ETH Price: $3,330.60 (-1.31%)
Gas: 10 Gwei

Token

PocketwithLoveSBT (PocketwithLoveSBT)
 

Overview

Max Total Supply

113 PocketwithLoveSBT

Holders

110

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 PocketwithLoveSBT
0x159c9B30E9B84DA6e8b068f18e0474e96828f85F
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:
PocketwithLoveSBT

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-06-02
*/

pragma solidity 0.8.13;

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/MerkleProof.sol)
/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(
        bytes32[] memory proof,
        bytes32 leaf
    ) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(
        bytes32[] calldata proof,
        bytes32 leaf
    ) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(
            leavesLen + proof.length - 1 == totalHashes,
            "MerkleProof: invalid multiproof"
        );

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen
                ? leaves[leafPos++]
                : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(
            leavesLen + proof.length - 1 == totalHashes,
            "MerkleProof: invalid multiproof"
        );

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen
                ? leaves[leafPos++]
                : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(
        bytes32 a,
        bytes32 b
    ) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
/**
 * @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;
    }
}

// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)
/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(
        uint256 a,
        Rounding rounding
    ) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return
                result +
                (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(
        uint256 value,
        Rounding rounding
    ) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return
                result +
                (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(
        uint256 value,
        Rounding rounding
    ) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return
                result +
                (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(
        uint256 value,
        Rounding rounding
    ) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return
                result +
                (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
        }
    }
}

// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)
/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two signed numbers.
     */
    function min(int256 a, int256 b) internal pure returns (int256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}

// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)
/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toString(int256 value) internal pure returns (string memory) {
        return
            string(
                abi.encodePacked(
                    value < 0 ? "-" : "",
                    toString(SignedMath.abs(value))
                )
            );
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(
        uint256 value,
        uint256 length
    ) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }

    /**
     * @dev Returns true if the two strings are equal.
     */
    function equal(
        string memory a,
        string memory b
    ) internal pure returns (bool) {
        return keccak256(bytes(a)) == keccak256(bytes(b));
    }
}

// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
/**
 * @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. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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);
    }
}

// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                0,
                "Address: low-level call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return
            verifyCallResultFromTarget(
                target,
                success,
                returndata,
                errorMessage
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data
    ) internal view returns (bytes memory) {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return
            verifyCallResultFromTarget(
                target,
                success,
                returndata,
                errorMessage
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data
    ) internal returns (bytes memory) {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return
            verifyCallResultFromTarget(
                target,
                success,
                returndata,
                errorMessage
            );
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(
        bytes memory returndata,
        string memory errorMessage
    ) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)
/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @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`.
     *
     * 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 calldata data
    ) external;

    /**
     * @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 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
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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);
}

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @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);
}

// ERC721A Contracts v3.3.0
// Creator: Chiru Labs
/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A is IERC721, IERC721Metadata {
    /**
     * 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();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * 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();

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);
}

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)
/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(
        bytes4 interfaceId
    ) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// ERC721A Contracts v3.3.0
// Creator: Chiru Labs
/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721A {
    using Address for address;
    using Strings for uint256;

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _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 _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

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

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

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

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

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(
        bytes4 interfaceId
    ) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

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

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

    /**
     * Sets the auxillary 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 {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(
        uint256 tokenId
    ) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    TokenOwnership memory ownership = _ownerships[curr];
                    if (!ownership.burned) {
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        while (true) {
                            curr--;
                            ownership = _ownerships[curr];
                            if (ownership.addr != address(0)) {
                                return ownership;
                            }
                        }
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    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, tokenId.toString()))
                : "";
    }

    /**
     * @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, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        _beforeApprove(to);

        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(
        uint256 tokenId
    ) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(
        address operator,
        bool approved
    ) public virtual override {
        _beforeApprove(operator);

        if (operator == _msgSender()) revert ApproveToCaller();

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

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(
        address owner,
        address operator
    ) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function _beforeApprove(address to) internal virtual {}

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract())
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @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 (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex &&
            !_ownerships[tokenId].burned;
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, 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.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (
                        !_checkContractOnERC721Received(
                            address(0),
                            to,
                            updatedIndex++,
                            _data
                        )
                    ) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @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.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(address from, address to, uint256 tokenId) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // 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 {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @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 {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // 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 {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

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

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId, address owner) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

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

    /**
     * @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 {}
}

interface IOperatorAccessControl {
    event RoleGranted(
        bytes32 indexed role,
        address indexed account,
        address indexed sender
    );

    event RoleRevoked(
        bytes32 indexed role,
        address indexed account,
        address indexed sender
    );

    function hasRole(
        bytes32 role,
        address account
    ) external view returns (bool);

    function isOperator(address account) external view returns (bool);

    function addOperator(address account) external;

    function revokeOperator(address account) external;
}

contract OperatorAccessControl is IOperatorAccessControl, Ownable {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE");

    function hasRole(
        bytes32 role,
        address account
    ) public view override returns (bool) {
        return _roles[role].members[account];
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }

    modifier isOperatorOrOwner() {
        address _sender = _msgSender();
        require(
            isOperator(_sender) || owner() == _sender,
            "OperatorAccessControl: caller is not operator or owner"
        );
        _;
    }

    modifier onlyOperator() {
        require(
            isOperator(_msgSender()),
            "OperatorAccessControl: caller is not operator"
        );
        _;
    }

    function isOperator(address account) public view override returns (bool) {
        return hasRole(OPERATOR_ROLE, account);
    }

    function _addOperator(address account) internal virtual {
        _grantRole(OPERATOR_ROLE, account);
    }

    function addOperator(address account) public override onlyOperator {
        _grantRole(OPERATOR_ROLE, account);
    }

    function revokeOperator(address account) public override onlyOperator {
        _revokeRole(OPERATOR_ROLE, account);
    }
}

library Base64 {
    bytes internal constant TABLE =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(
                    out,
                    and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)
                )
                out := shl(8, out)
                out := add(
                    out,
                    and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)
                )
                out := shl(8, out)
                out := add(
                    out,
                    and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)
                )
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

/*
                                                                                                                                                                        
                                                   :*****.    +***                ***=                                                                                  
        .-=                                        :#%%%%.    #%%%      .--      .%%%*                      ...   .::.          .::::.      ....      ....     ....     
       +%%%                                          +%%%.    =+++     #%%*       +++=                      +**+-*****+:      :+*******=.   +***.    +***+     +**+     
     ::#%%%:::.  :::::  -==:   .-====-:       .-===: +%%%.  .:::::   ::%%%*:::  ::::::       :====-.     ---************:    +****+++****:  -***-   :*****-   -***:     
     *%%%%%%%%- .%%%%%:#%%%+ .*%%%##%%%*.    +%%%%%%#*%%%.  =%%%%%   %%%%%%%%%. *%%%%*    .+%%%%%%%%+.   %%%****#%%%#***+   =***=.   :+***:  +***   +******.  +**+      
     ::*%%%:::.  :=%%%%#=--: +%%#.  .#%%+   +%%%+:.:+%%%%.  .:*%%%   ::%%%*:::  .:%%%*   .#%%%-..-#%%%.  :-%****. :#%***+  .***+      :***=  -***- -***.***- :***:      
       *%%%       -%%%#      ..:::---*%%#  .%%%*     +%%%.    +%%%     %%%*       #%%*   +%%%:    :%%%+   :%***+   =%***+  .***=      .***=   +**+.+**- -***.+**+       
       *%%%       -%%%-      :*%%%%%%%%%#  :%%%=     -%%%.    +%%%     %%%*       #%%*   *%%%      %%%#   :%***+   -%***+   ***+.     -***-   :***+**+   +**+***:       
       *%%%       -%%%:     .%%%*:.  +%%#  :%%%+     =%%%.    +%%%     %%%*       #%%*   *%%%.     %%%#   :%***+   -%***+   -***+-..:=***+.    +*****-   -*****+        
       *%%%  ##:  -%%%:     :%%%:   :%%%#   #%%%:   .#%%%.    +%%%     %%%* :##   #%%*   :%%%*    +%%%-   :%***+   -%***+    -**********+.     :****+     +****:        
       -%%%##%%..##%%%##-    #%%%++*%#%%%#= :#%%%**#%*%%%#* -#%%%%#*   +%%%*#%* +#%%%%#=  -%%%%**%%%%=   ##%####..##%####.    .-+****+=:        =+++:     :+++=         
        :*#%#+: .*******-     =*#%#+:-****-  .=*#%#*:.****+ :******=    =*#%#+. =******-   .-*#%%#*=.    *******..*******.                                              
        
*/
contract PocketwithLoveSBT is ERC721A, OperatorAccessControl, ReentrancyGuard {
    bytes32 public _kycMintMerkleRoot;
    bytes32 public _preMintMerkleRoot;

    mapping(address => uint256) private addressMintCount;

    uint256 private _kycMintLimit = 0;

    uint256 private _preMintLimit = 0;

    uint256 private _publicMintLimit = 0;

    uint256 private _superMintLimit = 0;

    uint256 private _addressMintLimit = 0;

    uint256 private _kycMintCount;

    uint256 private _preMintCount;

    uint256 private _publicMintCount;

    uint256 private _superMintCount;

    uint256 private _kycMintPrice = 0;

    uint256 private _preMintPrice = 0;

    uint256 private _publicMintPrice = 0;

    bool private _kycMintOpen = false;

    bool private _preMintOpen = false;

    bool private _publicMintOpen = false;

    bool private _superMintOpen = false;

    uint256 _totalSupply = 10000;

    uint256 _totalTokens;

    bool private _transferOpen = false;

    bool private _open = false;

    function setOpen(bool open) public onlyOperator {
        _open = open;
    }

    string private _nftName = "PocketwithLoveSBT";
    string private _baseUri =
        "https://nft-game.s3.ap-east-1.amazonaws.com/images";

    constructor() ERC721A(_nftName, _nftName) Ownable() {
        _addOperator(_msgSender());
    }

    function getMintCount()
        public
        view
        returns (
            uint256 kycMintCount,
            uint256 preMintCount,
            uint256 publicMintCount,
            uint256 superMintCount
        )
    {
        kycMintCount = _kycMintCount;
        preMintCount = _preMintCount;
        publicMintCount = _publicMintCount;
        superMintCount = _superMintCount;
    }

    function setMerkleRoot(
        bytes32 kycMintMerkleRoot,
        bytes32 preMintMerkleRoot
    ) public onlyOperator {
        _kycMintMerkleRoot = kycMintMerkleRoot;
        _preMintMerkleRoot = preMintMerkleRoot;
    }

    function isWhitelist(
        bytes32[] calldata kycMerkleProof,
        bytes32[] calldata preMerkleProof
    ) public view returns (bool isKycWhitelist, bool isPreWhitelist) {
        isKycWhitelist = MerkleProof.verify(
            kycMerkleProof,
            _kycMintMerkleRoot,
            keccak256(abi.encodePacked(msg.sender))
        );

        isPreWhitelist = MerkleProof.verify(
            preMerkleProof,
            _preMintMerkleRoot,
            keccak256(abi.encodePacked(msg.sender))
        );
    }

    function setMintLimit(
        uint256 kycMintLimit,
        uint256 preMintLimit,
        uint256 publicMintLimit,
        uint256 addressMintLimit,
        uint256 superMintLimit
    ) public onlyOperator {
        _kycMintLimit = kycMintLimit;
        _preMintLimit = preMintLimit;
        _publicMintLimit = publicMintLimit;
        _addressMintLimit = addressMintLimit;
        _superMintLimit = superMintLimit;
    }

    function getMintLimit()
        public
        view
        returns (
            uint256 kycMintLimit,
            uint256 preMintLimit,
            uint256 publicMintLimit,
            uint256 addressMintLimit,
            uint256 superMintLimit
        )
    {
        kycMintLimit = _kycMintLimit;
        preMintLimit = _preMintLimit;
        publicMintLimit = _publicMintLimit;
        addressMintLimit = _addressMintLimit;
        superMintLimit = _superMintLimit;
    }

    function setMintPrice(
        uint256 kycMintPrice,
        uint256 preMintPrice,
        uint256 publicMintPrice
    ) public onlyOperator {
        _kycMintPrice = kycMintPrice;
        _preMintPrice = preMintPrice;
        _publicMintPrice = publicMintPrice;
    }

    function getMintPrice()
        public
        view
        returns (
            uint256 kycMintPrice,
            uint256 preMintPrice,
            uint256 publicMintPrice
        )
    {
        kycMintPrice = _kycMintPrice;
        preMintPrice = _preMintPrice;
        publicMintPrice = _publicMintPrice;
    }

    function setSwith(
        bool kycMintOpen,
        bool preMintOpen,
        bool publicMintOpen,
        bool transferOpen,
        bool superMintOpen
    ) public onlyOperator {
        _kycMintOpen = kycMintOpen;
        _preMintOpen = preMintOpen;
        _publicMintOpen = publicMintOpen;
        _transferOpen = transferOpen;
        _superMintOpen = superMintOpen;
    }

    function getSwith()
        public
        view
        returns (
            bool kycMintOpen,
            bool preMintOpen,
            bool publicMintOpen,
            bool transferOpen,
            bool superMintOpen
        )
    {
        kycMintOpen = _kycMintOpen;
        preMintOpen = _preMintOpen;
        publicMintOpen = _publicMintOpen;
        transferOpen = _transferOpen;
        superMintOpen = _superMintOpen;
    }

    function _handleMint(address to) internal {
        require(
            addressMintCount[to] < _addressMintLimit,
            "error:10003 already claimed"
        );
        require(
            _totalTokens < _totalSupply,
            "error:10010 Exceeding the total amount"
        );

        _safeMint(to, 1);

        addressMintCount[to] = addressMintCount[to] + 1;

        _totalTokens = _totalTokens + 1;
    }

    function kycMint(
        bytes32[] calldata merkleProof,
        uint256 count
    ) public payable nonReentrant {
        require(count >= 1, "error:10010 Must be greater than 1");

        require(
            msg.value == _kycMintPrice * count,
            "error:10000 msg.value is incorrect"
        );

        require(_kycMintOpen, "error:10001 switch off");

        require(
            MerkleProof.verify(
                merkleProof,
                _kycMintMerkleRoot,
                keccak256(abi.encodePacked(msg.sender))
            ),
            "error:10002 not in the whitelist"
        );

        for (uint256 i = 0; i < count; i++) {
            require(
                _kycMintCount < _kycMintLimit,
                "error:10004 Reach the limit"
            );

            _handleMint(_msgSender());

            _kycMintCount = _kycMintCount + 1;
        }
    }

    function preMint(
        bytes32[] calldata merkleProof,
        uint256 count
    ) public payable nonReentrant {
        require(count >= 1, "error:10010 Must be greater than 1");

        require(
            msg.value == _preMintPrice * count,
            "error:10000 msg.value is incorrect"
        );

        require(_preMintOpen, "error:10001 switch off");

        require(
            MerkleProof.verify(
                merkleProof,
                _preMintMerkleRoot,
                keccak256(abi.encodePacked(msg.sender))
            ),
            "error:10002 not in the whitelist"
        );

        for (uint256 i = 0; i < count; i++) {
            require(
                _preMintCount < _preMintLimit,
                "error:10004 Reach the limit"
            );

            _handleMint(_msgSender());

            _preMintCount = _preMintCount + 1;
        }
    }

    function publicMint(uint256 count) public payable nonReentrant {
        require(count >= 1, "error:10010 Must be greater than 1");

        require(
            msg.value == _publicMintPrice * count,
            "error:10000 msg.value is incorrect"
        );

        require(_publicMintOpen, "error:10001 switch off");

        for (uint256 i = 0; i < count; i++) {
            require(
                _publicMintCount < _publicMintLimit,
                "error:10004 Reach the limit"
            );

            _handleMint(_msgSender());

            _publicMintCount = _publicMintCount + 1;
        }
    }

    function operatorMint(
        address[] memory toAddresses,
        uint256[] memory amounts
    ) public onlyOperator {
        require(
            toAddresses.length == amounts.length,
            "error:10033 toAddresses length does not match amounts length"
        );

        uint256 _len = toAddresses.length;
        for (uint256 _i; _i < _len; _i++) {
            address to = toAddresses[_i];
            uint256 amount = amounts[_i];

            for (uint256 j = 0; j < amount; j++) {
                require(
                    _totalTokens < _totalSupply,
                    "error:10010 Exceeding the total amount"
                );

                _safeMint(to, 1);

                _totalTokens = _totalTokens + 1;
            }
        }
    }

    function burn(uint256 tokenId) public onlyOperator {
        super._burn(tokenId);
    }

    function getCanMintCount(address user) external view returns (uint256) {
        return _addressMintLimit - addressMintCount[user];
    }

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal view override {
        require(_open, "error:10000 can't transfer");
    }

    function _beforeApprove(address to) internal view override {
        require(_open, "error:10000 can't approve");
    }

    function setBaseUri(string memory baseUri) public onlyOperator {
        _baseUri = baseUri;
    }

    function tokenURI(
        uint256 tokenId
    ) public view override returns (string memory) {
        return
            string(abi.encodePacked(_baseUri, "/", toString(tokenId), ".json"));
    }

    function supply() public view returns (uint256) {
        return _totalSupply;
    }

    function totalMinted() public view returns (uint256) {
        return _totalTokens;
    }

    function withdraw(
        address[] memory tokens,
        address _to
    ) public onlyOperator {
        for (uint8 i; i < tokens.length; i++) {
            IERC20 token = IERC20(tokens[i]);
            uint256 b = token.balanceOf(address(this));
            if (b > 0) {
                token.transfer(_to, b);
            }
        }
        uint256 balance = address(this).balance;
        payable(_to).transfer(balance);
    }

    function toString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    mapping(address => mapping(uint256 => uint256)) private superAddressToken;

    uint256 private _superMintPrice = 0;

    function setSuperMintPrice(uint256 superMintPrice) public onlyOperator {
        _superMintPrice = superMintPrice;
    }

    function getSuperMintPrice() public view returns (uint256) {
        return _superMintPrice;
    }

    mapping(address => uint256) private superAddress;

    function setSuperAddress(
        address contractAddress,
        uint256 count
    ) public onlyOperator {
        superAddress[contractAddress] = count;
    }

    function getSuperAddress(
        address contractAddress
    ) public view returns (uint256) {
        return superAddress[contractAddress];
    }

    function getTokenCanMintCount(
        address contractAddress,
        uint256 tokenId
    ) public view returns (uint256) {
        if (superAddress[contractAddress] == 0) {
            return 0;
        }
        return
            superAddress[contractAddress] -
            superAddressToken[contractAddress][tokenId];
    }

    function superMint(
        address[] memory contracts,
        uint256[] memory tokenIds,
        uint256[] memory counts
    ) public payable nonReentrant {
        require(
            contracts.length == tokenIds.length,
            "error: 10000 contracts length does not match tokenIds length"
        );

        require(
            tokenIds.length == counts.length,
            "error: 10001 tokenIds length does not match counts length"
        );

        require(_superMintOpen, "error:10002 switch off");

        uint256 totalMintCount = 0;
        for (uint256 i = 0; i < tokenIds.length; i++) {
            totalMintCount = totalMintCount + counts[i];
        }

        require(totalMintCount < 30, "error: 10003 Limit 30");

        require(
            msg.value == _superMintPrice * totalMintCount,
            "error:10004 msg.value is incorrect"
        );

        for (uint256 i = 0; i < tokenIds.length; i++) {
            address contractAddress = contracts[i];
            uint256 tokenId = tokenIds[i];
            uint256 mintCount = counts[i];

            require(
                IERC721(contractAddress).ownerOf(tokenId) == msg.sender,
                "error:10005 No owner"
            );

            require(
                superAddress[contractAddress] > 0,
                "error:10006 Contract cannot mint"
            );

            require(
                superAddressToken[contractAddress][tokenId] + mintCount <=
                    superAddress[contractAddress],
                "error:10007 Greater than maximum quantity"
            );

            require(
                _totalTokens + mintCount <= _totalSupply,
                "error:10008 Exceeding the total amount"
            );

            require(
                _superMintCount + mintCount <= _superMintLimit,
                "error:10009 Reach the limit"
            );

            for (uint256 j = 0; j < mintCount; j++) {
                _safeMint(msg.sender, 1);
            }

            _superMintCount = _superMintCount + mintCount;

            _totalTokens = _totalTokens + mintCount;

            superAddressToken[contractAddress][tokenId] =
                superAddressToken[contractAddress][tokenId] +
                mintCount;
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_kycMintMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_preMintMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addOperator","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","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":"user","type":"address"}],"name":"getCanMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintCount","outputs":[{"internalType":"uint256","name":"kycMintCount","type":"uint256"},{"internalType":"uint256","name":"preMintCount","type":"uint256"},{"internalType":"uint256","name":"publicMintCount","type":"uint256"},{"internalType":"uint256","name":"superMintCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintLimit","outputs":[{"internalType":"uint256","name":"kycMintLimit","type":"uint256"},{"internalType":"uint256","name":"preMintLimit","type":"uint256"},{"internalType":"uint256","name":"publicMintLimit","type":"uint256"},{"internalType":"uint256","name":"addressMintLimit","type":"uint256"},{"internalType":"uint256","name":"superMintLimit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintPrice","outputs":[{"internalType":"uint256","name":"kycMintPrice","type":"uint256"},{"internalType":"uint256","name":"preMintPrice","type":"uint256"},{"internalType":"uint256","name":"publicMintPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"getSuperAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSuperMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSwith","outputs":[{"internalType":"bool","name":"kycMintOpen","type":"bool"},{"internalType":"bool","name":"preMintOpen","type":"bool"},{"internalType":"bool","name":"publicMintOpen","type":"bool"},{"internalType":"bool","name":"transferOpen","type":"bool"},{"internalType":"bool","name":"superMintOpen","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenCanMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","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":[{"internalType":"address","name":"account","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"kycMerkleProof","type":"bytes32[]"},{"internalType":"bytes32[]","name":"preMerkleProof","type":"bytes32[]"}],"name":"isWhitelist","outputs":[{"internalType":"bool","name":"isKycWhitelist","type":"bool"},{"internalType":"bool","name":"isPreWhitelist","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"kycMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"toAddresses","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"operatorMint","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"preMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"revokeOperator","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":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseUri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"kycMintMerkleRoot","type":"bytes32"},{"internalType":"bytes32","name":"preMintMerkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"kycMintLimit","type":"uint256"},{"internalType":"uint256","name":"preMintLimit","type":"uint256"},{"internalType":"uint256","name":"publicMintLimit","type":"uint256"},{"internalType":"uint256","name":"addressMintLimit","type":"uint256"},{"internalType":"uint256","name":"superMintLimit","type":"uint256"}],"name":"setMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"kycMintPrice","type":"uint256"},{"internalType":"uint256","name":"preMintPrice","type":"uint256"},{"internalType":"uint256","name":"publicMintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"open","type":"bool"}],"name":"setOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setSuperAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"superMintPrice","type":"uint256"}],"name":"setSuperMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"kycMintOpen","type":"bool"},{"internalType":"bool","name":"preMintOpen","type":"bool"},{"internalType":"bool","name":"publicMintOpen","type":"bool"},{"internalType":"bool","name":"transferOpen","type":"bool"},{"internalType":"bool","name":"superMintOpen","type":"bool"}],"name":"setSwith","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"counts","type":"uint256[]"}],"name":"superMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"totalMinted","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":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6000600e819055600f81905560108190556011818155601282905560178290556018829055601991909155601a805463ffffffff19169055612710601b55601d805461ffff1916905560c0604052608081905270141bd8dad95d1dda5d1a131bdd9954d095607a1b60a09081526200007b91601e91906200035f565b5060405180606001604052806032815260200162003cde603291398051620000ac91601f916020909101906200035f565b506000602155348015620000bf57600080fd5b50601e8054620000cf9062000405565b80601f0160208091040260200160405190810160405280929190818152602001828054620000fd9062000405565b80156200014e5780601f1062000122576101008083540402835291602001916200014e565b820191906000526020600020905b8154815290600101906020018083116200013057829003601f168201915b5050505050601e8054620001629062000405565b80601f0160208091040260200160405190810160405280929190818152602001828054620001909062000405565b8015620001e15780601f10620001b557610100808354040283529160200191620001e1565b820191906000526020600020905b815481529060010190602001808311620001c357829003601f168201915b50508451620001fb9350600292506020860191506200035f565b508051620002119060039060208401906200035f565b50506000805550620002233362000239565b6001600a5562000233336200028b565b62000441565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620002b77f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92982620002ba565b50565b60008281526009602090815260408083206001600160a01b038516845290915290205460ff166200035b5760008281526009602090815260408083206001600160a01b03851684529091529020805460ff191660011790556200031a3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b8280546200036d9062000405565b90600052602060002090601f016020900481019282620003915760008555620003dc565b82601f10620003ac57805160ff1916838001178555620003dc565b82800160010185558215620003dc579182015b82811115620003dc578251825591602001919060010190620003bf565b50620003ea929150620003ee565b5090565b5b80821115620003ea5760008155600101620003ef565b600181811c908216806200041a57607f821691505b6020821081036200043b57634e487b7160e01b600052602260045260246000fd5b50919050565b61388d80620004516000396000f3fe6080604052600436106102c95760003560e01c8063715018a611610175578063a89370e7116100dc578063e0e6389311610095578063f01288521161006f578063f012885214610935578063f2fde38b14610948578063f5b541a614610968578063fad8b32a1461098a57600080fd5b8063e0e63893146108b7578063e985e9c5146108cc578063eeb86e781461091557600080fd5b8063a89370e7146107c1578063b824c19d14610824578063b88d4fde14610844578063c3e3019614610864578063c87b56dd14610877578063cf2bde3b1461089757600080fd5b806395d89b411161012e57806395d89b41146107065780639870d7fe1461071b578063a0bcfc7f1461073b578063a22cb4651461075b578063a2309ff81461077b578063a7f93ebd1461079057600080fd5b8063715018a61461062357806375edcbe0146106385780638ceb45a9146106585780638da5cb5b1461068f5780638fc3b549146106ad57806391d14854146106e657600080fd5b80632a7ce0511161023457806356bda4a2116101ed5780636d70f7ae116101c75780636d70f7ae1461058d5780636dc25b93146105ad5780636fdca5e0146105e357806370a082311461060357600080fd5b806356bda4a2146105095780636102664a1461054d5780636352211e1461056d57600080fd5b80632a7ce051146104605780632db1154414610476578063319948ba1461048957806342842e0e146104a957806342966c68146104c95780634ad7b025146104e957600080fd5b8063157620ab11610286578063157620ab146103be5780631649698b146103de57806316504c0a146103f157806318160ddd146104075780631d39191d1461042057806323b872dd1461044057600080fd5b806301ffc9a7146102ce578063047fc9aa1461030357806306fdde0314610322578063081812fc14610344578063095ea7b31461037c5780630af2b5621461039e575b600080fd5b3480156102da57600080fd5b506102ee6102e9366004612c47565b6109aa565b60405190151581526020015b60405180910390f35b34801561030f57600080fd5b50601b545b6040519081526020016102fa565b34801561032e57600080fd5b506103376109fc565b6040516102fa9190612cbc565b34801561035057600080fd5b5061036461035f366004612ccf565b610a8e565b6040516001600160a01b0390911681526020016102fa565b34801561038857600080fd5b5061039c610397366004612cfd565b610ad2565b005b3480156103aa57600080fd5b506103146103b9366004612cfd565b610b61565b3480156103ca57600080fd5b5061039c6103d9366004612e06565b610bc6565b61039c6103ec366004612ea2565b610d64565b3480156103fd57600080fd5b50610314600b5481565b34801561041357600080fd5b5060015460005403610314565b34801561042c57600080fd5b5061039c61043b366004612eed565b610ef3565b34801561044c57600080fd5b5061039c61045b366004612f28565b610f2f565b34801561046c57600080fd5b50610314600c5481565b61039c610484366004612ccf565b610f3a565b34801561049557600080fd5b5061039c6104a4366004612f69565b61101f565b3480156104b557600080fd5b5061039c6104c4366004612f28565b611052565b3480156104d557600080fd5b5061039c6104e4366004612ccf565b61106d565b3480156104f557600080fd5b5061039c610504366004612cfd565b61109b565b34801561051557600080fd5b50600e54600f54601054601254601154604080519586526020860194909452928401919091526060830152608082015260a0016102fa565b34801561055957600080fd5b5061039c610568366004612fa3565b6110dc565b34801561057957600080fd5b50610364610588366004612ccf565b611166565b34801561059957600080fd5b506102ee6105a8366004613014565b611178565b3480156105b957600080fd5b506103146105c8366004613014565b6001600160a01b031660009081526022602052604090205490565b3480156105ef57600080fd5b5061039c6105fe366004613031565b611192565b34801561060f57600080fd5b5061031461061e366004613014565b6111d1565b34801561062f57600080fd5b5061039c61121f565b34801561064457600080fd5b5061039c61065336600461304e565b611233565b34801561066457600080fd5b50610678610673366004613070565b611263565b6040805192151583529015156020830152016102fa565b34801561069b57600080fd5b506008546001600160a01b0316610364565b3480156106b957600080fd5b506013546014546015546016546040805194855260208501939093529183015260608201526080016102fa565b3480156106f257600080fd5b506102ee6107013660046130db565b61130b565b34801561071257600080fd5b50610337611336565b34801561072757600080fd5b5061039c610736366004613014565b611345565b34801561074757600080fd5b5061039c610756366004613157565b611382565b34801561076757600080fd5b5061039c61077636600461319f565b6113be565b34801561078757600080fd5b50601c54610314565b34801561079c57600080fd5b50601754601854601954604080519384526020840192909252908201526060016102fa565b3480156107cd57600080fd5b50601a54601d546040805160ff80851615158252610100850481161515602083015262010000850481161515928201929092529181161515606083015263010000009092049091161515608082015260a0016102fa565b34801561083057600080fd5b5061039c61083f366004612ccf565b61145c565b34801561085057600080fd5b5061039c61085f3660046131cd565b611486565b61039c610872366004612ea2565b6114ca565b34801561088357600080fd5b50610337610892366004612ccf565b611638565b3480156108a357600080fd5b5061039c6108b23660046132a7565b61166c565b3480156108c357600080fd5b50602154610314565b3480156108d857600080fd5b506102ee6108e736600461330a565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561092157600080fd5b50610314610930366004613014565b6117c3565b61039c610943366004613338565b6117e9565b34801561095457600080fd5b5061039c610963366004613014565b611ddb565b34801561097457600080fd5b5061031460008051602061381883398151915281565b34801561099657600080fd5b5061039c6109a5366004613014565b611e51565b60006001600160e01b031982166380ac58cd60e01b14806109db57506001600160e01b03198216635b5e139f60e01b145b806109f657506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060028054610a0b906133bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610a37906133bf565b8015610a845780601f10610a5957610100808354040283529160200191610a84565b820191906000526020600020905b815481529060010190602001808311610a6757829003601f168201915b5050505050905090565b6000610a9982611e8e565b610ab6576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b610adb82611eb9565b6000610ae682611166565b9050806001600160a01b0316836001600160a01b031603610b1a5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610b5157610b3481336108e7565b610b51576040516367d9dca160e11b815260040160405180910390fd5b610b5c838383611f10565b505050565b6001600160a01b0382166000908152602260205260408120548103610b88575060006109f6565b6001600160a01b0383166000818152602080805260408083208684528252808320549383526022909152902054610bbf919061340f565b9392505050565b610bcf33611178565b610bf45760405162461bcd60e51b8152600401610beb90613426565b60405180910390fd5b60005b82518160ff161015610d25576000838260ff1681518110610c1a57610c1a613473565b60209081029190910101516040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610c6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c939190613489565b90508015610d105760405163a9059cbb60e01b81526001600160a01b0385811660048301526024820183905283169063a9059cbb906044016020604051808303816000875af1158015610cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0e91906134a2565b505b50508080610d1d906134bf565b915050610bf7565b5060405147906001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610d5e573d6000803e3d6000fd5b50505050565b610d6c611f6c565b6001811015610d8d5760405162461bcd60e51b8152600401610beb906134de565b80601754610d9b9190613520565b3414610db95760405162461bcd60e51b8152600401610beb9061353f565b601a5460ff16610ddb5760405162461bcd60e51b8152600401610beb90613581565b610e4283838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600b54604051909250610e27915033906020016135b1565b60405160208183030381529060405280519060200120611fc5565b610e8e5760405162461bcd60e51b815260206004820181905260248201527f6572726f723a3130303032206e6f7420696e207468652077686974656c6973746044820152606401610beb565b60005b81811015610ee857600e5460135410610ebc5760405162461bcd60e51b8152600401610beb906135ce565b610ec533611fdb565b601354610ed3906001613605565b60135580610ee08161361d565b915050610e91565b50610b5c6001600a55565b610efc33611178565b610f185760405162461bcd60e51b8152600401610beb90613426565b600e94909455600f92909255601055601255601155565b610b5c8383836120c3565b610f42611f6c565b6001811015610f635760405162461bcd60e51b8152600401610beb906134de565b80601954610f719190613520565b3414610f8f5760405162461bcd60e51b8152600401610beb9061353f565b601a5462010000900460ff16610fb75760405162461bcd60e51b8152600401610beb90613581565b60005b818110156110115760105460155410610fe55760405162461bcd60e51b8152600401610beb906135ce565b610fee33611fdb565b601554610ffc906001613605565b601555806110098161361d565b915050610fba565b5061101c6001600a55565b50565b61102833611178565b6110445760405162461bcd60e51b8152600401610beb90613426565b601792909255601855601955565b610b5c83838360405180602001604052806000815250611486565b61107633611178565b6110925760405162461bcd60e51b8152600401610beb90613426565b61101c816122ab565b6110a433611178565b6110c05760405162461bcd60e51b8152600401610beb90613426565b6001600160a01b03909116600090815260226020526040902055565b6110e533611178565b6111015760405162461bcd60e51b8152600401610beb90613426565b601a8054601d805460ff19169415159490941790935561ffff1990921694151561ff00191694909417610100931515939093029290921763ffff00001916620100009115159190910263ff000000191617630100000092151592909202919091179055565b6000611171826122b6565b5192915050565b60006109f66000805160206138188339815191528361130b565b61119b33611178565b6111b75760405162461bcd60e51b8152600401610beb90613426565b601d80549115156101000261ff0019909216919091179055565b60006001600160a01b0382166111fa576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6112276123d0565b611231600061242a565b565b61123c33611178565b6112585760405162461bcd60e51b8152600401610beb90613426565b600b91909155600c55565b6000806112b286868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600b54604051909250610e27915033906020016135b1565b915061130084848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c54604051909250610e27915033906020016135b1565b905094509492505050565b60009182526009602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060038054610a0b906133bf565b61134e33611178565b61136a5760405162461bcd60e51b8152600401610beb90613426565b61101c6000805160206138188339815191528261247c565b61138b33611178565b6113a75760405162461bcd60e51b8152600401610beb90613426565b80516113ba90601f906020840190612b98565b5050565b6113c782611eb9565b336001600160a01b038316036113f05760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61146533611178565b6114815760405162461bcd60e51b8152600401610beb90613426565b602155565b6114918484846120c3565b6001600160a01b0383163b15610d5e576114ad84848484612502565b610d5e576040516368d2bf6b60e11b815260040160405180910390fd5b6114d2611f6c565b60018110156114f35760405162461bcd60e51b8152600401610beb906134de565b806018546115019190613520565b341461151f5760405162461bcd60e51b8152600401610beb9061353f565b601a54610100900460ff166115465760405162461bcd60e51b8152600401610beb90613581565b61159283838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c54604051909250610e27915033906020016135b1565b6115de5760405162461bcd60e51b815260206004820181905260248201527f6572726f723a3130303032206e6f7420696e207468652077686974656c6973746044820152606401610beb565b60005b81811015610ee857600f546014541061160c5760405162461bcd60e51b8152600401610beb906135ce565b61161533611fdb565b601454611623906001613605565b601455806116308161361d565b9150506115e1565b6060601f611645836125ee565b604051602001611656929190613652565b6040516020818303038152906040529050919050565b61167533611178565b6116915760405162461bcd60e51b8152600401610beb90613426565b80518251146117085760405162461bcd60e51b815260206004820152603c60248201527f6572726f723a313030333320746f416464726573736573206c656e677468206460448201527f6f6573206e6f74206d6174636820616d6f756e7473206c656e677468000000006064820152608401610beb565b815160005b81811015610d5e57600084828151811061172957611729613473565b60200260200101519050600084838151811061174757611747613473565b6020026020010151905060005b818110156117ad57601b54601c541061177f5760405162461bcd60e51b8152600401610beb9061371c565b61178a8360016126ee565b601c54611798906001613605565b601c55806117a58161361d565b915050611754565b50505080806117bb9061361d565b91505061170d565b6001600160a01b0381166000908152600d60205260408120546012546109f6919061340f565b6117f1611f6c565b81518351146118685760405162461bcd60e51b815260206004820152603c60248201527f6572726f723a20313030303020636f6e747261637473206c656e67746820646f60448201527f6573206e6f74206d6174636820746f6b656e496473206c656e677468000000006064820152608401610beb565b80518251146118df5760405162461bcd60e51b815260206004820152603960248201527f6572726f723a20313030303120746f6b656e496473206c656e67746820646f6560448201527f73206e6f74206d6174636820636f756e7473206c656e677468000000000000006064820152608401610beb565b601a546301000000900460ff166119315760405162461bcd60e51b815260206004820152601660248201527532b93937b91d18981818191039bbb4ba31b41037b33360511b6044820152606401610beb565b6000805b83518110156119775782818151811061195057611950613473565b6020026020010151826119639190613605565b91508061196f8161361d565b915050611935565b50601e81106119c05760405162461bcd60e51b815260206004820152601560248201527406572726f723a203130303033204c696d697420333605c1b6044820152606401610beb565b806021546119ce9190613520565b3414611a275760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303034206d73672e76616c756520697320696e636f72726560448201526118dd60f21b6064820152608401610beb565b60005b8351811015611dcf576000858281518110611a4757611a47613473565b602002602001015190506000858381518110611a6557611a65613473565b602002602001015190506000858481518110611a8357611a83613473565b60200260200101519050336001600160a01b0316836001600160a01b0316636352211e846040518263ffffffff1660e01b8152600401611ac591815260200190565b602060405180830381865afa158015611ae2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b069190613762565b6001600160a01b031614611b535760405162461bcd60e51b815260206004820152601460248201527332b93937b91d189818181a9027379037bbb732b960611b6044820152606401610beb565b6001600160a01b038316600090815260226020526040902054611bb85760405162461bcd60e51b815260206004820181905260248201527f6572726f723a313030303620436f6e74726163742063616e6e6f74206d696e746044820152606401610beb565b6001600160a01b03831660009081526022602090815260408083205482805281842086855290925290912054611bef908390613605565b1115611c4f5760405162461bcd60e51b815260206004820152602960248201527f6572726f723a31303030372047726561746572207468616e206d6178696d756d604482015268207175616e7469747960b81b6064820152608401610beb565b601b5481601c54611c609190613605565b1115611cbd5760405162461bcd60e51b815260206004820152602660248201527f6572726f723a313030303820457863656564696e672074686520746f74616c20604482015265185b5bdd5b9d60d21b6064820152608401610beb565b60115481601654611cce9190613605565b1115611d1c5760405162461bcd60e51b815260206004820152601b60248201527f6572726f723a313030303920526561636820746865206c696d697400000000006044820152606401610beb565b60005b81811015611d4457611d323360016126ee565b80611d3c8161361d565b915050611d1f565b5080601654611d539190613605565b601655601c54611d64908290613605565b601c556001600160a01b038316600090815260208080526040808320858452909152902054611d94908290613605565b6001600160a01b0390931660009081526020808052604080832094835293905291909120919091555080611dc78161361d565b915050611a2a565b5050610b5c6001600a55565b611de36123d0565b6001600160a01b038116611e485760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610beb565b61101c8161242a565b611e5a33611178565b611e765760405162461bcd60e51b8152600401610beb90613426565b61101c60008051602061381883398151915282612708565b60008054821080156109f6575050600090815260046020526040902054600160e01b900460ff161590565b601d54610100900460ff1661101c5760405162461bcd60e51b815260206004820152601960248201527f6572726f723a31303030302063616e277420617070726f7665000000000000006044820152606401610beb565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6002600a5403611fbe5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610beb565b6002600a55565b600082611fd2858461276f565b14949350505050565b6012546001600160a01b0382166000908152600d6020526040902054106120445760405162461bcd60e51b815260206004820152601b60248201527f6572726f723a313030303320616c726561647920636c61696d656400000000006044820152606401610beb565b601b54601c54106120675760405162461bcd60e51b8152600401610beb9061371c565b6120728160016126ee565b6001600160a01b0381166000908152600d6020526040902054612096906001613605565b6001600160a01b0382166000908152600d6020526040902055601c546120bd906001613605565b601c5550565b60006120ce826122b6565b9050836001600160a01b031681600001516001600160a01b0316146121055760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612123575061212385336108e7565b8061213e57503361213384610a8e565b6001600160a01b0316145b90508061215e57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661218557604051633a954ecd60e21b815260040160405180910390fd5b61219285858560016127bc565b61219e60008487611f10565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661227257600054821461227257805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b031660008051602061383883398151915260405160405180910390a45050505050565b61101c816000612813565b6040805160608101825260008082526020820181905291810191909152816000548110156123b757600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906123b55780516001600160a01b03161561234c579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156123b0579392505050565b61234c565b505b604051636f96cda160e11b815260040160405180910390fd5b6008546001600160a01b031633146112315760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610beb565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612486828261130b565b6113ba5760008281526009602090815260408083206001600160a01b03851684529091529020805460ff191660011790556124be3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061253790339089908890889060040161377f565b6020604051808303816000875af1925050508015612572575060408051601f3d908101601f1916820190925261256f918101906137bc565b60015b6125d0573d8080156125a0576040519150601f19603f3d011682016040523d82523d6000602084013e6125a5565b606091505b5080516000036125c8576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816000036126155750506040805180820190915260018152600360fc1b602082015290565b8160005b811561263f57806126298161361d565b91506126389050600a836137ef565b9150612619565b6000816001600160401b0381111561265957612659612d29565b6040519080825280601f01601f191660200182016040528015612683576020820181803683370190505b5090505b84156125e65761269860018361340f565b91506126a5600a86613803565b6126b0906030613605565b60f81b8183815181106126c5576126c5613473565b60200101906001600160f81b031916908160001a9053506126e7600a866137ef565b9450612687565b6113ba8282604051806020016040528060008152506129c6565b612712828261130b565b156113ba5760008281526009602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600081815b84518110156127b4576127a08286838151811061279357612793613473565b6020026020010151612b69565b9150806127ac8161361d565b915050612774565b509392505050565b601d54610100900460ff16610d5e5760405162461bcd60e51b815260206004820152601a60248201527f6572726f723a31303030302063616e2774207472616e736665720000000000006044820152606401610beb565b600061281e836122b6565b80519091508215612884576000336001600160a01b0383161480612847575061284782336108e7565b8061286257503361285786610a8e565b6001600160a01b0316145b90508061288257604051632ce44b5f60e11b815260040160405180910390fd5b505b61289060008583611f10565b6001600160a01b0380821660008181526005602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526004909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b17855591890180845292208054919490911661298e57600054821461298e57805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b03841690600080516020613838833981519152908390a4505060018054810190555050565b6000546001600160a01b0384166129ef57604051622e076360e81b815260040160405180910390fd5b82600003612a105760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15612b26575b60405182906001600160a01b03881690600090600080516020613838833981519152908290a4612aef6000878480600101955087612502565b612b0c576040516368d2bf6b60e11b815260040160405180910390fd5b808210612ab6578260005414612b2157600080fd5b612b59565b5b6040516001830192906001600160a01b03881690600090600080516020613838833981519152908290a4808210612b27575b506000908155610d5e9085838684565b6000818310612b85576000828152602084905260409020610bbf565b6000838152602083905260409020610bbf565b828054612ba4906133bf565b90600052602060002090601f016020900481019282612bc65760008555612c0c565b82601f10612bdf57805160ff1916838001178555612c0c565b82800160010185558215612c0c579182015b82811115612c0c578251825591602001919060010190612bf1565b50612c18929150612c1c565b5090565b5b80821115612c185760008155600101612c1d565b6001600160e01b03198116811461101c57600080fd5b600060208284031215612c5957600080fd5b8135610bbf81612c31565b60005b83811015612c7f578181015183820152602001612c67565b83811115610d5e5750506000910152565b60008151808452612ca8816020860160208601612c64565b601f01601f19169290920160200192915050565b602081526000610bbf6020830184612c90565b600060208284031215612ce157600080fd5b5035919050565b6001600160a01b038116811461101c57600080fd5b60008060408385031215612d1057600080fd5b8235612d1b81612ce8565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612d6757612d67612d29565b604052919050565b60006001600160401b03821115612d8857612d88612d29565b5060051b60200190565b600082601f830112612da357600080fd5b81356020612db8612db383612d6f565b612d3f565b82815260059290921b84018101918181019086841115612dd757600080fd5b8286015b84811015612dfb578035612dee81612ce8565b8352918301918301612ddb565b509695505050505050565b60008060408385031215612e1957600080fd5b82356001600160401b03811115612e2f57600080fd5b612e3b85828601612d92565b9250506020830135612e4c81612ce8565b809150509250929050565b60008083601f840112612e6957600080fd5b5081356001600160401b03811115612e8057600080fd5b6020830191508360208260051b8501011115612e9b57600080fd5b9250929050565b600080600060408486031215612eb757600080fd5b83356001600160401b03811115612ecd57600080fd5b612ed986828701612e57565b909790965060209590950135949350505050565b600080600080600060a08688031215612f0557600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b600080600060608486031215612f3d57600080fd5b8335612f4881612ce8565b92506020840135612f5881612ce8565b929592945050506040919091013590565b600080600060608486031215612f7e57600080fd5b505081359360208301359350604090920135919050565b801515811461101c57600080fd5b600080600080600060a08688031215612fbb57600080fd5b8535612fc681612f95565b94506020860135612fd681612f95565b93506040860135612fe681612f95565b92506060860135612ff681612f95565b9150608086013561300681612f95565b809150509295509295909350565b60006020828403121561302657600080fd5b8135610bbf81612ce8565b60006020828403121561304357600080fd5b8135610bbf81612f95565b6000806040838503121561306157600080fd5b50508035926020909101359150565b6000806000806040858703121561308657600080fd5b84356001600160401b038082111561309d57600080fd5b6130a988838901612e57565b909650945060208701359150808211156130c257600080fd5b506130cf87828801612e57565b95989497509550505050565b600080604083850312156130ee57600080fd5b823591506020830135612e4c81612ce8565b60006001600160401b0383111561311957613119612d29565b61312c601f8401601f1916602001612d3f565b905082815283838301111561314057600080fd5b828260208301376000602084830101529392505050565b60006020828403121561316957600080fd5b81356001600160401b0381111561317f57600080fd5b8201601f8101841361319057600080fd5b6125e684823560208401613100565b600080604083850312156131b257600080fd5b82356131bd81612ce8565b91506020830135612e4c81612f95565b600080600080608085870312156131e357600080fd5b84356131ee81612ce8565b935060208501356131fe81612ce8565b92506040850135915060608501356001600160401b0381111561322057600080fd5b8501601f8101871361323157600080fd5b61324087823560208401613100565b91505092959194509250565b600082601f83011261325d57600080fd5b8135602061326d612db383612d6f565b82815260059290921b8401810191818101908684111561328c57600080fd5b8286015b84811015612dfb5780358352918301918301613290565b600080604083850312156132ba57600080fd5b82356001600160401b03808211156132d157600080fd5b6132dd86838701612d92565b935060208501359150808211156132f357600080fd5b506133008582860161324c565b9150509250929050565b6000806040838503121561331d57600080fd5b823561332881612ce8565b91506020830135612e4c81612ce8565b60008060006060848603121561334d57600080fd5b83356001600160401b038082111561336457600080fd5b61337087838801612d92565b9450602086013591508082111561338657600080fd5b6133928783880161324c565b935060408601359150808211156133a857600080fd5b506133b58682870161324c565b9150509250925092565b600181811c908216806133d357607f821691505b6020821081036133f357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082821015613421576134216133f9565b500390565b6020808252602d908201527f4f70657261746f72416363657373436f6e74726f6c3a2063616c6c657220697360408201526c103737ba1037b832b930ba37b960991b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561349b57600080fd5b5051919050565b6000602082840312156134b457600080fd5b8151610bbf81612f95565b600060ff821660ff81036134d5576134d56133f9565b60010192915050565b60208082526022908201527f6572726f723a3130303130204d7573742062652067726561746572207468616e604082015261203160f01b606082015260800190565b600081600019048311821515161561353a5761353a6133f9565b500290565b60208082526022908201527f6572726f723a3130303030206d73672e76616c756520697320696e636f72726560408201526118dd60f21b606082015260800190565b60208082526016908201527532b93937b91d18981818189039bbb4ba31b41037b33360511b604082015260600190565b60609190911b6bffffffffffffffffffffffff1916815260140190565b6020808252601b908201527f6572726f723a313030303420526561636820746865206c696d69740000000000604082015260600190565b60008219821115613618576136186133f9565b500190565b60006001820161362f5761362f6133f9565b5060010190565b60008151613648818560208601612c64565b9290920192915050565b600080845481600182811c91508083168061366e57607f831692505b6020808410820361368d57634e487b7160e01b86526022600452602486fd5b8180156136a157600181146136b2576136df565b60ff198616895284890196506136df565b60008b81526020902060005b868110156136d75781548b8201529085019083016136be565b505084890196505b5050505050506137136137026136fc83602f60f81b815260010190565b86613636565b64173539b7b760d91b815260050190565b95945050505050565b60208082526026908201527f6572726f723a313030313020457863656564696e672074686520746f74616c20604082015265185b5bdd5b9d60d21b606082015260800190565b60006020828403121561377457600080fd5b8151610bbf81612ce8565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906137b290830184612c90565b9695505050505050565b6000602082840312156137ce57600080fd5b8151610bbf81612c31565b634e487b7160e01b600052601260045260246000fd5b6000826137fe576137fe6137d9565b500490565b600082613812576138126137d9565b50069056fe97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122067c4a6ce1356b7cce396eca2943dc6db569cc4d314e928c446907ae69c3ecfb664736f6c634300080d003368747470733a2f2f6e66742d67616d652e73332e61702d656173742d312e616d617a6f6e6177732e636f6d2f696d61676573

Deployed Bytecode

0x6080604052600436106102c95760003560e01c8063715018a611610175578063a89370e7116100dc578063e0e6389311610095578063f01288521161006f578063f012885214610935578063f2fde38b14610948578063f5b541a614610968578063fad8b32a1461098a57600080fd5b8063e0e63893146108b7578063e985e9c5146108cc578063eeb86e781461091557600080fd5b8063a89370e7146107c1578063b824c19d14610824578063b88d4fde14610844578063c3e3019614610864578063c87b56dd14610877578063cf2bde3b1461089757600080fd5b806395d89b411161012e57806395d89b41146107065780639870d7fe1461071b578063a0bcfc7f1461073b578063a22cb4651461075b578063a2309ff81461077b578063a7f93ebd1461079057600080fd5b8063715018a61461062357806375edcbe0146106385780638ceb45a9146106585780638da5cb5b1461068f5780638fc3b549146106ad57806391d14854146106e657600080fd5b80632a7ce0511161023457806356bda4a2116101ed5780636d70f7ae116101c75780636d70f7ae1461058d5780636dc25b93146105ad5780636fdca5e0146105e357806370a082311461060357600080fd5b806356bda4a2146105095780636102664a1461054d5780636352211e1461056d57600080fd5b80632a7ce051146104605780632db1154414610476578063319948ba1461048957806342842e0e146104a957806342966c68146104c95780634ad7b025146104e957600080fd5b8063157620ab11610286578063157620ab146103be5780631649698b146103de57806316504c0a146103f157806318160ddd146104075780631d39191d1461042057806323b872dd1461044057600080fd5b806301ffc9a7146102ce578063047fc9aa1461030357806306fdde0314610322578063081812fc14610344578063095ea7b31461037c5780630af2b5621461039e575b600080fd5b3480156102da57600080fd5b506102ee6102e9366004612c47565b6109aa565b60405190151581526020015b60405180910390f35b34801561030f57600080fd5b50601b545b6040519081526020016102fa565b34801561032e57600080fd5b506103376109fc565b6040516102fa9190612cbc565b34801561035057600080fd5b5061036461035f366004612ccf565b610a8e565b6040516001600160a01b0390911681526020016102fa565b34801561038857600080fd5b5061039c610397366004612cfd565b610ad2565b005b3480156103aa57600080fd5b506103146103b9366004612cfd565b610b61565b3480156103ca57600080fd5b5061039c6103d9366004612e06565b610bc6565b61039c6103ec366004612ea2565b610d64565b3480156103fd57600080fd5b50610314600b5481565b34801561041357600080fd5b5060015460005403610314565b34801561042c57600080fd5b5061039c61043b366004612eed565b610ef3565b34801561044c57600080fd5b5061039c61045b366004612f28565b610f2f565b34801561046c57600080fd5b50610314600c5481565b61039c610484366004612ccf565b610f3a565b34801561049557600080fd5b5061039c6104a4366004612f69565b61101f565b3480156104b557600080fd5b5061039c6104c4366004612f28565b611052565b3480156104d557600080fd5b5061039c6104e4366004612ccf565b61106d565b3480156104f557600080fd5b5061039c610504366004612cfd565b61109b565b34801561051557600080fd5b50600e54600f54601054601254601154604080519586526020860194909452928401919091526060830152608082015260a0016102fa565b34801561055957600080fd5b5061039c610568366004612fa3565b6110dc565b34801561057957600080fd5b50610364610588366004612ccf565b611166565b34801561059957600080fd5b506102ee6105a8366004613014565b611178565b3480156105b957600080fd5b506103146105c8366004613014565b6001600160a01b031660009081526022602052604090205490565b3480156105ef57600080fd5b5061039c6105fe366004613031565b611192565b34801561060f57600080fd5b5061031461061e366004613014565b6111d1565b34801561062f57600080fd5b5061039c61121f565b34801561064457600080fd5b5061039c61065336600461304e565b611233565b34801561066457600080fd5b50610678610673366004613070565b611263565b6040805192151583529015156020830152016102fa565b34801561069b57600080fd5b506008546001600160a01b0316610364565b3480156106b957600080fd5b506013546014546015546016546040805194855260208501939093529183015260608201526080016102fa565b3480156106f257600080fd5b506102ee6107013660046130db565b61130b565b34801561071257600080fd5b50610337611336565b34801561072757600080fd5b5061039c610736366004613014565b611345565b34801561074757600080fd5b5061039c610756366004613157565b611382565b34801561076757600080fd5b5061039c61077636600461319f565b6113be565b34801561078757600080fd5b50601c54610314565b34801561079c57600080fd5b50601754601854601954604080519384526020840192909252908201526060016102fa565b3480156107cd57600080fd5b50601a54601d546040805160ff80851615158252610100850481161515602083015262010000850481161515928201929092529181161515606083015263010000009092049091161515608082015260a0016102fa565b34801561083057600080fd5b5061039c61083f366004612ccf565b61145c565b34801561085057600080fd5b5061039c61085f3660046131cd565b611486565b61039c610872366004612ea2565b6114ca565b34801561088357600080fd5b50610337610892366004612ccf565b611638565b3480156108a357600080fd5b5061039c6108b23660046132a7565b61166c565b3480156108c357600080fd5b50602154610314565b3480156108d857600080fd5b506102ee6108e736600461330a565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561092157600080fd5b50610314610930366004613014565b6117c3565b61039c610943366004613338565b6117e9565b34801561095457600080fd5b5061039c610963366004613014565b611ddb565b34801561097457600080fd5b5061031460008051602061381883398151915281565b34801561099657600080fd5b5061039c6109a5366004613014565b611e51565b60006001600160e01b031982166380ac58cd60e01b14806109db57506001600160e01b03198216635b5e139f60e01b145b806109f657506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060028054610a0b906133bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610a37906133bf565b8015610a845780601f10610a5957610100808354040283529160200191610a84565b820191906000526020600020905b815481529060010190602001808311610a6757829003601f168201915b5050505050905090565b6000610a9982611e8e565b610ab6576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b610adb82611eb9565b6000610ae682611166565b9050806001600160a01b0316836001600160a01b031603610b1a5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610b5157610b3481336108e7565b610b51576040516367d9dca160e11b815260040160405180910390fd5b610b5c838383611f10565b505050565b6001600160a01b0382166000908152602260205260408120548103610b88575060006109f6565b6001600160a01b0383166000818152602080805260408083208684528252808320549383526022909152902054610bbf919061340f565b9392505050565b610bcf33611178565b610bf45760405162461bcd60e51b8152600401610beb90613426565b60405180910390fd5b60005b82518160ff161015610d25576000838260ff1681518110610c1a57610c1a613473565b60209081029190910101516040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610c6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c939190613489565b90508015610d105760405163a9059cbb60e01b81526001600160a01b0385811660048301526024820183905283169063a9059cbb906044016020604051808303816000875af1158015610cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0e91906134a2565b505b50508080610d1d906134bf565b915050610bf7565b5060405147906001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610d5e573d6000803e3d6000fd5b50505050565b610d6c611f6c565b6001811015610d8d5760405162461bcd60e51b8152600401610beb906134de565b80601754610d9b9190613520565b3414610db95760405162461bcd60e51b8152600401610beb9061353f565b601a5460ff16610ddb5760405162461bcd60e51b8152600401610beb90613581565b610e4283838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600b54604051909250610e27915033906020016135b1565b60405160208183030381529060405280519060200120611fc5565b610e8e5760405162461bcd60e51b815260206004820181905260248201527f6572726f723a3130303032206e6f7420696e207468652077686974656c6973746044820152606401610beb565b60005b81811015610ee857600e5460135410610ebc5760405162461bcd60e51b8152600401610beb906135ce565b610ec533611fdb565b601354610ed3906001613605565b60135580610ee08161361d565b915050610e91565b50610b5c6001600a55565b610efc33611178565b610f185760405162461bcd60e51b8152600401610beb90613426565b600e94909455600f92909255601055601255601155565b610b5c8383836120c3565b610f42611f6c565b6001811015610f635760405162461bcd60e51b8152600401610beb906134de565b80601954610f719190613520565b3414610f8f5760405162461bcd60e51b8152600401610beb9061353f565b601a5462010000900460ff16610fb75760405162461bcd60e51b8152600401610beb90613581565b60005b818110156110115760105460155410610fe55760405162461bcd60e51b8152600401610beb906135ce565b610fee33611fdb565b601554610ffc906001613605565b601555806110098161361d565b915050610fba565b5061101c6001600a55565b50565b61102833611178565b6110445760405162461bcd60e51b8152600401610beb90613426565b601792909255601855601955565b610b5c83838360405180602001604052806000815250611486565b61107633611178565b6110925760405162461bcd60e51b8152600401610beb90613426565b61101c816122ab565b6110a433611178565b6110c05760405162461bcd60e51b8152600401610beb90613426565b6001600160a01b03909116600090815260226020526040902055565b6110e533611178565b6111015760405162461bcd60e51b8152600401610beb90613426565b601a8054601d805460ff19169415159490941790935561ffff1990921694151561ff00191694909417610100931515939093029290921763ffff00001916620100009115159190910263ff000000191617630100000092151592909202919091179055565b6000611171826122b6565b5192915050565b60006109f66000805160206138188339815191528361130b565b61119b33611178565b6111b75760405162461bcd60e51b8152600401610beb90613426565b601d80549115156101000261ff0019909216919091179055565b60006001600160a01b0382166111fa576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6112276123d0565b611231600061242a565b565b61123c33611178565b6112585760405162461bcd60e51b8152600401610beb90613426565b600b91909155600c55565b6000806112b286868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600b54604051909250610e27915033906020016135b1565b915061130084848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c54604051909250610e27915033906020016135b1565b905094509492505050565b60009182526009602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060038054610a0b906133bf565b61134e33611178565b61136a5760405162461bcd60e51b8152600401610beb90613426565b61101c6000805160206138188339815191528261247c565b61138b33611178565b6113a75760405162461bcd60e51b8152600401610beb90613426565b80516113ba90601f906020840190612b98565b5050565b6113c782611eb9565b336001600160a01b038316036113f05760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61146533611178565b6114815760405162461bcd60e51b8152600401610beb90613426565b602155565b6114918484846120c3565b6001600160a01b0383163b15610d5e576114ad84848484612502565b610d5e576040516368d2bf6b60e11b815260040160405180910390fd5b6114d2611f6c565b60018110156114f35760405162461bcd60e51b8152600401610beb906134de565b806018546115019190613520565b341461151f5760405162461bcd60e51b8152600401610beb9061353f565b601a54610100900460ff166115465760405162461bcd60e51b8152600401610beb90613581565b61159283838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c54604051909250610e27915033906020016135b1565b6115de5760405162461bcd60e51b815260206004820181905260248201527f6572726f723a3130303032206e6f7420696e207468652077686974656c6973746044820152606401610beb565b60005b81811015610ee857600f546014541061160c5760405162461bcd60e51b8152600401610beb906135ce565b61161533611fdb565b601454611623906001613605565b601455806116308161361d565b9150506115e1565b6060601f611645836125ee565b604051602001611656929190613652565b6040516020818303038152906040529050919050565b61167533611178565b6116915760405162461bcd60e51b8152600401610beb90613426565b80518251146117085760405162461bcd60e51b815260206004820152603c60248201527f6572726f723a313030333320746f416464726573736573206c656e677468206460448201527f6f6573206e6f74206d6174636820616d6f756e7473206c656e677468000000006064820152608401610beb565b815160005b81811015610d5e57600084828151811061172957611729613473565b60200260200101519050600084838151811061174757611747613473565b6020026020010151905060005b818110156117ad57601b54601c541061177f5760405162461bcd60e51b8152600401610beb9061371c565b61178a8360016126ee565b601c54611798906001613605565b601c55806117a58161361d565b915050611754565b50505080806117bb9061361d565b91505061170d565b6001600160a01b0381166000908152600d60205260408120546012546109f6919061340f565b6117f1611f6c565b81518351146118685760405162461bcd60e51b815260206004820152603c60248201527f6572726f723a20313030303020636f6e747261637473206c656e67746820646f60448201527f6573206e6f74206d6174636820746f6b656e496473206c656e677468000000006064820152608401610beb565b80518251146118df5760405162461bcd60e51b815260206004820152603960248201527f6572726f723a20313030303120746f6b656e496473206c656e67746820646f6560448201527f73206e6f74206d6174636820636f756e7473206c656e677468000000000000006064820152608401610beb565b601a546301000000900460ff166119315760405162461bcd60e51b815260206004820152601660248201527532b93937b91d18981818191039bbb4ba31b41037b33360511b6044820152606401610beb565b6000805b83518110156119775782818151811061195057611950613473565b6020026020010151826119639190613605565b91508061196f8161361d565b915050611935565b50601e81106119c05760405162461bcd60e51b815260206004820152601560248201527406572726f723a203130303033204c696d697420333605c1b6044820152606401610beb565b806021546119ce9190613520565b3414611a275760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303034206d73672e76616c756520697320696e636f72726560448201526118dd60f21b6064820152608401610beb565b60005b8351811015611dcf576000858281518110611a4757611a47613473565b602002602001015190506000858381518110611a6557611a65613473565b602002602001015190506000858481518110611a8357611a83613473565b60200260200101519050336001600160a01b0316836001600160a01b0316636352211e846040518263ffffffff1660e01b8152600401611ac591815260200190565b602060405180830381865afa158015611ae2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b069190613762565b6001600160a01b031614611b535760405162461bcd60e51b815260206004820152601460248201527332b93937b91d189818181a9027379037bbb732b960611b6044820152606401610beb565b6001600160a01b038316600090815260226020526040902054611bb85760405162461bcd60e51b815260206004820181905260248201527f6572726f723a313030303620436f6e74726163742063616e6e6f74206d696e746044820152606401610beb565b6001600160a01b03831660009081526022602090815260408083205482805281842086855290925290912054611bef908390613605565b1115611c4f5760405162461bcd60e51b815260206004820152602960248201527f6572726f723a31303030372047726561746572207468616e206d6178696d756d604482015268207175616e7469747960b81b6064820152608401610beb565b601b5481601c54611c609190613605565b1115611cbd5760405162461bcd60e51b815260206004820152602660248201527f6572726f723a313030303820457863656564696e672074686520746f74616c20604482015265185b5bdd5b9d60d21b6064820152608401610beb565b60115481601654611cce9190613605565b1115611d1c5760405162461bcd60e51b815260206004820152601b60248201527f6572726f723a313030303920526561636820746865206c696d697400000000006044820152606401610beb565b60005b81811015611d4457611d323360016126ee565b80611d3c8161361d565b915050611d1f565b5080601654611d539190613605565b601655601c54611d64908290613605565b601c556001600160a01b038316600090815260208080526040808320858452909152902054611d94908290613605565b6001600160a01b0390931660009081526020808052604080832094835293905291909120919091555080611dc78161361d565b915050611a2a565b5050610b5c6001600a55565b611de36123d0565b6001600160a01b038116611e485760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610beb565b61101c8161242a565b611e5a33611178565b611e765760405162461bcd60e51b8152600401610beb90613426565b61101c60008051602061381883398151915282612708565b60008054821080156109f6575050600090815260046020526040902054600160e01b900460ff161590565b601d54610100900460ff1661101c5760405162461bcd60e51b815260206004820152601960248201527f6572726f723a31303030302063616e277420617070726f7665000000000000006044820152606401610beb565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6002600a5403611fbe5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610beb565b6002600a55565b600082611fd2858461276f565b14949350505050565b6012546001600160a01b0382166000908152600d6020526040902054106120445760405162461bcd60e51b815260206004820152601b60248201527f6572726f723a313030303320616c726561647920636c61696d656400000000006044820152606401610beb565b601b54601c54106120675760405162461bcd60e51b8152600401610beb9061371c565b6120728160016126ee565b6001600160a01b0381166000908152600d6020526040902054612096906001613605565b6001600160a01b0382166000908152600d6020526040902055601c546120bd906001613605565b601c5550565b60006120ce826122b6565b9050836001600160a01b031681600001516001600160a01b0316146121055760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612123575061212385336108e7565b8061213e57503361213384610a8e565b6001600160a01b0316145b90508061215e57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661218557604051633a954ecd60e21b815260040160405180910390fd5b61219285858560016127bc565b61219e60008487611f10565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661227257600054821461227257805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b031660008051602061383883398151915260405160405180910390a45050505050565b61101c816000612813565b6040805160608101825260008082526020820181905291810191909152816000548110156123b757600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906123b55780516001600160a01b03161561234c579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156123b0579392505050565b61234c565b505b604051636f96cda160e11b815260040160405180910390fd5b6008546001600160a01b031633146112315760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610beb565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612486828261130b565b6113ba5760008281526009602090815260408083206001600160a01b03851684529091529020805460ff191660011790556124be3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061253790339089908890889060040161377f565b6020604051808303816000875af1925050508015612572575060408051601f3d908101601f1916820190925261256f918101906137bc565b60015b6125d0573d8080156125a0576040519150601f19603f3d011682016040523d82523d6000602084013e6125a5565b606091505b5080516000036125c8576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816000036126155750506040805180820190915260018152600360fc1b602082015290565b8160005b811561263f57806126298161361d565b91506126389050600a836137ef565b9150612619565b6000816001600160401b0381111561265957612659612d29565b6040519080825280601f01601f191660200182016040528015612683576020820181803683370190505b5090505b84156125e65761269860018361340f565b91506126a5600a86613803565b6126b0906030613605565b60f81b8183815181106126c5576126c5613473565b60200101906001600160f81b031916908160001a9053506126e7600a866137ef565b9450612687565b6113ba8282604051806020016040528060008152506129c6565b612712828261130b565b156113ba5760008281526009602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600081815b84518110156127b4576127a08286838151811061279357612793613473565b6020026020010151612b69565b9150806127ac8161361d565b915050612774565b509392505050565b601d54610100900460ff16610d5e5760405162461bcd60e51b815260206004820152601a60248201527f6572726f723a31303030302063616e2774207472616e736665720000000000006044820152606401610beb565b600061281e836122b6565b80519091508215612884576000336001600160a01b0383161480612847575061284782336108e7565b8061286257503361285786610a8e565b6001600160a01b0316145b90508061288257604051632ce44b5f60e11b815260040160405180910390fd5b505b61289060008583611f10565b6001600160a01b0380821660008181526005602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526004909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b17855591890180845292208054919490911661298e57600054821461298e57805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b03841690600080516020613838833981519152908390a4505060018054810190555050565b6000546001600160a01b0384166129ef57604051622e076360e81b815260040160405180910390fd5b82600003612a105760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15612b26575b60405182906001600160a01b03881690600090600080516020613838833981519152908290a4612aef6000878480600101955087612502565b612b0c576040516368d2bf6b60e11b815260040160405180910390fd5b808210612ab6578260005414612b2157600080fd5b612b59565b5b6040516001830192906001600160a01b03881690600090600080516020613838833981519152908290a4808210612b27575b506000908155610d5e9085838684565b6000818310612b85576000828152602084905260409020610bbf565b6000838152602083905260409020610bbf565b828054612ba4906133bf565b90600052602060002090601f016020900481019282612bc65760008555612c0c565b82601f10612bdf57805160ff1916838001178555612c0c565b82800160010185558215612c0c579182015b82811115612c0c578251825591602001919060010190612bf1565b50612c18929150612c1c565b5090565b5b80821115612c185760008155600101612c1d565b6001600160e01b03198116811461101c57600080fd5b600060208284031215612c5957600080fd5b8135610bbf81612c31565b60005b83811015612c7f578181015183820152602001612c67565b83811115610d5e5750506000910152565b60008151808452612ca8816020860160208601612c64565b601f01601f19169290920160200192915050565b602081526000610bbf6020830184612c90565b600060208284031215612ce157600080fd5b5035919050565b6001600160a01b038116811461101c57600080fd5b60008060408385031215612d1057600080fd5b8235612d1b81612ce8565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612d6757612d67612d29565b604052919050565b60006001600160401b03821115612d8857612d88612d29565b5060051b60200190565b600082601f830112612da357600080fd5b81356020612db8612db383612d6f565b612d3f565b82815260059290921b84018101918181019086841115612dd757600080fd5b8286015b84811015612dfb578035612dee81612ce8565b8352918301918301612ddb565b509695505050505050565b60008060408385031215612e1957600080fd5b82356001600160401b03811115612e2f57600080fd5b612e3b85828601612d92565b9250506020830135612e4c81612ce8565b809150509250929050565b60008083601f840112612e6957600080fd5b5081356001600160401b03811115612e8057600080fd5b6020830191508360208260051b8501011115612e9b57600080fd5b9250929050565b600080600060408486031215612eb757600080fd5b83356001600160401b03811115612ecd57600080fd5b612ed986828701612e57565b909790965060209590950135949350505050565b600080600080600060a08688031215612f0557600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b600080600060608486031215612f3d57600080fd5b8335612f4881612ce8565b92506020840135612f5881612ce8565b929592945050506040919091013590565b600080600060608486031215612f7e57600080fd5b505081359360208301359350604090920135919050565b801515811461101c57600080fd5b600080600080600060a08688031215612fbb57600080fd5b8535612fc681612f95565b94506020860135612fd681612f95565b93506040860135612fe681612f95565b92506060860135612ff681612f95565b9150608086013561300681612f95565b809150509295509295909350565b60006020828403121561302657600080fd5b8135610bbf81612ce8565b60006020828403121561304357600080fd5b8135610bbf81612f95565b6000806040838503121561306157600080fd5b50508035926020909101359150565b6000806000806040858703121561308657600080fd5b84356001600160401b038082111561309d57600080fd5b6130a988838901612e57565b909650945060208701359150808211156130c257600080fd5b506130cf87828801612e57565b95989497509550505050565b600080604083850312156130ee57600080fd5b823591506020830135612e4c81612ce8565b60006001600160401b0383111561311957613119612d29565b61312c601f8401601f1916602001612d3f565b905082815283838301111561314057600080fd5b828260208301376000602084830101529392505050565b60006020828403121561316957600080fd5b81356001600160401b0381111561317f57600080fd5b8201601f8101841361319057600080fd5b6125e684823560208401613100565b600080604083850312156131b257600080fd5b82356131bd81612ce8565b91506020830135612e4c81612f95565b600080600080608085870312156131e357600080fd5b84356131ee81612ce8565b935060208501356131fe81612ce8565b92506040850135915060608501356001600160401b0381111561322057600080fd5b8501601f8101871361323157600080fd5b61324087823560208401613100565b91505092959194509250565b600082601f83011261325d57600080fd5b8135602061326d612db383612d6f565b82815260059290921b8401810191818101908684111561328c57600080fd5b8286015b84811015612dfb5780358352918301918301613290565b600080604083850312156132ba57600080fd5b82356001600160401b03808211156132d157600080fd5b6132dd86838701612d92565b935060208501359150808211156132f357600080fd5b506133008582860161324c565b9150509250929050565b6000806040838503121561331d57600080fd5b823561332881612ce8565b91506020830135612e4c81612ce8565b60008060006060848603121561334d57600080fd5b83356001600160401b038082111561336457600080fd5b61337087838801612d92565b9450602086013591508082111561338657600080fd5b6133928783880161324c565b935060408601359150808211156133a857600080fd5b506133b58682870161324c565b9150509250925092565b600181811c908216806133d357607f821691505b6020821081036133f357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082821015613421576134216133f9565b500390565b6020808252602d908201527f4f70657261746f72416363657373436f6e74726f6c3a2063616c6c657220697360408201526c103737ba1037b832b930ba37b960991b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561349b57600080fd5b5051919050565b6000602082840312156134b457600080fd5b8151610bbf81612f95565b600060ff821660ff81036134d5576134d56133f9565b60010192915050565b60208082526022908201527f6572726f723a3130303130204d7573742062652067726561746572207468616e604082015261203160f01b606082015260800190565b600081600019048311821515161561353a5761353a6133f9565b500290565b60208082526022908201527f6572726f723a3130303030206d73672e76616c756520697320696e636f72726560408201526118dd60f21b606082015260800190565b60208082526016908201527532b93937b91d18981818189039bbb4ba31b41037b33360511b604082015260600190565b60609190911b6bffffffffffffffffffffffff1916815260140190565b6020808252601b908201527f6572726f723a313030303420526561636820746865206c696d69740000000000604082015260600190565b60008219821115613618576136186133f9565b500190565b60006001820161362f5761362f6133f9565b5060010190565b60008151613648818560208601612c64565b9290920192915050565b600080845481600182811c91508083168061366e57607f831692505b6020808410820361368d57634e487b7160e01b86526022600452602486fd5b8180156136a157600181146136b2576136df565b60ff198616895284890196506136df565b60008b81526020902060005b868110156136d75781548b8201529085019083016136be565b505084890196505b5050505050506137136137026136fc83602f60f81b815260010190565b86613636565b64173539b7b760d91b815260050190565b95945050505050565b60208082526026908201527f6572726f723a313030313020457863656564696e672074686520746f74616c20604082015265185b5bdd5b9d60d21b606082015260800190565b60006020828403121561377457600080fd5b8151610bbf81612ce8565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906137b290830184612c90565b9695505050505050565b6000602082840312156137ce57600080fd5b8151610bbf81612c31565b634e487b7160e01b600052601260045260246000fd5b6000826137fe576137fe6137d9565b500490565b600082613812576138126137d9565b50069056fe97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122067c4a6ce1356b7cce396eca2943dc6db569cc4d314e928c446907ae69c3ecfb664736f6c634300080d0033

Deployed Bytecode Sourcemap

87742:14310:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61520:321;;;;;;;;;;-1:-1:-1;61520:321:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;61520:321:0;;;;;;;;97417:86;;;;;;;;;;-1:-1:-1;97483:12:0;;97417:86;;;738:25:1;;;726:2;711:18;97417:86:0;592:177:1;64756:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;66384:220::-;;;;;;;;;;-1:-1:-1;66384:220:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1896:32:1;;;1878:51;;1866:2;1851:18;66384:220:0;1732:203:1;65885:433:0;;;;;;;;;;-1:-1:-1;65885:433:0;;;;;:::i;:::-;;:::i;:::-;;99358:339;;;;;;;;;;-1:-1:-1;99358:339:0;;;;;:::i;:::-;;:::i;97610:446::-;;;;;;;;;;-1:-1:-1;97610:446:0;;;;;:::i;:::-;;:::i;93190:922::-;;;;;;:::i;:::-;;:::i;87827:33::-;;;;;;;;;;;;;;;;60760:312;;;;;;;;;;-1:-1:-1;61023:12:0;;60813:7;61007:13;:28;60760:312;;90326:434;;;;;;;;;;-1:-1:-1;90326:434:0;;;;;:::i;:::-;;:::i;67415:170::-;;;;;;;;;;-1:-1:-1;67415:170:0;;;;;:::i;:::-;;:::i;87867:33::-;;;;;;;;;;;;;;;;95050:633;;;;;;:::i;:::-;;:::i;91269:276::-;;;;;;;;;;-1:-1:-1;91269:276:0;;;;;:::i;:::-;;:::i;67656:185::-;;;;;;;;;;-1:-1:-1;67656:185:0;;;;;:::i;:::-;;:::i;96491:90::-;;;;;;;;;;-1:-1:-1;96491:90:0;;;;;:::i;:::-;;:::i;99025:166::-;;;;;;;;;;-1:-1:-1;99025:166:0;;;;;:::i;:::-;;:::i;90768:493::-;;;;;;;;;;-1:-1:-1;91066:13:0;;91105;;91147:16;;91193:17;;91238:15;;90768:493;;;6790:25:1;;;6846:2;6831:18;;6824:34;;;;6874:18;;;6867:34;;;;6932:2;6917:18;;6910:34;6975:3;6960:19;;6953:35;6777:3;6762:19;90768:493:0;6531:463:1;91888:391:0;;;;;;;;;;-1:-1:-1;91888:391:0;;;;;:::i;:::-;;:::i;64564:125::-;;;;;;;;;;-1:-1:-1;64564:125:0;;;;;:::i;:::-;;:::i;83000:130::-;;;;;;;;;;-1:-1:-1;83000:130:0;;;;;:::i;:::-;;:::i;99199:151::-;;;;;;;;;;-1:-1:-1;99199:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;99313:29:0;99286:7;99313:29;;;:12;:29;;;;;;;99199:151;88792:79;;;;;;;;;;-1:-1:-1;88792:79:0;;;;;:::i;:::-;;:::i;61905:206::-;;;;;;;;;;-1:-1:-1;61905:206:0;;;;;:::i;:::-;;:::i;33187:103::-;;;;;;;;;;;;;:::i;89547:228::-;;;;;;;;;;-1:-1:-1;89547:228:0;;;;;:::i;:::-;;:::i;89783:535::-;;;;;;;;;;-1:-1:-1;89783:535:0;;;;;:::i;:::-;;:::i;:::-;;;;9626:14:1;;9619:22;9601:41;;9685:14;;9678:22;9673:2;9658:18;;9651:50;9574:18;89783:535:0;9439:268:1;32546:87:0;;;;;;;;;;-1:-1:-1;32619:6:0;;-1:-1:-1;;;;;32619:6:0;32546:87;;89132:407;;;;;;;;;;-1:-1:-1;89391:13:0;;89430;;89472:16;;89516:15;;89132:407;;;9943:25:1;;;9999:2;9984:18;;9977:34;;;;10027:18;;;10020:34;10085:2;10070:18;;10063:34;9930:3;9915:19;89132:407:0;9712:391:1;81797:164:0;;;;;;;;;;-1:-1:-1;81797:164:0;;;;;:::i;:::-;;:::i;64925:104::-;;;;;;;;;;;;;:::i;83255:120::-;;;;;;;;;;-1:-1:-1;83255:120:0;;;;;:::i;:::-;;:::i;97099:100::-;;;;;;;;;;-1:-1:-1;97099:100:0;;;;;:::i;:::-;;:::i;66676:349::-;;;;;;;;;;-1:-1:-1;66676:349:0;;;;;:::i;:::-;;:::i;97511:91::-;;;;;;;;;;-1:-1:-1;97582:12:0;;97511:91;;91553:327;;;;;;;;;;-1:-1:-1;91775:13:0;;91814;;91856:16;;91553:327;;;11885:25:1;;;11941:2;11926:18;;11919:34;;;;11969:18;;;11962:34;11873:2;11858:18;91553:327:0;11683:319:1;92287:450:0;;;;;;;;;;-1:-1:-1;92557:12:0;;92675:13;;92287:450;;;92557:12;;;;12261:14:1;12254:22;12236:41;;92557:12:0;92594;;;;12320:14:1;12313:22;12308:2;12293:18;;12286:50;92634:15:0;;;;;12379:14:1;12372:22;12352:18;;;12345:50;;;;92675:13:0;;;12438:14:1;12431:22;12426:2;12411:18;;12404:50;92715:14:0;;;;;;;12498::1;12491:22;12485:3;12470:19;;12463:51;12223:3;12208:19;92287:450:0;12007:513:1;98730:122:0;;;;;;;;;;-1:-1:-1;98730:122:0;;;;;:::i;:::-;;:::i;67912:392::-;;;;;;;;;;-1:-1:-1;67912:392:0;;;;;:::i;:::-;;:::i;94120:922::-;;;;;;:::i;:::-;;:::i;97207:202::-;;;;;;;;;;-1:-1:-1;97207:202:0;;;;;:::i;:::-;;:::i;95691:792::-;;;;;;;;;;-1:-1:-1;95691:792:0;;;;;:::i;:::-;;:::i;98860:100::-;;;;;;;;;;-1:-1:-1;98937:15:0;;98860:100;;67096:189;;;;;;;;;;-1:-1:-1;67096:189:0;;;;;:::i;:::-;-1:-1:-1;;;;;67242:25:0;;;67218:4;67242:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;67096:189;96589:139;;;;;;;;;;-1:-1:-1;96589:139:0;;;;;:::i;:::-;;:::i;99705:2344::-;;;;;;:::i;:::-;;:::i;33445:238::-;;;;;;;;;;-1:-1:-1;33445:238:0;;;;;:::i;:::-;;:::i;81722:66::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;81722:66:0;;83383:124;;;;;;;;;;-1:-1:-1;83383:124:0;;;;;:::i;:::-;;:::i;61520:321::-;61638:4;-1:-1:-1;;;;;;61675:40:0;;-1:-1:-1;;;61675:40:0;;:105;;-1:-1:-1;;;;;;;61732:48:0;;-1:-1:-1;;;61732:48:0;61675:105;:158;;;-1:-1:-1;;;;;;;;;;58701:40:0;;;61797:36;61655:178;61520:321;-1:-1:-1;;61520:321:0:o;64756:100::-;64810:13;64843:5;64836:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64756:100;:::o;66384:220::-;66468:7;66493:16;66501:7;66493;:16::i;:::-;66488:64;;66518:34;;-1:-1:-1;;;66518:34:0;;;;;;;;;;;66488:64;-1:-1:-1;66572:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;66572:24:0;;66384:220::o;65885:433::-;65966:18;65981:2;65966:14;:18::i;:::-;65997:13;66013:24;66029:7;66013:15;:24::i;:::-;65997:40;;66058:5;-1:-1:-1;;;;;66052:11:0;:2;-1:-1:-1;;;;;66052:11:0;;66048:48;;66072:24;;-1:-1:-1;;;66072:24:0;;;;;;;;;;;66048:48;13718:10;-1:-1:-1;;;;;66113:21:0;;;66109:161;;66154:37;66171:5;13718:10;67096:189;:::i;66154:37::-;66149:121;;66219:35;;-1:-1:-1;;;66219:35:0;;;;;;;;;;;66149:121;66282:28;66291:2;66295:7;66304:5;66282:8;:28::i;:::-;65955:363;65885:433;;:::o;99358:339::-;-1:-1:-1;;;;;99500:29:0;;99476:7;99500:29;;;:12;:29;;;;;;:34;;99496:75;;-1:-1:-1;99558:1:0;99551:8;;99496:75;-1:-1:-1;;;;;99646:34:0;;;;;;:17;:34;;;;;;;:43;;;;;;;;;99601:29;;;:12;:29;;;;;;:88;;99646:43;99601:88;:::i;:::-;99581:108;99358:339;-1:-1:-1;;;99358:339:0:o;97610:446::-;82875:24;13718:10;83000:130;:::i;82875:24::-;82853:119;;;;-1:-1:-1;;;82853:119:0;;;;;;;:::i;:::-;;;;;;;;;97727:7:::1;97722:236;97740:6;:13;97736:1;:17;;;97722:236;;;97775:12;97797:6;97804:1;97797:9;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;97834:30:::1;::::0;-1:-1:-1;;;97834:30:0;;97858:4:::1;97834:30;::::0;::::1;1878:51:1::0;97797:9:0;;-1:-1:-1;97822:9:0::1;::::0;-1:-1:-1;;;;;97834:15:0;::::1;::::0;::::1;::::0;1851:18:1;;97834:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;97822:42:::0;-1:-1:-1;97883:5:0;;97879:68:::1;;97909:22;::::0;-1:-1:-1;;;97909:22:0;;-1:-1:-1;;;;;17385:32:1;;;97909:22:0::1;::::0;::::1;17367:51:1::0;17434:18;;;17427:34;;;97909:14:0;::::1;::::0;::::1;::::0;17340:18:1;;97909:22:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;97879:68;97760:198;;97755:3;;;;;:::i;:::-;;;;97722:236;;;-1:-1:-1::0;98018:30:0::1;::::0;97986:21:::1;::::0;-1:-1:-1;;;;;98018:21:0;::::1;::::0;:30;::::1;;;::::0;97986:21;;97968:15:::1;98018:30:::0;97968:15;98018:30;97986:21;98018;:30;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;97711:345;97610:446:::0;;:::o;93190:922::-;12149:21;:19;:21::i;:::-;93335:1:::1;93326:5;:10;;93318:57;;;;-1:-1:-1::0;;;93318:57:0::1;;;;;;;:::i;:::-;93439:5;93423:13;;:21;;;;:::i;:::-;93410:9;:34;93388:118;;;;-1:-1:-1::0;;;93388:118:0::1;;;;;;;:::i;:::-;93527:12;::::0;::::1;;93519:47;;;;-1:-1:-1::0;;;93519:47:0::1;;;;;;;:::i;:::-;93601:158;93638:11;;93601:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;93668:18:0::1;::::0;93715:28:::1;::::0;93668:18;;-1:-1:-1;93715:28:0::1;::::0;-1:-1:-1;93732:10:0::1;::::0;93715:28:::1;;;:::i;:::-;;;;;;;;;;;;;93705:39;;;;;;93601:18;:158::i;:::-;93579:240;;;::::0;-1:-1:-1;;;93579:240:0;;19668:2:1;93579:240:0::1;::::0;::::1;19650:21:1::0;;;19687:18;;;19680:30;19746:34;19726:18;;;19719:62;19798:18;;93579:240:0::1;19466:356:1::0;93579:240:0::1;93837:9;93832:273;93856:5;93852:1;:9;93832:273;;;93925:13;;93909;;:29;93883:118;;;;-1:-1:-1::0;;;93883:118:0::1;;;;;;;:::i;:::-;94018:25;13718:10:::0;94018:11:::1;:25::i;:::-;94076:13;::::0;:17:::1;::::0;94092:1:::1;94076:17;:::i;:::-;94060:13;:33:::0;93863:3;::::1;::::0;::::1;:::i;:::-;;;;93832:273;;;;12193:20:::0;11587:1;12713:7;:22;12530:213;90326:434;82875:24;13718:10;83000:130;:::i;82875:24::-;82853:119;;;;-1:-1:-1;;;82853:119:0;;;;;;;:::i;:::-;90550:13:::1;:28:::0;;;;90589:13:::1;:28:::0;;;;90628:16:::1;:34:::0;90673:17:::1;:36:::0;90720:15:::1;:32:::0;90326:434::o;67415:170::-;67549:28;67559:4;67565:2;67569:7;67549:9;:28::i;95050:633::-;12149:21;:19;:21::i;:::-;95141:1:::1;95132:5;:10;;95124:57;;;;-1:-1:-1::0;;;95124:57:0::1;;;;;;;:::i;:::-;95248:5;95229:16;;:24;;;;:::i;:::-;95216:9;:37;95194:121;;;;-1:-1:-1::0;;;95194:121:0::1;;;;;;;:::i;:::-;95336:15;::::0;;;::::1;;;95328:50;;;;-1:-1:-1::0;;;95328:50:0::1;;;;;;;:::i;:::-;95396:9;95391:285;95415:5;95411:1;:9;95391:285;;;95487:16;;95468;;:35;95442:124;;;;-1:-1:-1::0;;;95442:124:0::1;;;;;;;:::i;:::-;95583:25;13718:10:::0;94018:11:::1;:25::i;95583:::-;95644:16;::::0;:20:::1;::::0;95663:1:::1;95644:20;:::i;:::-;95625:16;:39:::0;95422:3;::::1;::::0;::::1;:::i;:::-;;;;95391:285;;;;12193:20:::0;11587:1;12713:7;:22;12530:213;12193:20;95050:633;:::o;91269:276::-;82875:24;13718:10;83000:130;:::i;82875:24::-;82853:119;;;;-1:-1:-1;;;82853:119:0;;;;;;;:::i;:::-;91425:13:::1;:28:::0;;;;91464:13:::1;:28:::0;91503:16:::1;:34:::0;91269:276::o;67656:185::-;67794:39;67811:4;67817:2;67821:7;67794:39;;;;;;;;;;;;:16;:39::i;96491:90::-;82875:24;13718:10;83000:130;:::i;82875:24::-;82853:119;;;;-1:-1:-1;;;82853:119:0;;;;;;;:::i;:::-;96553:20:::1;96565:7;96553:11;:20::i;99025:166::-:0;82875:24;13718:10;83000:130;:::i;82875:24::-;82853:119;;;;-1:-1:-1;;;82853:119:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;99146:29:0;;::::1;;::::0;;;:12:::1;:29;::::0;;;;:37;99025:166::o;91888:391::-;82875:24;13718:10;83000:130;:::i;82875:24::-;82853:119;;;;-1:-1:-1;;;82853:119:0;;;;;;;:::i;:::-;92085:12:::1;:26:::0;;92202:13:::1;:28:::0;;-1:-1:-1;;92202:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;;92122:26:0;;;92085;::::1;;-1:-1:-1::0;;92122:26:0;;;;;92085::::1;92122::::0;::::1;;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;92241:30:0;92159:32;;::::1;;::::0;;;::::1;-1:-1:-1::0;;92241:30:0;;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;91888:391::o;64564:125::-;64628:7;64655:21;64668:7;64655:12;:21::i;:::-;:26;;64564:125;-1:-1:-1;;64564:125:0:o;83000:130::-;83067:4;83091:31;-1:-1:-1;;;;;;;;;;;83114:7:0;83091;:31::i;88792:79::-;82875:24;13718:10;83000:130;:::i;82875:24::-;82853:119;;;;-1:-1:-1;;;82853:119:0;;;;;;;:::i;:::-;88851:5:::1;:12:::0;;;::::1;;;;-1:-1:-1::0;;88851:12:0;;::::1;::::0;;;::::1;::::0;;88792:79::o;61905:206::-;61969:7;-1:-1:-1;;;;;61993:19:0;;61989:60;;62021:28;;-1:-1:-1;;;62021:28:0;;;;;;;;;;;61989:60;-1:-1:-1;;;;;;62075:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;62075:27:0;;61905:206::o;33187:103::-;32432:13;:11;:13::i;:::-;33252:30:::1;33279:1;33252:18;:30::i;:::-;33187:103::o:0;89547:228::-;82875:24;13718:10;83000:130;:::i;82875:24::-;82853:119;;;;-1:-1:-1;;;82853:119:0;;;;;;;:::i;:::-;89680:18:::1;:38:::0;;;;89729:18:::1;:38:::0;89547:228::o;89783:535::-;89920:19;89941;89990:145;90023:14;;89990:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;90052:18:0;;90095:28;;90052:18;;-1:-1:-1;90095:28:0;;-1:-1:-1;90112:10:0;;90095:28;;;:::i;89990:145::-;89973:162;;90165:145;90198:14;;90165:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;90227:18:0;;90270:28;;90227:18;;-1:-1:-1;90270:28:0;;-1:-1:-1;90287:10:0;;90270:28;;;:::i;90165:145::-;90148:162;;89783:535;;;;;;;:::o;81797:164::-;81900:4;81924:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;81924:29:0;;;;;;;;;;;;;;;81797:164::o;64925:104::-;64981:13;65014:7;65007:14;;;;;:::i;83255:120::-;82875:24;13718:10;83000:130;:::i;82875:24::-;82853:119;;;;-1:-1:-1;;;82853:119:0;;;;;;;:::i;:::-;83333:34:::1;-1:-1:-1::0;;;;;;;;;;;83359:7:0::1;83333:10;:34::i;97099:100::-:0;82875:24;13718:10;83000:130;:::i;82875:24::-;82853:119;;;;-1:-1:-1;;;82853:119:0;;;;;;;:::i;:::-;97173:18;;::::1;::::0;:8:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;97099:100:::0;:::o;66676:349::-;66796:24;66811:8;66796:14;:24::i;:::-;13718:10;-1:-1:-1;;;;;66837:24:0;;;66833:54;;66870:17;;-1:-1:-1;;;66870:17:0;;;;;;;;;;;66833:54;13718:10;66900:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;66900:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;66900:53:0;;;;;;;;;;66969:48;;540:41:1;;;66900:42:0;;13718:10;66969:48;;513:18:1;66969:48:0;;;;;;;66676:349;;:::o;98730:122::-;82875:24;13718:10;83000:130;:::i;82875:24::-;82853:119;;;;-1:-1:-1;;;82853:119:0;;;;;;;:::i;:::-;98812:15:::1;:32:::0;98730:122::o;67912:392::-;68079:28;68089:4;68095:2;68099:7;68079:9;:28::i;:::-;-1:-1:-1;;;;;68122:13:0;;35725:19;:23;68118:179;;68157:56;68188:4;68194:2;68198:7;68207:5;68157:30;:56::i;:::-;68152:145;;68241:40;;-1:-1:-1;;;68241:40:0;;;;;;;;;;;94120:922;12149:21;:19;:21::i;:::-;94265:1:::1;94256:5;:10;;94248:57;;;;-1:-1:-1::0;;;94248:57:0::1;;;;;;;:::i;:::-;94369:5;94353:13;;:21;;;;:::i;:::-;94340:9;:34;94318:118;;;;-1:-1:-1::0;;;94318:118:0::1;;;;;;;:::i;:::-;94457:12;::::0;::::1;::::0;::::1;;;94449:47;;;;-1:-1:-1::0;;;94449:47:0::1;;;;;;;:::i;:::-;94531:158;94568:11;;94531:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;94598:18:0::1;::::0;94645:28:::1;::::0;94598:18;;-1:-1:-1;94645:28:0::1;::::0;-1:-1:-1;94662:10:0::1;::::0;94645:28:::1;;;:::i;94531:158::-;94509:240;;;::::0;-1:-1:-1;;;94509:240:0;;19668:2:1;94509:240:0::1;::::0;::::1;19650:21:1::0;;;19687:18;;;19680:30;19746:34;19726:18;;;19719:62;19798:18;;94509:240:0::1;19466:356:1::0;94509:240:0::1;94767:9;94762:273;94786:5;94782:1;:9;94762:273;;;94855:13;;94839;;:29;94813:118;;;;-1:-1:-1::0;;;94813:118:0::1;;;;;;;:::i;:::-;94948:25;13718:10:::0;94018:11:::1;:25::i;94948:::-;95006:13;::::0;:17:::1;::::0;95022:1:::1;95006:17;:::i;:::-;94990:13;:33:::0;94793:3;::::1;::::0;::::1;:::i;:::-;;;;94762:273;;97207:202:::0;97288:13;97358:8;97373:17;97382:7;97373:8;:17::i;:::-;97341:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;97314:87;;97207:202;;;:::o;95691:792::-;82875:24;13718:10;83000:130;:::i;82875:24::-;82853:119;;;;-1:-1:-1;;;82853:119:0;;;;;;;:::i;:::-;95869:7:::1;:14;95847:11;:18;:36;95825:146;;;::::0;-1:-1:-1;;;95825:146:0;;22649:2:1;95825:146:0::1;::::0;::::1;22631:21:1::0;22688:2;22668:18;;;22661:30;22727:34;22707:18;;;22700:62;22798:30;22778:18;;;22771:58;22846:19;;95825:146:0::1;22447:424:1::0;95825:146:0::1;95999:18:::0;;95984:12:::1;96028:448;96050:4;96045:2;:9;96028:448;;;96077:10;96090:11;96102:2;96090:15;;;;;;;;:::i;:::-;;;;;;;96077:28;;96120:14;96137:7;96145:2;96137:11;;;;;;;;:::i;:::-;;;;;;;96120:28;;96170:9;96165:300;96189:6;96185:1;:10;96165:300;;;96266:12;;96251;;:27;96221:139;;;;-1:-1:-1::0;;;96221:139:0::1;;;;;;;:::i;:::-;96381:16;96391:2;96395:1;96381:9;:16::i;:::-;96433:12;::::0;:16:::1;::::0;96448:1:::1;96433:16;:::i;:::-;96418:12;:31:::0;96197:3;::::1;::::0;::::1;:::i;:::-;;;;96165:300;;;;96062:414;;96056:4;;;;;:::i;:::-;;;;96028:448;;96589:139:::0;-1:-1:-1;;;;;96698:22:0;;96651:7;96698:22;;;:16;:22;;;;;;96678:17;;:42;;96698:22;96678:42;:::i;99705:2344::-;12149:21;:19;:21::i;:::-;99919:8:::1;:15;99899:9;:16;:35;99877:145;;;::::0;-1:-1:-1;;;99877:145:0;;23485:2:1;99877:145:0::1;::::0;::::1;23467:21:1::0;23524:2;23504:18;;;23497:30;23563:34;23543:18;;;23536:62;23634:30;23614:18;;;23607:58;23682:19;;99877:145:0::1;23283:424:1::0;99877:145:0::1;100076:6;:13;100057:8;:15;:32;100035:139;;;::::0;-1:-1:-1;;;100035:139:0;;23914:2:1;100035:139:0::1;::::0;::::1;23896:21:1::0;23953:2;23933:18;;;23926:30;23992:34;23972:18;;;23965:62;24063:27;24043:18;;;24036:55;24108:19;;100035:139:0::1;23712:421:1::0;100035:139:0::1;100195:14;::::0;;;::::1;;;100187:49;;;::::0;-1:-1:-1;;;100187:49:0;;24340:2:1;100187:49:0::1;::::0;::::1;24322:21:1::0;24379:2;24359:18;;;24352:30;-1:-1:-1;;;24398:18:1;;;24391:52;24460:18;;100187:49:0::1;24138:346:1::0;100187:49:0::1;100249:22;100291:9:::0;100286:116:::1;100310:8;:15;100306:1;:19;100286:116;;;100381:6;100388:1;100381:9;;;;;;;;:::i;:::-;;;;;;;100364:14;:26;;;;:::i;:::-;100347:43:::0;-1:-1:-1;100327:3:0;::::1;::::0;::::1;:::i;:::-;;;;100286:116;;;;100439:2;100422:14;:19;100414:53;;;::::0;-1:-1:-1;;;100414:53:0;;24691:2:1;100414:53:0::1;::::0;::::1;24673:21:1::0;24730:2;24710:18;;;24703:30;-1:-1:-1;;;24749:18:1;;;24742:51;24810:18;;100414:53:0::1;24489:345:1::0;100414:53:0::1;100533:14;100515:15;;:32;;;;:::i;:::-;100502:9;:45;100480:129;;;::::0;-1:-1:-1;;;100480:129:0;;25041:2:1;100480:129:0::1;::::0;::::1;25023:21:1::0;25080:2;25060:18;;;25053:30;25119:34;25099:18;;;25092:62;-1:-1:-1;;;25170:18:1;;;25163:32;25212:19;;100480:129:0::1;24839:398:1::0;100480:129:0::1;100627:9;100622:1420;100646:8;:15;100642:1;:19;100622:1420;;;100683:23;100709:9;100719:1;100709:12;;;;;;;;:::i;:::-;;;;;;;100683:38;;100736:15;100754:8;100763:1;100754:11;;;;;;;;:::i;:::-;;;;;;;100736:29;;100780:17;100800:6;100807:1;100800:9;;;;;;;;:::i;:::-;;;;;;;100780:29;;100897:10;-1:-1:-1::0;;;;;100852:55:0::1;100860:15;-1:-1:-1::0;;;;;100852:32:0::1;;100885:7;100852:41;;;;;;;;;;;;;738:25:1::0;;726:2;711:18;;592:177;100852:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;100852:55:0::1;;100826:137;;;::::0;-1:-1:-1;;;100826:137:0;;25700:2:1;100826:137:0::1;::::0;::::1;25682:21:1::0;25739:2;25719:18;;;25712:30;-1:-1:-1;;;25758:18:1;;;25751:50;25818:18;;100826:137:0::1;25498:344:1::0;100826:137:0::1;-1:-1:-1::0;;;;;101006:29:0;::::1;101038:1;101006:29:::0;;;:12:::1;:29;::::0;;;;;100980:127:::1;;;::::0;-1:-1:-1;;;100980:127:0;;26049:2:1;100980:127:0::1;::::0;::::1;26031:21:1::0;;;26068:18;;;26061:30;26127:34;26107:18;;;26100:62;26179:18;;100980:127:0::1;25847:356:1::0;100980:127:0::1;-1:-1:-1::0;;;;;101230:29:0;::::1;;::::0;;;:12:::1;:29;::::0;;;;;;;;101150:34;;;;;;:43;;;;;;;;;;:55:::1;::::0;101196:9;;101150:55:::1;:::i;:::-;:109;;101124:212;;;::::0;-1:-1:-1;;;101124:212:0;;26410:2:1;101124:212:0::1;::::0;::::1;26392:21:1::0;26449:2;26429:18;;;26422:30;26488:34;26468:18;;;26461:62;-1:-1:-1;;;26539:18:1;;;26532:39;26588:19;;101124:212:0::1;26208:405:1::0;101124:212:0::1;101407:12;;101394:9;101379:12;;:24;;;;:::i;:::-;:40;;101353:140;;;::::0;-1:-1:-1;;;101353:140:0;;26820:2:1;101353:140:0::1;::::0;::::1;26802:21:1::0;26859:2;26839:18;;;26832:30;26898:34;26878:18;;;26871:62;-1:-1:-1;;;26949:18:1;;;26942:36;26995:19;;101353:140:0::1;26618:402:1::0;101353:140:0::1;101567:15;;101554:9;101536:15;;:27;;;;:::i;:::-;:46;;101510:135;;;::::0;-1:-1:-1;;;101510:135:0;;27227:2:1;101510:135:0::1;::::0;::::1;27209:21:1::0;27266:2;27246:18;;;27239:30;27305:29;27285:18;;;27278:57;27352:18;;101510:135:0::1;27025:351:1::0;101510:135:0::1;101667:9;101662:99;101686:9;101682:1;:13;101662:99;;;101721:24;101731:10;101743:1;101721:9;:24::i;:::-;101697:3:::0;::::1;::::0;::::1;:::i;:::-;;;;101662:99;;;;101813:9;101795:15;;:27;;;;:::i;:::-;101777:15;:45:::0;101854:12:::1;::::0;:24:::1;::::0;101869:9;;101854:24:::1;:::i;:::-;101839:12;:39:::0;-1:-1:-1;;;;;101958:34:0;::::1;;::::0;;;:17:::1;:34:::0;;;;;;;:43;;;;;;;;;:72:::1;::::0;102021:9;;101958:72:::1;:::i;:::-;-1:-1:-1::0;;;;;101895:34:0;;::::1;;::::0;;;:17:::1;:34:::0;;;;;;;:43;;;;;;;;;;:135;;;;-1:-1:-1;100663:3:0;::::1;::::0;::::1;:::i;:::-;;;;100622:1420;;;;99866:2183;12193:20:::0;11587:1;12713:7;:22;12530:213;33445:238;32432:13;:11;:13::i;:::-;-1:-1:-1;;;;;33548:22:0;::::1;33526:110;;;::::0;-1:-1:-1;;;33526:110:0;;27583:2:1;33526:110:0::1;::::0;::::1;27565:21:1::0;27622:2;27602:18;;;27595:30;27661:34;27641:18;;;27634:62;-1:-1:-1;;;27712:18:1;;;27705:36;27758:19;;33526:110:0::1;27381:402:1::0;33526:110:0::1;33647:28;33666:8;33647:18;:28::i;83383:124::-:0;82875:24;13718:10;83000:130;:::i;82875:24::-;82853:119;;;;-1:-1:-1;;;82853:119:0;;;;;;;:::i;:::-;83464:35:::1;-1:-1:-1::0;;;;;;;;;;;83491:7:0::1;83464:11;:35::i;68559:213::-:0;68616:4;68706:13;;68696:7;:23;68653:111;;;;-1:-1:-1;;68737:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;68737:27:0;;;;68736:28;;68559:213::o;96970:121::-;97048:5;;;;;;;97040:43;;;;-1:-1:-1;;;97040:43:0;;27990:2:1;97040:43:0;;;27972:21:1;28029:2;28009:18;;;28002:30;28068:27;28048:18;;;28041:55;28113:18;;97040:43:0;27788:349:1;77839:162:0;77920:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;77920:29:0;-1:-1:-1;;;;;77920:29:0;;;;;;;;;77965:28;;77920:24;;77965:28;;;;;;;77839:162;;;:::o;12229:293::-;11631:1;12363:7;;:19;12355:63;;;;-1:-1:-1;;;12355:63:0;;28344:2:1;12355:63:0;;;28326:21:1;28383:2;28363:18;;;28356:30;28422:33;28402:18;;;28395:61;28473:18;;12355:63:0;28142:355:1;12355:63:0;11631:1;12496:7;:18;12229:293::o;1180:190::-;1305:4;1358;1329:25;1342:5;1349:4;1329:12;:25::i;:::-;:33;;1180:190;-1:-1:-1;;;;1180:190:0:o;92745:437::-;92843:17;;-1:-1:-1;;;;;92820:20:0;;;;;;:16;:20;;;;;;:40;92798:117;;;;-1:-1:-1;;;92798:117:0;;28704:2:1;92798:117:0;;;28686:21:1;28743:2;28723:18;;;28716:30;28782:29;28762:18;;;28755:57;28829:18;;92798:117:0;28502:351:1;92798:117:0;92963:12;;92948;;:27;92926:115;;;;-1:-1:-1;;;92926:115:0;;;;;;;:::i;:::-;93054:16;93064:2;93068:1;93054:9;:16::i;:::-;-1:-1:-1;;;;;93106:20:0;;;;;;:16;:20;;;;;;:24;;93129:1;93106:24;:::i;:::-;-1:-1:-1;;;;;93083:20:0;;;;;;:16;:20;;;;;:47;93158:12;;:16;;93173:1;93158:16;:::i;:::-;93143:12;:31;-1:-1:-1;92745:437:0:o;72885:2096::-;72966:35;73004:21;73017:7;73004:12;:21::i;:::-;72966:59;;73064:4;-1:-1:-1;;;;;73042:26:0;:13;:18;;;-1:-1:-1;;;;;73042:26:0;;73038:67;;73077:28;;-1:-1:-1;;;73077:28:0;;;;;;;;;;;73038:67;73118:22;13718:10;-1:-1:-1;;;;;73144:20:0;;;;:73;;-1:-1:-1;73181:36:0;73198:4;13718:10;67096:189;:::i;73181:36::-;73144:126;;;-1:-1:-1;13718:10:0;73234:20;73246:7;73234:11;:20::i;:::-;-1:-1:-1;;;;;73234:36:0;;73144:126;73118:153;;73289:17;73284:66;;73315:35;;-1:-1:-1;;;73315:35:0;;;;;;;;;;;73284:66;-1:-1:-1;;;;;73365:16:0;;73361:52;;73390:23;;-1:-1:-1;;;73390:23:0;;;;;;;;;;;73361:52;73426:43;73448:4;73454:2;73458:7;73467:1;73426:21;:43::i;:::-;73534:35;73551:1;73555:7;73564:4;73534:8;:35::i;:::-;-1:-1:-1;;;;;73865:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;73865:31:0;;;-1:-1:-1;;;;;73865:31:0;;;-1:-1:-1;;73865:31:0;;;;;;;73911:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;73911:29:0;;;;;;;;;;;73991:20;;;:11;:20;;;;;;74026:18;;-1:-1:-1;;;;;;74059:49:0;;;;-1:-1:-1;;;74092:15:0;74059:49;;;;;;;;;;74382:11;;74442:24;;;;;74485:13;;73991:20;;74442:24;;74485:13;74481:384;;74695:13;;74680:11;:28;74676:174;;74733:20;;74802:28;;;;-1:-1:-1;;;;;74776:54:0;-1:-1:-1;;;74776:54:0;-1:-1:-1;;;;;;74776:54:0;;;-1:-1:-1;;;;;74733:20:0;;74776:54;;;;74676:174;73840:1036;;;74912:7;74908:2;-1:-1:-1;;;;;74893:27:0;74902:4;-1:-1:-1;;;;;74893:27:0;-1:-1:-1;;;;;;;;;;;74893:27:0;;;;;;;;;72955:2026;;72885:2096;;;:::o;75059:89::-;75119:21;75125:7;75134:5;75119;:21::i;63286:1216::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;63413:7:0;63515:13;;63508:4;:20;63504:931;;;63553:31;63587:17;;;:11;:17;;;;;;;;;63553:51;;;;;;;;;-1:-1:-1;;;;;63553:51:0;;;;-1:-1:-1;;;63553:51:0;;-1:-1:-1;;;;;63553:51:0;;;;;;;;-1:-1:-1;;;63553:51:0;;;;;;;;;;;;;;63627:789;;63681:14;;-1:-1:-1;;;;;63681:28:0;;63677:109;;63749:9;63286:1216;-1:-1:-1;;;63286:1216:0:o;63677:109::-;-1:-1:-1;;;64152:6:0;64201:17;;;;:11;:17;;;;;;;;;64189:29;;;;;;;;;-1:-1:-1;;;;;64189:29:0;;;;;-1:-1:-1;;;64189:29:0;;-1:-1:-1;;;;;64189:29:0;;;;;;;;-1:-1:-1;;;64189:29:0;;;;;;;;;;;;;64253:28;64249:117;;64325:9;63286:1216;-1:-1:-1;;;63286:1216:0:o;64249:117::-;64108:285;;;63530:905;63504:931;64463:31;;-1:-1:-1;;;64463:31:0;;;;;;;;;;;32711:132;32619:6;;-1:-1:-1;;;;;32619:6:0;13718:10;32775:23;32767:68;;;;-1:-1:-1;;;32767:68:0;;29060:2:1;32767:68:0;;;29042:21:1;;;29079:18;;;29072:30;29138:34;29118:18;;;29111:62;29190:18;;32767:68:0;28858:356:1;33843:191:0;33936:6;;;-1:-1:-1;;;;;33953:17:0;;;-1:-1:-1;;;;;;33953:17:0;;;;;;;33986:40;;33936:6;;;33953:17;33936:6;;33986:40;;33917:16;;33986:40;33906:128;33843:191;:::o;81969:229::-;82044:22;82052:4;82058:7;82044;:22::i;:::-;82039:152;;82083:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;82083:29:0;;;;;;;;;:36;;-1:-1:-1;;82083:36:0;82115:4;82083:36;;;82166:12;13718:10;;13638:98;82166:12;-1:-1:-1;;;;;82139:40:0;82157:7;-1:-1:-1;;;;;82139:40:0;82151:4;82139:40;;;;;;;;;;81969:229;;:::o;78493:772::-;78690:155;;-1:-1:-1;;;78690:155:0;;78656:4;;-1:-1:-1;;;;;78690:36:0;;;;;:155;;13718:10;;78776:4;;78799:7;;78825:5;;78690:155;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;78690:155:0;;;;;;;;-1:-1:-1;;78690:155:0;;;;;;;;;;;;:::i;:::-;;;78673:585;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79016:6;:13;79033:1;79016:18;79012:235;;79062:40;;-1:-1:-1;;;79062:40:0;;;;;;;;;;;79012:235;79205:6;79199:13;79190:6;79186:2;79182:15;79175:38;78673:585;-1:-1:-1;;;;;;78901:55:0;-1:-1:-1;;;78901:55:0;;-1:-1:-1;78673:585:0;78493:772;;;;;;:::o;98064:532::-;98120:13;98150:5;98159:1;98150:10;98146:53;;-1:-1:-1;;98177:10:0;;;;;;;;;;;;-1:-1:-1;;;98177:10:0;;;;;98064:532::o;98146:53::-;98224:5;98209:12;98265:78;98272:9;;98265:78;;98298:8;;;;:::i;:::-;;-1:-1:-1;98321:10:0;;-1:-1:-1;98329:2:0;98321:10;;:::i;:::-;;;98265:78;;;98353:19;98385:6;-1:-1:-1;;;;;98375:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;98375:17:0;;98353:39;;98403:154;98410:10;;98403:154;;98437:11;98447:1;98437:11;;:::i;:::-;;-1:-1:-1;98506:10:0;98514:2;98506:5;:10;:::i;:::-;98493:24;;:2;:24;:::i;:::-;98480:39;;98463:6;98470;98463:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;98463:56:0;;;;;;;;-1:-1:-1;98534:11:0;98543:2;98534:11;;:::i;:::-;;;98403:154;;68856:104;68925:27;68935:2;68939:8;68925:27;;;;;;;;;;;;:9;:27::i;82326:230::-;82401:22;82409:4;82415:7;82401;:22::i;:::-;82397:152;;;82472:5;82440:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;82440:29:0;;;;;;;;;;:37;;-1:-1:-1;;82440:37:0;;;82497:40;13718:10;;82440:12;;82497:40;;82472:5;82497:40;82326:230;;:::o;2047:321::-;2155:7;2198:4;2155:7;2213:118;2237:5;:12;2233:1;:16;2213:118;;;2286:33;2296:12;2310:5;2316:1;2310:8;;;;;;;;:::i;:::-;;;;;;;2286:9;:33::i;:::-;2271:48;-1:-1:-1;2251:3:0;;;;:::i;:::-;;;;2213:118;;;-1:-1:-1;2348:12:0;2047:321;-1:-1:-1;;;2047:321:0:o;96736:226::-;96918:5;;;;;;;96910:44;;;;-1:-1:-1;;;96910:44:0;;30554:2:1;96910:44:0;;;30536:21:1;30593:2;30573:18;;;30566:30;30632:28;30612:18;;;30605:56;30678:18;;96910:44:0;30352:350:1;75377:2344:0;75457:35;75495:21;75508:7;75495:12;:21::i;:::-;75544:18;;75457:59;;-1:-1:-1;75575:290:0;;;;75609:22;13718:10;-1:-1:-1;;;;;75635:20:0;;;;:77;;-1:-1:-1;75676:36:0;75693:4;13718:10;67096:189;:::i;75676:36::-;75635:134;;;-1:-1:-1;13718:10:0;75733:20;75745:7;75733:11;:20::i;:::-;-1:-1:-1;;;;;75733:36:0;;75635:134;75609:161;;75792:17;75787:66;;75818:35;;-1:-1:-1;;;75818:35:0;;;;;;;;;;;75787:66;75594:271;75575:290;75929:35;75946:1;75950:7;75959:4;75929:8;:35::i;:::-;-1:-1:-1;;;;;76294:18:0;;;76260:31;76294:18;;;:12;:18;;;;;;;;76327:24;;-1:-1:-1;;;;;;;;;;76327:24:0;;;;;;;;;-1:-1:-1;;76327:24:0;;;;76366:29;;;;;76350:1;76366:29;;;;;;;;-1:-1:-1;;76366:29:0;;;;;;;;;;76528:20;;;:11;:20;;;;;;76563;;-1:-1:-1;;;;76631:15:0;76598:49;;;-1:-1:-1;;;76598:49:0;-1:-1:-1;;;;;;76598:49:0;;;;;;;;;;76662:22;-1:-1:-1;;;76662:22:0;;;76954:11;;;77014:24;;;;;77057:13;;76294:18;;77014:24;;77057:13;77053:384;;77267:13;;77252:11;:28;77248:174;;77305:20;;77374:28;;;;-1:-1:-1;;;;;77348:54:0;-1:-1:-1;;;77348:54:0;-1:-1:-1;;;;;;77348:54:0;;;-1:-1:-1;;;;;77305:20:0;;77348:54;;;;77248:174;-1:-1:-1;;77465:35:0;;77492:7;;-1:-1:-1;77488:1:0;;-1:-1:-1;;;;;;77465:35:0;;;-1:-1:-1;;;;;;;;;;;77465:35:0;77488:1;;77465:35;-1:-1:-1;;77688:12:0;:14;;;;;;-1:-1:-1;;75377:2344:0:o;69333:1866::-;69456:20;69479:13;-1:-1:-1;;;;;69507:16:0;;69503:48;;69532:19;;-1:-1:-1;;;69532:19:0;;;;;;;;;;;69503:48;69566:8;69578:1;69566:13;69562:44;;69588:18;;-1:-1:-1;;;69588:18:0;;;;;;;;;;;69562:44;-1:-1:-1;;;;;69883:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;69942:49:0;;-1:-1:-1;;;;;69883:44:0;;;;;;;69942:49;;;;-1:-1:-1;;69883:44:0;;;;;;69942:49;;;;;;;;;;;;;;;;70008:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;70058:66:0;;;-1:-1:-1;;;70108:15:0;70058:66;;;;;;;;;;;;;70008:25;;70205:23;;;;35725:19;:23;70245:822;;70285:504;70316:38;;70341:12;;-1:-1:-1;;;;;70316:38:0;;;70333:1;;-1:-1:-1;;;;;;;;;;;70316:38:0;70333:1;;70316:38;70408:212;70477:1;70510:2;70543:14;;;;;;70588:5;70408:30;:212::i;:::-;70377:365;;70678:40;;-1:-1:-1;;;70678:40:0;;;;;;;;;;;70377:365;70784:3;70769:12;:18;70285:504;;70870:12;70853:13;;:29;70849:43;;70884:8;;;70849:43;70245:822;;;70933:119;70964:40;;70989:14;;;;;-1:-1:-1;;;;;70964:40:0;;;70981:1;;-1:-1:-1;;;;;;;;;;;70964:40:0;70981:1;;70964:40;71047:3;71032:12;:18;70933:119;;70245:822;-1:-1:-1;71081:13:0;:28;;;71131:60;;71164:2;71168:12;71182:8;71131:60;:::i;9443:149::-;9506:7;9537:1;9533;:5;:51;;9693:13;9787:15;;;9823:4;9816:15;;;9870:4;9854:21;;9533:51;;;9693:13;9787:15;;;9823:4;9816:15;;;9870:4;9854:21;;9541:20;9600:293;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;774:258::-;846:1;856:113;870:6;867:1;864:13;856:113;;;946:11;;;940:18;927:11;;;920:39;892:2;885:10;856:113;;;987:6;984:1;981:13;978:48;;;-1:-1:-1;;1022:1:1;1004:16;;997:27;774:258::o;1037:269::-;1090:3;1128:5;1122:12;1155:6;1150:3;1143:19;1171:63;1227:6;1220:4;1215:3;1211:14;1204:4;1197:5;1193:16;1171:63;:::i;:::-;1288:2;1267:15;-1:-1:-1;;1263:29:1;1254:39;;;;1295:4;1250:50;;1037:269;-1:-1:-1;;1037:269:1:o;1311:231::-;1460:2;1449:9;1442:21;1423:4;1480:56;1532:2;1521:9;1517:18;1509:6;1480:56;:::i;1547:180::-;1606:6;1659:2;1647:9;1638:7;1634:23;1630:32;1627:52;;;1675:1;1672;1665:12;1627:52;-1:-1:-1;1698:23:1;;1547:180;-1:-1:-1;1547:180:1:o;1940:131::-;-1:-1:-1;;;;;2015:31:1;;2005:42;;1995:70;;2061:1;2058;2051:12;2076:315;2144:6;2152;2205:2;2193:9;2184:7;2180:23;2176:32;2173:52;;;2221:1;2218;2211:12;2173:52;2260:9;2247:23;2279:31;2304:5;2279:31;:::i;:::-;2329:5;2381:2;2366:18;;;;2353:32;;-1:-1:-1;;;2076:315:1:o;2396:127::-;2457:10;2452:3;2448:20;2445:1;2438:31;2488:4;2485:1;2478:15;2512:4;2509:1;2502:15;2528:275;2599:2;2593:9;2664:2;2645:13;;-1:-1:-1;;2641:27:1;2629:40;;-1:-1:-1;;;;;2684:34:1;;2720:22;;;2681:62;2678:88;;;2746:18;;:::i;:::-;2782:2;2775:22;2528:275;;-1:-1:-1;2528:275:1:o;2808:183::-;2868:4;-1:-1:-1;;;;;2893:6:1;2890:30;2887:56;;;2923:18;;:::i;:::-;-1:-1:-1;2968:1:1;2964:14;2980:4;2960:25;;2808:183::o;2996:737::-;3050:5;3103:3;3096:4;3088:6;3084:17;3080:27;3070:55;;3121:1;3118;3111:12;3070:55;3157:6;3144:20;3183:4;3207:60;3223:43;3263:2;3223:43;:::i;:::-;3207:60;:::i;:::-;3301:15;;;3387:1;3383:10;;;;3371:23;;3367:32;;;3332:12;;;;3411:15;;;3408:35;;;3439:1;3436;3429:12;3408:35;3475:2;3467:6;3463:15;3487:217;3503:6;3498:3;3495:15;3487:217;;;3583:3;3570:17;3600:31;3625:5;3600:31;:::i;:::-;3644:18;;3682:12;;;;3520;;3487:217;;;-1:-1:-1;3722:5:1;2996:737;-1:-1:-1;;;;;;2996:737:1:o;3738:483::-;3831:6;3839;3892:2;3880:9;3871:7;3867:23;3863:32;3860:52;;;3908:1;3905;3898:12;3860:52;3948:9;3935:23;-1:-1:-1;;;;;3973:6:1;3970:30;3967:50;;;4013:1;4010;4003:12;3967:50;4036:61;4089:7;4080:6;4069:9;4065:22;4036:61;:::i;:::-;4026:71;;;4147:2;4136:9;4132:18;4119:32;4160:31;4185:5;4160:31;:::i;:::-;4210:5;4200:15;;;3738:483;;;;;:::o;4226:367::-;4289:8;4299:6;4353:3;4346:4;4338:6;4334:17;4330:27;4320:55;;4371:1;4368;4361:12;4320:55;-1:-1:-1;4394:20:1;;-1:-1:-1;;;;;4426:30:1;;4423:50;;;4469:1;4466;4459:12;4423:50;4506:4;4498:6;4494:17;4482:29;;4566:3;4559:4;4549:6;4546:1;4542:14;4534:6;4530:27;4526:38;4523:47;4520:67;;;4583:1;4580;4573:12;4520:67;4226:367;;;;;:::o;4598:505::-;4693:6;4701;4709;4762:2;4750:9;4741:7;4737:23;4733:32;4730:52;;;4778:1;4775;4768:12;4730:52;4818:9;4805:23;-1:-1:-1;;;;;4843:6:1;4840:30;4837:50;;;4883:1;4880;4873:12;4837:50;4922:70;4984:7;4975:6;4964:9;4960:22;4922:70;:::i;:::-;5011:8;;4896:96;;-1:-1:-1;5093:2:1;5078:18;;;;5065:32;;4598:505;-1:-1:-1;;;;4598:505:1:o;5290:454::-;5385:6;5393;5401;5409;5417;5470:3;5458:9;5449:7;5445:23;5441:33;5438:53;;;5487:1;5484;5477:12;5438:53;-1:-1:-1;;5510:23:1;;;5580:2;5565:18;;5552:32;;-1:-1:-1;5631:2:1;5616:18;;5603:32;;5682:2;5667:18;;5654:32;;-1:-1:-1;5733:3:1;5718:19;5705:33;;-1:-1:-1;5290:454:1;-1:-1:-1;5290:454:1:o;5749:456::-;5826:6;5834;5842;5895:2;5883:9;5874:7;5870:23;5866:32;5863:52;;;5911:1;5908;5901:12;5863:52;5950:9;5937:23;5969:31;5994:5;5969:31;:::i;:::-;6019:5;-1:-1:-1;6076:2:1;6061:18;;6048:32;6089:33;6048:32;6089:33;:::i;:::-;5749:456;;6141:7;;-1:-1:-1;;;6195:2:1;6180:18;;;;6167:32;;5749:456::o;6210:316::-;6287:6;6295;6303;6356:2;6344:9;6335:7;6331:23;6327:32;6324:52;;;6372:1;6369;6362:12;6324:52;-1:-1:-1;;6395:23:1;;;6465:2;6450:18;;6437:32;;-1:-1:-1;6516:2:1;6501:18;;;6488:32;;6210:316;-1:-1:-1;6210:316:1:o;6999:118::-;7085:5;7078:13;7071:21;7064:5;7061:32;7051:60;;7107:1;7104;7097:12;7122:783;7202:6;7210;7218;7226;7234;7287:3;7275:9;7266:7;7262:23;7258:33;7255:53;;;7304:1;7301;7294:12;7255:53;7343:9;7330:23;7362:28;7384:5;7362:28;:::i;:::-;7409:5;-1:-1:-1;7466:2:1;7451:18;;7438:32;7479:30;7438:32;7479:30;:::i;:::-;7528:7;-1:-1:-1;7587:2:1;7572:18;;7559:32;7600:30;7559:32;7600:30;:::i;:::-;7649:7;-1:-1:-1;7708:2:1;7693:18;;7680:32;7721:30;7680:32;7721:30;:::i;:::-;7770:7;-1:-1:-1;7829:3:1;7814:19;;7801:33;7843:30;7801:33;7843:30;:::i;:::-;7892:7;7882:17;;;7122:783;;;;;;;;:::o;7910:247::-;7969:6;8022:2;8010:9;8001:7;7997:23;7993:32;7990:52;;;8038:1;8035;8028:12;7990:52;8077:9;8064:23;8096:31;8121:5;8096:31;:::i;8162:241::-;8218:6;8271:2;8259:9;8250:7;8246:23;8242:32;8239:52;;;8287:1;8284;8277:12;8239:52;8326:9;8313:23;8345:28;8367:5;8345:28;:::i;8408:248::-;8476:6;8484;8537:2;8525:9;8516:7;8512:23;8508:32;8505:52;;;8553:1;8550;8543:12;8505:52;-1:-1:-1;;8576:23:1;;;8646:2;8631:18;;;8618:32;;-1:-1:-1;8408:248:1:o;8661:773::-;8783:6;8791;8799;8807;8860:2;8848:9;8839:7;8835:23;8831:32;8828:52;;;8876:1;8873;8866:12;8828:52;8916:9;8903:23;-1:-1:-1;;;;;8986:2:1;8978:6;8975:14;8972:34;;;9002:1;8999;8992:12;8972:34;9041:70;9103:7;9094:6;9083:9;9079:22;9041:70;:::i;:::-;9130:8;;-1:-1:-1;9015:96:1;-1:-1:-1;9218:2:1;9203:18;;9190:32;;-1:-1:-1;9234:16:1;;;9231:36;;;9263:1;9260;9253:12;9231:36;;9302:72;9366:7;9355:8;9344:9;9340:24;9302:72;:::i;:::-;8661:773;;;;-1:-1:-1;9393:8:1;-1:-1:-1;;;;8661:773:1:o;10108:315::-;10176:6;10184;10237:2;10225:9;10216:7;10212:23;10208:32;10205:52;;;10253:1;10250;10243:12;10205:52;10289:9;10276:23;10266:33;;10349:2;10338:9;10334:18;10321:32;10362:31;10387:5;10362:31;:::i;10428:407::-;10493:5;-1:-1:-1;;;;;10519:6:1;10516:30;10513:56;;;10549:18;;:::i;:::-;10587:57;10632:2;10611:15;;-1:-1:-1;;10607:29:1;10638:4;10603:40;10587:57;:::i;:::-;10578:66;;10667:6;10660:5;10653:21;10707:3;10698:6;10693:3;10689:16;10686:25;10683:45;;;10724:1;10721;10714:12;10683:45;10773:6;10768:3;10761:4;10754:5;10750:16;10737:43;10827:1;10820:4;10811:6;10804:5;10800:18;10796:29;10789:40;10428:407;;;;;:::o;10840:451::-;10909:6;10962:2;10950:9;10941:7;10937:23;10933:32;10930:52;;;10978:1;10975;10968:12;10930:52;11018:9;11005:23;-1:-1:-1;;;;;11043:6:1;11040:30;11037:50;;;11083:1;11080;11073:12;11037:50;11106:22;;11159:4;11151:13;;11147:27;-1:-1:-1;11137:55:1;;11188:1;11185;11178:12;11137:55;11211:74;11277:7;11272:2;11259:16;11254:2;11250;11246:11;11211:74;:::i;11296:382::-;11361:6;11369;11422:2;11410:9;11401:7;11397:23;11393:32;11390:52;;;11438:1;11435;11428:12;11390:52;11477:9;11464:23;11496:31;11521:5;11496:31;:::i;:::-;11546:5;-1:-1:-1;11603:2:1;11588:18;;11575:32;11616:30;11575:32;11616:30;:::i;12525:795::-;12620:6;12628;12636;12644;12697:3;12685:9;12676:7;12672:23;12668:33;12665:53;;;12714:1;12711;12704:12;12665:53;12753:9;12740:23;12772:31;12797:5;12772:31;:::i;:::-;12822:5;-1:-1:-1;12879:2:1;12864:18;;12851:32;12892:33;12851:32;12892:33;:::i;:::-;12944:7;-1:-1:-1;12998:2:1;12983:18;;12970:32;;-1:-1:-1;13053:2:1;13038:18;;13025:32;-1:-1:-1;;;;;13069:30:1;;13066:50;;;13112:1;13109;13102:12;13066:50;13135:22;;13188:4;13180:13;;13176:27;-1:-1:-1;13166:55:1;;13217:1;13214;13207:12;13166:55;13240:74;13306:7;13301:2;13288:16;13283:2;13279;13275:11;13240:74;:::i;:::-;13230:84;;;12525:795;;;;;;;:::o;13325:662::-;13379:5;13432:3;13425:4;13417:6;13413:17;13409:27;13399:55;;13450:1;13447;13440:12;13399:55;13486:6;13473:20;13512:4;13536:60;13552:43;13592:2;13552:43;:::i;13536:60::-;13630:15;;;13716:1;13712:10;;;;13700:23;;13696:32;;;13661:12;;;;13740:15;;;13737:35;;;13768:1;13765;13758:12;13737:35;13804:2;13796:6;13792:15;13816:142;13832:6;13827:3;13824:15;13816:142;;;13898:17;;13886:30;;13936:12;;;;13849;;13816:142;;13992:595;14110:6;14118;14171:2;14159:9;14150:7;14146:23;14142:32;14139:52;;;14187:1;14184;14177:12;14139:52;14227:9;14214:23;-1:-1:-1;;;;;14297:2:1;14289:6;14286:14;14283:34;;;14313:1;14310;14303:12;14283:34;14336:61;14389:7;14380:6;14369:9;14365:22;14336:61;:::i;:::-;14326:71;;14450:2;14439:9;14435:18;14422:32;14406:48;;14479:2;14469:8;14466:16;14463:36;;;14495:1;14492;14485:12;14463:36;;14518:63;14573:7;14562:8;14551:9;14547:24;14518:63;:::i;:::-;14508:73;;;13992:595;;;;;:::o;14592:388::-;14660:6;14668;14721:2;14709:9;14700:7;14696:23;14692:32;14689:52;;;14737:1;14734;14727:12;14689:52;14776:9;14763:23;14795:31;14820:5;14795:31;:::i;:::-;14845:5;-1:-1:-1;14902:2:1;14887:18;;14874:32;14915:33;14874:32;14915:33;:::i;14985:821::-;15137:6;15145;15153;15206:2;15194:9;15185:7;15181:23;15177:32;15174:52;;;15222:1;15219;15212:12;15174:52;15262:9;15249:23;-1:-1:-1;;;;;15332:2:1;15324:6;15321:14;15318:34;;;15348:1;15345;15338:12;15318:34;15371:61;15424:7;15415:6;15404:9;15400:22;15371:61;:::i;:::-;15361:71;;15485:2;15474:9;15470:18;15457:32;15441:48;;15514:2;15504:8;15501:16;15498:36;;;15530:1;15527;15520:12;15498:36;15553:63;15608:7;15597:8;15586:9;15582:24;15553:63;:::i;:::-;15543:73;;15669:2;15658:9;15654:18;15641:32;15625:48;;15698:2;15688:8;15685:16;15682:36;;;15714:1;15711;15704:12;15682:36;;15737:63;15792:7;15781:8;15770:9;15766:24;15737:63;:::i;:::-;15727:73;;;14985:821;;;;;:::o;15811:380::-;15890:1;15886:12;;;;15933;;;15954:61;;16008:4;16000:6;15996:17;15986:27;;15954:61;16061:2;16053:6;16050:14;16030:18;16027:38;16024:161;;16107:10;16102:3;16098:20;16095:1;16088:31;16142:4;16139:1;16132:15;16170:4;16167:1;16160:15;16024:161;;15811:380;;;:::o;16196:127::-;16257:10;16252:3;16248:20;16245:1;16238:31;16288:4;16285:1;16278:15;16312:4;16309:1;16302:15;16328:125;16368:4;16396:1;16393;16390:8;16387:34;;;16401:18;;:::i;:::-;-1:-1:-1;16438:9:1;;16328:125::o;16458:409::-;16660:2;16642:21;;;16699:2;16679:18;;;16672:30;16738:34;16733:2;16718:18;;16711:62;-1:-1:-1;;;16804:2:1;16789:18;;16782:43;16857:3;16842:19;;16458:409::o;16872:127::-;16933:10;16928:3;16924:20;16921:1;16914:31;16964:4;16961:1;16954:15;16988:4;16985:1;16978:15;17004:184;17074:6;17127:2;17115:9;17106:7;17102:23;17098:32;17095:52;;;17143:1;17140;17133:12;17095:52;-1:-1:-1;17166:16:1;;17004:184;-1:-1:-1;17004:184:1:o;17472:245::-;17539:6;17592:2;17580:9;17571:7;17567:23;17563:32;17560:52;;;17608:1;17605;17598:12;17560:52;17640:9;17634:16;17659:28;17681:5;17659:28;:::i;17722:175::-;17759:3;17803:4;17796:5;17792:16;17832:4;17823:7;17820:17;17817:43;;17840:18;;:::i;:::-;17889:1;17876:15;;17722:175;-1:-1:-1;;17722:175:1:o;17902:398::-;18104:2;18086:21;;;18143:2;18123:18;;;18116:30;18182:34;18177:2;18162:18;;18155:62;-1:-1:-1;;;18248:2:1;18233:18;;18226:32;18290:3;18275:19;;17902:398::o;18305:168::-;18345:7;18411:1;18407;18403:6;18399:14;18396:1;18393:21;18388:1;18381:9;18374:17;18370:45;18367:71;;;18418:18;;:::i;:::-;-1:-1:-1;18458:9:1;;18305:168::o;18478:398::-;18680:2;18662:21;;;18719:2;18699:18;;;18692:30;18758:34;18753:2;18738:18;;18731:62;-1:-1:-1;;;18824:2:1;18809:18;;18802:32;18866:3;18851:19;;18478:398::o;18881:346::-;19083:2;19065:21;;;19122:2;19102:18;;;19095:30;-1:-1:-1;;;19156:2:1;19141:18;;19134:52;19218:2;19203:18;;18881:346::o;19232:229::-;19381:2;19377:15;;;;-1:-1:-1;;19373:53:1;19361:66;;19452:2;19443:12;;19232:229::o;19827:351::-;20029:2;20011:21;;;20068:2;20048:18;;;20041:30;20107:29;20102:2;20087:18;;20080:57;20169:2;20154:18;;19827:351::o;20183:128::-;20223:3;20254:1;20250:6;20247:1;20244:13;20241:39;;;20260:18;;:::i;:::-;-1:-1:-1;20296:9:1;;20183:128::o;20316:135::-;20355:3;20376:17;;;20373:43;;20396:18;;:::i;:::-;-1:-1:-1;20443:1:1;20432:13;;20316:135::o;20701:185::-;20743:3;20781:5;20775:12;20796:52;20841:6;20836:3;20829:4;20822:5;20818:16;20796:52;:::i;:::-;20864:16;;;;;20701:185;-1:-1:-1;;20701:185:1:o;21009:1433::-;21387:3;21416:1;21449:6;21443:13;21479:3;21501:1;21529:9;21525:2;21521:18;21511:28;;21589:2;21578:9;21574:18;21611;21601:61;;21655:4;21647:6;21643:17;21633:27;;21601:61;21681:2;21729;21721:6;21718:14;21698:18;21695:38;21692:165;;-1:-1:-1;;;21756:33:1;;21812:4;21809:1;21802:15;21842:4;21763:3;21830:17;21692:165;21873:18;21900:104;;;;22018:1;22013:320;;;;21866:467;;21900:104;-1:-1:-1;;21933:24:1;;21921:37;;21978:16;;;;-1:-1:-1;21900:104:1;;22013:320;20529:1;20522:14;;;20566:4;20553:18;;22108:1;22122:165;22136:6;22133:1;22130:13;22122:165;;;22214:14;;22201:11;;;22194:35;22257:16;;;;22151:10;;22122:165;;;22126:3;;22316:6;22311:3;22307:16;22300:23;;21866:467;;;;;;;22349:87;22374:61;22400:34;22430:3;-1:-1:-1;;;20647:16:1;;20688:1;20679:11;;20582:114;22400:34;22392:6;22374:61;:::i;:::-;-1:-1:-1;;;20951:20:1;;20996:1;20987:11;;20891:113;22349:87;22342:94;21009:1433;-1:-1:-1;;;;;21009:1433:1:o;22876:402::-;23078:2;23060:21;;;23117:2;23097:18;;;23090:30;23156:34;23151:2;23136:18;;23129:62;-1:-1:-1;;;23222:2:1;23207:18;;23200:36;23268:3;23253:19;;22876:402::o;25242:251::-;25312:6;25365:2;25353:9;25344:7;25340:23;25336:32;25333:52;;;25381:1;25378;25371:12;25333:52;25413:9;25407:16;25432:31;25457:5;25432:31;:::i;29219:500::-;-1:-1:-1;;;;;29488:15:1;;;29470:34;;29540:15;;29535:2;29520:18;;29513:43;29587:2;29572:18;;29565:34;;;29635:3;29630:2;29615:18;;29608:31;;;29413:4;;29656:57;;29693:19;;29685:6;29656:57;:::i;:::-;29648:65;29219:500;-1:-1:-1;;;;;;29219:500:1:o;29724:249::-;29793:6;29846:2;29834:9;29825:7;29821:23;29817:32;29814:52;;;29862:1;29859;29852:12;29814:52;29894:9;29888:16;29913:30;29937:5;29913:30;:::i;29978:127::-;30039:10;30034:3;30030:20;30027:1;30020:31;30070:4;30067:1;30060:15;30094:4;30091:1;30084:15;30110:120;30150:1;30176;30166:35;;30181:18;;:::i;:::-;-1:-1:-1;30215:9:1;;30110:120::o;30235:112::-;30267:1;30293;30283:35;;30298:18;;:::i;:::-;-1:-1:-1;30332:9:1;;30235:112::o

Swarm Source

ipfs://67c4a6ce1356b7cce396eca2943dc6db569cc4d314e928c446907ae69c3ecfb6
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.