ETH Price: $3,240.87 (-2.61%)
Gas: 5.21 Gwei
 

Overview

Max Total Supply

1,406 CRATE

Holders

106

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 CRATE
0x77B2f25816450FD70cc1854fc5767b061de54173
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:
TerraCrate

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.4;


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

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

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

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

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

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId].value;
    }

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

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

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

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

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

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

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

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

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

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

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

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


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

pragma solidity ^0.8.4;



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

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

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

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

// File: contracts/terraCrate.sol


pragma solidity ^0.8.7;







interface Interface is IERC721Enumerable {
    function amountOfTurtlesStaked(address owner)
        external
        view
        returns (uint256);
}

contract TerraCrate is ERC721A, ERC721AQueryable, Ownable, ReentrancyGuard {
    uint256 public constant MAX_SUPPLY = 6989;
    uint256 private MINT_PRICE = 0.005 ether;
    
    bytes32 private root;

    address public collectionAddress;
    address public stakingAddress;
    
    string private revealURI;
    uint256 private publicMintTime = 1677616200;

    mapping (address => uint256) public amountClaimed;

    constructor(bytes32 _root, address _collectionAddress, address _stakingAddress, string memory _revealURI) ERC721A("terraCrate", "CRATE") {
        root = _root;
        collectionAddress = _collectionAddress;
        stakingAddress = _stakingAddress;
        revealURI = _revealURI;
    }

    function claim(uint256 quantity, bytes32[] memory proof) public nonReentrant {
        uint256 tokenCount = ownerTokenCount(msg.sender);

        require(block.timestamp < publicMintTime, "Public mint is active.");
        require(isValid(proof, keccak256(abi.encodePacked(msg.sender))), "Not a part of Allowlist");
        require(quantity > 0, "Quantity cannot be zero.");
        require(quantity <= tokenCount - amountClaimed[msg.sender], "You can't mint more than you own.");
        require(totalSupply() + quantity <= MAX_SUPPLY, "Not enough tokens left.");

        if (tokenCount == amountClaimed[msg.sender]) revert("You can't claim more.");

        amountClaimed[msg.sender] = quantity + amountClaimed[msg.sender];
        _safeMint(msg.sender, quantity);
    }

    function publicMint(uint256 quantity) public payable nonReentrant {
        require(block.timestamp >= publicMintTime, "Public mint is not active.");
        require(quantity > 0, "Quantity cannot be zero.");
        require(quantity <= 10, "You can't mint more than 10.");
        require(totalSupply() + quantity <= MAX_SUPPLY, "Not enough tokens left.");
        require(msg.value >= (quantity * MINT_PRICE), "Insufficient Balance.");
        _safeMint(msg.sender, quantity);
    }

    function ownerTokenCount(address owner) public view returns (uint256 tokenCount) {
        uint256 collectionCount = IERC721Enumerable(collectionAddress).balanceOf(owner);
        uint256 stakingCount = Interface(stakingAddress).amountOfTurtlesStaked(owner);
        tokenCount = collectionCount + stakingCount;
        return tokenCount;
    }

    function isValid(bytes32[] memory proof, bytes32 leaf) internal view returns (bool) {
        return MerkleProof.verify(proof, root, leaf);
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return revealURI;
    }

    function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner{
        root = _merkleRoot;
    }

    function changeURI(string memory _revealURI) external onlyOwner {
        revealURI = _revealURI;
    }

    function setPublicMintTime(uint256 _timestmap) external onlyOwner {
        publicMintTime = _timestmap;
    }

    function setAddress(address _collectionAddress, address _stakingAddress) external onlyOwner {
        collectionAddress = _collectionAddress;
        stakingAddress = _stakingAddress;
    }

    function withdraw() external onlyOwner nonReentrant {
        payable(msg.sender).transfer(address(this).balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"},{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"address","name":"_stakingAddress","type":"address"},{"internalType":"string","name":"_revealURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"amountClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_revealURI","type":"string"}],"name":"changeURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectionAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ownerTokenCount","outputs":[{"internalType":"uint256","name":"tokenCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_collectionAddress","type":"address"},{"internalType":"address","name":"_stakingAddress","type":"address"}],"name":"setAddress","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":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestmap","type":"uint256"}],"name":"setPublicMintTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526611c37937e08000600a556363fe6448600f553480156200002457600080fd5b50604051620046033803806200460383398181016040528101906200004a919062000403565b6040518060400160405280600a81526020017f74657272614372617465000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f43524154450000000000000000000000000000000000000000000000000000008152508160029080519060200190620000ce929190620002a7565b508060039080519060200190620000e7929190620002a7565b50620000f8620001d460201b60201c565b60008190555050506200012062000114620001d960201b60201c565b620001e160201b60201c565b600160098190555083600b8190555082600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600e9080519060200190620001c9929190620002a7565b50505050506200068a565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002b59062000567565b90600052602060002090601f016020900481019282620002d9576000855562000325565b82601f10620002f457805160ff191683800117855562000325565b8280016001018555821562000325579182015b828111156200032457825182559160200191906001019062000307565b5b50905062000334919062000338565b5090565b5b808211156200035357600081600090555060010162000339565b5090565b60006200036e6200036884620004bd565b62000494565b9050828152602081018484840111156200038d576200038c62000636565b5b6200039a84828562000531565b509392505050565b600081519050620003b38162000656565b92915050565b600081519050620003ca8162000670565b92915050565b600082601f830112620003e857620003e762000631565b5b8151620003fa84826020860162000357565b91505092915050565b6000806000806080858703121562000420576200041f62000640565b5b60006200043087828801620003b9565b94505060206200044387828801620003a2565b93505060406200045687828801620003a2565b925050606085015167ffffffffffffffff8111156200047a57620004796200063b565b5b6200048887828801620003d0565b91505092959194509250565b6000620004a0620004b3565b9050620004ae82826200059d565b919050565b6000604051905090565b600067ffffffffffffffff821115620004db57620004da62000602565b5b620004e68262000645565b9050602081019050919050565b6000620005008262000511565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b838110156200055157808201518184015260208101905062000534565b8381111562000561576000848401525b50505050565b600060028204905060018216806200058057607f821691505b60208210811415620005975762000596620005d3565b5b50919050565b620005a88262000645565b810181811067ffffffffffffffff82111715620005ca57620005c962000602565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200066181620004f3565b81146200066d57600080fd5b50565b6200067b8162000507565b81146200068757600080fd5b50565b613f69806200069a6000396000f3fe6080604052600436106101ee5760003560e01c806370a082311161010d578063b88d4fde116100a0578063d7b4be241161006f578063d7b4be24146106de578063d7e1ea1714610709578063e5e01c1114610746578063e985e9c51461076f578063f2fde38b146107ac576101ee565b8063b88d4fde1461060b578063c23dc68f14610627578063c2fb09a814610664578063c87b56dd146106a1576101ee565b80638da5cb5b116100dc5780638da5cb5b1461054f57806395d89b411461057a57806399a2557a146105a5578063a22cb465146105e2576101ee565b806370a0823114610495578063715018a6146104d25780637cb64759146104e95780638462151c14610512576101ee565b80632f52ebb71161018557806342842e0e1161015457806342842e0e146103d45780635bbb2177146103f05780636352211e1461042d5780636aa003711461046a576101ee565b80632f52ebb71461034057806332cb6b0c146103695780633b58524d146103945780633ccfd60b146103bd576101ee565b8063095ea7b3116101c1578063095ea7b3146102c157806318160ddd146102dd57806323b872dd146103085780632db1154414610324576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b57806308f4c7ff14610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612ebd565b6107d5565b604051610227919061353a565b60405180910390f35b34801561023c57600080fd5b50610245610867565b6040516102529190613555565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190612f60565b6108f9565b60405161028f919061348f565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190612f60565b610978565b005b6102db60048036038101906102d69190612db0565b61098a565b005b3480156102e957600080fd5b506102f2610ace565b6040516102ff9190613732565b60405180910390f35b610322600480360381019061031d9190612c9a565b610ae5565b005b61033e60048036038101906103399190612f60565b610e0a565b005b34801561034c57600080fd5b5061036760048036038101906103629190612fba565b610f9a565b005b34801561037557600080fd5b5061037e6112b0565b60405161038b9190613732565b60405180910390f35b3480156103a057600080fd5b506103bb60048036038101906103b69190612c5a565b6112b6565b005b3480156103c957600080fd5b506103d2611344565b005b6103ee60048036038101906103e99190612c9a565b6113a5565b005b3480156103fc57600080fd5b5061041760048036038101906104129190612e43565b6113c5565b60405161042491906134f6565b60405180910390f35b34801561043957600080fd5b50610454600480360381019061044f9190612f60565b611488565b604051610461919061348f565b60405180910390f35b34801561047657600080fd5b5061047f61149a565b60405161048c919061348f565b60405180910390f35b3480156104a157600080fd5b506104bc60048036038101906104b79190612c2d565b6114c0565b6040516104c99190613732565b60405180910390f35b3480156104de57600080fd5b506104e7611579565b005b3480156104f557600080fd5b50610510600480360381019061050b9190612e90565b61158d565b005b34801561051e57600080fd5b5061053960048036038101906105349190612c2d565b61159f565b6040516105469190613518565b60405180910390f35b34801561055b57600080fd5b506105646116e9565b604051610571919061348f565b60405180910390f35b34801561058657600080fd5b5061058f611713565b60405161059c9190613555565b60405180910390f35b3480156105b157600080fd5b506105cc60048036038101906105c79190612df0565b6117a5565b6040516105d99190613518565b60405180910390f35b3480156105ee57600080fd5b5061060960048036038101906106049190612d70565b6119b9565b005b61062560048036038101906106209190612ced565b611ac4565b005b34801561063357600080fd5b5061064e60048036038101906106499190612f60565b611b37565b60405161065b9190613717565b60405180910390f35b34801561067057600080fd5b5061068b60048036038101906106869190612c2d565b611ba1565b6040516106989190613732565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c39190612f60565b611d15565b6040516106d59190613555565b60405180910390f35b3480156106ea57600080fd5b506106f3611df1565b604051610700919061348f565b60405180910390f35b34801561071557600080fd5b50610730600480360381019061072b9190612c2d565b611e17565b60405161073d9190613732565b60405180910390f35b34801561075257600080fd5b5061076d60048036038101906107689190612f17565b611e2f565b005b34801561077b57600080fd5b5061079660048036038101906107919190612c5a565b611e51565b6040516107a3919061353a565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce9190612c2d565b611ee5565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061083057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108605750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461087690613a71565b80601f01602080910402602001604051908101604052809291908181526020018280546108a290613a71565b80156108ef5780601f106108c4576101008083540402835291602001916108ef565b820191906000526020600020905b8154815290600101906020018083116108d257829003601f168201915b5050505050905090565b600061090482611f69565b61093a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610980611fc8565b80600f8190555050565b600061099582611488565b90508073ffffffffffffffffffffffffffffffffffffffff166109b6612046565b73ffffffffffffffffffffffffffffffffffffffff1614610a19576109e2816109dd612046565b611e51565b610a18576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610ad861204e565b6001546000540303905090565b6000610af082612053565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b57576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b6384612121565b91509150610b798187610b74612046565b612148565b610bc557610b8e86610b89612046565b611e51565b610bc4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610c2c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c39868686600161218c565b8015610c4457600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610d1285610cee888887612192565b7c0200000000000000000000000000000000000000000000000000000000176121ba565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610d9a576000600185019050600060046000838152602001908152602001600020541415610d98576000548114610d97578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e0286868660016121e5565b505050505050565b610e126121eb565b600f54421015610e57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4e906135f7565b60405180910390fd5b60008111610e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e91906136b7565b60405180910390fd5b600a811115610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed5906135b7565b60405180910390fd5b611b4d81610eea610ace565b610ef491906138aa565b1115610f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2c90613597565b60405180910390fd5b600a5481610f439190613900565b341015610f85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7c90613637565b60405180910390fd5b610f8f338261223b565b610f97612259565b50565b610fa26121eb565b6000610fad33611ba1565b9050600f544210610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea90613617565b60405180910390fd5b61102382336040516020016110089190613474565b60405160208183030381529060405280519060200120612263565b611062576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105990613657565b60405180910390fd5b600083116110a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109c906136b7565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054816110f0919061395a565b831115611132576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611129906136d7565b60405180910390fd5b611b4d8361113e610ace565b61114891906138aa565b1115611189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118090613597565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481141561120b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611202906135d7565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548361125691906138aa565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506112a3338461223b565b506112ac612259565b5050565b611b4d81565b6112be611fc8565b81600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b61134c611fc8565b6113546121eb565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561139a573d6000803e3d6000fd5b506113a3612259565b565b6113c083838360405180602001604052806000815250611ac4565b505050565b6060600083839050905060008167ffffffffffffffff8111156113eb576113ea613bce565b5b60405190808252806020026020018201604052801561142457816020015b6114116128d4565b8152602001906001900390816114095790505b50905060005b82811461147c5761145386868381811061144757611446613b9f565b5b90506020020135611b37565b82828151811061146657611465613b9f565b5b602002602001018190525080600101905061142a565b50809250505092915050565b600061149382612053565b9050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611528576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611581611fc8565b61158b600061227a565b565b611595611fc8565b80600b8190555050565b606060008060006115af856114c0565b905060008167ffffffffffffffff8111156115cd576115cc613bce565b5b6040519080825280602002602001820160405280156115fb5781602001602082028036833780820191505090505b5090506116066128d4565b600061161061204e565b90505b8386146116db5761162381612340565b9150816040015115611634576116d0565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461167457816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156116cf57808387806001019850815181106116c2576116c1613b9f565b5b6020026020010181815250505b5b806001019050611613565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461172290613a71565b80601f016020809104026020016040519081016040528092919081815260200182805461174e90613a71565b801561179b5780601f106117705761010080835404028352916020019161179b565b820191906000526020600020905b81548152906001019060200180831161177e57829003601f168201915b5050505050905090565b60608183106117e0576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806117eb61236b565b90506117f561204e565b8510156118075761180461204e565b94505b80841115611813578093505b600061181e876114c0565b90508486101561184157600086860390508181101561183b578091505b50611846565b600090505b60008167ffffffffffffffff81111561186257611861613bce565b5b6040519080825280602002602001820160405280156118905781602001602082028036833780820191505090505b50905060008214156118a857809450505050506119b2565b60006118b388611b37565b9050600081604001516118c857816000015190505b60008990505b8881141580156118de5750848714155b156119a4576118ec81612340565b92508260400151156118fd57611999565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461193d57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611998578084888060010199508151811061198b5761198a613b9f565b5b6020026020010181815250505b5b8060010190506118ce565b508583528296505050505050505b9392505050565b80600760006119c6612046565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a73612046565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ab8919061353a565b60405180910390a35050565b611acf848484610ae5565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611b3157611afa84848484612374565b611b30576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611b3f6128d4565b611b476128d4565b611b4f61204e565b831080611b635750611b5f61236b565b8310155b15611b715780915050611b9c565b611b7a83612340565b9050806040015115611b8f5780915050611b9c565b611b98836124d4565b9150505b919050565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401611bff919061348f565b60206040518083038186803b158015611c1757600080fd5b505afa158015611c2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4f9190612f8d565b90506000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8df0d35856040518263ffffffff1660e01b8152600401611cae919061348f565b60206040518083038186803b158015611cc657600080fd5b505afa158015611cda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cfe9190612f8d565b90508082611d0c91906138aa565b92505050919050565b6060611d2082611f69565b611d5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5690613697565b60405180910390fd5b600e8054611d6c90613a71565b80601f0160208091040260200160405190810160405280929190818152602001828054611d9890613a71565b8015611de55780601f10611dba57610100808354040283529160200191611de5565b820191906000526020600020905b815481529060010190602001808311611dc857829003601f168201915b50505050509050919050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60106020528060005260406000206000915090505481565b611e37611fc8565b80600e9080519060200190611e4d929190612923565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611eed611fc8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5490613577565b60405180910390fd5b611f668161227a565b50565b600081611f7461204e565b11158015611f83575060005482105b8015611fc1575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b611fd06124f4565b73ffffffffffffffffffffffffffffffffffffffff16611fee6116e9565b73ffffffffffffffffffffffffffffffffffffffff1614612044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203b90613677565b60405180910390fd5b565b600033905090565b600090565b6000808290508061206261204e565b116120ea576000548110156120e95760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156120e7575b60008114156120dd5760046000836001900393508381526020019081526020016000205490506120b2565b809250505061211c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86121a98686846124fc565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60026009541415612231576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612228906136f7565b60405180910390fd5b6002600981905550565b612255828260405180602001604052806000815250612505565b5050565b6001600981905550565b600061227283600b54846125a2565b905092915050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123486128d4565b61236460046000848152602001908152602001600020546125b9565b9050919050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261239a612046565b8786866040518563ffffffff1660e01b81526004016123bc94939291906134aa565b602060405180830381600087803b1580156123d657600080fd5b505af192505050801561240757506040513d601f19601f820116820180604052508101906124049190612eea565b60015b612481573d8060008114612437576040519150601f19603f3d011682016040523d82523d6000602084013e61243c565b606091505b50600081511415612479576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6124dc6128d4565b6124ed6124e883612053565b6125b9565b9050919050565b600033905090565b60009392505050565b61250f838361266f565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461259d57600080549050600083820390505b61254f6000868380600101945086612374565b612585576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061253c57816000541461259a57600080fd5b50505b505050565b6000826125af858461282c565b1490509392505050565b6125c16128d4565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008054905060008214156126b0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126bd600084838561218c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612734836127256000866000612192565b61272e85612882565b176121ba565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146127d557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061279a565b506000821415612811576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061282760008483856121e5565b505050565b60008082905060005b8451811015612877576128628286838151811061285557612854613b9f565b5b6020026020010151612892565b9150808061286f90613ad4565b915050612835565b508091505092915050565b60006001821460e11b9050919050565b60008183106128aa576128a582846128bd565b6128b5565b6128b483836128bd565b5b905092915050565b600082600052816020526040600020905092915050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b82805461292f90613a71565b90600052602060002090601f0160209004810192826129515760008555612998565b82601f1061296a57805160ff1916838001178555612998565b82800160010185558215612998579182015b8281111561299757825182559160200191906001019061297c565b5b5090506129a591906129a9565b5090565b5b808211156129c25760008160009055506001016129aa565b5090565b60006129d96129d484613772565b61374d565b905080838252602082019050828560208602820111156129fc576129fb613c07565b5b60005b85811015612a2c5781612a128882612b68565b8452602084019350602083019250506001810190506129ff565b5050509392505050565b6000612a49612a448461379e565b61374d565b905082815260208101848484011115612a6557612a64613c0c565b5b612a70848285613a2f565b509392505050565b6000612a8b612a86846137cf565b61374d565b905082815260208101848484011115612aa757612aa6613c0c565b5b612ab2848285613a2f565b509392505050565b600081359050612ac981613ec0565b92915050565b600082601f830112612ae457612ae3613c02565b5b8135612af48482602086016129c6565b91505092915050565b60008083601f840112612b1357612b12613c02565b5b8235905067ffffffffffffffff811115612b3057612b2f613bfd565b5b602083019150836020820283011115612b4c57612b4b613c07565b5b9250929050565b600081359050612b6281613ed7565b92915050565b600081359050612b7781613eee565b92915050565b600081359050612b8c81613f05565b92915050565b600081519050612ba181613f05565b92915050565b600082601f830112612bbc57612bbb613c02565b5b8135612bcc848260208601612a36565b91505092915050565b600082601f830112612bea57612be9613c02565b5b8135612bfa848260208601612a78565b91505092915050565b600081359050612c1281613f1c565b92915050565b600081519050612c2781613f1c565b92915050565b600060208284031215612c4357612c42613c16565b5b6000612c5184828501612aba565b91505092915050565b60008060408385031215612c7157612c70613c16565b5b6000612c7f85828601612aba565b9250506020612c9085828601612aba565b9150509250929050565b600080600060608486031215612cb357612cb2613c16565b5b6000612cc186828701612aba565b9350506020612cd286828701612aba565b9250506040612ce386828701612c03565b9150509250925092565b60008060008060808587031215612d0757612d06613c16565b5b6000612d1587828801612aba565b9450506020612d2687828801612aba565b9350506040612d3787828801612c03565b925050606085013567ffffffffffffffff811115612d5857612d57613c11565b5b612d6487828801612ba7565b91505092959194509250565b60008060408385031215612d8757612d86613c16565b5b6000612d9585828601612aba565b9250506020612da685828601612b53565b9150509250929050565b60008060408385031215612dc757612dc6613c16565b5b6000612dd585828601612aba565b9250506020612de685828601612c03565b9150509250929050565b600080600060608486031215612e0957612e08613c16565b5b6000612e1786828701612aba565b9350506020612e2886828701612c03565b9250506040612e3986828701612c03565b9150509250925092565b60008060208385031215612e5a57612e59613c16565b5b600083013567ffffffffffffffff811115612e7857612e77613c11565b5b612e8485828601612afd565b92509250509250929050565b600060208284031215612ea657612ea5613c16565b5b6000612eb484828501612b68565b91505092915050565b600060208284031215612ed357612ed2613c16565b5b6000612ee184828501612b7d565b91505092915050565b600060208284031215612f0057612eff613c16565b5b6000612f0e84828501612b92565b91505092915050565b600060208284031215612f2d57612f2c613c16565b5b600082013567ffffffffffffffff811115612f4b57612f4a613c11565b5b612f5784828501612bd5565b91505092915050565b600060208284031215612f7657612f75613c16565b5b6000612f8484828501612c03565b91505092915050565b600060208284031215612fa357612fa2613c16565b5b6000612fb184828501612c18565b91505092915050565b60008060408385031215612fd157612fd0613c16565b5b6000612fdf85828601612c03565b925050602083013567ffffffffffffffff81111561300057612fff613c11565b5b61300c85828601612acf565b9150509250929050565b6000613022838361338e565b60808301905092915050565b600061303a8383613447565b60208301905092915050565b61304f8161398e565b82525050565b61305e8161398e565b82525050565b6130756130708261398e565b613b1d565b82525050565b600061308682613820565b6130908185613866565b935061309b83613800565b8060005b838110156130cc5781516130b38882613016565b97506130be8361384c565b92505060018101905061309f565b5085935050505092915050565b60006130e48261382b565b6130ee8185613877565b93506130f983613810565b8060005b8381101561312a578151613111888261302e565b975061311c83613859565b9250506001810190506130fd565b5085935050505092915050565b613140816139a0565b82525050565b61314f816139a0565b82525050565b600061316082613836565b61316a8185613888565b935061317a818560208601613a3e565b61318381613c1b565b840191505092915050565b600061319982613841565b6131a38185613899565b93506131b3818560208601613a3e565b6131bc81613c1b565b840191505092915050565b60006131d4602683613899565b91506131df82613c39565b604082019050919050565b60006131f7601783613899565b915061320282613c88565b602082019050919050565b600061321a601c83613899565b915061322582613cb1565b602082019050919050565b600061323d601583613899565b915061324882613cda565b602082019050919050565b6000613260601a83613899565b915061326b82613d03565b602082019050919050565b6000613283601683613899565b915061328e82613d2c565b602082019050919050565b60006132a6601583613899565b91506132b182613d55565b602082019050919050565b60006132c9601783613899565b91506132d482613d7e565b602082019050919050565b60006132ec602083613899565b91506132f782613da7565b602082019050919050565b600061330f602f83613899565b915061331a82613dd0565b604082019050919050565b6000613332601883613899565b915061333d82613e1f565b602082019050919050565b6000613355602183613899565b915061336082613e48565b604082019050919050565b6000613378601f83613899565b915061338382613e97565b602082019050919050565b6080820160008201516133a46000850182613046565b5060208201516133b76020850182613465565b5060408201516133ca6040850182613137565b5060608201516133dd6060850182613438565b50505050565b6080820160008201516133f96000850182613046565b50602082015161340c6020850182613465565b50604082015161341f6040850182613137565b5060608201516134326060850182613438565b50505050565b61344181613a02565b82525050565b61345081613a11565b82525050565b61345f81613a11565b82525050565b61346e81613a1b565b82525050565b60006134808284613064565b60148201915081905092915050565b60006020820190506134a46000830184613055565b92915050565b60006080820190506134bf6000830187613055565b6134cc6020830186613055565b6134d96040830185613456565b81810360608301526134eb8184613155565b905095945050505050565b60006020820190508181036000830152613510818461307b565b905092915050565b6000602082019050818103600083015261353281846130d9565b905092915050565b600060208201905061354f6000830184613146565b92915050565b6000602082019050818103600083015261356f818461318e565b905092915050565b60006020820190508181036000830152613590816131c7565b9050919050565b600060208201905081810360008301526135b0816131ea565b9050919050565b600060208201905081810360008301526135d08161320d565b9050919050565b600060208201905081810360008301526135f081613230565b9050919050565b6000602082019050818103600083015261361081613253565b9050919050565b6000602082019050818103600083015261363081613276565b9050919050565b6000602082019050818103600083015261365081613299565b9050919050565b60006020820190508181036000830152613670816132bc565b9050919050565b60006020820190508181036000830152613690816132df565b9050919050565b600060208201905081810360008301526136b081613302565b9050919050565b600060208201905081810360008301526136d081613325565b9050919050565b600060208201905081810360008301526136f081613348565b9050919050565b600060208201905081810360008301526137108161336b565b9050919050565b600060808201905061372c60008301846133e3565b92915050565b60006020820190506137476000830184613456565b92915050565b6000613757613768565b90506137638282613aa3565b919050565b6000604051905090565b600067ffffffffffffffff82111561378d5761378c613bce565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156137b9576137b8613bce565b5b6137c282613c1b565b9050602081019050919050565b600067ffffffffffffffff8211156137ea576137e9613bce565b5b6137f382613c1b565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b60006138b582613a11565b91506138c083613a11565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138f5576138f4613b41565b5b828201905092915050565b600061390b82613a11565b915061391683613a11565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561394f5761394e613b41565b5b828202905092915050565b600061396582613a11565b915061397083613a11565b92508282101561398357613982613b41565b5b828203905092915050565b6000613999826139e2565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613a5c578082015181840152602081019050613a41565b83811115613a6b576000848401525b50505050565b60006002820490506001821680613a8957607f821691505b60208210811415613a9d57613a9c613b70565b5b50919050565b613aac82613c1b565b810181811067ffffffffffffffff82111715613acb57613aca613bce565b5b80604052505050565b6000613adf82613a11565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b1257613b11613b41565b5b600182019050919050565b6000613b2882613b2f565b9050919050565b6000613b3a82613c2c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820746f6b656e73206c6566742e000000000000000000600082015250565b7f596f752063616e2774206d696e74206d6f7265207468616e2031302e00000000600082015250565b7f596f752063616e277420636c61696d206d6f72652e0000000000000000000000600082015250565b7f5075626c6963206d696e74206973206e6f74206163746976652e000000000000600082015250565b7f5075626c6963206d696e74206973206163746976652e00000000000000000000600082015250565b7f496e73756666696369656e742042616c616e63652e0000000000000000000000600082015250565b7f4e6f7420612070617274206f6620416c6c6f776c697374000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f5175616e746974792063616e6e6f74206265207a65726f2e0000000000000000600082015250565b7f596f752063616e2774206d696e74206d6f7265207468616e20796f75206f776e60008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b613ec98161398e565b8114613ed457600080fd5b50565b613ee0816139a0565b8114613eeb57600080fd5b50565b613ef7816139ac565b8114613f0257600080fd5b50565b613f0e816139b6565b8114613f1957600080fd5b50565b613f2581613a11565b8114613f3057600080fd5b5056fea26469706673582212207acd1909687fae9d2d076dc4ffe1a08ca082f375f739b4eef31fd9bc3588464064736f6c63430008070033fb7e4793a61f0a813b0d71aac8f79e845268f4fd24cac8cb07ba279680b8615f00000000000000000000000059c0e4b889f4c036dd0d6d759c7b37cf91f3ec010000000000000000000000008b2fda65cb4609a5f60c0a14c1ae33791a3d56ec0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000005e68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d5073333175654c793262756a6e67323345365a6e744a694e75466e4764566d734c397354725577585274375a2f6d657461646174612e6a736f6e0000

Deployed Bytecode

0x6080604052600436106101ee5760003560e01c806370a082311161010d578063b88d4fde116100a0578063d7b4be241161006f578063d7b4be24146106de578063d7e1ea1714610709578063e5e01c1114610746578063e985e9c51461076f578063f2fde38b146107ac576101ee565b8063b88d4fde1461060b578063c23dc68f14610627578063c2fb09a814610664578063c87b56dd146106a1576101ee565b80638da5cb5b116100dc5780638da5cb5b1461054f57806395d89b411461057a57806399a2557a146105a5578063a22cb465146105e2576101ee565b806370a0823114610495578063715018a6146104d25780637cb64759146104e95780638462151c14610512576101ee565b80632f52ebb71161018557806342842e0e1161015457806342842e0e146103d45780635bbb2177146103f05780636352211e1461042d5780636aa003711461046a576101ee565b80632f52ebb71461034057806332cb6b0c146103695780633b58524d146103945780633ccfd60b146103bd576101ee565b8063095ea7b3116101c1578063095ea7b3146102c157806318160ddd146102dd57806323b872dd146103085780632db1154414610324576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b57806308f4c7ff14610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612ebd565b6107d5565b604051610227919061353a565b60405180910390f35b34801561023c57600080fd5b50610245610867565b6040516102529190613555565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190612f60565b6108f9565b60405161028f919061348f565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190612f60565b610978565b005b6102db60048036038101906102d69190612db0565b61098a565b005b3480156102e957600080fd5b506102f2610ace565b6040516102ff9190613732565b60405180910390f35b610322600480360381019061031d9190612c9a565b610ae5565b005b61033e60048036038101906103399190612f60565b610e0a565b005b34801561034c57600080fd5b5061036760048036038101906103629190612fba565b610f9a565b005b34801561037557600080fd5b5061037e6112b0565b60405161038b9190613732565b60405180910390f35b3480156103a057600080fd5b506103bb60048036038101906103b69190612c5a565b6112b6565b005b3480156103c957600080fd5b506103d2611344565b005b6103ee60048036038101906103e99190612c9a565b6113a5565b005b3480156103fc57600080fd5b5061041760048036038101906104129190612e43565b6113c5565b60405161042491906134f6565b60405180910390f35b34801561043957600080fd5b50610454600480360381019061044f9190612f60565b611488565b604051610461919061348f565b60405180910390f35b34801561047657600080fd5b5061047f61149a565b60405161048c919061348f565b60405180910390f35b3480156104a157600080fd5b506104bc60048036038101906104b79190612c2d565b6114c0565b6040516104c99190613732565b60405180910390f35b3480156104de57600080fd5b506104e7611579565b005b3480156104f557600080fd5b50610510600480360381019061050b9190612e90565b61158d565b005b34801561051e57600080fd5b5061053960048036038101906105349190612c2d565b61159f565b6040516105469190613518565b60405180910390f35b34801561055b57600080fd5b506105646116e9565b604051610571919061348f565b60405180910390f35b34801561058657600080fd5b5061058f611713565b60405161059c9190613555565b60405180910390f35b3480156105b157600080fd5b506105cc60048036038101906105c79190612df0565b6117a5565b6040516105d99190613518565b60405180910390f35b3480156105ee57600080fd5b5061060960048036038101906106049190612d70565b6119b9565b005b61062560048036038101906106209190612ced565b611ac4565b005b34801561063357600080fd5b5061064e60048036038101906106499190612f60565b611b37565b60405161065b9190613717565b60405180910390f35b34801561067057600080fd5b5061068b60048036038101906106869190612c2d565b611ba1565b6040516106989190613732565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c39190612f60565b611d15565b6040516106d59190613555565b60405180910390f35b3480156106ea57600080fd5b506106f3611df1565b604051610700919061348f565b60405180910390f35b34801561071557600080fd5b50610730600480360381019061072b9190612c2d565b611e17565b60405161073d9190613732565b60405180910390f35b34801561075257600080fd5b5061076d60048036038101906107689190612f17565b611e2f565b005b34801561077b57600080fd5b5061079660048036038101906107919190612c5a565b611e51565b6040516107a3919061353a565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce9190612c2d565b611ee5565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061083057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108605750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461087690613a71565b80601f01602080910402602001604051908101604052809291908181526020018280546108a290613a71565b80156108ef5780601f106108c4576101008083540402835291602001916108ef565b820191906000526020600020905b8154815290600101906020018083116108d257829003601f168201915b5050505050905090565b600061090482611f69565b61093a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610980611fc8565b80600f8190555050565b600061099582611488565b90508073ffffffffffffffffffffffffffffffffffffffff166109b6612046565b73ffffffffffffffffffffffffffffffffffffffff1614610a19576109e2816109dd612046565b611e51565b610a18576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610ad861204e565b6001546000540303905090565b6000610af082612053565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b57576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b6384612121565b91509150610b798187610b74612046565b612148565b610bc557610b8e86610b89612046565b611e51565b610bc4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610c2c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c39868686600161218c565b8015610c4457600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610d1285610cee888887612192565b7c0200000000000000000000000000000000000000000000000000000000176121ba565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610d9a576000600185019050600060046000838152602001908152602001600020541415610d98576000548114610d97578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e0286868660016121e5565b505050505050565b610e126121eb565b600f54421015610e57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4e906135f7565b60405180910390fd5b60008111610e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e91906136b7565b60405180910390fd5b600a811115610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed5906135b7565b60405180910390fd5b611b4d81610eea610ace565b610ef491906138aa565b1115610f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2c90613597565b60405180910390fd5b600a5481610f439190613900565b341015610f85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7c90613637565b60405180910390fd5b610f8f338261223b565b610f97612259565b50565b610fa26121eb565b6000610fad33611ba1565b9050600f544210610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea90613617565b60405180910390fd5b61102382336040516020016110089190613474565b60405160208183030381529060405280519060200120612263565b611062576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105990613657565b60405180910390fd5b600083116110a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109c906136b7565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054816110f0919061395a565b831115611132576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611129906136d7565b60405180910390fd5b611b4d8361113e610ace565b61114891906138aa565b1115611189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118090613597565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481141561120b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611202906135d7565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548361125691906138aa565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506112a3338461223b565b506112ac612259565b5050565b611b4d81565b6112be611fc8565b81600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b61134c611fc8565b6113546121eb565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561139a573d6000803e3d6000fd5b506113a3612259565b565b6113c083838360405180602001604052806000815250611ac4565b505050565b6060600083839050905060008167ffffffffffffffff8111156113eb576113ea613bce565b5b60405190808252806020026020018201604052801561142457816020015b6114116128d4565b8152602001906001900390816114095790505b50905060005b82811461147c5761145386868381811061144757611446613b9f565b5b90506020020135611b37565b82828151811061146657611465613b9f565b5b602002602001018190525080600101905061142a565b50809250505092915050565b600061149382612053565b9050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611528576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611581611fc8565b61158b600061227a565b565b611595611fc8565b80600b8190555050565b606060008060006115af856114c0565b905060008167ffffffffffffffff8111156115cd576115cc613bce565b5b6040519080825280602002602001820160405280156115fb5781602001602082028036833780820191505090505b5090506116066128d4565b600061161061204e565b90505b8386146116db5761162381612340565b9150816040015115611634576116d0565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461167457816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156116cf57808387806001019850815181106116c2576116c1613b9f565b5b6020026020010181815250505b5b806001019050611613565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461172290613a71565b80601f016020809104026020016040519081016040528092919081815260200182805461174e90613a71565b801561179b5780601f106117705761010080835404028352916020019161179b565b820191906000526020600020905b81548152906001019060200180831161177e57829003601f168201915b5050505050905090565b60608183106117e0576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806117eb61236b565b90506117f561204e565b8510156118075761180461204e565b94505b80841115611813578093505b600061181e876114c0565b90508486101561184157600086860390508181101561183b578091505b50611846565b600090505b60008167ffffffffffffffff81111561186257611861613bce565b5b6040519080825280602002602001820160405280156118905781602001602082028036833780820191505090505b50905060008214156118a857809450505050506119b2565b60006118b388611b37565b9050600081604001516118c857816000015190505b60008990505b8881141580156118de5750848714155b156119a4576118ec81612340565b92508260400151156118fd57611999565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461193d57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611998578084888060010199508151811061198b5761198a613b9f565b5b6020026020010181815250505b5b8060010190506118ce565b508583528296505050505050505b9392505050565b80600760006119c6612046565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a73612046565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ab8919061353a565b60405180910390a35050565b611acf848484610ae5565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611b3157611afa84848484612374565b611b30576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611b3f6128d4565b611b476128d4565b611b4f61204e565b831080611b635750611b5f61236b565b8310155b15611b715780915050611b9c565b611b7a83612340565b9050806040015115611b8f5780915050611b9c565b611b98836124d4565b9150505b919050565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401611bff919061348f565b60206040518083038186803b158015611c1757600080fd5b505afa158015611c2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4f9190612f8d565b90506000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8df0d35856040518263ffffffff1660e01b8152600401611cae919061348f565b60206040518083038186803b158015611cc657600080fd5b505afa158015611cda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cfe9190612f8d565b90508082611d0c91906138aa565b92505050919050565b6060611d2082611f69565b611d5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5690613697565b60405180910390fd5b600e8054611d6c90613a71565b80601f0160208091040260200160405190810160405280929190818152602001828054611d9890613a71565b8015611de55780601f10611dba57610100808354040283529160200191611de5565b820191906000526020600020905b815481529060010190602001808311611dc857829003601f168201915b50505050509050919050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60106020528060005260406000206000915090505481565b611e37611fc8565b80600e9080519060200190611e4d929190612923565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611eed611fc8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5490613577565b60405180910390fd5b611f668161227a565b50565b600081611f7461204e565b11158015611f83575060005482105b8015611fc1575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b611fd06124f4565b73ffffffffffffffffffffffffffffffffffffffff16611fee6116e9565b73ffffffffffffffffffffffffffffffffffffffff1614612044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203b90613677565b60405180910390fd5b565b600033905090565b600090565b6000808290508061206261204e565b116120ea576000548110156120e95760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156120e7575b60008114156120dd5760046000836001900393508381526020019081526020016000205490506120b2565b809250505061211c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86121a98686846124fc565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60026009541415612231576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612228906136f7565b60405180910390fd5b6002600981905550565b612255828260405180602001604052806000815250612505565b5050565b6001600981905550565b600061227283600b54846125a2565b905092915050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123486128d4565b61236460046000848152602001908152602001600020546125b9565b9050919050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261239a612046565b8786866040518563ffffffff1660e01b81526004016123bc94939291906134aa565b602060405180830381600087803b1580156123d657600080fd5b505af192505050801561240757506040513d601f19601f820116820180604052508101906124049190612eea565b60015b612481573d8060008114612437576040519150601f19603f3d011682016040523d82523d6000602084013e61243c565b606091505b50600081511415612479576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6124dc6128d4565b6124ed6124e883612053565b6125b9565b9050919050565b600033905090565b60009392505050565b61250f838361266f565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461259d57600080549050600083820390505b61254f6000868380600101945086612374565b612585576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061253c57816000541461259a57600080fd5b50505b505050565b6000826125af858461282c565b1490509392505050565b6125c16128d4565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008054905060008214156126b0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126bd600084838561218c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612734836127256000866000612192565b61272e85612882565b176121ba565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146127d557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061279a565b506000821415612811576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061282760008483856121e5565b505050565b60008082905060005b8451811015612877576128628286838151811061285557612854613b9f565b5b6020026020010151612892565b9150808061286f90613ad4565b915050612835565b508091505092915050565b60006001821460e11b9050919050565b60008183106128aa576128a582846128bd565b6128b5565b6128b483836128bd565b5b905092915050565b600082600052816020526040600020905092915050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b82805461292f90613a71565b90600052602060002090601f0160209004810192826129515760008555612998565b82601f1061296a57805160ff1916838001178555612998565b82800160010185558215612998579182015b8281111561299757825182559160200191906001019061297c565b5b5090506129a591906129a9565b5090565b5b808211156129c25760008160009055506001016129aa565b5090565b60006129d96129d484613772565b61374d565b905080838252602082019050828560208602820111156129fc576129fb613c07565b5b60005b85811015612a2c5781612a128882612b68565b8452602084019350602083019250506001810190506129ff565b5050509392505050565b6000612a49612a448461379e565b61374d565b905082815260208101848484011115612a6557612a64613c0c565b5b612a70848285613a2f565b509392505050565b6000612a8b612a86846137cf565b61374d565b905082815260208101848484011115612aa757612aa6613c0c565b5b612ab2848285613a2f565b509392505050565b600081359050612ac981613ec0565b92915050565b600082601f830112612ae457612ae3613c02565b5b8135612af48482602086016129c6565b91505092915050565b60008083601f840112612b1357612b12613c02565b5b8235905067ffffffffffffffff811115612b3057612b2f613bfd565b5b602083019150836020820283011115612b4c57612b4b613c07565b5b9250929050565b600081359050612b6281613ed7565b92915050565b600081359050612b7781613eee565b92915050565b600081359050612b8c81613f05565b92915050565b600081519050612ba181613f05565b92915050565b600082601f830112612bbc57612bbb613c02565b5b8135612bcc848260208601612a36565b91505092915050565b600082601f830112612bea57612be9613c02565b5b8135612bfa848260208601612a78565b91505092915050565b600081359050612c1281613f1c565b92915050565b600081519050612c2781613f1c565b92915050565b600060208284031215612c4357612c42613c16565b5b6000612c5184828501612aba565b91505092915050565b60008060408385031215612c7157612c70613c16565b5b6000612c7f85828601612aba565b9250506020612c9085828601612aba565b9150509250929050565b600080600060608486031215612cb357612cb2613c16565b5b6000612cc186828701612aba565b9350506020612cd286828701612aba565b9250506040612ce386828701612c03565b9150509250925092565b60008060008060808587031215612d0757612d06613c16565b5b6000612d1587828801612aba565b9450506020612d2687828801612aba565b9350506040612d3787828801612c03565b925050606085013567ffffffffffffffff811115612d5857612d57613c11565b5b612d6487828801612ba7565b91505092959194509250565b60008060408385031215612d8757612d86613c16565b5b6000612d9585828601612aba565b9250506020612da685828601612b53565b9150509250929050565b60008060408385031215612dc757612dc6613c16565b5b6000612dd585828601612aba565b9250506020612de685828601612c03565b9150509250929050565b600080600060608486031215612e0957612e08613c16565b5b6000612e1786828701612aba565b9350506020612e2886828701612c03565b9250506040612e3986828701612c03565b9150509250925092565b60008060208385031215612e5a57612e59613c16565b5b600083013567ffffffffffffffff811115612e7857612e77613c11565b5b612e8485828601612afd565b92509250509250929050565b600060208284031215612ea657612ea5613c16565b5b6000612eb484828501612b68565b91505092915050565b600060208284031215612ed357612ed2613c16565b5b6000612ee184828501612b7d565b91505092915050565b600060208284031215612f0057612eff613c16565b5b6000612f0e84828501612b92565b91505092915050565b600060208284031215612f2d57612f2c613c16565b5b600082013567ffffffffffffffff811115612f4b57612f4a613c11565b5b612f5784828501612bd5565b91505092915050565b600060208284031215612f7657612f75613c16565b5b6000612f8484828501612c03565b91505092915050565b600060208284031215612fa357612fa2613c16565b5b6000612fb184828501612c18565b91505092915050565b60008060408385031215612fd157612fd0613c16565b5b6000612fdf85828601612c03565b925050602083013567ffffffffffffffff81111561300057612fff613c11565b5b61300c85828601612acf565b9150509250929050565b6000613022838361338e565b60808301905092915050565b600061303a8383613447565b60208301905092915050565b61304f8161398e565b82525050565b61305e8161398e565b82525050565b6130756130708261398e565b613b1d565b82525050565b600061308682613820565b6130908185613866565b935061309b83613800565b8060005b838110156130cc5781516130b38882613016565b97506130be8361384c565b92505060018101905061309f565b5085935050505092915050565b60006130e48261382b565b6130ee8185613877565b93506130f983613810565b8060005b8381101561312a578151613111888261302e565b975061311c83613859565b9250506001810190506130fd565b5085935050505092915050565b613140816139a0565b82525050565b61314f816139a0565b82525050565b600061316082613836565b61316a8185613888565b935061317a818560208601613a3e565b61318381613c1b565b840191505092915050565b600061319982613841565b6131a38185613899565b93506131b3818560208601613a3e565b6131bc81613c1b565b840191505092915050565b60006131d4602683613899565b91506131df82613c39565b604082019050919050565b60006131f7601783613899565b915061320282613c88565b602082019050919050565b600061321a601c83613899565b915061322582613cb1565b602082019050919050565b600061323d601583613899565b915061324882613cda565b602082019050919050565b6000613260601a83613899565b915061326b82613d03565b602082019050919050565b6000613283601683613899565b915061328e82613d2c565b602082019050919050565b60006132a6601583613899565b91506132b182613d55565b602082019050919050565b60006132c9601783613899565b91506132d482613d7e565b602082019050919050565b60006132ec602083613899565b91506132f782613da7565b602082019050919050565b600061330f602f83613899565b915061331a82613dd0565b604082019050919050565b6000613332601883613899565b915061333d82613e1f565b602082019050919050565b6000613355602183613899565b915061336082613e48565b604082019050919050565b6000613378601f83613899565b915061338382613e97565b602082019050919050565b6080820160008201516133a46000850182613046565b5060208201516133b76020850182613465565b5060408201516133ca6040850182613137565b5060608201516133dd6060850182613438565b50505050565b6080820160008201516133f96000850182613046565b50602082015161340c6020850182613465565b50604082015161341f6040850182613137565b5060608201516134326060850182613438565b50505050565b61344181613a02565b82525050565b61345081613a11565b82525050565b61345f81613a11565b82525050565b61346e81613a1b565b82525050565b60006134808284613064565b60148201915081905092915050565b60006020820190506134a46000830184613055565b92915050565b60006080820190506134bf6000830187613055565b6134cc6020830186613055565b6134d96040830185613456565b81810360608301526134eb8184613155565b905095945050505050565b60006020820190508181036000830152613510818461307b565b905092915050565b6000602082019050818103600083015261353281846130d9565b905092915050565b600060208201905061354f6000830184613146565b92915050565b6000602082019050818103600083015261356f818461318e565b905092915050565b60006020820190508181036000830152613590816131c7565b9050919050565b600060208201905081810360008301526135b0816131ea565b9050919050565b600060208201905081810360008301526135d08161320d565b9050919050565b600060208201905081810360008301526135f081613230565b9050919050565b6000602082019050818103600083015261361081613253565b9050919050565b6000602082019050818103600083015261363081613276565b9050919050565b6000602082019050818103600083015261365081613299565b9050919050565b60006020820190508181036000830152613670816132bc565b9050919050565b60006020820190508181036000830152613690816132df565b9050919050565b600060208201905081810360008301526136b081613302565b9050919050565b600060208201905081810360008301526136d081613325565b9050919050565b600060208201905081810360008301526136f081613348565b9050919050565b600060208201905081810360008301526137108161336b565b9050919050565b600060808201905061372c60008301846133e3565b92915050565b60006020820190506137476000830184613456565b92915050565b6000613757613768565b90506137638282613aa3565b919050565b6000604051905090565b600067ffffffffffffffff82111561378d5761378c613bce565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156137b9576137b8613bce565b5b6137c282613c1b565b9050602081019050919050565b600067ffffffffffffffff8211156137ea576137e9613bce565b5b6137f382613c1b565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b60006138b582613a11565b91506138c083613a11565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138f5576138f4613b41565b5b828201905092915050565b600061390b82613a11565b915061391683613a11565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561394f5761394e613b41565b5b828202905092915050565b600061396582613a11565b915061397083613a11565b92508282101561398357613982613b41565b5b828203905092915050565b6000613999826139e2565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613a5c578082015181840152602081019050613a41565b83811115613a6b576000848401525b50505050565b60006002820490506001821680613a8957607f821691505b60208210811415613a9d57613a9c613b70565b5b50919050565b613aac82613c1b565b810181811067ffffffffffffffff82111715613acb57613aca613bce565b5b80604052505050565b6000613adf82613a11565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b1257613b11613b41565b5b600182019050919050565b6000613b2882613b2f565b9050919050565b6000613b3a82613c2c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820746f6b656e73206c6566742e000000000000000000600082015250565b7f596f752063616e2774206d696e74206d6f7265207468616e2031302e00000000600082015250565b7f596f752063616e277420636c61696d206d6f72652e0000000000000000000000600082015250565b7f5075626c6963206d696e74206973206e6f74206163746976652e000000000000600082015250565b7f5075626c6963206d696e74206973206163746976652e00000000000000000000600082015250565b7f496e73756666696369656e742042616c616e63652e0000000000000000000000600082015250565b7f4e6f7420612070617274206f6620416c6c6f776c697374000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f5175616e746974792063616e6e6f74206265207a65726f2e0000000000000000600082015250565b7f596f752063616e2774206d696e74206d6f7265207468616e20796f75206f776e60008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b613ec98161398e565b8114613ed457600080fd5b50565b613ee0816139a0565b8114613eeb57600080fd5b50565b613ef7816139ac565b8114613f0257600080fd5b50565b613f0e816139b6565b8114613f1957600080fd5b50565b613f2581613a11565b8114613f3057600080fd5b5056fea26469706673582212207acd1909687fae9d2d076dc4ffe1a08ca082f375f739b4eef31fd9bc3588464064736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

fb7e4793a61f0a813b0d71aac8f79e845268f4fd24cac8cb07ba279680b8615f00000000000000000000000059c0e4b889f4c036dd0d6d759c7b37cf91f3ec010000000000000000000000008b2fda65cb4609a5f60c0a14c1ae33791a3d56ec0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000005e68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d5073333175654c793262756a6e67323345365a6e744a694e75466e4764566d734c397354725577585274375a2f6d657461646174612e6a736f6e0000

-----Decoded View---------------
Arg [0] : _root (bytes32): 0xfb7e4793a61f0a813b0d71aac8f79e845268f4fd24cac8cb07ba279680b8615f
Arg [1] : _collectionAddress (address): 0x59C0e4b889F4c036DD0D6d759c7B37cF91f3eC01
Arg [2] : _stakingAddress (address): 0x8B2FdA65Cb4609a5f60c0a14C1ae33791A3d56EC
Arg [3] : _revealURI (string): https://gateway.pinata.cloud/ipfs/QmPs31ueLy2bujng23E6ZntJiNuFnGdVmsL9sTrUwXRt7Z/metadata.json

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : fb7e4793a61f0a813b0d71aac8f79e845268f4fd24cac8cb07ba279680b8615f
Arg [1] : 00000000000000000000000059c0e4b889f4c036dd0d6d759c7b37cf91f3ec01
Arg [2] : 0000000000000000000000008b2fda65cb4609a5f60c0a14c1ae33791a3d56ec
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [4] : 000000000000000000000000000000000000000000000000000000000000005e
Arg [5] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [6] : 732f516d5073333175654c793262756a6e67323345365a6e744a694e75466e47
Arg [7] : 64566d734c397354725577585274375a2f6d657461646174612e6a736f6e0000


Deployed Bytecode Sourcemap

83880:3423:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44160:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45062:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51553:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86858:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50986:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40813:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55192:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85409:491;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84615:786;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83962:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86978:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87178:122;;;;;;;;;;;;;:::i;:::-;;58113:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78859:528;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46455:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84092:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41997:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22415:103;;;;;;;;;;;;;:::i;:::-;;86638:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82735:900;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21767:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45238:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79775:2513;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52111:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58904:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78272:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85908:349;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86420:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84131:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84256:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86745:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52502:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22673:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44160:639;44245:4;44584:10;44569:25;;:11;:25;;;;:102;;;;44661:10;44646:25;;:11;:25;;;;44569:102;:179;;;;44738:10;44723:25;;:11;:25;;;;44569:179;44549:199;;44160:639;;;:::o;45062:100::-;45116:13;45149:5;45142:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45062:100;:::o;51553:218::-;51629:7;51654:16;51662:7;51654;:16::i;:::-;51649:64;;51679:34;;;;;;;;;;;;;;51649:64;51733:15;:24;51749:7;51733:24;;;;;;;;;;;:30;;;;;;;;;;;;51726:37;;51553:218;;;:::o;86858:112::-;21653:13;:11;:13::i;:::-;86952:10:::1;86935:14;:27;;;;86858:112:::0;:::o;50986:408::-;51075:13;51091:16;51099:7;51091;:16::i;:::-;51075:32;;51147:5;51124:28;;:19;:17;:19::i;:::-;:28;;;51120:175;;51172:44;51189:5;51196:19;:17;:19::i;:::-;51172:16;:44::i;:::-;51167:128;;51244:35;;;;;;;;;;;;;;51167:128;51120:175;51340:2;51307:15;:24;51323:7;51307:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;51378:7;51374:2;51358:28;;51367:5;51358:28;;;;;;;;;;;;51064:330;50986:408;;:::o;40813:323::-;40874:7;41102:15;:13;:15::i;:::-;41087:12;;41071:13;;:28;:46;41064:53;;40813:323;:::o;55192:2825::-;55334:27;55364;55383:7;55364:18;:27::i;:::-;55334:57;;55449:4;55408:45;;55424:19;55408:45;;;55404:86;;55462:28;;;;;;;;;;;;;;55404:86;55504:27;55533:23;55560:35;55587:7;55560:26;:35::i;:::-;55503:92;;;;55695:68;55720:15;55737:4;55743:19;:17;:19::i;:::-;55695:24;:68::i;:::-;55690:180;;55783:43;55800:4;55806:19;:17;:19::i;:::-;55783:16;:43::i;:::-;55778:92;;55835:35;;;;;;;;;;;;;;55778:92;55690:180;55901:1;55887:16;;:2;:16;;;55883:52;;;55912:23;;;;;;;;;;;;;;55883:52;55948:43;55970:4;55976:2;55980:7;55989:1;55948:21;:43::i;:::-;56084:15;56081:160;;;56224:1;56203:19;56196:30;56081:160;56621:18;:24;56640:4;56621:24;;;;;;;;;;;;;;;;56619:26;;;;;;;;;;;;56690:18;:22;56709:2;56690:22;;;;;;;;;;;;;;;;56688:24;;;;;;;;;;;57012:146;57049:2;57098:45;57113:4;57119:2;57123:19;57098:14;:45::i;:::-;37212:8;57070:73;57012:18;:146::i;:::-;56983:17;:26;57001:7;56983:26;;;;;;;;;;;:175;;;;57329:1;37212:8;57278:19;:47;:52;57274:627;;;57351:19;57383:1;57373:7;:11;57351:33;;57540:1;57506:17;:30;57524:11;57506:30;;;;;;;;;;;;:35;57502:384;;;57644:13;;57629:11;:28;57625:242;;57824:19;57791:17;:30;57809:11;57791:30;;;;;;;;;;;:52;;;;57625:242;57502:384;57332:569;57274:627;57948:7;57944:2;57929:27;;57938:4;57929:27;;;;;;;;;;;;57967:42;57988:4;57994:2;57998:7;58007:1;57967:20;:42::i;:::-;55323:2694;;;55192:2825;;;:::o;85409:491::-;19038:21;:19;:21::i;:::-;85513:14:::1;;85494:15;:33;;85486:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;85588:1;85577:8;:12;85569:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;85649:2;85637:8;:14;;85629:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;83999:4;85719:8;85703:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;85695:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;85813:10;;85802:8;:21;;;;:::i;:::-;85788:9;:36;;85780:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;85861:31;85871:10;85883:8;85861:9;:31::i;:::-;19082:20:::0;:18;:20::i;:::-;85409:491;:::o;84615:786::-;19038:21;:19;:21::i;:::-;84703:18:::1;84724:27;84740:10;84724:15;:27::i;:::-;84703:48;;84790:14;;84772:15;:32;84764:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;84850:55;84858:5;84892:10;84875:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;84865:39;;;;;;84850:7;:55::i;:::-;84842:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;84963:1;84952:8;:12;84944:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;85037:13;:25;85051:10;85037:25;;;;;;;;;;;;;;;;85024:10;:38;;;;:::i;:::-;85012:8;:50;;85004:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;83999:4;85135:8;85119:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;85111:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;85216:13;:25;85230:10;85216:25;;;;;;;;;;;;;;;;85202:10;:39;85198:76;;;85243:31;;;;;;;;;;:::i;:::-;;;;;;;;85198:76;85326:13;:25;85340:10;85326:25;;;;;;;;;;;;;;;;85315:8;:36;;;;:::i;:::-;85287:13;:25;85301:10;85287:25;;;;;;;;;;;;;;;:64;;;;85362:31;85372:10;85384:8;85362:9;:31::i;:::-;84692:709;19082:20:::0;:18;:20::i;:::-;84615:786;;:::o;83962:41::-;83999:4;83962:41;:::o;86978:192::-;21653:13;:11;:13::i;:::-;87101:18:::1;87081:17;;:38;;;;;;;;;;;;;;;;;;87147:15;87130:14;;:32;;;;;;;;;;;;;;;;;;86978:192:::0;;:::o;87178:122::-;21653:13;:11;:13::i;:::-;19038:21:::1;:19;:21::i;:::-;87249:10:::2;87241:28;;:51;87270:21;87241:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;19082:20:::1;:18;:20::i;:::-;87178:122::o:0;58113:193::-;58259:39;58276:4;58282:2;58286:7;58259:39;;;;;;;;;;;;:16;:39::i;:::-;58113:193;;;:::o;78859:528::-;79003:23;79069:22;79094:8;;:15;;79069:40;;79124:34;79182:14;79161:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;79124:73;;79217:9;79212:125;79233:14;79228:1;:19;79212:125;;79289:32;79309:8;;79318:1;79309:11;;;;;;;:::i;:::-;;;;;;;;79289:19;:32::i;:::-;79273:10;79284:1;79273:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;79249:3;;;;;79212:125;;;;79358:10;79351:17;;;;78859:528;;;;:::o;46455:152::-;46527:7;46570:27;46589:7;46570:18;:27::i;:::-;46547:52;;46455:152;;;:::o;84092:32::-;;;;;;;;;;;;;:::o;41997:233::-;42069:7;42110:1;42093:19;;:5;:19;;;42089:60;;;42121:28;;;;;;;;;;;;;;42089:60;36156:13;42167:18;:25;42186:5;42167:25;;;;;;;;;;;;;;;;:55;42160:62;;41997:233;;;:::o;22415:103::-;21653:13;:11;:13::i;:::-;22480:30:::1;22507:1;22480:18;:30::i;:::-;22415:103::o:0;86638:99::-;21653:13;:11;:13::i;:::-;86718:11:::1;86711:4;:18;;;;86638:99:::0;:::o;82735:900::-;82813:16;82867:19;82901:25;82941:22;82966:16;82976:5;82966:9;:16::i;:::-;82941:41;;82997:25;83039:14;83025:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82997:57;;83069:31;;:::i;:::-;83120:9;83132:15;:13;:15::i;:::-;83120:27;;83115:472;83164:14;83149:11;:29;83115:472;;83216:15;83229:1;83216:12;:15::i;:::-;83204:27;;83254:9;:16;;;83250:73;;;83295:8;;83250:73;83371:1;83345:28;;:9;:14;;;:28;;;83341:111;;83418:9;:14;;;83398:34;;83341:111;83495:5;83474:26;;:17;:26;;;83470:102;;;83551:1;83525:8;83534:13;;;;;;83525:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;83470:102;83115:472;83180:3;;;;;83115:472;;;;83608:8;83601:15;;;;;;;82735:900;;;:::o;21767:87::-;21813:7;21840:6;;;;;;;;;;;21833:13;;21767:87;:::o;45238:104::-;45294:13;45327:7;45320:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45238:104;:::o;79775:2513::-;79918:16;79985:4;79976:5;:13;79972:45;;79998:19;;;;;;;;;;;;;;79972:45;80032:19;80066:17;80086:14;:12;:14::i;:::-;80066:34;;80186:15;:13;:15::i;:::-;80178:5;:23;80174:87;;;80230:15;:13;:15::i;:::-;80222:23;;80174:87;80337:9;80330:4;:16;80326:73;;;80374:9;80367:16;;80326:73;80413:25;80441:16;80451:5;80441:9;:16::i;:::-;80413:44;;80635:4;80627:5;:12;80623:278;;;80660:19;80689:5;80682:4;:12;80660:34;;80731:17;80717:11;:31;80713:111;;;80793:11;80773:31;;80713:111;80641:198;80623:278;;;80884:1;80864:21;;80623:278;80915:25;80957:17;80943:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80915:60;;81015:1;80994:17;:22;80990:78;;;81044:8;81037:15;;;;;;;;80990:78;81212:31;81246:26;81266:5;81246:19;:26::i;:::-;81212:60;;81287:25;81532:9;:16;;;81527:92;;81589:9;:14;;;81569:34;;81527:92;81638:9;81650:5;81638:17;;81633:478;81662:4;81657:1;:9;;:45;;;;;81685:17;81670:11;:32;;81657:45;81633:478;;;81740:15;81753:1;81740:12;:15::i;:::-;81728:27;;81778:9;:16;;;81774:73;;;81819:8;;81774:73;81895:1;81869:28;;:9;:14;;;:28;;;81865:111;;81942:9;:14;;;81922:34;;81865:111;82019:5;81998:26;;:17;:26;;;81994:102;;;82075:1;82049:8;82058:13;;;;;;82049:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;81994:102;81633:478;81704:3;;;;;81633:478;;;;82213:11;82203:8;82196:29;82261:8;82254:15;;;;;;;;79775:2513;;;;;;:::o;52111:234::-;52258:8;52206:18;:39;52225:19;:17;:19::i;:::-;52206:39;;;;;;;;;;;;;;;:49;52246:8;52206:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;52318:8;52282:55;;52297:19;:17;:19::i;:::-;52282:55;;;52328:8;52282:55;;;;;;:::i;:::-;;;;;;;;52111:234;;:::o;58904:407::-;59079:31;59092:4;59098:2;59102:7;59079:12;:31::i;:::-;59143:1;59125:2;:14;;;:19;59121:183;;59164:56;59195:4;59201:2;59205:7;59214:5;59164:30;:56::i;:::-;59159:145;;59248:40;;;;;;;;;;;;;;59159:145;59121:183;58904:407;;;;:::o;78272:428::-;78356:21;;:::i;:::-;78390:31;;:::i;:::-;78446:15;:13;:15::i;:::-;78436:7;:25;:54;;;;78476:14;:12;:14::i;:::-;78465:7;:25;;78436:54;78432:103;;;78514:9;78507:16;;;;;78432:103;78557:21;78570:7;78557:12;:21::i;:::-;78545:33;;78593:9;:16;;;78589:65;;;78633:9;78626:16;;;;;78589:65;78671:21;78684:7;78671:12;:21::i;:::-;78664:28;;;78272:428;;;;:::o;85908:349::-;85969:18;86000:23;86044:17;;;;;;;;;;;86026:46;;;86073:5;86026:53;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;86000:79;;86090:20;86123:14;;;;;;;;;;;86113:47;;;86161:5;86113:54;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;86090:77;;86209:12;86191:15;:30;;;;:::i;:::-;86178:43;;86232:17;;85908:349;;;:::o;86420:210::-;86493:13;86527:16;86535:7;86527;:16::i;:::-;86519:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;86613:9;86606:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86420:210;;;:::o;84131:29::-;;;;;;;;;;;;;:::o;84256:49::-;;;;;;;;;;;;;;;;;:::o;86745:105::-;21653:13;:11;:13::i;:::-;86832:10:::1;86820:9;:22;;;;;;;;;;;;:::i;:::-;;86745:105:::0;:::o;52502:164::-;52599:4;52623:18;:25;52642:5;52623:25;;;;;;;;;;;;;;;:35;52649:8;52623:35;;;;;;;;;;;;;;;;;;;;;;;;;52616:42;;52502:164;;;;:::o;22673:201::-;21653:13;:11;:13::i;:::-;22782:1:::1;22762:22;;:8;:22;;;;22754:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22838:28;22857:8;22838:18;:28::i;:::-;22673:201:::0;:::o;52924:282::-;52989:4;53045:7;53026:15;:13;:15::i;:::-;:26;;:66;;;;;53079:13;;53069:7;:23;53026:66;:153;;;;;53178:1;36932:8;53130:17;:26;53148:7;53130:26;;;;;;;;;;;;:44;:49;53026:153;53006:173;;52924:282;;;:::o;21932:132::-;22007:12;:10;:12::i;:::-;21996:23;;:7;:5;:7::i;:::-;:23;;;21988:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21932:132::o;75232:105::-;75292:7;75319:10;75312:17;;75232:105;:::o;40329:92::-;40385:7;40329:92;:::o;47610:1275::-;47677:7;47697:12;47712:7;47697:22;;47780:4;47761:15;:13;:15::i;:::-;:23;47757:1061;;47814:13;;47807:4;:20;47803:1015;;;47852:14;47869:17;:23;47887:4;47869:23;;;;;;;;;;;;47852:40;;47986:1;36932:8;47958:6;:24;:29;47954:845;;;48623:113;48640:1;48630:6;:11;48623:113;;;48683:17;:25;48701:6;;;;;;;48683:25;;;;;;;;;;;;48674:34;;48623:113;;;48769:6;48762:13;;;;;;47954:845;47829:989;47803:1015;47757:1061;48846:31;;;;;;;;;;;;;;47610:1275;;;;:::o;54087:485::-;54189:27;54218:23;54259:38;54300:15;:24;54316:7;54300:24;;;;;;;;;;;54259:65;;54477:18;54454:41;;54534:19;54528:26;54509:45;;54439:126;54087:485;;;:::o;53315:659::-;53464:11;53629:16;53622:5;53618:28;53609:37;;53789:16;53778:9;53774:32;53761:45;;53939:15;53928:9;53925:30;53917:5;53906:9;53903:20;53900:56;53890:66;;53315:659;;;;;:::o;59973:159::-;;;;;:::o;74541:311::-;74676:7;74696:16;37336:3;74722:19;:41;;74696:68;;37336:3;74790:31;74801:4;74807:2;74811:9;74790:10;:31::i;:::-;74782:40;;:62;;74775:69;;;74541:311;;;;;:::o;49433:450::-;49513:14;49681:16;49674:5;49670:28;49661:37;;49858:5;49844:11;49819:23;49815:41;49812:52;49805:5;49802:63;49792:73;;49433:450;;;;:::o;60797:158::-;;;;;:::o;19118:293::-;18520:1;19252:7;;:19;;19244:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;18520:1;19385:7;:18;;;;19118:293::o;69064:112::-;69141:27;69151:2;69155:8;69141:27;;;;;;;;;;;;:9;:27::i;:::-;69064:112;;:::o;19419:213::-;18476:1;19602:7;:22;;;;19419:213::o;86265:147::-;86343:4;86367:37;86386:5;86393:4;;86399;86367:18;:37::i;:::-;86360:44;;86265:147;;;;:::o;23034:191::-;23108:16;23127:6;;;;;;;;;;;23108:25;;23153:8;23144:6;;:17;;;;;;;;;;;;;;;;;;23208:8;23177:40;;23198:8;23177:40;;;;;;;;;;;;23097:128;23034:191;:::o;47058:161::-;47126:21;;:::i;:::-;47167:44;47186:17;:24;47204:5;47186:24;;;;;;;;;;;;47167:18;:44::i;:::-;47160:51;;47058:161;;;:::o;40500:103::-;40555:7;40582:13;;40575:20;;40500:103;:::o;61395:716::-;61558:4;61604:2;61579:45;;;61625:19;:17;:19::i;:::-;61646:4;61652:7;61661:5;61579:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;61575:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61879:1;61862:6;:13;:18;61858:235;;;61908:40;;;;;;;;;;;;;;61858:235;62051:6;62045:13;62036:6;62032:2;62028:15;62021:38;61575:529;61748:54;;;61738:64;;;:6;:64;;;;61731:71;;;61395:716;;;;;;:::o;46796:166::-;46866:21;;:::i;:::-;46907:47;46926:27;46945:7;46926:18;:27::i;:::-;46907:18;:47::i;:::-;46900:54;;46796:166;;;:::o;20318:98::-;20371:7;20398:10;20391:17;;20318:98;:::o;74242:147::-;74379:6;74242:147;;;;;:::o;68291:689::-;68422:19;68428:2;68432:8;68422:5;:19::i;:::-;68501:1;68483:2;:14;;;:19;68479:483;;68523:11;68537:13;;68523:27;;68569:13;68591:8;68585:3;:14;68569:30;;68618:233;68649:62;68688:1;68692:2;68696:7;;;;;;68705:5;68649:30;:62::i;:::-;68644:167;;68747:40;;;;;;;;;;;;;;68644:167;68846:3;68838:5;:11;68618:233;;68933:3;68916:13;;:20;68912:34;;68938:8;;;68912:34;68504:458;;68479:483;68291:689;;;:::o;8354:190::-;8479:4;8532;8503:25;8516:5;8523:4;8503:12;:25::i;:::-;:33;8496:40;;8354:190;;;;;:::o;48984:366::-;49050:31;;:::i;:::-;49127:6;49094:9;:14;;:41;;;;;;;;;;;36815:3;49180:6;:33;;49146:9;:24;;:68;;;;;;;;;;;49272:1;36932:8;49244:6;:24;:29;;49225:9;:16;;:48;;;;;;;;;;;37336:3;49313:6;:28;;49284:9;:19;;:58;;;;;;;;;;;48984:366;;;:::o;62573:2966::-;62646:20;62669:13;;62646:36;;62709:1;62697:8;:13;62693:44;;;62719:18;;;;;;;;;;;;;;62693:44;62750:61;62780:1;62784:2;62788:12;62802:8;62750:21;:61::i;:::-;63294:1;36294:2;63264:1;:26;;63263:32;63251:8;:45;63225:18;:22;63244:2;63225:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;63573:139;63610:2;63664:33;63687:1;63691:2;63695:1;63664:14;:33::i;:::-;63631:30;63652:8;63631:20;:30::i;:::-;:66;63573:18;:139::i;:::-;63539:17;:31;63557:12;63539:31;;;;;;;;;;;:173;;;;63729:16;63760:11;63789:8;63774:12;:23;63760:37;;64310:16;64306:2;64302:25;64290:37;;64682:12;64642:8;64601:1;64539:25;64480:1;64419;64392:335;65053:1;65039:12;65035:20;64993:346;65094:3;65085:7;65082:16;64993:346;;65312:7;65302:8;65299:1;65272:25;65269:1;65266;65261:59;65147:1;65138:7;65134:15;65123:26;;64993:346;;;64997:77;65384:1;65372:8;:13;65368:45;;;65394:19;;;;;;;;;;;;;;65368:45;65446:3;65430:13;:19;;;;62999:2462;;65471:60;65500:1;65504:2;65508:12;65522:8;65471:20;:60::i;:::-;62635:2904;62573:2966;;:::o;9221:296::-;9304:7;9324:20;9347:4;9324:27;;9367:9;9362:118;9386:5;:12;9382:1;:16;9362:118;;;9435:33;9445:12;9459:5;9465:1;9459:8;;;;;;;;:::i;:::-;;;;;;;;9435:9;:33::i;:::-;9420:48;;9400:3;;;;;:::i;:::-;;;;9362:118;;;;9497:12;9490:19;;;9221:296;;;;:::o;49985:324::-;50055:14;50288:1;50278:8;50275:15;50249:24;50245:46;50235:56;;49985:324;;;:::o;16261:149::-;16324:7;16355:1;16351;:5;:51;;16382:20;16397:1;16400;16382:14;:20::i;:::-;16351:51;;;16359:20;16374:1;16377;16359:14;:20::i;:::-;16351:51;16344:58;;16261:149;;;;:::o;16418:268::-;16486:13;16593:1;16587:4;16580:15;16622:1;16616:4;16609:15;16663:4;16657;16647:21;16638:30;;16418:268;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2141:568::-;2214:8;2224:6;2274:3;2267:4;2259:6;2255:17;2251:27;2241:122;;2282:79;;:::i;:::-;2241:122;2395:6;2382:20;2372:30;;2425:18;2417:6;2414:30;2411:117;;;2447:79;;:::i;:::-;2411:117;2561:4;2553:6;2549:17;2537:29;;2615:3;2607:4;2599:6;2595:17;2585:8;2581:32;2578:41;2575:128;;;2622:79;;:::i;:::-;2575:128;2141:568;;;;;:::o;2715:133::-;2758:5;2796:6;2783:20;2774:29;;2812:30;2836:5;2812:30;:::i;:::-;2715:133;;;;:::o;2854:139::-;2900:5;2938:6;2925:20;2916:29;;2954:33;2981:5;2954:33;:::i;:::-;2854:139;;;;:::o;2999:137::-;3044:5;3082:6;3069:20;3060:29;;3098:32;3124:5;3098:32;:::i;:::-;2999:137;;;;:::o;3142:141::-;3198:5;3229:6;3223:13;3214:22;;3245:32;3271:5;3245:32;:::i;:::-;3142:141;;;;:::o;3302:338::-;3357:5;3406:3;3399:4;3391:6;3387:17;3383:27;3373:122;;3414:79;;:::i;:::-;3373:122;3531:6;3518:20;3556:78;3630:3;3622:6;3615:4;3607:6;3603:17;3556:78;:::i;:::-;3547:87;;3363:277;3302:338;;;;:::o;3660:340::-;3716:5;3765:3;3758:4;3750:6;3746:17;3742:27;3732:122;;3773:79;;:::i;:::-;3732:122;3890:6;3877:20;3915:79;3990:3;3982:6;3975:4;3967:6;3963:17;3915:79;:::i;:::-;3906:88;;3722:278;3660:340;;;;:::o;4006:139::-;4052:5;4090:6;4077:20;4068:29;;4106:33;4133:5;4106:33;:::i;:::-;4006:139;;;;:::o;4151:143::-;4208:5;4239:6;4233:13;4224:22;;4255:33;4282:5;4255:33;:::i;:::-;4151:143;;;;:::o;4300:329::-;4359:6;4408:2;4396:9;4387:7;4383:23;4379:32;4376:119;;;4414:79;;:::i;:::-;4376:119;4534:1;4559:53;4604:7;4595:6;4584:9;4580:22;4559:53;:::i;:::-;4549:63;;4505:117;4300:329;;;;:::o;4635:474::-;4703:6;4711;4760:2;4748:9;4739:7;4735:23;4731:32;4728:119;;;4766:79;;:::i;:::-;4728:119;4886:1;4911:53;4956:7;4947:6;4936:9;4932:22;4911:53;:::i;:::-;4901:63;;4857:117;5013:2;5039:53;5084:7;5075:6;5064:9;5060:22;5039:53;:::i;:::-;5029:63;;4984:118;4635:474;;;;;:::o;5115:619::-;5192:6;5200;5208;5257:2;5245:9;5236:7;5232:23;5228:32;5225:119;;;5263:79;;:::i;:::-;5225:119;5383:1;5408:53;5453:7;5444:6;5433:9;5429:22;5408:53;:::i;:::-;5398:63;;5354:117;5510:2;5536:53;5581:7;5572:6;5561:9;5557:22;5536:53;:::i;:::-;5526:63;;5481:118;5638:2;5664:53;5709:7;5700:6;5689:9;5685:22;5664:53;:::i;:::-;5654:63;;5609:118;5115:619;;;;;:::o;5740:943::-;5835:6;5843;5851;5859;5908:3;5896:9;5887:7;5883:23;5879:33;5876:120;;;5915:79;;:::i;:::-;5876:120;6035:1;6060:53;6105:7;6096:6;6085:9;6081:22;6060:53;:::i;:::-;6050:63;;6006:117;6162:2;6188:53;6233:7;6224:6;6213:9;6209:22;6188:53;:::i;:::-;6178:63;;6133:118;6290:2;6316:53;6361:7;6352:6;6341:9;6337:22;6316:53;:::i;:::-;6306:63;;6261:118;6446:2;6435:9;6431:18;6418:32;6477:18;6469:6;6466:30;6463:117;;;6499:79;;:::i;:::-;6463:117;6604:62;6658:7;6649:6;6638:9;6634:22;6604:62;:::i;:::-;6594:72;;6389:287;5740:943;;;;;;;:::o;6689:468::-;6754:6;6762;6811:2;6799:9;6790:7;6786:23;6782:32;6779:119;;;6817:79;;:::i;:::-;6779:119;6937:1;6962:53;7007:7;6998:6;6987:9;6983:22;6962:53;:::i;:::-;6952:63;;6908:117;7064:2;7090:50;7132:7;7123:6;7112:9;7108:22;7090:50;:::i;:::-;7080:60;;7035:115;6689:468;;;;;:::o;7163:474::-;7231:6;7239;7288:2;7276:9;7267:7;7263:23;7259:32;7256:119;;;7294:79;;:::i;:::-;7256:119;7414:1;7439:53;7484:7;7475:6;7464:9;7460:22;7439:53;:::i;:::-;7429:63;;7385:117;7541:2;7567:53;7612:7;7603:6;7592:9;7588:22;7567:53;:::i;:::-;7557:63;;7512:118;7163:474;;;;;:::o;7643:619::-;7720:6;7728;7736;7785:2;7773:9;7764:7;7760:23;7756:32;7753:119;;;7791:79;;:::i;:::-;7753:119;7911:1;7936:53;7981:7;7972:6;7961:9;7957:22;7936:53;:::i;:::-;7926:63;;7882:117;8038:2;8064:53;8109:7;8100:6;8089:9;8085:22;8064:53;:::i;:::-;8054:63;;8009:118;8166:2;8192:53;8237:7;8228:6;8217:9;8213:22;8192:53;:::i;:::-;8182:63;;8137:118;7643:619;;;;;:::o;8268:559::-;8354:6;8362;8411:2;8399:9;8390:7;8386:23;8382:32;8379:119;;;8417:79;;:::i;:::-;8379:119;8565:1;8554:9;8550:17;8537:31;8595:18;8587:6;8584:30;8581:117;;;8617:79;;:::i;:::-;8581:117;8730:80;8802:7;8793:6;8782:9;8778:22;8730:80;:::i;:::-;8712:98;;;;8508:312;8268:559;;;;;:::o;8833:329::-;8892:6;8941:2;8929:9;8920:7;8916:23;8912:32;8909:119;;;8947:79;;:::i;:::-;8909:119;9067:1;9092:53;9137:7;9128:6;9117:9;9113:22;9092:53;:::i;:::-;9082:63;;9038:117;8833:329;;;;:::o;9168:327::-;9226:6;9275:2;9263:9;9254:7;9250:23;9246:32;9243:119;;;9281:79;;:::i;:::-;9243:119;9401:1;9426:52;9470:7;9461:6;9450:9;9446:22;9426:52;:::i;:::-;9416:62;;9372:116;9168:327;;;;:::o;9501:349::-;9570:6;9619:2;9607:9;9598:7;9594:23;9590:32;9587:119;;;9625:79;;:::i;:::-;9587:119;9745:1;9770:63;9825:7;9816:6;9805:9;9801:22;9770:63;:::i;:::-;9760:73;;9716:127;9501:349;;;;:::o;9856:509::-;9925:6;9974:2;9962:9;9953:7;9949:23;9945:32;9942:119;;;9980:79;;:::i;:::-;9942:119;10128:1;10117:9;10113:17;10100:31;10158:18;10150:6;10147:30;10144:117;;;10180:79;;:::i;:::-;10144:117;10285:63;10340:7;10331:6;10320:9;10316:22;10285:63;:::i;:::-;10275:73;;10071:287;9856:509;;;;:::o;10371:329::-;10430:6;10479:2;10467:9;10458:7;10454:23;10450:32;10447:119;;;10485:79;;:::i;:::-;10447:119;10605:1;10630:53;10675:7;10666:6;10655:9;10651:22;10630:53;:::i;:::-;10620:63;;10576:117;10371:329;;;;:::o;10706:351::-;10776:6;10825:2;10813:9;10804:7;10800:23;10796:32;10793:119;;;10831:79;;:::i;:::-;10793:119;10951:1;10976:64;11032:7;11023:6;11012:9;11008:22;10976:64;:::i;:::-;10966:74;;10922:128;10706:351;;;;:::o;11063:684::-;11156:6;11164;11213:2;11201:9;11192:7;11188:23;11184:32;11181:119;;;11219:79;;:::i;:::-;11181:119;11339:1;11364:53;11409:7;11400:6;11389:9;11385:22;11364:53;:::i;:::-;11354:63;;11310:117;11494:2;11483:9;11479:18;11466:32;11525:18;11517:6;11514:30;11511:117;;;11547:79;;:::i;:::-;11511:117;11652:78;11722:7;11713:6;11702:9;11698:22;11652:78;:::i;:::-;11642:88;;11437:303;11063:684;;;;;:::o;11753:303::-;11884:10;11905:108;12009:3;12001:6;11905:108;:::i;:::-;12045:4;12040:3;12036:14;12022:28;;11753:303;;;;:::o;12062:179::-;12131:10;12152:46;12194:3;12186:6;12152:46;:::i;:::-;12230:4;12225:3;12221:14;12207:28;;12062:179;;;;:::o;12247:108::-;12324:24;12342:5;12324:24;:::i;:::-;12319:3;12312:37;12247:108;;:::o;12361:118::-;12448:24;12466:5;12448:24;:::i;:::-;12443:3;12436:37;12361:118;;:::o;12485:157::-;12590:45;12610:24;12628:5;12610:24;:::i;:::-;12590:45;:::i;:::-;12585:3;12578:58;12485:157;;:::o;12724:980::-;12905:3;12934:85;13013:5;12934:85;:::i;:::-;13035:117;13145:6;13140:3;13035:117;:::i;:::-;13028:124;;13176:87;13257:5;13176:87;:::i;:::-;13286:7;13317:1;13302:377;13327:6;13324:1;13321:13;13302:377;;;13403:6;13397:13;13430:125;13551:3;13536:13;13430:125;:::i;:::-;13423:132;;13578:91;13662:6;13578:91;:::i;:::-;13568:101;;13362:317;13349:1;13346;13342:9;13337:14;;13302:377;;;13306:14;13695:3;13688:10;;12910:794;;;12724:980;;;;:::o;13740:732::-;13859:3;13888:54;13936:5;13888:54;:::i;:::-;13958:86;14037:6;14032:3;13958:86;:::i;:::-;13951:93;;14068:56;14118:5;14068:56;:::i;:::-;14147:7;14178:1;14163:284;14188:6;14185:1;14182:13;14163:284;;;14264:6;14258:13;14291:63;14350:3;14335:13;14291:63;:::i;:::-;14284:70;;14377:60;14430:6;14377:60;:::i;:::-;14367:70;;14223:224;14210:1;14207;14203:9;14198:14;;14163:284;;;14167:14;14463:3;14456:10;;13864:608;;;13740:732;;;;:::o;14478:99::-;14549:21;14564:5;14549:21;:::i;:::-;14544:3;14537:34;14478:99;;:::o;14583:109::-;14664:21;14679:5;14664:21;:::i;:::-;14659:3;14652:34;14583:109;;:::o;14698:360::-;14784:3;14812:38;14844:5;14812:38;:::i;:::-;14866:70;14929:6;14924:3;14866:70;:::i;:::-;14859:77;;14945:52;14990:6;14985:3;14978:4;14971:5;14967:16;14945:52;:::i;:::-;15022:29;15044:6;15022:29;:::i;:::-;15017:3;15013:39;15006:46;;14788:270;14698:360;;;;:::o;15064:364::-;15152:3;15180:39;15213:5;15180:39;:::i;:::-;15235:71;15299:6;15294:3;15235:71;:::i;:::-;15228:78;;15315:52;15360:6;15355:3;15348:4;15341:5;15337:16;15315:52;:::i;:::-;15392:29;15414:6;15392:29;:::i;:::-;15387:3;15383:39;15376:46;;15156:272;15064:364;;;;:::o;15434:366::-;15576:3;15597:67;15661:2;15656:3;15597:67;:::i;:::-;15590:74;;15673:93;15762:3;15673:93;:::i;:::-;15791:2;15786:3;15782:12;15775:19;;15434:366;;;:::o;15806:::-;15948:3;15969:67;16033:2;16028:3;15969:67;:::i;:::-;15962:74;;16045:93;16134:3;16045:93;:::i;:::-;16163:2;16158:3;16154:12;16147:19;;15806:366;;;:::o;16178:::-;16320:3;16341:67;16405:2;16400:3;16341:67;:::i;:::-;16334:74;;16417:93;16506:3;16417:93;:::i;:::-;16535:2;16530:3;16526:12;16519:19;;16178:366;;;:::o;16550:::-;16692:3;16713:67;16777:2;16772:3;16713:67;:::i;:::-;16706:74;;16789:93;16878:3;16789:93;:::i;:::-;16907:2;16902:3;16898:12;16891:19;;16550:366;;;:::o;16922:::-;17064:3;17085:67;17149:2;17144:3;17085:67;:::i;:::-;17078:74;;17161:93;17250:3;17161:93;:::i;:::-;17279:2;17274:3;17270:12;17263:19;;16922:366;;;:::o;17294:::-;17436:3;17457:67;17521:2;17516:3;17457:67;:::i;:::-;17450:74;;17533:93;17622:3;17533:93;:::i;:::-;17651:2;17646:3;17642:12;17635:19;;17294:366;;;:::o;17666:::-;17808:3;17829:67;17893:2;17888:3;17829:67;:::i;:::-;17822:74;;17905:93;17994:3;17905:93;:::i;:::-;18023:2;18018:3;18014:12;18007:19;;17666:366;;;:::o;18038:::-;18180:3;18201:67;18265:2;18260:3;18201:67;:::i;:::-;18194:74;;18277:93;18366:3;18277:93;:::i;:::-;18395:2;18390:3;18386:12;18379:19;;18038:366;;;:::o;18410:::-;18552:3;18573:67;18637:2;18632:3;18573:67;:::i;:::-;18566:74;;18649:93;18738:3;18649:93;:::i;:::-;18767:2;18762:3;18758:12;18751:19;;18410:366;;;:::o;18782:::-;18924:3;18945:67;19009:2;19004:3;18945:67;:::i;:::-;18938:74;;19021:93;19110:3;19021:93;:::i;:::-;19139:2;19134:3;19130:12;19123:19;;18782:366;;;:::o;19154:::-;19296:3;19317:67;19381:2;19376:3;19317:67;:::i;:::-;19310:74;;19393:93;19482:3;19393:93;:::i;:::-;19511:2;19506:3;19502:12;19495:19;;19154:366;;;:::o;19526:::-;19668:3;19689:67;19753:2;19748:3;19689:67;:::i;:::-;19682:74;;19765:93;19854:3;19765:93;:::i;:::-;19883:2;19878:3;19874:12;19867:19;;19526:366;;;:::o;19898:::-;20040:3;20061:67;20125:2;20120:3;20061:67;:::i;:::-;20054:74;;20137:93;20226:3;20137:93;:::i;:::-;20255:2;20250:3;20246:12;20239:19;;19898:366;;;:::o;20342:864::-;20491:4;20486:3;20482:14;20578:4;20571:5;20567:16;20561:23;20597:63;20654:4;20649:3;20645:14;20631:12;20597:63;:::i;:::-;20506:164;20762:4;20755:5;20751:16;20745:23;20781:61;20836:4;20831:3;20827:14;20813:12;20781:61;:::i;:::-;20680:172;20936:4;20929:5;20925:16;20919:23;20955:57;21006:4;21001:3;20997:14;20983:12;20955:57;:::i;:::-;20862:160;21109:4;21102:5;21098:16;21092:23;21128:61;21183:4;21178:3;21174:14;21160:12;21128:61;:::i;:::-;21032:167;20460:746;20342:864;;:::o;21284:874::-;21443:4;21438:3;21434:14;21530:4;21523:5;21519:16;21513:23;21549:63;21606:4;21601:3;21597:14;21583:12;21549:63;:::i;:::-;21458:164;21714:4;21707:5;21703:16;21697:23;21733:61;21788:4;21783:3;21779:14;21765:12;21733:61;:::i;:::-;21632:172;21888:4;21881:5;21877:16;21871:23;21907:57;21958:4;21953:3;21949:14;21935:12;21907:57;:::i;:::-;21814:160;22061:4;22054:5;22050:16;22044:23;22080:61;22135:4;22130:3;22126:14;22112:12;22080:61;:::i;:::-;21984:167;21412:746;21284:874;;:::o;22164:105::-;22239:23;22256:5;22239:23;:::i;:::-;22234:3;22227:36;22164:105;;:::o;22275:108::-;22352:24;22370:5;22352:24;:::i;:::-;22347:3;22340:37;22275:108;;:::o;22389:118::-;22476:24;22494:5;22476:24;:::i;:::-;22471:3;22464:37;22389:118;;:::o;22513:105::-;22588:23;22605:5;22588:23;:::i;:::-;22583:3;22576:36;22513:105;;:::o;22624:256::-;22736:3;22751:75;22822:3;22813:6;22751:75;:::i;:::-;22851:2;22846:3;22842:12;22835:19;;22871:3;22864:10;;22624:256;;;;:::o;22886:222::-;22979:4;23017:2;23006:9;23002:18;22994:26;;23030:71;23098:1;23087:9;23083:17;23074:6;23030:71;:::i;:::-;22886:222;;;;:::o;23114:640::-;23309:4;23347:3;23336:9;23332:19;23324:27;;23361:71;23429:1;23418:9;23414:17;23405:6;23361:71;:::i;:::-;23442:72;23510:2;23499:9;23495:18;23486:6;23442:72;:::i;:::-;23524;23592:2;23581:9;23577:18;23568:6;23524:72;:::i;:::-;23643:9;23637:4;23633:20;23628:2;23617:9;23613:18;23606:48;23671:76;23742:4;23733:6;23671:76;:::i;:::-;23663:84;;23114:640;;;;;;;:::o;23760:497::-;23965:4;24003:2;23992:9;23988:18;23980:26;;24052:9;24046:4;24042:20;24038:1;24027:9;24023:17;24016:47;24080:170;24245:4;24236:6;24080:170;:::i;:::-;24072:178;;23760:497;;;;:::o;24263:373::-;24406:4;24444:2;24433:9;24429:18;24421:26;;24493:9;24487:4;24483:20;24479:1;24468:9;24464:17;24457:47;24521:108;24624:4;24615:6;24521:108;:::i;:::-;24513:116;;24263:373;;;;:::o;24642:210::-;24729:4;24767:2;24756:9;24752:18;24744:26;;24780:65;24842:1;24831:9;24827:17;24818:6;24780:65;:::i;:::-;24642:210;;;;:::o;24858:313::-;24971:4;25009:2;24998:9;24994:18;24986:26;;25058:9;25052:4;25048:20;25044:1;25033:9;25029:17;25022:47;25086:78;25159:4;25150:6;25086:78;:::i;:::-;25078:86;;24858:313;;;;:::o;25177:419::-;25343:4;25381:2;25370:9;25366:18;25358:26;;25430:9;25424:4;25420:20;25416:1;25405:9;25401:17;25394:47;25458:131;25584:4;25458:131;:::i;:::-;25450:139;;25177:419;;;:::o;25602:::-;25768:4;25806:2;25795:9;25791:18;25783:26;;25855:9;25849:4;25845:20;25841:1;25830:9;25826:17;25819:47;25883:131;26009:4;25883:131;:::i;:::-;25875:139;;25602:419;;;:::o;26027:::-;26193:4;26231:2;26220:9;26216:18;26208:26;;26280:9;26274:4;26270:20;26266:1;26255:9;26251:17;26244:47;26308:131;26434:4;26308:131;:::i;:::-;26300:139;;26027:419;;;:::o;26452:::-;26618:4;26656:2;26645:9;26641:18;26633:26;;26705:9;26699:4;26695:20;26691:1;26680:9;26676:17;26669:47;26733:131;26859:4;26733:131;:::i;:::-;26725:139;;26452:419;;;:::o;26877:::-;27043:4;27081:2;27070:9;27066:18;27058:26;;27130:9;27124:4;27120:20;27116:1;27105:9;27101:17;27094:47;27158:131;27284:4;27158:131;:::i;:::-;27150:139;;26877:419;;;:::o;27302:::-;27468:4;27506:2;27495:9;27491:18;27483:26;;27555:9;27549:4;27545:20;27541:1;27530:9;27526:17;27519:47;27583:131;27709:4;27583:131;:::i;:::-;27575:139;;27302:419;;;:::o;27727:::-;27893:4;27931:2;27920:9;27916:18;27908:26;;27980:9;27974:4;27970:20;27966:1;27955:9;27951:17;27944:47;28008:131;28134:4;28008:131;:::i;:::-;28000:139;;27727:419;;;:::o;28152:::-;28318:4;28356:2;28345:9;28341:18;28333:26;;28405:9;28399:4;28395:20;28391:1;28380:9;28376:17;28369:47;28433:131;28559:4;28433:131;:::i;:::-;28425:139;;28152:419;;;:::o;28577:::-;28743:4;28781:2;28770:9;28766:18;28758:26;;28830:9;28824:4;28820:20;28816:1;28805:9;28801:17;28794:47;28858:131;28984:4;28858:131;:::i;:::-;28850:139;;28577:419;;;:::o;29002:::-;29168:4;29206:2;29195:9;29191:18;29183:26;;29255:9;29249:4;29245:20;29241:1;29230:9;29226:17;29219:47;29283:131;29409:4;29283:131;:::i;:::-;29275:139;;29002:419;;;:::o;29427:::-;29593:4;29631:2;29620:9;29616:18;29608:26;;29680:9;29674:4;29670:20;29666:1;29655:9;29651:17;29644:47;29708:131;29834:4;29708:131;:::i;:::-;29700:139;;29427:419;;;:::o;29852:::-;30018:4;30056:2;30045:9;30041:18;30033:26;;30105:9;30099:4;30095:20;30091:1;30080:9;30076:17;30069:47;30133:131;30259:4;30133:131;:::i;:::-;30125:139;;29852:419;;;:::o;30277:::-;30443:4;30481:2;30470:9;30466:18;30458:26;;30530:9;30524:4;30520:20;30516:1;30505:9;30501:17;30494:47;30558:131;30684:4;30558:131;:::i;:::-;30550:139;;30277:419;;;:::o;30702:347::-;30857:4;30895:3;30884:9;30880:19;30872:27;;30909:133;31039:1;31028:9;31024:17;31015:6;30909:133;:::i;:::-;30702:347;;;;:::o;31055:222::-;31148:4;31186:2;31175:9;31171:18;31163:26;;31199:71;31267:1;31256:9;31252:17;31243:6;31199:71;:::i;:::-;31055:222;;;;:::o;31283:129::-;31317:6;31344:20;;:::i;:::-;31334:30;;31373:33;31401:4;31393:6;31373:33;:::i;:::-;31283:129;;;:::o;31418:75::-;31451:6;31484:2;31478:9;31468:19;;31418:75;:::o;31499:311::-;31576:4;31666:18;31658:6;31655:30;31652:56;;;31688:18;;:::i;:::-;31652:56;31738:4;31730:6;31726:17;31718:25;;31798:4;31792;31788:15;31780:23;;31499:311;;;:::o;31816:307::-;31877:4;31967:18;31959:6;31956:30;31953:56;;;31989:18;;:::i;:::-;31953:56;32027:29;32049:6;32027:29;:::i;:::-;32019:37;;32111:4;32105;32101:15;32093:23;;31816:307;;;:::o;32129:308::-;32191:4;32281:18;32273:6;32270:30;32267:56;;;32303:18;;:::i;:::-;32267:56;32341:29;32363:6;32341:29;:::i;:::-;32333:37;;32425:4;32419;32415:15;32407:23;;32129:308;;;:::o;32443:163::-;32541:4;32564:3;32556:11;;32594:4;32589:3;32585:14;32577:22;;32443:163;;;:::o;32612:132::-;32679:4;32702:3;32694:11;;32732:4;32727:3;32723:14;32715:22;;32612:132;;;:::o;32750:145::-;32848:6;32882:5;32876:12;32866:22;;32750:145;;;:::o;32901:114::-;32968:6;33002:5;32996:12;32986:22;;32901:114;;;:::o;33021:98::-;33072:6;33106:5;33100:12;33090:22;;33021:98;;;:::o;33125:99::-;33177:6;33211:5;33205:12;33195:22;;33125:99;;;:::o;33230:144::-;33331:4;33363;33358:3;33354:14;33346:22;;33230:144;;;:::o;33380:113::-;33450:4;33482;33477:3;33473:14;33465:22;;33380:113;;;:::o;33499:215::-;33629:11;33663:6;33658:3;33651:19;33703:4;33698:3;33694:14;33679:29;;33499:215;;;;:::o;33720:184::-;33819:11;33853:6;33848:3;33841:19;33893:4;33888:3;33884:14;33869:29;;33720:184;;;;:::o;33910:168::-;33993:11;34027:6;34022:3;34015:19;34067:4;34062:3;34058:14;34043:29;;33910:168;;;;:::o;34084:169::-;34168:11;34202:6;34197:3;34190:19;34242:4;34237:3;34233:14;34218:29;;34084:169;;;;:::o;34259:305::-;34299:3;34318:20;34336:1;34318:20;:::i;:::-;34313:25;;34352:20;34370:1;34352:20;:::i;:::-;34347:25;;34506:1;34438:66;34434:74;34431:1;34428:81;34425:107;;;34512:18;;:::i;:::-;34425:107;34556:1;34553;34549:9;34542:16;;34259:305;;;;:::o;34570:348::-;34610:7;34633:20;34651:1;34633:20;:::i;:::-;34628:25;;34667:20;34685:1;34667:20;:::i;:::-;34662:25;;34855:1;34787:66;34783:74;34780:1;34777:81;34772:1;34765:9;34758:17;34754:105;34751:131;;;34862:18;;:::i;:::-;34751:131;34910:1;34907;34903:9;34892:20;;34570:348;;;;:::o;34924:191::-;34964:4;34984:20;35002:1;34984:20;:::i;:::-;34979:25;;35018:20;35036:1;35018:20;:::i;:::-;35013:25;;35057:1;35054;35051:8;35048:34;;;35062:18;;:::i;:::-;35048:34;35107:1;35104;35100:9;35092:17;;34924:191;;;;:::o;35121:96::-;35158:7;35187:24;35205:5;35187:24;:::i;:::-;35176:35;;35121:96;;;:::o;35223:90::-;35257:7;35300:5;35293:13;35286:21;35275:32;;35223:90;;;:::o;35319:77::-;35356:7;35385:5;35374:16;;35319:77;;;:::o;35402:149::-;35438:7;35478:66;35471:5;35467:78;35456:89;;35402:149;;;:::o;35557:126::-;35594:7;35634:42;35627:5;35623:54;35612:65;;35557:126;;;:::o;35689:91::-;35725:7;35765:8;35758:5;35754:20;35743:31;;35689:91;;;:::o;35786:77::-;35823:7;35852:5;35841:16;;35786:77;;;:::o;35869:101::-;35905:7;35945:18;35938:5;35934:30;35923:41;;35869:101;;;:::o;35976:154::-;36060:6;36055:3;36050;36037:30;36122:1;36113:6;36108:3;36104:16;36097:27;35976:154;;;:::o;36136:307::-;36204:1;36214:113;36228:6;36225:1;36222:13;36214:113;;;36313:1;36308:3;36304:11;36298:18;36294:1;36289:3;36285:11;36278:39;36250:2;36247:1;36243:10;36238:15;;36214:113;;;36345:6;36342:1;36339:13;36336:101;;;36425:1;36416:6;36411:3;36407:16;36400:27;36336:101;36185:258;36136:307;;;:::o;36449:320::-;36493:6;36530:1;36524:4;36520:12;36510:22;;36577:1;36571:4;36567:12;36598:18;36588:81;;36654:4;36646:6;36642:17;36632:27;;36588:81;36716:2;36708:6;36705:14;36685:18;36682:38;36679:84;;;36735:18;;:::i;:::-;36679:84;36500:269;36449:320;;;:::o;36775:281::-;36858:27;36880:4;36858:27;:::i;:::-;36850:6;36846:40;36988:6;36976:10;36973:22;36952:18;36940:10;36937:34;36934:62;36931:88;;;36999:18;;:::i;:::-;36931:88;37039:10;37035:2;37028:22;36818:238;36775:281;;:::o;37062:233::-;37101:3;37124:24;37142:5;37124:24;:::i;:::-;37115:33;;37170:66;37163:5;37160:77;37157:103;;;37240:18;;:::i;:::-;37157:103;37287:1;37280:5;37276:13;37269:20;;37062:233;;;:::o;37301:100::-;37340:7;37369:26;37389:5;37369:26;:::i;:::-;37358:37;;37301:100;;;:::o;37407:94::-;37446:7;37475:20;37489:5;37475:20;:::i;:::-;37464:31;;37407:94;;;:::o;37507:180::-;37555:77;37552:1;37545:88;37652:4;37649:1;37642:15;37676:4;37673:1;37666:15;37693:180;37741:77;37738:1;37731:88;37838:4;37835:1;37828:15;37862:4;37859:1;37852:15;37879:180;37927:77;37924:1;37917:88;38024:4;38021:1;38014:15;38048:4;38045:1;38038:15;38065:180;38113:77;38110:1;38103:88;38210:4;38207:1;38200:15;38234:4;38231:1;38224:15;38251:117;38360:1;38357;38350:12;38374:117;38483:1;38480;38473:12;38497:117;38606:1;38603;38596:12;38620:117;38729:1;38726;38719:12;38743:117;38852:1;38849;38842:12;38866:117;38975:1;38972;38965:12;38989:102;39030:6;39081:2;39077:7;39072:2;39065:5;39061:14;39057:28;39047:38;;38989:102;;;:::o;39097:94::-;39130:8;39178:5;39174:2;39170:14;39149:35;;39097:94;;;:::o;39197:225::-;39337:34;39333:1;39325:6;39321:14;39314:58;39406:8;39401:2;39393:6;39389:15;39382:33;39197:225;:::o;39428:173::-;39568:25;39564:1;39556:6;39552:14;39545:49;39428:173;:::o;39607:178::-;39747:30;39743:1;39735:6;39731:14;39724:54;39607:178;:::o;39791:171::-;39931:23;39927:1;39919:6;39915:14;39908:47;39791:171;:::o;39968:176::-;40108:28;40104:1;40096:6;40092:14;40085:52;39968:176;:::o;40150:172::-;40290:24;40286:1;40278:6;40274:14;40267:48;40150:172;:::o;40328:171::-;40468:23;40464:1;40456:6;40452:14;40445:47;40328:171;:::o;40505:173::-;40645:25;40641:1;40633:6;40629:14;40622:49;40505:173;:::o;40684:182::-;40824:34;40820:1;40812:6;40808:14;40801:58;40684:182;:::o;40872:234::-;41012:34;41008:1;41000:6;40996:14;40989:58;41081:17;41076:2;41068:6;41064:15;41057:42;40872:234;:::o;41112:174::-;41252:26;41248:1;41240:6;41236:14;41229:50;41112:174;:::o;41292:220::-;41432:34;41428:1;41420:6;41416:14;41409:58;41501:3;41496:2;41488:6;41484:15;41477:28;41292:220;:::o;41518:181::-;41658:33;41654:1;41646:6;41642:14;41635:57;41518:181;:::o;41705:122::-;41778:24;41796:5;41778:24;:::i;:::-;41771:5;41768:35;41758:63;;41817:1;41814;41807:12;41758:63;41705:122;:::o;41833:116::-;41903:21;41918:5;41903:21;:::i;:::-;41896:5;41893:32;41883:60;;41939:1;41936;41929:12;41883:60;41833:116;:::o;41955:122::-;42028:24;42046:5;42028:24;:::i;:::-;42021:5;42018:35;42008:63;;42067:1;42064;42057:12;42008:63;41955:122;:::o;42083:120::-;42155:23;42172:5;42155:23;:::i;:::-;42148:5;42145:34;42135:62;;42193:1;42190;42183:12;42135:62;42083:120;:::o;42209:122::-;42282:24;42300:5;42282:24;:::i;:::-;42275:5;42272:35;42262:63;;42321:1;42318;42311:12;42262:63;42209:122;:::o

Swarm Source

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