ETH Price: $3,386.86 (-1.59%)
Gas: 2 Gwei

Token

MiladyRave (MIR)
 

Overview

Max Total Supply

2,500 MIR

Holders

813

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
3 MIR
0xae52b79d8d7859afc2e61c81e4d39cf04ced0832
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MiladyRaveMaker

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-09
*/

// SPDX-License-Identifier: MIT

// File: solady/src/utils/SafeTransferLib.sol


pragma solidity ^0.8.4;

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/SafeTransferLib.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Caution! This library won't check that a token has code, responsibility is delegated to the caller.
library SafeTransferLib {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       CUSTOM ERRORS                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    error ETHTransferFailed();

    error TransferFromFailed();

    error TransferFailed();

    error ApproveFailed();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       ETH OPERATIONS                       */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    function safeTransferETH(address to, uint256 amount) internal {
        assembly {
            // Transfer the ETH and check if it succeeded or not.
            if iszero(call(gas(), to, amount, 0, 0, 0, 0)) {
                // Store the function selector of `ETHTransferFailed()`.
                mstore(0x00, 0xb12d13eb)
                // Revert with (offset, size).
                revert(0x1c, 0x04)
            }
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                      ERC20 OPERATIONS                      */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 amount
    ) internal {
        assembly {
            // We'll write our calldata to this slot below, but restore it later.
            let memPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(0x00, 0x23b872dd)
            mstore(0x20, from) // Append the "from" argument.
            mstore(0x40, to) // Append the "to" argument.
            mstore(0x60, amount) // Append the "amount" argument.

            if iszero(
                and(
                    // Set success to whether the call reverted, if not we check it either
                    // returned exactly 1 (can't just be non-zero data), or had no return data.
                    or(eq(mload(0x00), 1), iszero(returndatasize())),
                    // We use 0x64 because that's the total length of our calldata (0x04 + 0x20 * 3)
                    // Counterintuitively, this call() must be positioned after the or() in the
                    // surrounding and() because and() evaluates its arguments from right to left.
                    call(gas(), token, 0, 0x1c, 0x64, 0x00, 0x20)
                )
            ) {
                // Store the function selector of `TransferFromFailed()`.
                mstore(0x00, 0x7939f424)
                // Revert with (offset, size).
                revert(0x1c, 0x04)
            }

            mstore(0x60, 0) // Restore the zero slot to zero.
            mstore(0x40, memPointer) // Restore the memPointer.
        }
    }

    function safeTransfer(
        address token,
        address to,
        uint256 amount
    ) internal {
        assembly {
            // We'll write our calldata to this slot below, but restore it later.
            let memPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(0x00, 0xa9059cbb)
            mstore(0x20, to) // Append the "to" argument.
            mstore(0x40, amount) // Append the "amount" argument.

            if iszero(
                and(
                    // Set success to whether the call reverted, if not we check it either
                    // returned exactly 1 (can't just be non-zero data), or had no return data.
                    or(eq(mload(0x00), 1), iszero(returndatasize())),
                    // We use 0x44 because that's the total length of our calldata (0x04 + 0x20 * 2)
                    // Counterintuitively, this call() must be positioned after the or() in the
                    // surrounding and() because and() evaluates its arguments from right to left.
                    call(gas(), token, 0, 0x1c, 0x44, 0x00, 0x20)
                )
            ) {
                // Store the function selector of `TransferFailed()`.
                mstore(0x00, 0x90b8ec18)
                // Revert with (offset, size).
                revert(0x1c, 0x04)
            }

            mstore(0x40, memPointer) // Restore the memPointer.
        }
    }

    function safeApprove(
        address token,
        address to,
        uint256 amount
    ) internal {
        assembly {
            // We'll write our calldata to this slot below, but restore it later.
            let memPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(0x00, 0x095ea7b3)
            mstore(0x20, to) // Append the "to" argument.
            mstore(0x40, amount) // Append the "amount" argument.

            if iszero(
                and(
                    // Set success to whether the call reverted, if not we check it either
                    // returned exactly 1 (can't just be non-zero data), or had no return data.
                    or(eq(mload(0x00), 1), iszero(returndatasize())),
                    // We use 0x44 because that's the total length of our calldata (0x04 + 0x20 * 2)
                    // Counterintuitively, this call() must be positioned after the or() in the
                    // surrounding and() because and() evaluates its arguments from right to left.
                    call(gas(), token, 0, 0x1c, 0x44, 0x00, 0x20)
                )
            ) {
                // Store the function selector of `ApproveFailed()`.
                mstore(0x00, 0x3e3f8f73)
                // Revert with (offset, size).
                revert(0x1c, 0x04)
            }

            mstore(0x40, memPointer) // Restore the memPointer.
        }
    }
}

// File: solady/src/utils/LibString.sol


pragma solidity ^0.8.4;

/// @notice Library for converting numbers into strings and other string operations.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibString.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/LibString.sol)
library LibString {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                        CUSTOM ERRORS                       */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    error HexLengthInsufficient();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                     DECIMAL OPERATIONS                     */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    function toString(uint256 value) internal pure returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 0x80 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80.
            str := add(mload(0x40), 0x80)
            // Update the free memory pointer to allocate.
            mstore(0x40, str)

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                   HEXADECIMAL OPERATIONS                   */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    function toHexString(uint256 value, uint256 length) internal pure returns (string memory str) {
        assembly {
            let start := mload(0x40)
            // We need length * 2 bytes for the digits, 2 bytes for the prefix,
            // and 32 bytes for the length. We add 32 to the total and round down
            // to a multiple of 32. (32 + 2 + 32) = 66.
            str := add(start, and(add(shl(1, length), 66), not(31)))

            // Cache the end to calculate the length later.
            let end := str

            // Allocate the memory.
            mstore(0x40, str)
            // Store "0123456789abcdef" in scratch space.
            mstore(0x0f, 0x30313233343536373839616263646566)

            let temp := value
            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for {} 1 {} {
                str := sub(str, 2)
                mstore8(add(str, 1), mload(and(temp, 15)))
                mstore8(str, mload(and(shr(4, temp), 15)))
                temp := shr(8, temp)
                length := sub(length, 1)
                // prettier-ignore
                if iszero(length) { break }
            }

            if temp {
                // Store the function selector of `HexLengthInsufficient()`.
                mstore(0x00, 0x2194895a)
                // Revert with (offset, size).
                revert(0x1c, 0x04)
            }

            // Compute the string's length.
            let strLength := add(sub(end, str), 2)
            // Move the pointer and write the "0x" prefix.
            str := sub(str, 0x20)
            mstore(str, 0x3078)
            // Move the pointer and write the length.
            str := sub(str, 2)
            mstore(str, strLength)
        }
    }

    function toHexString(uint256 value) internal pure returns (string memory str) {
        assembly {
            let start := mload(0x40)
            // We need 0x20 bytes for the length, 0x02 bytes for the prefix,
            // and 0x40 bytes for the digits.
            // The next multiple of 0x20 above (0x20 + 2 + 0x40) is 0x80.
            str := add(start, 0x80)

            // Cache the end to calculate the length later.
            let end := str

            // Allocate the memory.
            mstore(0x40, str)
            // Store "0123456789abcdef" in scratch space.
            mstore(0x0f, 0x30313233343536373839616263646566)

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 2)
                mstore8(add(str, 1), mload(and(temp, 15)))
                mstore8(str, mload(and(shr(4, temp), 15)))
                temp := shr(8, temp)
                // prettier-ignore
                if iszero(temp) { break }
            }

            // Compute the string's length.
            let strLength := add(sub(end, str), 2)
            // Move the pointer and write the "0x" prefix.
            str := sub(str, 0x20)
            mstore(str, 0x3078)
            // Move the pointer and write the length.
            str := sub(str, 2)
            mstore(str, strLength)
        }
    }

    function toHexString(address value) internal pure returns (string memory str) {
        assembly {
            let start := mload(0x40)
            // We need 32 bytes for the length, 2 bytes for the prefix,
            // and 40 bytes for the digits.
            // The next multiple of 32 above (32 + 2 + 40) is 96.
            str := add(start, 96)

            // Allocate the memory.
            mstore(0x40, str)
            // Store "0123456789abcdef" in scratch space.
            mstore(0x0f, 0x30313233343536373839616263646566)

            let length := 20
            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 2)
                mstore8(add(str, 1), mload(and(temp, 15)))
                mstore8(str, mload(and(shr(4, temp), 15)))
                temp := shr(8, temp)
                length := sub(length, 1)
                // prettier-ignore
                if iszero(length) { break }
            }

            // Move the pointer and write the "0x" prefix.
            str := sub(str, 32)
            mstore(str, 0x3078)
            // Move the pointer and write the length.
            str := sub(str, 2)
            mstore(str, 42)
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                   OTHER STRING OPERATIONS                  */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    function replace(
        string memory subject,
        string memory search,
        string memory replacement
    ) internal pure returns (string memory result) {
        assembly {
            let subjectLength := mload(subject)
            let searchLength := mload(search)
            let replacementLength := mload(replacement)

            subject := add(subject, 0x20)
            search := add(search, 0x20)
            replacement := add(replacement, 0x20)
            result := add(mload(0x40), 0x20)

            let subjectEnd := add(subject, subjectLength)
            if iszero(gt(searchLength, subjectLength)) {
                let subjectSearchEnd := add(sub(subjectEnd, searchLength), 1)
                let h := 0
                if iszero(lt(searchLength, 32)) {
                    h := keccak256(search, searchLength)
                }
                let m := shl(3, sub(32, and(searchLength, 31)))
                let s := mload(search)
                // prettier-ignore
                for {} 1 {} {
                    let t := mload(subject)
                    // Whether the first `searchLength % 32` bytes of 
                    // `subject` and `search` matches.
                    if iszero(shr(m, xor(t, s))) {
                        if h {
                            if iszero(eq(keccak256(subject, searchLength), h)) {
                                mstore(result, t)
                                result := add(result, 1)
                                subject := add(subject, 1)
                                // prettier-ignore
                                if iszero(lt(subject, subjectSearchEnd)) { break }
                                continue
                            }
                        }
                        // Copy the `replacement` one word at a time.
                        // prettier-ignore
                        for { let o := 0 } 1 {} {
                            mstore(add(result, o), mload(add(replacement, o)))
                            o := add(o, 0x20)
                            // prettier-ignore
                            if iszero(lt(o, replacementLength)) { break }
                        }
                        result := add(result, replacementLength)
                        subject := add(subject, searchLength)    
                        if iszero(searchLength) {
                            mstore(result, t)
                            result := add(result, 1)
                            subject := add(subject, 1)
                        }
                        // prettier-ignore
                        if iszero(lt(subject, subjectSearchEnd)) { break }
                        continue
                    }
                    mstore(result, t)
                    result := add(result, 1)
                    subject := add(subject, 1)
                    // prettier-ignore
                    if iszero(lt(subject, subjectSearchEnd)) { break }
                }
            }

            let resultRemainder := result
            result := add(mload(0x40), 0x20)
            let k := add(sub(resultRemainder, result), sub(subjectEnd, subject))
            // Copy the rest of the string one word at a time.
            // prettier-ignore
            for {} lt(subject, subjectEnd) {} {
                mstore(resultRemainder, mload(subject))
                resultRemainder := add(resultRemainder, 0x20)
                subject := add(subject, 0x20)
            }
            // Allocate memory for the length and the bytes,
            // rounded up to a multiple of 32.
            mstore(0x40, add(result, and(add(k, 0x40), not(0x1f))))
            result := sub(result, 0x20)
            mstore(result, k)
        }
    }
}

// File: solady/src/utils/ECDSA.sol


pragma solidity ^0.8.4;

/// @notice Gas optimized ECDSA wrapper.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/ECDSA.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/ECDSA.sol)
/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/ECDSA.sol)
library ECDSA {
    function recover(bytes32 hash, bytes calldata signature) internal view returns (address result) {
        assembly {
            // Copy the free memory pointer so that we can restore it later.
            let m := mload(0x40)
            // Directly load `s` from the calldata.
            let s := calldataload(add(signature.offset, 0x20))

            switch signature.length
            case 64 {
                // Here, `s` is actually `vs` that needs to be recovered into `v` and `s`.
                // Compute `v` and store it in the scratch space.
                mstore(0x20, add(shr(255, s), 27))
                // prettier-ignore
                s := and(s, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            }
            case 65 {
                // Compute `v` and store it in the scratch space.
                mstore(0x20, byte(0, calldataload(add(signature.offset, 0x40))))
            }

            // If `s` in lower half order, such that the signature is not malleable.
            // prettier-ignore
            if iszero(gt(s, 0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0)) {
                mstore(0x00, hash)
                calldatacopy(0x40, signature.offset, 0x20) // Directly copy `r` over.
                mstore(0x60, s)
                pop(
                    staticcall(
                        gas(), // Amount of gas left for the transaction.
                        0x01, // Address of `ecrecover`.
                        0x00, // Start of input.
                        0x80, // Size of input.
                        0x40, // Start of output.
                        0x20 // Size of output.
                    )
                )
                // Restore the zero slot.
                mstore(0x60, 0)
                // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.
                result := mload(sub(0x60, returndatasize()))
            }
            // Restore the free memory pointer.
            mstore(0x40, m)
        }
    }

    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 result) {
        assembly {
            // Store into scratch space for keccak256.
            mstore(0x20, hash)
            mstore(0x00, "\x00\x00\x00\x00\x19Ethereum Signed Message:\n32")
            // 0x40 - 0x04 = 0x3c
            result := keccak256(0x04, 0x3c)
        }
    }

    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32 result) {
        assembly {
            // We need at most 128 bytes for Ethereum signed message header.
            // The max length of the ASCII reprenstation of a uint256 is 78 bytes.
            // The length of "\x19Ethereum Signed Message:\n" is 26 bytes (i.e. 0x1a).
            // The next multiple of 32 above 78 + 26 is 128 (i.e. 0x80).

            // Instead of allocating, we temporarily copy the 128 bytes before the
            // start of `s` data to some variables.
            let m3 := mload(sub(s, 0x60))
            let m2 := mload(sub(s, 0x40))
            let m1 := mload(sub(s, 0x20))
            // The length of `s` is in bytes.
            let sLength := mload(s)

            let ptr := add(s, 0x20)

            // `end` marks the end of the memory which we will compute the keccak256 of.
            let end := add(ptr, sLength)

            // Convert the length of the bytes to ASCII decimal representation
            // and store it into the memory.
            // prettier-ignore
            for { let temp := sLength } 1 {} {
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            // Copy the header over to the memory.
            mstore(sub(ptr, 0x20), "\x00\x00\x00\x00\x00\x00\x19Ethereum Signed Message:\n")
            // Compute the keccak256 of the memory.
            result := keccak256(sub(ptr, 0x1a), sub(end, sub(ptr, 0x1a)))

            // Restore the previous memory.
            mstore(s, sLength)
            mstore(sub(s, 0x20), m1)
            mstore(sub(s, 0x40), m2)
            mstore(sub(s, 0x60), m3)
        }
    }
}

// File: solady/src/Milady.sol


pragma solidity ^0.8.4;

/*
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣾⣿⣷⣶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠿⣿⣿⣿⣿⣿⣿⣶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣠⣤⣴⣶⣾⣿⣷⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠻⢿⣿⣿⣿⣿⣷⣦⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⢿⣿⣿⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣾⣿⣿⣿⣿⣿⡿⠿⠟⠛⠉⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⣿⣿⣿⣆⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⣿⡿⠟⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣿⣿⣧⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣿⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢻⣿⣇⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⣶⣿⣿⣿⣿⣿⣿⣿⣶⣤⡀⠀⠙⠋⠀⠀⠀
⠀⠀⠀⠀⠀⣠⣾⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣤⣾⠟⢋⣥⣤⠀⣶⣶⣶⣦⣤⣌⣉⠛⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⣴⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠋⢁⣴⣿⣿⡿⠀⣿⣿⣿⣿⣿⣿⣿⣷⡄⠀⠀⠀⠀⠀
⠀⠀⠀⣼⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣤⣤⣶⣶⣾⣿⣿⣿⣿⣷⣶⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣿⣿⣿⠁⠀⠀⢹⣿⣿⣿⣿⣿⣿⢻⣿⡄⠀⠀⠀⠀
⠀⠀⠀⠛⠋⠀⠀⠀⠀⠀⠀⠀⢀⣤⣾⣿⠿⠛⣛⣉⣉⣀⣀⡀⠀⠀⠀⠀⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣿⣿⣿⣿⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⢸⣿⣿⡄⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣾⡿⢋⣩⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣶⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣦⣀⣀⣴⣿⣿⣿⣿⣿⡿⢸⣿⢿⣷⡀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣡⣄⠀⠋⠁⠀⠈⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣿⡟⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⢸⡿⠀⠛⠃⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⣿⣧⡀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠛⠛⠃⢹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠁⠈⠁⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⣿⢿⣿⣿⣿⣷⣦⣤⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣶⣶⠀⠈⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠀⣿⠇⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⢠⣿⣿⣿⠟⠉⠀⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣿⠀⠀⢹⣿⣿⣿⣿⣿⣿⣿⣿⣿⠁⢸⣿⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣼⣿⡟⠁⣠⣦⠀⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠉⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⡆⠀⠀⢻⣿⣿⣿⣿⣿⣿⣿⠏⠀⣸⡏⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣿⡏⠀⠀⣿⣿⡀⠀⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠀⢹⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣇⠀⠀⠀⠙⢿⣿⣿⡿⠟⠁⠀⣸⡿⠁⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢸⣿⠁⠀⠀⢸⣿⣇⠀⠀⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⠀⢀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢿⣦⡀⠀⠀⠀⠈⠉⠀⠀⠀⣼⡿⠁⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠈⠁⠀⠀⠀⠀⢿⣿⡄⠀⠀⠈⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⠀⠀⣼⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣷⣦⣄⣀⠀⠀⢀⡈⠙⠁⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢻⣿⣆⠀⠀⠀⠉⠛⠿⢿⣿⣿⠿⠛⠁⠀⠀⠀⣠⣿⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠿⣿⣿⣷⣿⣯⣤⣶⠄⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣿⣷⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠙⠛⠋⠁⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⢿⣷⣤⣀⠀⠀⠀⠀⠀⠀⠀⠺⣿⣿⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠛⢻⣿⣶⣤⣤⣤⣶⣷⣤⠈⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢿⣿⣿⣿⣿⡿⠿⠛⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠶⢤⣄⣀⣀⣤⠶⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
*/

library Milady {
    string public constant WEBSITE = "https://miladymaker.net";

    address public constant CONTRACT = 0x5Af0D9827E0c53E4799BB226655A1de152A425a5;
}

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.2.2
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721A.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables
     * (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`,
     * checking first that contract recipients are aware of the ERC721 protocol
     * to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move
     * this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom}
     * whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the
     * zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/extensions/IERC721AQueryable.sol


// ERC721A Contracts v4.2.2
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev Interface of ERC721AQueryable.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.2.2
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Reference type for token approval.
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

    // Mapping from token ID to approved address.
    mapping(uint256 => TokenApprovalRef) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view virtual returns (uint256) {
        // Counter underflow is impossible as `_currentIndex` does not decrement,
        // and it is initialized to `_startTokenId()`.
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the
     * zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ownerOf(tokenId);

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token IDs
     * are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token IDs
     * have been transferred. This includes minting.
     * And also called after one token has been burned.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 0x80 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80.
            str := add(mload(0x40), 0x80)
            // Update the free memory pointer to allocate.
            mstore(0x40, str)

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}

// File: erc721a/contracts/extensions/ERC721AQueryable.sol


// ERC721A Contracts v4.2.2
// Creator: Chiru Labs

pragma solidity ^0.8.4;



/**
 * @title ERC721AQueryable.
 *
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
            return ownership;
        }
        ownership = _ownershipAt(tokenId);
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] calldata tokenIds)
        external
        view
        virtual
        override
        returns (TokenOwnership[] memory)
    {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view virtual override returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _nextTokenId();
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, stopLimit)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: MiladyRave.sol


pragma solidity ^0.8.4;








contract MiladyRaveMaker is ERC721A, ERC721AQueryable, Ownable {
    using ECDSA for bytes32;

    uint256 public constant PRICE_UNIT = 0.001 ether;

    string private _tokenURI;

    address public signer;

    uint16 public maxSupply;

    uint16 private _miladyPriceUnits;

    uint16 private _publicPriceUnits;

    bool public paused;

    bool public mintLocked;

    bool public maxSupplyLocked;

    bool public tokenURILocked;

    constructor() ERC721A("MiladyRave", "MIR") {
        maxSupply = 5000;
        _miladyPriceUnits = _toPriceUnits(0.03 ether);
        _publicPriceUnits = _toPriceUnits(0.06 ether);
        paused = true; // Must be initialized to true.
    }

    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        return LibString.replace(_tokenURI, "{id}", _toString(tokenId));
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                     MINTING FUNCTIONS                      */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    function publicMint(uint256 quantity)
        external
        payable
        mintNotPaused
        requireMintable(quantity)
        requireExactPayment(_publicPriceUnits, quantity)
    {
        _mint(msg.sender, quantity);
    }

    function miladyMint(uint256 quantity, bytes calldata signature)
        external
        payable
        mintNotPaused
        requireMintable(quantity)
        requireSignature(signature)
        requireExactPayment(_miladyPriceUnits, quantity)
    {
        _mint(msg.sender, quantity);
    }

    function claimGiveaway(bytes calldata signature)
        external
        payable
        mintNotPaused
        requireMintable(1)
        requireSignature(signature)
    {
        require(_getAux(msg.sender) == 0, "Already claimed.");
        _setAux(msg.sender, 1);

        _mint(msg.sender, 1);
    }

    function hasClaimedGiveaway(address claimer) external view returns (bool) {
        return _getAux(claimer) != 0;
    }

    function miladyPrice() external view returns (uint256) {
        return _toPrice(_miladyPriceUnits);
    }

    function publicPrice() external view returns (uint256) {
        return _toPrice(_publicPriceUnits);
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                          HELPERS                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    function _toPriceUnits(uint256 price) private pure returns (uint16) {
        unchecked {
            require(price % PRICE_UNIT == 0, "Price must be a multiple of PRICE_UNIT.");
            require((price /= PRICE_UNIT) <= type(uint16).max, "Overflow.");
            return uint16(price);
        }
    }

    function _toPrice(uint16 priceUnits) private pure returns (uint256) {
        return uint256(priceUnits) * PRICE_UNIT;
    }

    modifier requireMintable(uint256 quantity) {
        unchecked {
            require(mintLocked == false, "Locked.");
            require(_totalMinted() + quantity <= maxSupply, "Out of stock!");
        }
        _;
    }

    modifier requireExactPayment(uint16 priceUnits, uint256 quantity) {
        unchecked {
            require(quantity <= 100, "Quantity too high.");
            require(msg.value == _toPrice(priceUnits) * quantity, "Wrong Ether value.");
        }
        _;
    }

    modifier requireSignature(bytes calldata signature) {
        require(
            keccak256(abi.encode(msg.sender)).toEthSignedMessageHash().recover(signature) == signer,
            "Invalid signature."
        );
        _;
    }

    modifier mintNotPaused() {
        require(paused == false, "Paused.");
        _;
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                      ADMIN FUNCTIONS                       */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    function forceMint(address[] calldata to, uint256 quantity)
        external
        onlyOwner
        requireMintable(quantity * to.length)
    {
        unchecked {
            for (uint256 i; i != to.length; ++i) {
                _mint(to[i], quantity);
            }
        }
    }

    function selfMint(uint256 quantity) external onlyOwner requireMintable(quantity) {
        unchecked {
            uint256 miniBatchSize = 8;
            uint256 i = quantity % miniBatchSize;
            _mint(msg.sender, i);
            while (i != quantity) {
                _mint(msg.sender, miniBatchSize);
                i += miniBatchSize;
            }
        }
    }

    function setTokenURI(string calldata value) external onlyOwner {
        require(tokenURILocked == false, "Locked.");
        _tokenURI = value;
    }

    function setMaxSupply(uint16 value) external onlyOwner {
        require(maxSupplyLocked == false, "Locked.");
        maxSupply = value;
    }

    function setPaused(bool value) external onlyOwner {
        if (value == false) {
            require(maxSupply != 0, "Max supply not set.");
            require(signer != address(0), "Signer not set.");
        }
        paused = value;
    }

    function setSigner(address value) external onlyOwner {
        require(value != address(0), "Signer must not be the zero address.");
        signer = value;
    }

    function lockMint() external onlyOwner {
        mintLocked = true;
    }

    function lockMaxSupply() external onlyOwner {
        maxSupplyLocked = true;
    }

    function lockTokenURI() external onlyOwner {
        tokenURILocked = true;
    }

    function setMiladyPrice(uint256 value) external onlyOwner {
        _miladyPriceUnits = _toPriceUnits(value);
    }

    function setPublicPrice(uint256 value) external onlyOwner {
        _publicPriceUnits = _toPriceUnits(value);
    }

    function withdraw() external payable onlyOwner {
        SafeTransferLib.safeTransferETH(msg.sender, address(this).balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"PRICE_UNIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"claimGiveaway","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"forceMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"claimer","type":"address"}],"name":"hasClaimedGiveaway","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"miladyMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"miladyPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"selfMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"value","type":"uint16"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMiladyPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"value","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"value","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURILocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040523480156200001157600080fd5b50604080518082018252600a8152694d696c6164795261766560b01b60208083019182528351808501909452600384526226a4a960e91b9084015281519192916200005f916002916200022b565b508051620000759060039060208401906200022b565b505060016000555062000088336200011a565b600a805461ffff60a01b191661027160a31b179055620000af666a94d74f4300006200016c565b600a805461ffff92909216600160b01b0261ffff60b01b19909216919091179055620000e266d529ae9e8600006200016c565b600a805460ff60d01b1961ffff93909316600160c01b029290921662ffffff60c01b1990921691909117600160d01b17905562000304565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600066038d7ea4c68000820615620001db5760405162461bcd60e51b815260206004820152602760248201527f5072696365206d7573742062652061206d756c7469706c65206f66205052494360448201526622afaaa724aa1760c91b60648201526084015b60405180910390fd5b61ffff66038d7ea4c6800083049250821115620002275760405162461bcd60e51b815260206004820152600960248201526827bb32b9333637bb9760b91b6044820152606401620001d2565b5090565b8280546200023990620002c7565b90600052602060002090601f0160209004810192826200025d5760008555620002a8565b82601f106200027857805160ff1916838001178555620002a8565b82800160010185558215620002a8579182015b82811115620002a85782518255916020019190600101906200028b565b50620002279291505b80821115620002275760008155600101620002b1565b600181811c90821680620002dc57607f821691505b60208210811415620002fe57634e487b7160e01b600052602260045260246000fd5b50919050565b6129f780620003146000396000f3fe60806040526004361061027d5760003560e01c80638462151c1161014f578063c6275255116100c1578063e0b6bb671161007a578063e0b6bb671461079d578063e0df5b6f146107b2578063e985e9c5146107d2578063ed435e581461081b578063f2fde38b14610836578063fca76c261461085657600080fd5b8063c6275255146106d4578063c87b56dd146106f4578063d40651ee14610714578063d5abeb0114610727578063d6d0095e1461075c578063df3c3a301461077c57600080fd5b8063a8d0466c11610113578063a8d0466c14610610578063a945bf8014610631578063ac998f4514610646578063b88d4fde14610667578063c23dc68f14610687578063c2d52560146106b457600080fd5b80638462151c146105705780638da5cb5b1461059d57806395d89b41146105bb57806399a2557a146105d0578063a22cb465146105f057600080fd5b80632db11544116101f35780635e5a9e30116101ac5780635e5a9e30146104d15780636352211e146104e65780636c19e7831461050657806370a0823114610526578063715018a6146105465780637cf8cf3f1461055b57600080fd5b80632db11544146104355780633ccfd60b1461044857806342842e0e14610450578063435644e8146104705780635bbb2177146104835780635c975abb146104b057600080fd5b8063095ea7b311610245578063095ea7b31461036e5780630d3c69b41461038e57806316c38b3c146103ae57806318160ddd146103ce578063238ac933146103f557806323b872dd1461041557600080fd5b806301ffc9a71461028257806305295695146102b757806306421c2f146102f257806306fdde0314610314578063081812fc14610336575b600080fd5b34801561028e57600080fd5b506102a261029d366004612656565b61086b565b60405190151581526020015b60405180910390f35b3480156102c357600080fd5b506102a26102d23660046123c3565b6001600160a01b031660009081526005602052604090205460c01c151590565b3480156102fe57600080fd5b5061031261030d3660046126c5565b6108bd565b005b34801561032057600080fd5b5061032961091a565b6040516102ae919061288d565b34801561034257600080fd5b506103566103513660046126e9565b6109ac565b6040516001600160a01b0390911681526020016102ae565b34801561037a57600080fd5b50610312610389366004612552565b6109f0565b34801561039a57600080fd5b506103126103a93660046126e9565b610a90565b3480156103ba57600080fd5b506103126103c936600461263b565b610b2d565b3480156103da57600080fd5b5060015460005403600019015b6040519081526020016102ae565b34801561040157600080fd5b50600a54610356906001600160a01b031681565b34801561042157600080fd5b50610312610430366004612411565b610bf2565b6103126104433660046126e9565b610d83565b610312610ec1565b34801561045c57600080fd5b5061031261046b366004612411565b610ed5565b61031261047e366004612702565b610ef5565b34801561048f57600080fd5b506104a361049e3660046125fa565b6110fb565b6040516102ae9190612813565b3480156104bc57600080fd5b50600a546102a290600160d01b900460ff1681565b3480156104dd57600080fd5b506103126111c6565b3480156104f257600080fd5b506103566105013660046126e9565b6111e3565b34801561051257600080fd5b506103126105213660046123c3565b6111ee565b34801561053257600080fd5b506103e76105413660046123c3565b61127a565b34801561055257600080fd5b506103126112c8565b34801561056757600080fd5b506103e76112da565b34801561057c57600080fd5b5061059061058b3660046123c3565b6112f9565b6040516102ae9190612855565b3480156105a957600080fd5b506008546001600160a01b0316610356565b3480156105c757600080fd5b50610329611408565b3480156105dc57600080fd5b506105906105eb36600461257c565b611417565b3480156105fc57600080fd5b5061031261060b366004612528565b6115a2565b34801561061c57600080fd5b50600a546102a290600160e01b900460ff1681565b34801561063d57600080fd5b506103e7611638565b34801561065257600080fd5b50600a546102a290600160e81b900460ff1681565b34801561067357600080fd5b5061031261068236600461244d565b611652565b34801561069357600080fd5b506106a76106a23660046126e9565b611696565b6040516102ae9190612909565b3480156106c057600080fd5b506103126106cf3660046126e9565b61171e565b3480156106e057600080fd5b506103126106ef3660046126e9565b61174e565b34801561070057600080fd5b5061032961070f3660046126e9565b61177e565b610312610722366004612690565b611839565b34801561073357600080fd5b50600a5461074990600160a01b900461ffff1681565b60405161ffff90911681526020016102ae565b34801561076857600080fd5b506103126107773660046125af565b6119cc565b34801561078857600080fd5b50600a546102a290600160d81b900460ff1681565b3480156107a957600080fd5b50610312611a85565b3480156107be57600080fd5b506103126107cd366004612690565b611aa2565b3480156107de57600080fd5b506102a26107ed3660046123de565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561082757600080fd5b506103e766038d7ea4c6800081565b34801561084257600080fd5b506103126108513660046123c3565b611ae0565b34801561086257600080fd5b50610312611b59565b60006301ffc9a760e01b6001600160e01b03198316148061089c57506380ac58cd60e01b6001600160e01b03198316145b806108b75750635b5e139f60e01b6001600160e01b03198316145b92915050565b6108c5611b76565b600a54600160e01b900460ff16156108f85760405162461bcd60e51b81526004016108ef906128c1565b60405180910390fd5b600a805461ffff909216600160a01b0261ffff60a01b19909216919091179055565b60606002805461092990612944565b80601f016020809104026020016040519081016040528092919081815260200182805461095590612944565b80156109a25780601f10610977576101008083540402835291602001916109a2565b820191906000526020600020905b81548152906001019060200180831161098557829003601f168201915b5050505050905090565b60006109b782611bd0565b6109d4576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006109fb826111e3565b9050336001600160a01b03821614610a3457610a1781336107ed565b610a34576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610a98611b76565b600a548190600160d81b900460ff1615610ac45760405162461bcd60e51b81526004016108ef906128c1565b600a54600160a01b900461ffff1681610ae06000546000190190565b011115610aff5760405162461bcd60e51b81526004016108ef906128e2565b600860078316610b0f3382611c05565b838114610b2757610b203383611c05565b8101610b0f565b50505050565b610b35611b76565b80610bd457600a54600160a01b900461ffff16610b8a5760405162461bcd60e51b815260206004820152601360248201527226b0bc1039bab838363c903737ba1039b2ba1760691b60448201526064016108ef565b600a546001600160a01b0316610bd45760405162461bcd60e51b815260206004820152600f60248201526e29b4b3b732b9103737ba1039b2ba1760891b60448201526064016108ef565b600a8054911515600160d01b0260ff60d01b19909216919091179055565b6000610bfd82611cfc565b9050836001600160a01b0316816001600160a01b031614610c305760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610c7d57610c6086336107ed565b610c7d57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610ca457604051633a954ecd60e21b815260040160405180910390fd5b8015610caf57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040902055600160e11b8316610d3a5760018401600081815260046020526040902054610d38576000548114610d385760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b600a54600160d01b900460ff1615610dad5760405162461bcd60e51b81526004016108ef906128a0565b600a548190600160d81b900460ff1615610dd95760405162461bcd60e51b81526004016108ef906128c1565b600a54600160a01b900461ffff1681610df56000546000190190565b011115610e145760405162461bcd60e51b81526004016108ef906128e2565b600a54600160c01b900461ffff16826064811115610e695760405162461bcd60e51b815260206004820152601260248201527128bab0b73a34ba3c903a37b7903434b3b41760711b60448201526064016108ef565b80610e7383611d65565b023414610eb75760405162461bcd60e51b81526020600482015260126024820152712bb937b7339022ba3432b9103b30b63ab29760711b60448201526064016108ef565b610b273385611c05565b610ec9611b76565b610ed33347611d7c565b565b610ef083838360405180602001604052806000815250611652565b505050565b600a54600160d01b900460ff1615610f1f5760405162461bcd60e51b81526004016108ef906128a0565b600a548390600160d81b900460ff1615610f4b5760405162461bcd60e51b81526004016108ef906128c1565b600a54600160a01b900461ffff1681610f676000546000190190565b011115610f865760405162461bcd60e51b81526004016108ef906128e2565b600a5460408051336020820152859285926001600160a01b0390911691610ff99185918591610ff291015b604051602081830303815290604052805190602001206020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042090565b9190611d9c565b6001600160a01b0316146110445760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b21039b4b3b730ba3ab9329760711b60448201526064016108ef565b600a54600160b01b900461ffff168660648111156110995760405162461bcd60e51b815260206004820152601260248201527128bab0b73a34ba3c903a37b7903434b3b41760711b60448201526064016108ef565b806110a383611d65565b0234146110e75760405162461bcd60e51b81526020600482015260126024820152712bb937b7339022ba3432b9103b30b63ab29760711b60448201526064016108ef565b6110f13389611c05565b5050505050505050565b6060816000816001600160401b0381111561111857611118612995565b60405190808252806020026020018201604052801561116a57816020015b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816111365790505b50905060005b8281146111bd5761119886868381811061118c5761118c61297f565b90506020020135611696565b8282815181106111aa576111aa61297f565b6020908102919091010152600101611170565b50949350505050565b6111ce611b76565b600a805460ff60e81b1916600160e81b179055565b60006108b782611cfc565b6111f6611b76565b6001600160a01b0381166112585760405162461bcd60e51b8152602060048201526024808201527f5369676e6572206d757374206e6f7420626520746865207a65726f206164647260448201526332b9b99760e11b60648201526084016108ef565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166112a3576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6112d0611b76565b610ed36000611e3e565b600a546000906112f490600160b01b900461ffff16611d65565b905090565b606060008060006113098561127a565b90506000816001600160401b0381111561132557611325612995565b60405190808252806020026020018201604052801561134e578160200160208202803683370190505b50905061137b60408051608081018252600080825260208201819052918101829052606081019190915290565b60015b8386146113fc5761138e81611e90565b915081604001511561139f576113f4565b81516001600160a01b0316156113b457815194505b876001600160a01b0316856001600160a01b031614156113f457808387806001019850815181106113e7576113e761297f565b6020026020010181815250505b60010161137e565b50909695505050505050565b60606003805461092990612944565b606081831061143957604051631960ccad60e11b815260040160405180910390fd5b60008061144560005490565b9050600185101561145557600194505b80841115611461578093505b600061146c8761127a565b90508486101561148b5785850381811015611485578091505b5061148f565b5060005b6000816001600160401b038111156114a9576114a9612995565b6040519080825280602002602001820160405280156114d2578160200160208202803683370190505b509050816114e557935061159b92505050565b60006114f088611696565b905060008160400151611501575080515b885b8881141580156115135750848714155b1561158f5761152181611e90565b925082604001511561153257611587565b82516001600160a01b03161561154757825191505b8a6001600160a01b0316826001600160a01b03161415611587578084888060010199508151811061157a5761157a61297f565b6020026020010181815250505b600101611503565b50505092835250909150505b9392505050565b6001600160a01b0382163314156115cc5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546000906112f490600160c01b900461ffff16611d65565b61165d848484610bf2565b6001600160a01b0383163b15610b275761167984848484611ecc565b610b27576040516368d2bf6b60e11b815260040160405180910390fd5b60408051608081018252600080825260208201819052918101829052606081019190915260408051608081018252600080825260208201819052918101829052606081019190915260018310806116ef57506000548310155b156116fa5792915050565b61170383611e90565b90508060400151156117155792915050565b61159b83611fc3565b611726611b76565b61172f81611ff8565b600a60166101000a81548161ffff021916908361ffff16021790555050565b611756611b76565b61175f81611ff8565b600a60186101000a81548161ffff021916908361ffff16021790555050565b60606108b76009805461179090612944565b80601f01602080910402602001604051908101604052809291908181526020018280546117bc90612944565b80156118095780601f106117de57610100808354040283529160200191611809565b820191906000526020600020905b8154815290600101906020018083116117ec57829003601f168201915b5050505050604051806040016040528060048152602001637b69647d60e01b815250611834856120af565b6120f1565b600a54600160d01b900460ff16156118635760405162461bcd60e51b81526004016108ef906128a0565b600a54600190600160d81b900460ff16156118905760405162461bcd60e51b81526004016108ef906128c1565b600a54600160a01b900461ffff16816118ac6000546000190190565b0111156118cb5760405162461bcd60e51b81526004016108ef906128e2565b600a5460408051336020820152859285926001600160a01b03909116916118fa9185918591610ff29101610fb1565b6001600160a01b0316146119455760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b21039b4b3b730ba3ab9329760711b60448201526064016108ef565b3360009081526005602052604090205460c01c156119985760405162461bcd60e51b815260206004820152601060248201526f20b63932b0b23c9031b630b4b6b2b21760811b60448201526064016108ef565b33600090815260056020526040902080546001600160c01b0316600160c01b1790556119c5336001611c05565b5050505050565b6119d4611b76565b6119de8282612917565b600a54600160d81b900460ff1615611a085760405162461bcd60e51b81526004016108ef906128c1565b600a54600160a01b900461ffff1681611a246000546000190190565b011115611a435760405162461bcd60e51b81526004016108ef906128e2565b60005b8084146119c557611a7d858583818110611a6257611a6261297f565b9050602002016020810190611a7791906123c3565b84611c05565b600101611a46565b611a8d611b76565b600a805460ff60d81b1916600160d81b179055565b611aaa611b76565b600a54600160e81b900460ff1615611ad45760405162461bcd60e51b81526004016108ef906128c1565b610ef06009838361227b565b611ae8611b76565b6001600160a01b038116611b4d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ef565b611b5681611e3e565b50565b611b61611b76565b600a805460ff60e01b1916600160e01b179055565b6008546001600160a01b03163314610ed35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ef565b600081600111158015611be4575060005482105b80156108b7575050600090815260046020526040902054600160e01b161590565b60005481611c265760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114611cd557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611c9d565b5081611cf357604051622e076360e81b815260040160405180910390fd5b60005550505050565b60008180600111611d4c57600054811015611d4c57600081815260046020526040902054600160e01b8116611d4a575b8061159b575060001901600081815260046020526040902054611d2c565b505b604051636f96cda160e11b815260040160405180910390fd5b60006108b766038d7ea4c6800061ffff8416612917565b60008060008084865af1611d985763b12d13eb6000526004601cfd5b5050565b600060405160208401358360408114611dbc5760418114611dd757611de3565b601b8260ff1c016020526001600160ff1b0382169150611de3565b604086013560001a6020525b507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08111611e33578560005260208560403780606052602060406080600060015afa5060006060523d6060035192505b506040529392505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040805160808101825260008082526020820181905291810182905260608101919091526000828152600460205260409020546108b790612234565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611f019033908990889088906004016127d6565b602060405180830381600087803b158015611f1b57600080fd5b505af1925050508015611f4b575060408051601f3d908101601f19168201909252611f4891810190612673565b60015b611fa6573d808015611f79576040519150601f19603f3d011682016040523d82523d6000602084013e611f7e565b606091505b508051611f9e576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6040805160808101825260008082526020820181905291810182905260608101919091526108b7611ff383611cfc565b612234565b600066038d7ea4c680008206156120615760405162461bcd60e51b815260206004820152602760248201527f5072696365206d7573742062652061206d756c7469706c65206f66205052494360448201526622afaaa724aa1760c91b60648201526084016108ef565b61ffff66038d7ea4c68000830492508211156120ab5760405162461bcd60e51b815260206004820152600960248201526827bb32b9333637bb9760b91b60448201526064016108ef565b5090565b604080516080019081905280825b600183039250600a81066030018353600a9004806120da576120df565b6120bd565b50819003601f19909101908152919050565b606083518351835160208701965060208601955060208501945060206040510193508287018383116121e35760018382030160006020851061213257508388205b601f851660200360031b89515b8b51818118831c6121c15783156121795783888e201461217957808a5260019c8d019c90990198848d1061217357506121de565b5061213f565b60005b8b8101518b82015260200187811061219357612198565b61217c565b509b87019b98860198876121b457808a5260019c8d019c909901985b848d1061217357506121de565b895260019b8c019b90980197838c106121d9576121de565b61213f565b505050505b84935060206040510194508781038585030192505b808810156122135787518452602097880197909301926121f8565b5050601f196040820116830160405260208303925080835250509392505050565b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b82805461228790612944565b90600052602060002090601f0160209004810192826122a957600085556122ef565b82601f106122c25782800160ff198235161785556122ef565b828001600101855582156122ef579182015b828111156122ef5782358255916020019190600101906122d4565b506120ab9291505b808211156120ab57600081556001016122f7565b80356001600160a01b038116811461232257600080fd5b919050565b60008083601f84011261233957600080fd5b5081356001600160401b0381111561235057600080fd5b6020830191508360208260051b850101111561236b57600080fd5b9250929050565b8035801515811461232257600080fd5b60008083601f84011261239457600080fd5b5081356001600160401b038111156123ab57600080fd5b60208301915083602082850101111561236b57600080fd5b6000602082840312156123d557600080fd5b61159b8261230b565b600080604083850312156123f157600080fd5b6123fa8361230b565b91506124086020840161230b565b90509250929050565b60008060006060848603121561242657600080fd5b61242f8461230b565b925061243d6020850161230b565b9150604084013590509250925092565b6000806000806080858703121561246357600080fd5b61246c8561230b565b935061247a6020860161230b565b92506040850135915060608501356001600160401b038082111561249d57600080fd5b818701915087601f8301126124b157600080fd5b8135818111156124c3576124c3612995565b604051601f8201601f19908116603f011681019083821181831017156124eb576124eb612995565b816040528281528a602084870101111561250457600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561253b57600080fd5b6125448361230b565b915061240860208401612372565b6000806040838503121561256557600080fd5b61256e8361230b565b946020939093013593505050565b60008060006060848603121561259157600080fd5b61259a8461230b565b95602085013595506040909401359392505050565b6000806000604084860312156125c457600080fd5b83356001600160401b038111156125da57600080fd5b6125e686828701612327565b909790965060209590950135949350505050565b6000806020838503121561260d57600080fd5b82356001600160401b0381111561262357600080fd5b61262f85828601612327565b90969095509350505050565b60006020828403121561264d57600080fd5b61159b82612372565b60006020828403121561266857600080fd5b813561159b816129ab565b60006020828403121561268557600080fd5b815161159b816129ab565b600080602083850312156126a357600080fd5b82356001600160401b038111156126b957600080fd5b61262f85828601612382565b6000602082840312156126d757600080fd5b813561ffff8116811461159b57600080fd5b6000602082840312156126fb57600080fd5b5035919050565b60008060006040848603121561271757600080fd5b8335925060208401356001600160401b0381111561273457600080fd5b61274086828701612382565b9497909650939450505050565b6000815180845260005b8181101561277357602081850181015186830182015201612757565b81811115612785576000602083870101525b50601f01601f19169290920160200192915050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906128099083018461274d565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156113fc5761284283855161279a565b928401926080929092019160010161282f565b6020808252825182820181905260009190848201906040850190845b818110156113fc57835183529284019291840191600101612871565b60208152600061159b602083018461274d565b6020808252600790820152662830bab9b2b21760c91b604082015260600190565b6020808252600790820152662637b1b5b2b21760c91b604082015260600190565b6020808252600d908201526c4f7574206f662073746f636b2160981b604082015260600190565b608081016108b7828461279a565b600081600019048311821515161561293f57634e487b7160e01b600052601160045260246000fd5b500290565b600181811c9082168061295857607f821691505b6020821081141561297957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611b5657600080fdfea264697066735822122091802568b431d7df3e85c1b5b7eabc8f33ea2b8422dbc503174b375c16c8bdf264736f6c63430008070033

Deployed Bytecode

0x60806040526004361061027d5760003560e01c80638462151c1161014f578063c6275255116100c1578063e0b6bb671161007a578063e0b6bb671461079d578063e0df5b6f146107b2578063e985e9c5146107d2578063ed435e581461081b578063f2fde38b14610836578063fca76c261461085657600080fd5b8063c6275255146106d4578063c87b56dd146106f4578063d40651ee14610714578063d5abeb0114610727578063d6d0095e1461075c578063df3c3a301461077c57600080fd5b8063a8d0466c11610113578063a8d0466c14610610578063a945bf8014610631578063ac998f4514610646578063b88d4fde14610667578063c23dc68f14610687578063c2d52560146106b457600080fd5b80638462151c146105705780638da5cb5b1461059d57806395d89b41146105bb57806399a2557a146105d0578063a22cb465146105f057600080fd5b80632db11544116101f35780635e5a9e30116101ac5780635e5a9e30146104d15780636352211e146104e65780636c19e7831461050657806370a0823114610526578063715018a6146105465780637cf8cf3f1461055b57600080fd5b80632db11544146104355780633ccfd60b1461044857806342842e0e14610450578063435644e8146104705780635bbb2177146104835780635c975abb146104b057600080fd5b8063095ea7b311610245578063095ea7b31461036e5780630d3c69b41461038e57806316c38b3c146103ae57806318160ddd146103ce578063238ac933146103f557806323b872dd1461041557600080fd5b806301ffc9a71461028257806305295695146102b757806306421c2f146102f257806306fdde0314610314578063081812fc14610336575b600080fd5b34801561028e57600080fd5b506102a261029d366004612656565b61086b565b60405190151581526020015b60405180910390f35b3480156102c357600080fd5b506102a26102d23660046123c3565b6001600160a01b031660009081526005602052604090205460c01c151590565b3480156102fe57600080fd5b5061031261030d3660046126c5565b6108bd565b005b34801561032057600080fd5b5061032961091a565b6040516102ae919061288d565b34801561034257600080fd5b506103566103513660046126e9565b6109ac565b6040516001600160a01b0390911681526020016102ae565b34801561037a57600080fd5b50610312610389366004612552565b6109f0565b34801561039a57600080fd5b506103126103a93660046126e9565b610a90565b3480156103ba57600080fd5b506103126103c936600461263b565b610b2d565b3480156103da57600080fd5b5060015460005403600019015b6040519081526020016102ae565b34801561040157600080fd5b50600a54610356906001600160a01b031681565b34801561042157600080fd5b50610312610430366004612411565b610bf2565b6103126104433660046126e9565b610d83565b610312610ec1565b34801561045c57600080fd5b5061031261046b366004612411565b610ed5565b61031261047e366004612702565b610ef5565b34801561048f57600080fd5b506104a361049e3660046125fa565b6110fb565b6040516102ae9190612813565b3480156104bc57600080fd5b50600a546102a290600160d01b900460ff1681565b3480156104dd57600080fd5b506103126111c6565b3480156104f257600080fd5b506103566105013660046126e9565b6111e3565b34801561051257600080fd5b506103126105213660046123c3565b6111ee565b34801561053257600080fd5b506103e76105413660046123c3565b61127a565b34801561055257600080fd5b506103126112c8565b34801561056757600080fd5b506103e76112da565b34801561057c57600080fd5b5061059061058b3660046123c3565b6112f9565b6040516102ae9190612855565b3480156105a957600080fd5b506008546001600160a01b0316610356565b3480156105c757600080fd5b50610329611408565b3480156105dc57600080fd5b506105906105eb36600461257c565b611417565b3480156105fc57600080fd5b5061031261060b366004612528565b6115a2565b34801561061c57600080fd5b50600a546102a290600160e01b900460ff1681565b34801561063d57600080fd5b506103e7611638565b34801561065257600080fd5b50600a546102a290600160e81b900460ff1681565b34801561067357600080fd5b5061031261068236600461244d565b611652565b34801561069357600080fd5b506106a76106a23660046126e9565b611696565b6040516102ae9190612909565b3480156106c057600080fd5b506103126106cf3660046126e9565b61171e565b3480156106e057600080fd5b506103126106ef3660046126e9565b61174e565b34801561070057600080fd5b5061032961070f3660046126e9565b61177e565b610312610722366004612690565b611839565b34801561073357600080fd5b50600a5461074990600160a01b900461ffff1681565b60405161ffff90911681526020016102ae565b34801561076857600080fd5b506103126107773660046125af565b6119cc565b34801561078857600080fd5b50600a546102a290600160d81b900460ff1681565b3480156107a957600080fd5b50610312611a85565b3480156107be57600080fd5b506103126107cd366004612690565b611aa2565b3480156107de57600080fd5b506102a26107ed3660046123de565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561082757600080fd5b506103e766038d7ea4c6800081565b34801561084257600080fd5b506103126108513660046123c3565b611ae0565b34801561086257600080fd5b50610312611b59565b60006301ffc9a760e01b6001600160e01b03198316148061089c57506380ac58cd60e01b6001600160e01b03198316145b806108b75750635b5e139f60e01b6001600160e01b03198316145b92915050565b6108c5611b76565b600a54600160e01b900460ff16156108f85760405162461bcd60e51b81526004016108ef906128c1565b60405180910390fd5b600a805461ffff909216600160a01b0261ffff60a01b19909216919091179055565b60606002805461092990612944565b80601f016020809104026020016040519081016040528092919081815260200182805461095590612944565b80156109a25780601f10610977576101008083540402835291602001916109a2565b820191906000526020600020905b81548152906001019060200180831161098557829003601f168201915b5050505050905090565b60006109b782611bd0565b6109d4576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006109fb826111e3565b9050336001600160a01b03821614610a3457610a1781336107ed565b610a34576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610a98611b76565b600a548190600160d81b900460ff1615610ac45760405162461bcd60e51b81526004016108ef906128c1565b600a54600160a01b900461ffff1681610ae06000546000190190565b011115610aff5760405162461bcd60e51b81526004016108ef906128e2565b600860078316610b0f3382611c05565b838114610b2757610b203383611c05565b8101610b0f565b50505050565b610b35611b76565b80610bd457600a54600160a01b900461ffff16610b8a5760405162461bcd60e51b815260206004820152601360248201527226b0bc1039bab838363c903737ba1039b2ba1760691b60448201526064016108ef565b600a546001600160a01b0316610bd45760405162461bcd60e51b815260206004820152600f60248201526e29b4b3b732b9103737ba1039b2ba1760891b60448201526064016108ef565b600a8054911515600160d01b0260ff60d01b19909216919091179055565b6000610bfd82611cfc565b9050836001600160a01b0316816001600160a01b031614610c305760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610c7d57610c6086336107ed565b610c7d57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610ca457604051633a954ecd60e21b815260040160405180910390fd5b8015610caf57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040902055600160e11b8316610d3a5760018401600081815260046020526040902054610d38576000548114610d385760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b600a54600160d01b900460ff1615610dad5760405162461bcd60e51b81526004016108ef906128a0565b600a548190600160d81b900460ff1615610dd95760405162461bcd60e51b81526004016108ef906128c1565b600a54600160a01b900461ffff1681610df56000546000190190565b011115610e145760405162461bcd60e51b81526004016108ef906128e2565b600a54600160c01b900461ffff16826064811115610e695760405162461bcd60e51b815260206004820152601260248201527128bab0b73a34ba3c903a37b7903434b3b41760711b60448201526064016108ef565b80610e7383611d65565b023414610eb75760405162461bcd60e51b81526020600482015260126024820152712bb937b7339022ba3432b9103b30b63ab29760711b60448201526064016108ef565b610b273385611c05565b610ec9611b76565b610ed33347611d7c565b565b610ef083838360405180602001604052806000815250611652565b505050565b600a54600160d01b900460ff1615610f1f5760405162461bcd60e51b81526004016108ef906128a0565b600a548390600160d81b900460ff1615610f4b5760405162461bcd60e51b81526004016108ef906128c1565b600a54600160a01b900461ffff1681610f676000546000190190565b011115610f865760405162461bcd60e51b81526004016108ef906128e2565b600a5460408051336020820152859285926001600160a01b0390911691610ff99185918591610ff291015b604051602081830303815290604052805190602001206020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042090565b9190611d9c565b6001600160a01b0316146110445760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b21039b4b3b730ba3ab9329760711b60448201526064016108ef565b600a54600160b01b900461ffff168660648111156110995760405162461bcd60e51b815260206004820152601260248201527128bab0b73a34ba3c903a37b7903434b3b41760711b60448201526064016108ef565b806110a383611d65565b0234146110e75760405162461bcd60e51b81526020600482015260126024820152712bb937b7339022ba3432b9103b30b63ab29760711b60448201526064016108ef565b6110f13389611c05565b5050505050505050565b6060816000816001600160401b0381111561111857611118612995565b60405190808252806020026020018201604052801561116a57816020015b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816111365790505b50905060005b8281146111bd5761119886868381811061118c5761118c61297f565b90506020020135611696565b8282815181106111aa576111aa61297f565b6020908102919091010152600101611170565b50949350505050565b6111ce611b76565b600a805460ff60e81b1916600160e81b179055565b60006108b782611cfc565b6111f6611b76565b6001600160a01b0381166112585760405162461bcd60e51b8152602060048201526024808201527f5369676e6572206d757374206e6f7420626520746865207a65726f206164647260448201526332b9b99760e11b60648201526084016108ef565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166112a3576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6112d0611b76565b610ed36000611e3e565b600a546000906112f490600160b01b900461ffff16611d65565b905090565b606060008060006113098561127a565b90506000816001600160401b0381111561132557611325612995565b60405190808252806020026020018201604052801561134e578160200160208202803683370190505b50905061137b60408051608081018252600080825260208201819052918101829052606081019190915290565b60015b8386146113fc5761138e81611e90565b915081604001511561139f576113f4565b81516001600160a01b0316156113b457815194505b876001600160a01b0316856001600160a01b031614156113f457808387806001019850815181106113e7576113e761297f565b6020026020010181815250505b60010161137e565b50909695505050505050565b60606003805461092990612944565b606081831061143957604051631960ccad60e11b815260040160405180910390fd5b60008061144560005490565b9050600185101561145557600194505b80841115611461578093505b600061146c8761127a565b90508486101561148b5785850381811015611485578091505b5061148f565b5060005b6000816001600160401b038111156114a9576114a9612995565b6040519080825280602002602001820160405280156114d2578160200160208202803683370190505b509050816114e557935061159b92505050565b60006114f088611696565b905060008160400151611501575080515b885b8881141580156115135750848714155b1561158f5761152181611e90565b925082604001511561153257611587565b82516001600160a01b03161561154757825191505b8a6001600160a01b0316826001600160a01b03161415611587578084888060010199508151811061157a5761157a61297f565b6020026020010181815250505b600101611503565b50505092835250909150505b9392505050565b6001600160a01b0382163314156115cc5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546000906112f490600160c01b900461ffff16611d65565b61165d848484610bf2565b6001600160a01b0383163b15610b275761167984848484611ecc565b610b27576040516368d2bf6b60e11b815260040160405180910390fd5b60408051608081018252600080825260208201819052918101829052606081019190915260408051608081018252600080825260208201819052918101829052606081019190915260018310806116ef57506000548310155b156116fa5792915050565b61170383611e90565b90508060400151156117155792915050565b61159b83611fc3565b611726611b76565b61172f81611ff8565b600a60166101000a81548161ffff021916908361ffff16021790555050565b611756611b76565b61175f81611ff8565b600a60186101000a81548161ffff021916908361ffff16021790555050565b60606108b76009805461179090612944565b80601f01602080910402602001604051908101604052809291908181526020018280546117bc90612944565b80156118095780601f106117de57610100808354040283529160200191611809565b820191906000526020600020905b8154815290600101906020018083116117ec57829003601f168201915b5050505050604051806040016040528060048152602001637b69647d60e01b815250611834856120af565b6120f1565b600a54600160d01b900460ff16156118635760405162461bcd60e51b81526004016108ef906128a0565b600a54600190600160d81b900460ff16156118905760405162461bcd60e51b81526004016108ef906128c1565b600a54600160a01b900461ffff16816118ac6000546000190190565b0111156118cb5760405162461bcd60e51b81526004016108ef906128e2565b600a5460408051336020820152859285926001600160a01b03909116916118fa9185918591610ff29101610fb1565b6001600160a01b0316146119455760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b21039b4b3b730ba3ab9329760711b60448201526064016108ef565b3360009081526005602052604090205460c01c156119985760405162461bcd60e51b815260206004820152601060248201526f20b63932b0b23c9031b630b4b6b2b21760811b60448201526064016108ef565b33600090815260056020526040902080546001600160c01b0316600160c01b1790556119c5336001611c05565b5050505050565b6119d4611b76565b6119de8282612917565b600a54600160d81b900460ff1615611a085760405162461bcd60e51b81526004016108ef906128c1565b600a54600160a01b900461ffff1681611a246000546000190190565b011115611a435760405162461bcd60e51b81526004016108ef906128e2565b60005b8084146119c557611a7d858583818110611a6257611a6261297f565b9050602002016020810190611a7791906123c3565b84611c05565b600101611a46565b611a8d611b76565b600a805460ff60d81b1916600160d81b179055565b611aaa611b76565b600a54600160e81b900460ff1615611ad45760405162461bcd60e51b81526004016108ef906128c1565b610ef06009838361227b565b611ae8611b76565b6001600160a01b038116611b4d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ef565b611b5681611e3e565b50565b611b61611b76565b600a805460ff60e01b1916600160e01b179055565b6008546001600160a01b03163314610ed35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ef565b600081600111158015611be4575060005482105b80156108b7575050600090815260046020526040902054600160e01b161590565b60005481611c265760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114611cd557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611c9d565b5081611cf357604051622e076360e81b815260040160405180910390fd5b60005550505050565b60008180600111611d4c57600054811015611d4c57600081815260046020526040902054600160e01b8116611d4a575b8061159b575060001901600081815260046020526040902054611d2c565b505b604051636f96cda160e11b815260040160405180910390fd5b60006108b766038d7ea4c6800061ffff8416612917565b60008060008084865af1611d985763b12d13eb6000526004601cfd5b5050565b600060405160208401358360408114611dbc5760418114611dd757611de3565b601b8260ff1c016020526001600160ff1b0382169150611de3565b604086013560001a6020525b507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08111611e33578560005260208560403780606052602060406080600060015afa5060006060523d6060035192505b506040529392505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040805160808101825260008082526020820181905291810182905260608101919091526000828152600460205260409020546108b790612234565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611f019033908990889088906004016127d6565b602060405180830381600087803b158015611f1b57600080fd5b505af1925050508015611f4b575060408051601f3d908101601f19168201909252611f4891810190612673565b60015b611fa6573d808015611f79576040519150601f19603f3d011682016040523d82523d6000602084013e611f7e565b606091505b508051611f9e576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6040805160808101825260008082526020820181905291810182905260608101919091526108b7611ff383611cfc565b612234565b600066038d7ea4c680008206156120615760405162461bcd60e51b815260206004820152602760248201527f5072696365206d7573742062652061206d756c7469706c65206f66205052494360448201526622afaaa724aa1760c91b60648201526084016108ef565b61ffff66038d7ea4c68000830492508211156120ab5760405162461bcd60e51b815260206004820152600960248201526827bb32b9333637bb9760b91b60448201526064016108ef565b5090565b604080516080019081905280825b600183039250600a81066030018353600a9004806120da576120df565b6120bd565b50819003601f19909101908152919050565b606083518351835160208701965060208601955060208501945060206040510193508287018383116121e35760018382030160006020851061213257508388205b601f851660200360031b89515b8b51818118831c6121c15783156121795783888e201461217957808a5260019c8d019c90990198848d1061217357506121de565b5061213f565b60005b8b8101518b82015260200187811061219357612198565b61217c565b509b87019b98860198876121b457808a5260019c8d019c909901985b848d1061217357506121de565b895260019b8c019b90980197838c106121d9576121de565b61213f565b505050505b84935060206040510194508781038585030192505b808810156122135787518452602097880197909301926121f8565b5050601f196040820116830160405260208303925080835250509392505050565b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b82805461228790612944565b90600052602060002090601f0160209004810192826122a957600085556122ef565b82601f106122c25782800160ff198235161785556122ef565b828001600101855582156122ef579182015b828111156122ef5782358255916020019190600101906122d4565b506120ab9291505b808211156120ab57600081556001016122f7565b80356001600160a01b038116811461232257600080fd5b919050565b60008083601f84011261233957600080fd5b5081356001600160401b0381111561235057600080fd5b6020830191508360208260051b850101111561236b57600080fd5b9250929050565b8035801515811461232257600080fd5b60008083601f84011261239457600080fd5b5081356001600160401b038111156123ab57600080fd5b60208301915083602082850101111561236b57600080fd5b6000602082840312156123d557600080fd5b61159b8261230b565b600080604083850312156123f157600080fd5b6123fa8361230b565b91506124086020840161230b565b90509250929050565b60008060006060848603121561242657600080fd5b61242f8461230b565b925061243d6020850161230b565b9150604084013590509250925092565b6000806000806080858703121561246357600080fd5b61246c8561230b565b935061247a6020860161230b565b92506040850135915060608501356001600160401b038082111561249d57600080fd5b818701915087601f8301126124b157600080fd5b8135818111156124c3576124c3612995565b604051601f8201601f19908116603f011681019083821181831017156124eb576124eb612995565b816040528281528a602084870101111561250457600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561253b57600080fd5b6125448361230b565b915061240860208401612372565b6000806040838503121561256557600080fd5b61256e8361230b565b946020939093013593505050565b60008060006060848603121561259157600080fd5b61259a8461230b565b95602085013595506040909401359392505050565b6000806000604084860312156125c457600080fd5b83356001600160401b038111156125da57600080fd5b6125e686828701612327565b909790965060209590950135949350505050565b6000806020838503121561260d57600080fd5b82356001600160401b0381111561262357600080fd5b61262f85828601612327565b90969095509350505050565b60006020828403121561264d57600080fd5b61159b82612372565b60006020828403121561266857600080fd5b813561159b816129ab565b60006020828403121561268557600080fd5b815161159b816129ab565b600080602083850312156126a357600080fd5b82356001600160401b038111156126b957600080fd5b61262f85828601612382565b6000602082840312156126d757600080fd5b813561ffff8116811461159b57600080fd5b6000602082840312156126fb57600080fd5b5035919050565b60008060006040848603121561271757600080fd5b8335925060208401356001600160401b0381111561273457600080fd5b61274086828701612382565b9497909650939450505050565b6000815180845260005b8181101561277357602081850181015186830182015201612757565b81811115612785576000602083870101525b50601f01601f19169290920160200192915050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906128099083018461274d565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156113fc5761284283855161279a565b928401926080929092019160010161282f565b6020808252825182820181905260009190848201906040850190845b818110156113fc57835183529284019291840191600101612871565b60208152600061159b602083018461274d565b6020808252600790820152662830bab9b2b21760c91b604082015260600190565b6020808252600790820152662637b1b5b2b21760c91b604082015260600190565b6020808252600d908201526c4f7574206f662073746f636b2160981b604082015260600190565b608081016108b7828461279a565b600081600019048311821515161561293f57634e487b7160e01b600052601160045260246000fd5b500290565b600181811c9082168061295857607f821691505b6020821081141561297957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611b5657600080fdfea264697066735822122091802568b431d7df3e85c1b5b7eabc8f33ea2b8422dbc503174b375c16c8bdf264736f6c63430008070033

Deployed Bytecode Sourcemap

96454:6510:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53949:639;;;;;;;;;;-1:-1:-1;53949:639:0;;;;;:::i;:::-;;:::i;:::-;;;10332:14:1;;10325:22;10307:41;;10295:2;10280:18;53949:639:0;;;;;;;;98621:121;;;;;;;;;;-1:-1:-1;98621:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;52761:25:0;98689:4;52761:25;;;:18;:25;;;;;;46319:3;52761:40;98713:21;;;98621:121;101728:146;;;;;;;;;;-1:-1:-1;101728:146:0;;;;;:::i;:::-;;:::i;:::-;;54851:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;61334:218::-;;;;;;;;;;-1:-1:-1;61334:218:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8266:32:1;;;8248:51;;8236:2;8221:18;61334:218:0;8102:203:1;60775:400:0;;;;;;;;;;-1:-1:-1;60775:400:0;;;;;:::i;:::-;;:::i;101172:387::-;;;;;;;;;;-1:-1:-1;101172:387:0;;;;;:::i;:::-;;:::i;101882:249::-;;;;;;;;;;-1:-1:-1;101882:249:0;;;;;:::i;:::-;;:::i;50602:323::-;;;;;;;;;;-1:-1:-1;97265:1:0;50876:12;50663:7;50860:13;:28;-1:-1:-1;;50860:46:0;50602:323;;;16201:25:1;;;16189:2;16174:18;50602:323:0;16055:177:1;96646:21:0;;;;;;;;;;-1:-1:-1;96646:21:0;;;;-1:-1:-1;;;;;96646:21:0;;;65041:2817;;;;;;;;;;-1:-1:-1;65041:2817:0;;;;;:::i;:::-;;:::i;97739:240::-;;;;;;:::i;:::-;;:::i;102829:132::-;;;:::i;67954:185::-;;;;;;;;;;-1:-1:-1;67954:185:0;;;;;:::i;:::-;;:::i;97987:303::-;;;;;;:::i;:::-;;:::i;88008:528::-;;;;;;;;;;-1:-1:-1;88008:528:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;96790:18::-;;;;;;;;;;-1:-1:-1;96790:18:0;;;;-1:-1:-1;;;96790:18:0;;;;;;102488:83;;;;;;;;;;;;;:::i;56244:152::-;;;;;;;;;;-1:-1:-1;56244:152:0;;;;;:::i;:::-;;:::i;102139:165::-;;;;;;;;;;-1:-1:-1;102139:165:0;;;;;:::i;:::-;;:::i;51786:233::-;;;;;;;;;;-1:-1:-1;51786:233:0;;;;;:::i;:::-;;:::i;95567:103::-;;;;;;;;;;;;;:::i;98750:108::-;;;;;;;;;;;;;:::i;91884:900::-;;;;;;;;;;-1:-1:-1;91884:900:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;94919:87::-;;;;;;;;;;-1:-1:-1;94992:6:0;;-1:-1:-1;;;;;94992:6:0;94919:87;;55027:104;;;;;;;;;;;;;:::i;88924:2513::-;;;;;;;;;;-1:-1:-1;88924:2513:0;;;;;:::i;:::-;;:::i;61892:308::-;;;;;;;;;;-1:-1:-1;61892:308:0;;;;;:::i;:::-;;:::i;96848:27::-;;;;;;;;;;-1:-1:-1;96848:27:0;;;;-1:-1:-1;;;96848:27:0;;;;;;98866:108;;;;;;;;;;;;;:::i;96884:26::-;;;;;;;;;;-1:-1:-1;96884:26:0;;;;-1:-1:-1;;;96884:26:0;;;;;;68737:399;;;;;;;;;;-1:-1:-1;68737:399:0;;;;;:::i;:::-;;:::i;87421:428::-;;;;;;;;;;-1:-1:-1;87421:428:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;102579:117::-;;;;;;;;;;-1:-1:-1;102579:117:0;;;;;:::i;:::-;;:::i;102704:::-;;;;;;;;;;-1:-1:-1;102704:117:0;;;;;:::i;:::-;;:::i;97282:162::-;;;;;;;;;;-1:-1:-1;97282:162:0;;;;;:::i;:::-;;:::i;98298:315::-;;;;;;:::i;:::-;;:::i;96676:23::-;;;;;;;;;;-1:-1:-1;96676:23:0;;;;-1:-1:-1;;;96676:23:0;;;;;;;;;16036:6:1;16024:19;;;16006:38;;15994:2;15979:18;96676:23:0;15862:188:1;100867:297:0;;;;;;;;;;-1:-1:-1;100867:297:0;;;;;:::i;:::-;;:::i;96817:22::-;;;;;;;;;;-1:-1:-1;96817:22:0;;;;-1:-1:-1;;;96817:22:0;;;;;;102312:75;;;;;;;;;;;;;:::i;101567:153::-;;;;;;;;;;-1:-1:-1;101567:153:0;;;;;:::i;:::-;;:::i;62357:164::-;;;;;;;;;;-1:-1:-1;62357:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;62478:25:0;;;62454:4;62478:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;62357:164;96556:48;;;;;;;;;;;;96593:11;96556:48;;95825:201;;;;;;;;;;-1:-1:-1;95825:201:0;;;;;:::i;:::-;;:::i;102395:85::-;;;;;;;;;;;;;:::i;53949:639::-;54034:4;-1:-1:-1;;;;;;;;;54358:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;54435:25:0;;;54358:102;:179;;;-1:-1:-1;;;;;;;;;;54512:25:0;;;54358:179;54338:199;53949:639;-1:-1:-1;;53949:639:0:o;101728:146::-;94805:13;:11;:13::i;:::-;101802:15:::1;::::0;-1:-1:-1;;;101802:15:0;::::1;;;:24;101794:44;;;;-1:-1:-1::0;;;101794:44:0::1;;;;;;;:::i;:::-;;;;;;;;;101849:9;:17:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;101849:17:0::1;-1:-1:-1::0;;;;101849:17:0;;::::1;::::0;;;::::1;::::0;;101728:146::o;54851:100::-;54905:13;54938:5;54931:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54851:100;:::o;61334:218::-;61410:7;61435:16;61443:7;61435;:16::i;:::-;61430:64;;61460:34;;-1:-1:-1;;;61460:34:0;;;;;;;;;;;61430:64;-1:-1:-1;61514:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;61514:30:0;;61334:218::o;60775:400::-;60856:13;60872:16;60880:7;60872;:16::i;:::-;60856:32;-1:-1:-1;84632:10:0;-1:-1:-1;;;;;60905:28:0;;;60901:175;;60953:44;60970:5;84632:10;62357:164;:::i;60953:44::-;60948:128;;61025:35;;-1:-1:-1;;;61025:35:0;;;;;;;;;;;60948:128;61088:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;61088:35:0;-1:-1:-1;;;;;61088:35:0;;;;;;;;;61139:28;;61088:24;;61139:28;;;;;;;60845:330;60775:400;;:::o;101172:387::-;94805:13;:11;:13::i;:::-;99809:10:::1;::::0;101243:8;;-1:-1:-1;;;99809:10:0;::::1;;;:19;99801:39;;;;-1:-1:-1::0;;;99801:39:0::1;;;;;;;:::i;:::-;99892:9;::::0;-1:-1:-1;;;99892:9:0;::::1;;;99880:8:::0;99863:14:::1;51078:7:::0;51269:13;-1:-1:-1;;51269:31:0;;51023:296;99863:14:::1;:25;:38;;99855:64;;;;-1:-1:-1::0;;;99855:64:0::1;;;;;;;:::i;:::-;101313:1:::2;101341:24:::0;;;101380:20:::2;101386:10;101341:24:::0;101380:5:::2;:20::i;:::-;101427:8;101422:1;:13;101415:126;;101456:32;101462:10;101474:13;101456:5;:32::i;:::-;101507:18:::0;::::2;101415:126;;;101264:288;;94829:1:::1;101172:387:::0;:::o;101882:249::-;94805:13;:11;:13::i;:::-;101947:14;101943:156:::1;;101986:9;::::0;-1:-1:-1;;;101986:9:0;::::1;;;101978:46;;;::::0;-1:-1:-1;;;101978:46:0;;11539:2:1;101978:46:0::1;::::0;::::1;11521:21:1::0;11578:2;11558:18;;;11551:30;-1:-1:-1;;;11597:18:1;;;11590:49;11656:18;;101978:46:0::1;11337:343:1::0;101978:46:0::1;102047:6;::::0;-1:-1:-1;;;;;102047:6:0::1;102039:48;;;::::0;-1:-1:-1;;;102039:48:0;;15449:2:1;102039:48:0::1;::::0;::::1;15431:21:1::0;15488:2;15468:18;;;15461:30;-1:-1:-1;;;15507:18:1;;;15500:45;15562:18;;102039:48:0::1;15247:339:1::0;102039:48:0::1;102109:6;:14:::0;;;::::1;;-1:-1:-1::0;;;102109:14:0::1;-1:-1:-1::0;;;;102109:14:0;;::::1;::::0;;;::::1;::::0;;101882:249::o;65041:2817::-;65175:27;65205;65224:7;65205:18;:27::i;:::-;65175:57;;65290:4;-1:-1:-1;;;;;65249:45:0;65265:19;-1:-1:-1;;;;;65249:45:0;;65245:86;;65303:28;;-1:-1:-1;;;65303:28:0;;;;;;;;;;;65245:86;65345:27;64155:24;;;:15;:24;;;;;64377:26;;84632:10;63780:30;;;-1:-1:-1;;;;;63473:28:0;;63758:20;;;63755:56;65531:180;;65624:43;65641:4;84632:10;62357:164;:::i;65624:43::-;65619:92;;65676:35;;-1:-1:-1;;;65676:35:0;;;;;;;;;;;65619:92;-1:-1:-1;;;;;65728:16:0;;65724:52;;65753:23;;-1:-1:-1;;;65753:23:0;;;;;;;;;;;65724:52;65925:15;65922:160;;;66065:1;66044:19;66037:30;65922:160;-1:-1:-1;;;;;66462:24:0;;;;;;;:18;:24;;;;;;66460:26;;-1:-1:-1;;66460:26:0;;;66531:22;;;;;;;;;66529:24;;-1:-1:-1;66529:24:0;;;59633:11;59608:23;59604:41;59591:63;-1:-1:-1;;;59591:63:0;66824:26;;;;:17;:26;;;;;:175;-1:-1:-1;;;67119:47:0;;67115:627;;67224:1;67214:11;;67192:19;67347:30;;;:17;:30;;;;;;67343:384;;67485:13;;67470:11;:28;67466:242;;67632:30;;;;:17;:30;;;;;:52;;;67466:242;67173:569;67115:627;67789:7;67785:2;-1:-1:-1;;;;;67770:27:0;67779:4;-1:-1:-1;;;;;67770:27:0;;;;;;;;;;;65164:2694;;;65041:2817;;;:::o;97739:240::-;100525:6;;-1:-1:-1;;;100525:6:0;;;;:15;100517:35;;;;-1:-1:-1;;;100517:35:0;;;;;;;:::i;:::-;99809:10:::1;::::0;97860:8;;-1:-1:-1;;;99809:10:0;::::1;;;:19;99801:39;;;;-1:-1:-1::0;;;99801:39:0::1;;;;;;;:::i;:::-;99892:9;::::0;-1:-1:-1;;;99892:9:0;::::1;;;99880:8:::0;99863:14:::1;51078:7:::0;51269:13;-1:-1:-1;;51269:31:0;;51023:296;99863:14:::1;:25;:38;;99855:64;;;;-1:-1:-1::0;;;99855:64:0::1;;;;;;;:::i;:::-;97899:17:::2;::::0;-1:-1:-1;;;97899:17:0;::::2;;;97918:8:::0;100080:3:::2;100068:15:::0;::::2;;100060:46;;;::::0;-1:-1:-1;;;100060:46:0;;10785:2:1;100060:46:0::2;::::0;::::2;10767:21:1::0;10824:2;10804:18;;;10797:30;-1:-1:-1;;;10843:18:1;;;10836:48;10901:18;;100060:46:0::2;10583:342:1::0;100060:46:0::2;100165:8;100142:20;100151:10;100142:8;:20::i;:::-;:31;100129:9;:44;100121:75;;;::::0;-1:-1:-1;;;100121:75:0;;13380:2:1;100121:75:0::2;::::0;::::2;13362:21:1::0;13419:2;13399:18;;;13392:30;-1:-1:-1;;;13438:18:1;;;13431:48;13496:18;;100121:75:0::2;13178:342:1::0;100121:75:0::2;97944:27:::3;97950:10;97962:8;97944:5;:27::i;102829:132::-:0;94805:13;:11;:13::i;:::-;102887:66:::1;102919:10;102931:21;102887:31;:66::i;:::-;102829:132::o:0;67954:185::-;68092:39;68109:4;68115:2;68119:7;68092:39;;;;;;;;;;;;:16;:39::i;:::-;67954:185;;;:::o;97987:303::-;100525:6;;-1:-1:-1;;;100525:6:0;;;;:15;100517:35;;;;-1:-1:-1;;;100517:35:0;;;;;;;:::i;:::-;99809:10:::1;::::0;98134:8;;-1:-1:-1;;;99809:10:0;::::1;;;:19;99801:39;;;;-1:-1:-1::0;;;99801:39:0::1;;;;;;;:::i;:::-;99892:9;::::0;-1:-1:-1;;;99892:9:0;::::1;;;99880:8:::0;99863:14:::1;51078:7:::0;51269:13;-1:-1:-1;;51269:31:0;;51023:296;99863:14:::1;:25;:38;;99855:64;;;;-1:-1:-1::0;;;99855:64:0::1;;;;;;;:::i;:::-;100401:6:::2;::::0;100330:22:::2;::::0;;100341:10:::2;100330:22;::::0;::::2;8248:51:1::0;98170:9:0;;;;-1:-1:-1;;;;;100401:6:0;;::::2;::::0;100320:77:::2;::::0;98170:9;;;;100320:58:::2;::::0;8221:18:1;100330:22:0::2;;;;;;;;;;;;;100320:33;;;;;;21470:4:::0;21463:18;21508:50;21356:14;21495:64;21634:4;21628;21618:21;;21287:370;100320:58:::2;:66:::0;:77;:66:::2;:77::i;:::-;-1:-1:-1::0;;;;;100320:87:0::2;;100298:155;;;::::0;-1:-1:-1;;;100298:155:0;;14760:2:1;100298:155:0::2;::::0;::::2;14742:21:1::0;14799:2;14779:18;;;14772:30;-1:-1:-1;;;14818:18:1;;;14811:48;14876:18;;100298:155:0::2;14558:342:1::0;100298:155:0::2;98210:17:::3;::::0;-1:-1:-1;;;98210:17:0;::::3;;;98229:8:::0;100080:3:::3;100068:15:::0;::::3;;100060:46;;;::::0;-1:-1:-1;;;100060:46:0;;10785:2:1;100060:46:0::3;::::0;::::3;10767:21:1::0;10824:2;10804:18;;;10797:30;-1:-1:-1;;;10843:18:1;;;10836:48;10901:18;;100060:46:0::3;10583:342:1::0;100060:46:0::3;100165:8;100142:20;100151:10;100142:8;:20::i;:::-;:31;100129:9;:44;100121:75;;;::::0;-1:-1:-1;;;100121:75:0;;13380:2:1;100121:75:0::3;::::0;::::3;13362:21:1::0;13419:2;13399:18;;;13392:30;-1:-1:-1;;;13438:18:1;;;13431:48;13496:18;;100121:75:0::3;13178:342:1::0;100121:75:0::3;98255:27:::4;98261:10;98273:8;98255:5;:27::i;:::-;100464:1:::3;;99941::::2;;100563::::1;97987:303:::0;;;:::o;88008:528::-;88152:23;88243:8;88218:22;88243:8;-1:-1:-1;;;;;88310:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88310:36:0;;-1:-1:-1;;88310:36:0;;;;;;;;;;;;88273:73;;88366:9;88361:125;88382:14;88377:1;:19;88361:125;;88438:32;88458:8;;88467:1;88458:11;;;;;;;:::i;:::-;;;;;;;88438:19;:32::i;:::-;88422:10;88433:1;88422:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;88398:3;;88361:125;;;-1:-1:-1;88507:10:0;88008:528;-1:-1:-1;;;;88008:528:0:o;102488:83::-;94805:13;:11;:13::i;:::-;102542:14:::1;:21:::0;;-1:-1:-1;;;;102542:21:0::1;-1:-1:-1::0;;;102542:21:0::1;::::0;;102488:83::o;56244:152::-;56316:7;56359:27;56378:7;56359:18;:27::i;102139:165::-;94805:13;:11;:13::i;:::-;-1:-1:-1;;;;;102211:19:0;::::1;102203:68;;;::::0;-1:-1:-1;;;102203:68:0;;12630:2:1;102203:68:0::1;::::0;::::1;12612:21:1::0;12669:2;12649:18;;;12642:30;12708:34;12688:18;;;12681:62;-1:-1:-1;;;12759:18:1;;;12752:34;12803:19;;102203:68:0::1;12428:400:1::0;102203:68:0::1;102282:6;:14:::0;;-1:-1:-1;;;;;;102282:14:0::1;-1:-1:-1::0;;;;;102282:14:0;;;::::1;::::0;;;::::1;::::0;;102139:165::o;51786:233::-;51858:7;-1:-1:-1;;;;;51882:19:0;;51878:60;;51910:28;;-1:-1:-1;;;51910:28:0;;;;;;;;;;;51878:60;-1:-1:-1;;;;;;51956:25:0;;;;;:18;:25;;;;;;-1:-1:-1;;;;;51956:55:0;;51786:233::o;95567:103::-;94805:13;:11;:13::i;:::-;95632:30:::1;95659:1;95632:18;:30::i;98750:108::-:0;98832:17;;98796:7;;98823:27;;-1:-1:-1;;;98832:17:0;;;;98823:8;:27::i;:::-;98816:34;;98750:108;:::o;91884:900::-;91962:16;92016:19;92050:25;92090:22;92115:16;92125:5;92115:9;:16::i;:::-;92090:41;;92146:25;92188:14;-1:-1:-1;;;;;92174:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;92174:29:0;;92146:57;;92218:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92218:31:0;97265:1;92264:472;92313:14;92298:11;:29;92264:472;;92365:15;92378:1;92365:12;:15::i;:::-;92353:27;;92403:9;:16;;;92399:73;;;92444:8;;92399:73;92494:14;;-1:-1:-1;;;;;92494:28:0;;92490:111;;92567:14;;;-1:-1:-1;92490:111:0;92644:5;-1:-1:-1;;;;;92623:26:0;:17;-1:-1:-1;;;;;92623:26:0;;92619:102;;;92700:1;92674:8;92683:13;;;;;;92674:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;92619:102;92329:3;;92264:472;;;-1:-1:-1;92757:8:0;;91884:900;-1:-1:-1;;;;;;91884:900:0:o;55027:104::-;55083:13;55116:7;55109:14;;;;;:::i;88924:2513::-;89067:16;89134:4;89125:5;:13;89121:45;;89147:19;;-1:-1:-1;;;89147:19:0;;;;;;;;;;;89121:45;89181:19;89215:17;89235:14;50344:7;50371:13;;50289:103;89235:14;89215:34;-1:-1:-1;97265:1:0;89327:5;:23;89323:87;;;97265:1;89371:23;;89323:87;89486:9;89479:4;:16;89475:73;;;89523:9;89516:16;;89475:73;89562:25;89590:16;89600:5;89590:9;:16::i;:::-;89562:44;;89784:4;89776:5;:12;89772:278;;;89831:12;;;89866:31;;;89862:111;;;89942:11;89922:31;;89862:111;89790:198;89772:278;;;-1:-1:-1;90033:1:0;89772:278;90064:25;90106:17;-1:-1:-1;;;;;90092:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;90092:32:0;-1:-1:-1;90064:60:0;-1:-1:-1;90143:22:0;90139:78;;90193:8;-1:-1:-1;90186:15:0;;-1:-1:-1;;;90186:15:0;90139:78;90361:31;90395:26;90415:5;90395:19;:26::i;:::-;90361:60;;90436:25;90681:9;:16;;;90676:92;;-1:-1:-1;90738:14:0;;90676:92;90799:5;90782:478;90811:4;90806:1;:9;;:45;;;;;90834:17;90819:11;:32;;90806:45;90782:478;;;90889:15;90902:1;90889:12;:15::i;:::-;90877:27;;90927:9;:16;;;90923:73;;;90968:8;;90923:73;91018:14;;-1:-1:-1;;;;;91018:28:0;;91014:111;;91091:14;;;-1:-1:-1;91014:111:0;91168:5;-1:-1:-1;;;;;91147:26:0;:17;-1:-1:-1;;;;;91147:26:0;;91143:102;;;91224:1;91198:8;91207:13;;;;;;91198:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;91143:102;90853:3;;90782:478;;;-1:-1:-1;;;91345:29:0;;;-1:-1:-1;91352:8:0;;-1:-1:-1;;88924:2513:0;;;;;;:::o;61892:308::-;-1:-1:-1;;;;;61991:31:0;;84632:10;61991:31;61987:61;;;62031:17;;-1:-1:-1;;;62031:17:0;;;;;;;;;;;61987:61;84632:10;62061:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;62061:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;62061:60:0;;;;;;;;;;62137:55;;10307:41:1;;;62061:49:0;;84632:10;62137:55;;10280:18:1;62137:55:0;;;;;;;61892:308;;:::o;98866:108::-;98948:17;;98912:7;;98939:27;;-1:-1:-1;;;98948:17:0;;;;98939:8;:27::i;68737:399::-;68904:31;68917:4;68923:2;68927:7;68904:12;:31::i;:::-;-1:-1:-1;;;;;68950:14:0;;;:19;68946:183;;68989:56;69020:4;69026:2;69030:7;69039:5;68989:30;:56::i;:::-;68984:145;;69073:40;;-1:-1:-1;;;69073:40:0;;;;;;;;;;;87421:428;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97265:1:0;87585:7;:25;:54;;;-1:-1:-1;50344:7:0;50371:13;87614:7;:25;;87585:54;87581:103;;;87663:9;87421:428;-1:-1:-1;;87421:428:0:o;87581:103::-;87706:21;87719:7;87706:12;:21::i;:::-;87694:33;;87742:9;:16;;;87738:65;;;87782:9;87421:428;-1:-1:-1;;87421:428:0:o;87738:65::-;87820:21;87833:7;87820:12;:21::i;102579:117::-;94805:13;:11;:13::i;:::-;102668:20:::1;102682:5;102668:13;:20::i;:::-;102648:17;;:40;;;;;;;;;;;;;;;;;;102579:117:::0;:::o;102704:::-;94805:13;:11;:13::i;:::-;102793:20:::1;102807:5;102793:13;:20::i;:::-;102773:17;;:40;;;;;;;;;;;;;;;;;;102704:117:::0;:::o;97282:162::-;97347:13;97380:56;97398:9;97380:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;97380:56:0;;;97417:18;97427:7;97417:9;:18::i;:::-;97380:17;:56::i;98298:315::-;100525:6;;-1:-1:-1;;;100525:6:0;;;;:15;100517:35;;;;-1:-1:-1;;;100517:35:0;;;;;;;:::i;:::-;99809:10:::1;::::0;98430:1:::1;::::0;-1:-1:-1;;;99809:10:0;::::1;;;:19;99801:39;;;;-1:-1:-1::0;;;99801:39:0::1;;;;;;;:::i;:::-;99892:9;::::0;-1:-1:-1;;;99892:9:0;::::1;;;99880:8:::0;99863:14:::1;51078:7:::0;51269:13;-1:-1:-1;;51269:31:0;;51023:296;99863:14:::1;:25;:38;;99855:64;;;;-1:-1:-1::0;;;99855:64:0::1;;;;;;;:::i;:::-;100401:6:::2;::::0;100330:22:::2;::::0;;100341:10:::2;100330:22;::::0;::::2;8248:51:1::0;98459:9:0;;;;-1:-1:-1;;;;;100401:6:0;;::::2;::::0;100320:77:::2;::::0;98459:9;;;;100320:58:::2;::::0;8221:18:1;100330:22:0::2;8102:203:1::0;100320:77:0::2;-1:-1:-1::0;;;;;100320:87:0::2;;100298:155;;;::::0;-1:-1:-1;;;100298:155:0;;14760:2:1;100298:155:0::2;::::0;::::2;14742:21:1::0;14799:2;14779:18;;;14772:30;-1:-1:-1;;;14818:18:1;;;14811:48;14876:18;;100298:155:0::2;14558:342:1::0;100298:155:0::2;98502:10:::3;52728:6:::0;52761:25;;;:18;:25;;;;;;46319:3;52761:40;98494:24;98486:53:::3;;;::::0;-1:-1:-1;;;98486:53:0;;13035:2:1;98486:53:0::3;::::0;::::3;13017:21:1::0;13074:2;13054:18;;;13047:30;-1:-1:-1;;;13093:18:1;;;13086:46;13149:18;;98486:53:0::3;12833:340:1::0;98486:53:0::3;98558:10;53070:14:::0;53087:25;;;:18;:25;;;;;;;-1:-1:-1;;;;;53287:32:0;-1:-1:-1;;;53286:63:0;53360:34;;98585:20:::3;98591:10;98603:1;98585:5;:20::i;:::-;99941:1:::2;;100563::::1;98298:315:::0;;:::o;100867:297::-;94805:13;:11;:13::i;:::-;100989:20:::1;101000:2:::0;100989:8;:20:::1;:::i;:::-;99809:10;::::0;-1:-1:-1;;;99809:10:0;::::1;;;:19;99801:39;;;;-1:-1:-1::0;;;99801:39:0::1;;;;;;;:::i;:::-;99892:9;::::0;-1:-1:-1;;;99892:9:0;::::1;;;99880:8:::0;99863:14:::1;51078:7:::0;51269:13;-1:-1:-1;;51269:31:0;;51023:296;99863:14:::1;:25;:38;;99855:64;;;;-1:-1:-1::0;;;99855:64:0::1;;;;;;;:::i;:::-;101057:9:::2;101052:94;101068:14:::0;;::::2;101052:94;;101108:22;101114:2;;101117:1;101114:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;101121:8;101108:5;:22::i;:::-;101084:3;;101052:94;;102312:75:::0;94805:13;:11;:13::i;:::-;102362:10:::1;:17:::0;;-1:-1:-1;;;;102362:17:0::1;-1:-1:-1::0;;;102362:17:0::1;::::0;;102312:75::o;101567:153::-;94805:13;:11;:13::i;:::-;101649:14:::1;::::0;-1:-1:-1;;;101649:14:0;::::1;;;:23;101641:43;;;;-1:-1:-1::0;;;101641:43:0::1;;;;;;;:::i;:::-;101695:17;:9;101707:5:::0;;101695:17:::1;:::i;95825:201::-:0;94805:13;:11;:13::i;:::-;-1:-1:-1;;;;;95914:22:0;::::1;95906:73;;;::::0;-1:-1:-1;;;95906:73:0;;11132:2:1;95906:73:0::1;::::0;::::1;11114:21:1::0;11171:2;11151:18;;;11144:30;11210:34;11190:18;;;11183:62;-1:-1:-1;;;11261:18:1;;;11254:36;11307:19;;95906:73:0::1;10930:402:1::0;95906:73:0::1;95990:28;96009:8;95990:18;:28::i;:::-;95825:201:::0;:::o;102395:85::-;94805:13;:11;:13::i;:::-;102450:15:::1;:22:::0;;-1:-1:-1;;;;102450:22:0::1;-1:-1:-1::0;;;102450:22:0::1;::::0;;102395:85::o;95084:132::-;94992:6;;-1:-1:-1;;;;;94992:6:0;84632:10;95148:23;95140:68;;;;-1:-1:-1;;;95140:68:0;;14399:2:1;95140:68:0;;;14381:21:1;;;14418:18;;;14411:30;14477:34;14457:18;;;14450:62;14529:18;;95140:68:0;14197:356:1;62779:282:0;62844:4;62900:7;97265:1;62881:26;;:66;;;;;62934:13;;62924:7;:23;62881:66;:153;;;;-1:-1:-1;;62985:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;62985:44:0;:49;;62779:282::o;72398:2454::-;72471:20;72494:13;72522;72518:44;;72544:18;;-1:-1:-1;;;72544:18:0;;;;;;;;;;;72518:44;-1:-1:-1;;;;;73050:22:0;;;;;;:18;:22;;;;46083:2;73050:22;;;:71;;73088:32;73076:45;;73050:71;;;73364:31;;;:17;:31;;;;;-1:-1:-1;60064:15:0;;60038:24;60034:46;59633:11;59608:23;59604:41;59601:52;59591:63;;73364:173;;73599:23;;;;73364:31;;73050:22;;74098:25;73050:22;;73951:335;74366:1;74352:12;74348:20;74306:346;74407:3;74398:7;74395:16;74306:346;;74625:7;74615:8;74612:1;74585:25;74582:1;74579;74574:59;74460:1;74447:15;74306:346;;;-1:-1:-1;74685:13:0;74681:45;;74707:19;;-1:-1:-1;;;74707:19:0;;;;;;;;;;;74681:45;74743:13;:19;-1:-1:-1;67954:185:0;;;:::o;57399:1275::-;57466:7;57501;;97265:1;57550:23;57546:1061;;57603:13;;57596:4;:20;57592:1015;;;57641:14;57658:23;;;:17;:23;;;;;;-1:-1:-1;;;57747:24:0;;57743:845;;58412:113;58419:11;58412:113;;-1:-1:-1;;;58490:6:0;58472:25;;;;:17;:25;;;;;;58412:113;;57743:845;57618:989;57592:1015;58635:31;;-1:-1:-1;;;58635:31:0;;;;;;;;;;;99588:126;99647:7;99674:32;96593:11;99674:19;;;:32;:::i;1273:445::-;1480:1;1477;1474;1471;1463:6;1459:2;1452:5;1447:35;1437:263;;1590:10;1584:4;1577:24;1680:4;1674;1667:18;1437:263;1273:445;;:::o;19181:2098::-;19261:14;19405:4;19399:11;19521:4;19503:16;19499:27;19486:41;19550:16;19585:2;19580:368;;;;19967:2;19962:173;;;;19543:592;;19580:368;19796:2;19792:1;19787:3;19783:11;19779:20;19773:4;19766:34;-1:-1:-1;;;;;19863:1:0;19859:74;19854:79;;19580:368;;19962:173;20112:4;20094:16;20090:27;20077:41;20074:1;20069:50;20063:4;20056:64;19543:592;;20285:66;20282:1;20279:73;20269:914;;20386:4;20380;20373:18;20446:4;20428:16;20422:4;20409:42;20509:1;20503:4;20496:15;20875:4;20824;20775;20725;20667;20592:5;20555:366;20529:411;21014:1;21008:4;21001:15;21150:16;21144:4;21140:27;21134:34;21124:44;;20269:914;-1:-1:-1;21253:4:0;21246:15;19181:2098;;-1:-1:-1;;;19181:2098:0:o;96186:191::-;96279:6;;;-1:-1:-1;;;;;96296:17:0;;;-1:-1:-1;;;;;;96296:17:0;;;;;;;96329:40;;96279:6;;;96296:17;96279:6;;96329:40;;96260:16;;96329:40;96249:128;96186:191;:::o;56847:161::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56975:24:0;;;;:17;:24;;;;;;56956:44;;:18;:44::i;71220:716::-;71404:88;;-1:-1:-1;;;71404:88:0;;71383:4;;-1:-1:-1;;;;;71404:45:0;;;;;:88;;84632:10;;71471:4;;71477:7;;71486:5;;71404:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71404:88:0;;;;;;;;-1:-1:-1;;71404:88:0;;;;;;;;;;;;:::i;:::-;;;71400:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71687:13:0;;71683:235;;71733:40;;-1:-1:-1;;;71733:40:0;;;;;;;;;;;71683:235;71876:6;71870:13;71861:6;71857:2;71853:15;71846:38;71400:529;-1:-1:-1;;;;;;71563:64:0;-1:-1:-1;;;71563:64:0;;-1:-1:-1;71220:716:0;;;;;;:::o;56585:166::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56696:47:0;56715:27;56734:7;56715:18;:27::i;:::-;56696:18;:47::i;99269:311::-;99329:6;96593:11;99381:5;:18;:23;99373:75;;;;-1:-1:-1;;;99373:75:0;;12222:2:1;99373:75:0;;;12204:21:1;12261:2;12241:18;;;12234:30;12300:34;12280:18;;;12273:62;-1:-1:-1;;;12351:18:1;;;12344:37;12398:19;;99373:75:0;12020:403:1;99373:75:0;99496:16;96593:11;99472:19;;;;;99471:41;;99463:63;;;;-1:-1:-1;;;99463:63:0;;13727:2:1;99463:63:0;;;13709:21:1;13766:1;13746:18;;;13739:29;-1:-1:-1;;;13784:18:1;;;13777:39;13833:18;;99463:63:0;13525:332:1;99463:63:0;-1:-1:-1;99555:5:0;99269:311::o;84752:1581::-;85235:4;85229:11;;85242:4;85225:22;85321:17;;;;85225:22;85679:5;85661:428;85727:1;85722:3;85718:11;85711:18;;85898:2;85892:4;85888:13;85884:2;85880:22;85875:3;85867:36;85992:2;85982:13;;;86049:25;;86067:5;;86049:25;85661:428;;;-1:-1:-1;86119:13:0;;;-1:-1:-1;;86234:14:0;;;86296:19;;;86234:14;84752:1581;-1:-1:-1;84752:1581:0:o;14865:3831::-;15011:20;15095:7;15089:14;15143:6;15137:13;15195:11;15189:18;15247:4;15238:7;15234:18;15223:29;;15288:4;15280:6;15276:17;15266:27;;15339:4;15326:11;15322:22;15307:37;;15385:4;15378;15372:11;15368:22;15358:32;;15437:13;15428:7;15424:27;15492:13;15478:12;15475:31;15465:2462;;15586:1;15571:12;15559:10;15555:29;15551:37;15615:1;15661:2;15647:12;15644:20;15634:110;;-1:-1:-1;15694:31:0;;;15634:110;15804:2;15790:12;15786:21;15782:2;15778:30;15775:1;15771:38;15842:6;15836:13;15903:2009;15953:7;15947:14;16135:1;16132;16128:9;16125:1;16121:17;16111:1537;;16170:1;16167:493;;;16250:1;16235:12;16226:7;16216:32;16213:39;16203:430;;16289:17;;;16362:1;16409:15;;;;16350:14;;;;16520:29;;;16510:50;;16553:5;;;16510:50;16594:8;15903:2009;;16203:430;16816:1;16801:302;16885:19;;;16879:26;16863:14;;;16856:50;16948:4;16941:12;17041:24;;;17031:45;;17069:5;;17031:45;16801:302;;;-1:-1:-1;17206:26:0;;;;17139:30;;;;17219:12;17262:209;;17317:17;;;17386:1;17429:15;;;;17374:14;;;;17262:209;17563:16;17554:7;17551:29;17541:50;;17584:5;;;16111:1537;17670:17;;17731:1;17766:15;;;;17719:14;;;;17853:29;;;17843:50;;17886:5;;17843:50;15903:2009;;;15907:2;;;;15465:2462;17966:6;17943:29;;18013:4;18006;18000:11;17996:22;17986:32;;18091:7;18079:10;18075:24;18066:6;18049:15;18045:28;18041:59;18032:68;;18210:217;18229:10;18220:7;18217:23;18210:217;;;18287:14;;18263:39;;18360:4;18394:18;;;;18339:26;;;;18210:217;;;18214:2;;18598:4;18594:9;18587:4;18584:1;18580:12;18576:28;18568:6;18564:41;18558:4;18551:55;18642:4;18634:6;18630:17;18620:27;;18676:1;18668:6;18661:17;;;14865:3831;;;;;:::o;58773:366::-;-1:-1:-1;;;;;;;;;;;;;58883:41:0;;;;46604:3;58969:33;;;-1:-1:-1;;;;;58935:68:0;-1:-1:-1;;;58935:68:0;-1:-1:-1;;;59033:24:0;;:29;;-1:-1:-1;;;59014:48:0;;;;47125:3;59102:28;;;;-1:-1:-1;;;59073:58:0;-1:-1:-1;58773:366:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:367::-;255:8;265:6;319:3;312:4;304:6;300:17;296:27;286:55;;337:1;334;327:12;286:55;-1:-1:-1;360:20:1;;-1:-1:-1;;;;;392:30:1;;389:50;;;435:1;432;425:12;389:50;472:4;464:6;460:17;448:29;;532:3;525:4;515:6;512:1;508:14;500:6;496:27;492:38;489:47;486:67;;;549:1;546;539:12;486:67;192:367;;;;;:::o;564:160::-;629:20;;685:13;;678:21;668:32;;658:60;;714:1;711;704:12;729:347;780:8;790:6;844:3;837:4;829:6;825:17;821:27;811:55;;862:1;859;852:12;811:55;-1:-1:-1;885:20:1;;-1:-1:-1;;;;;917:30:1;;914:50;;;960:1;957;950:12;914:50;997:4;989:6;985:17;973:29;;1049:3;1042:4;1033:6;1025;1021:19;1017:30;1014:39;1011:59;;;1066:1;1063;1056:12;1081:186;1140:6;1193:2;1181:9;1172:7;1168:23;1164:32;1161:52;;;1209:1;1206;1199:12;1161:52;1232:29;1251:9;1232:29;:::i;1272:260::-;1340:6;1348;1401:2;1389:9;1380:7;1376:23;1372:32;1369:52;;;1417:1;1414;1407:12;1369:52;1440:29;1459:9;1440:29;:::i;:::-;1430:39;;1488:38;1522:2;1511:9;1507:18;1488:38;:::i;:::-;1478:48;;1272:260;;;;;:::o;1537:328::-;1614:6;1622;1630;1683:2;1671:9;1662:7;1658:23;1654:32;1651:52;;;1699:1;1696;1689:12;1651:52;1722:29;1741:9;1722:29;:::i;:::-;1712:39;;1770:38;1804:2;1793:9;1789:18;1770:38;:::i;:::-;1760:48;;1855:2;1844:9;1840:18;1827:32;1817:42;;1537:328;;;;;:::o;1870:1138::-;1965:6;1973;1981;1989;2042:3;2030:9;2021:7;2017:23;2013:33;2010:53;;;2059:1;2056;2049:12;2010:53;2082:29;2101:9;2082:29;:::i;:::-;2072:39;;2130:38;2164:2;2153:9;2149:18;2130:38;:::i;:::-;2120:48;;2215:2;2204:9;2200:18;2187:32;2177:42;;2270:2;2259:9;2255:18;2242:32;-1:-1:-1;;;;;2334:2:1;2326:6;2323:14;2320:34;;;2350:1;2347;2340:12;2320:34;2388:6;2377:9;2373:22;2363:32;;2433:7;2426:4;2422:2;2418:13;2414:27;2404:55;;2455:1;2452;2445:12;2404:55;2491:2;2478:16;2513:2;2509;2506:10;2503:36;;;2519:18;;:::i;:::-;2594:2;2588:9;2562:2;2648:13;;-1:-1:-1;;2644:22:1;;;2668:2;2640:31;2636:40;2624:53;;;2692:18;;;2712:22;;;2689:46;2686:72;;;2738:18;;:::i;:::-;2778:10;2774:2;2767:22;2813:2;2805:6;2798:18;2853:7;2848:2;2843;2839;2835:11;2831:20;2828:33;2825:53;;;2874:1;2871;2864:12;2825:53;2930:2;2925;2921;2917:11;2912:2;2904:6;2900:15;2887:46;2975:1;2970:2;2965;2957:6;2953:15;2949:24;2942:35;2996:6;2986:16;;;;;;;1870:1138;;;;;;;:::o;3013:254::-;3078:6;3086;3139:2;3127:9;3118:7;3114:23;3110:32;3107:52;;;3155:1;3152;3145:12;3107:52;3178:29;3197:9;3178:29;:::i;:::-;3168:39;;3226:35;3257:2;3246:9;3242:18;3226:35;:::i;3272:254::-;3340:6;3348;3401:2;3389:9;3380:7;3376:23;3372:32;3369:52;;;3417:1;3414;3407:12;3369:52;3440:29;3459:9;3440:29;:::i;:::-;3430:39;3516:2;3501:18;;;;3488:32;;-1:-1:-1;;;3272:254:1:o;3531:322::-;3608:6;3616;3624;3677:2;3665:9;3656:7;3652:23;3648:32;3645:52;;;3693:1;3690;3683:12;3645:52;3716:29;3735:9;3716:29;:::i;:::-;3706:39;3792:2;3777:18;;3764:32;;-1:-1:-1;3843:2:1;3828:18;;;3815:32;;3531:322;-1:-1:-1;;;3531:322:1:o;3858:505::-;3953:6;3961;3969;4022:2;4010:9;4001:7;3997:23;3993:32;3990:52;;;4038:1;4035;4028:12;3990:52;4078:9;4065:23;-1:-1:-1;;;;;4103:6:1;4100:30;4097:50;;;4143:1;4140;4133:12;4097:50;4182:70;4244:7;4235:6;4224:9;4220:22;4182:70;:::i;:::-;4271:8;;4156:96;;-1:-1:-1;4353:2:1;4338:18;;;;4325:32;;3858:505;-1:-1:-1;;;;3858:505:1:o;4368:437::-;4454:6;4462;4515:2;4503:9;4494:7;4490:23;4486:32;4483:52;;;4531:1;4528;4521:12;4483:52;4571:9;4558:23;-1:-1:-1;;;;;4596:6:1;4593:30;4590:50;;;4636:1;4633;4626:12;4590:50;4675:70;4737:7;4728:6;4717:9;4713:22;4675:70;:::i;:::-;4764:8;;4649:96;;-1:-1:-1;4368:437:1;-1:-1:-1;;;;4368:437:1:o;4810:180::-;4866:6;4919:2;4907:9;4898:7;4894:23;4890:32;4887:52;;;4935:1;4932;4925:12;4887:52;4958:26;4974:9;4958:26;:::i;4995:245::-;5053:6;5106:2;5094:9;5085:7;5081:23;5077:32;5074:52;;;5122:1;5119;5112:12;5074:52;5161:9;5148:23;5180:30;5204:5;5180:30;:::i;5245:249::-;5314:6;5367:2;5355:9;5346:7;5342:23;5338:32;5335:52;;;5383:1;5380;5373:12;5335:52;5415:9;5409:16;5434:30;5458:5;5434:30;:::i;5499:409::-;5569:6;5577;5630:2;5618:9;5609:7;5605:23;5601:32;5598:52;;;5646:1;5643;5636:12;5598:52;5686:9;5673:23;-1:-1:-1;;;;;5711:6:1;5708:30;5705:50;;;5751:1;5748;5741:12;5705:50;5790:58;5840:7;5831:6;5820:9;5816:22;5790:58;:::i;6328:272::-;6386:6;6439:2;6427:9;6418:7;6414:23;6410:32;6407:52;;;6455:1;6452;6445:12;6407:52;6494:9;6481:23;6544:6;6537:5;6533:18;6526:5;6523:29;6513:57;;6566:1;6563;6556:12;6605:180;6664:6;6717:2;6705:9;6696:7;6692:23;6688:32;6685:52;;;6733:1;6730;6723:12;6685:52;-1:-1:-1;6756:23:1;;6605:180;-1:-1:-1;6605:180:1:o;6790:477::-;6869:6;6877;6885;6938:2;6926:9;6917:7;6913:23;6909:32;6906:52;;;6954:1;6951;6944:12;6906:52;6990:9;6977:23;6967:33;;7051:2;7040:9;7036:18;7023:32;-1:-1:-1;;;;;7070:6:1;7067:30;7064:50;;;7110:1;7107;7100:12;7064:50;7149:58;7199:7;7190:6;7179:9;7175:22;7149:58;:::i;:::-;6790:477;;7226:8;;-1:-1:-1;7123:84:1;;-1:-1:-1;;;;6790:477:1:o;7272:471::-;7313:3;7351:5;7345:12;7378:6;7373:3;7366:19;7403:1;7413:162;7427:6;7424:1;7421:13;7413:162;;;7489:4;7545:13;;;7541:22;;7535:29;7517:11;;;7513:20;;7506:59;7442:12;7413:162;;;7593:6;7590:1;7587:13;7584:87;;;7659:1;7652:4;7643:6;7638:3;7634:16;7630:27;7623:38;7584:87;-1:-1:-1;7725:2:1;7704:15;-1:-1:-1;;7700:29:1;7691:39;;;;7732:4;7687:50;;7272:471;-1:-1:-1;;7272:471:1:o;7748:349::-;7832:12;;-1:-1:-1;;;;;7828:38:1;7816:51;;7920:4;7909:16;;;7903:23;-1:-1:-1;;;;;7899:48:1;7883:14;;;7876:72;8011:4;8000:16;;;7994:23;7987:31;7980:39;7964:14;;;7957:63;8073:4;8062:16;;;8056:23;8081:8;8052:38;8036:14;;8029:62;7748:349::o;8310:488::-;-1:-1:-1;;;;;8579:15:1;;;8561:34;;8631:15;;8626:2;8611:18;;8604:43;8678:2;8663:18;;8656:34;;;8726:3;8721:2;8706:18;;8699:31;;;8504:4;;8747:45;;8772:19;;8764:6;8747:45;:::i;:::-;8739:53;8310:488;-1:-1:-1;;;;;;8310:488:1:o;8803:722::-;9036:2;9088:21;;;9158:13;;9061:18;;;9180:22;;;9007:4;;9036:2;9259:15;;;;9233:2;9218:18;;;9007:4;9302:197;9316:6;9313:1;9310:13;9302:197;;;9365:52;9413:3;9404:6;9398:13;9365:52;:::i;:::-;9474:15;;;;9446:4;9437:14;;;;;9338:1;9331:9;9302:197;;9530:632;9701:2;9753:21;;;9823:13;;9726:18;;;9845:22;;;9672:4;;9701:2;9924:15;;;;9898:2;9883:18;;;9672:4;9967:169;9981:6;9978:1;9975:13;9967:169;;;10042:13;;10030:26;;10111:15;;;;10076:12;;;;10003:1;9996:9;9967:169;;10359:219;10508:2;10497:9;10490:21;10471:4;10528:44;10568:2;10557:9;10553:18;10545:6;10528:44;:::i;11685:330::-;11887:2;11869:21;;;11926:1;11906:18;;;11899:29;-1:-1:-1;;;11959:2:1;11944:18;;11937:37;12006:2;11991:18;;11685:330::o;13862:::-;14064:2;14046:21;;;14103:1;14083:18;;;14076:29;-1:-1:-1;;;14136:2:1;14121:18;;14114:37;14183:2;14168:18;;13862:330::o;14905:337::-;15107:2;15089:21;;;15146:2;15126:18;;;15119:30;-1:-1:-1;;;15180:2:1;15165:18;;15158:43;15233:2;15218:18;;14905:337::o;15591:266::-;15787:3;15772:19;;15800:51;15776:9;15833:6;15800:51;:::i;16237:265::-;16277:7;16343:1;16339;16335:6;16331:14;16328:1;16325:21;16320:1;16313:9;16306:17;16302:45;16299:168;;;16389:10;16384:3;16380:20;16377:1;16370:31;16424:4;16421:1;16414:15;16452:4;16449:1;16442:15;16299:168;-1:-1:-1;16487:9:1;;16237:265::o;16507:380::-;16586:1;16582:12;;;;16629;;;16650:61;;16704:4;16696:6;16692:17;16682:27;;16650:61;16757:2;16749:6;16746:14;16726:18;16723:38;16720:161;;;16803:10;16798:3;16794:20;16791:1;16784:31;16838:4;16835:1;16828:15;16866:4;16863:1;16856:15;16720:161;;16507:380;;;:::o;17024:127::-;17085:10;17080:3;17076:20;17073:1;17066:31;17116:4;17113:1;17106:15;17140:4;17137:1;17130:15;17156:127;17217:10;17212:3;17208:20;17205:1;17198:31;17248:4;17245:1;17238:15;17272:4;17269:1;17262:15;17288:131;-1:-1:-1;;;;;;17362:32:1;;17352:43;;17342:71;;17409:1;17406;17399:12

Swarm Source

ipfs://91802568b431d7df3e85c1b5b7eabc8f33ea2b8422dbc503174b375c16c8bdf2
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.