ETH Price: $3,398.40 (-2.15%)
Gas: 6 Gwei

Token

NftColorPremium (NCP)
 

Overview

Max Total Supply

1,400 NCP

Holders

431

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
7 NCP
0x345c1cc3a57c44bbb16ff08249ef74b944c37ae0
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:
NftColorPremium

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-30
*/

//SPDX-License-Identifier: MIT


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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

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

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

// File: contracts/MerkleProof.sol

pragma solidity ^0.8.7;


abstract contract MerkleProof {
    bytes32 internal _vipMerkleRoot;
    bytes32 internal _wlMerkleRoot;

    function _setWlMerkleRoot(bytes32 merkleRoot_) internal virtual {
        _wlMerkleRoot = merkleRoot_;
    }

    function isWhitelisted(address address_, bytes32[] memory proof_) public view returns (bool) {
        bytes32 _leaf = keccak256(abi.encodePacked(address_));
        for (uint256 i = 0; i < proof_.length; i++) {
            _leaf = _leaf < proof_[i] ? keccak256(abi.encodePacked(_leaf, proof_[i])) : keccak256(abi.encodePacked(proof_[i], _leaf));
        }
        return _leaf == _wlMerkleRoot;
    }
}
// File: @openzeppelin/contracts/utils/Base64.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides a set of functions to operate with Base64 strings.
 *
 * _Available since v4.5._
 */
library Base64 {
    /**
     * @dev Base64 Encoding/Decoding Table
     */
    string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /**
     * @dev Converts a `bytes` to its Bytes64 `string` representation.
     */
    function encode(bytes memory data) internal pure returns (string memory) {
        /**
         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
         */
        if (data.length == 0) return "";

        // Loads the table into memory
        string memory table = _TABLE;

        // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
        // and split into 4 numbers of 6 bits.
        // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
        // - `data.length + 2`  -> Round up
        // - `/ 3`              -> Number of 3-bytes chunks
        // - `4 *`              -> 4 characters for each chunk
        string memory result = new string(4 * ((data.length + 2) / 3));

        /// @solidity memory-safe-assembly
        assembly {
            // Prepare the lookup table (skip the first "length" byte)
            let tablePtr := add(table, 1)

            // Prepare result pointer, jump over length
            let resultPtr := add(result, 32)

            // Run over the input, 3 bytes at a time
            for {
                let dataPtr := data
                let endPtr := add(data, mload(data))
            } lt(dataPtr, endPtr) {

            } {
                // Advance 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // To write each character, shift the 3 bytes (18 bits) chunk
                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
                // and apply logical AND with 0x3F which is the number of
                // the previous character in the ASCII table prior to the Base64 Table
                // The result is then added to the table to get the character to write,
                // and finally write it in the result pointer but with a left shift
                // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits

                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance
            }

            // When data `bytes` is not exactly 3 bytes long
            // it is padded with `=` characters at the end
            switch mod(mload(data), 3)
            case 1 {
                mstore8(sub(resultPtr, 1), 0x3d)
                mstore8(sub(resultPtr, 2), 0x3d)
            }
            case 2 {
                mstore8(sub(resultPtr, 1), 0x3d)
            }
        }

        return result;
    }
}

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

// File: contracts/erc721a/IERC721A.sol


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: @openzeppelin/contracts/token/common/ERC2981.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

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


// OpenZeppelin Contracts v4.4.1 (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() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

        // 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: contracts/erc721a/ERC721A.sol


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;







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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSender()) revert ApproveToCaller();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

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

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

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

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

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

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

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

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

// 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: contracts/NCP.sol

pragma solidity ^0.8.7;

/*
╭━╮╱╭┳━━━┳━━━━┳━━━┳━━━┳╮╱╱╭━━━┳━━━╮
┃┃╰╮┃┃╭━━┫╭╮╭╮┃╭━╮┃╭━╮┃┃╱╱┃╭━╮┃╭━╮┃
┃╭╮╰╯┃╰━━╋╯┃┃╰┫┃╱╰┫┃╱┃┃┃╱╱┃┃╱┃┃╰━╯┃
┃┃╰╮┃┃╭━━╯╱┃┃╱┃┃╱╭┫┃╱┃┃┃╱╭┫┃╱┃┃╭╮╭╯
┃┃╱┃┃┃┃╱╱╱╱┃┃╱┃╰━╯┃╰━╯┃╰━╯┃╰━╯┃┃┃╰╮
╰╯╱╰━┻╯╱╱╱╱╰╯╱╰━━━┻━━━┻━━━┻━━━┻╯╰━╯
*/
//CODE BY FRICKLIK
//NftColorPremium
contract NftColorPremium is Ownable, ERC721A, ReentrancyGuard, MerkleProof, ERC2981{

  //Project Settings
  uint256 public wlMintPrice = 0.01 ether;
  uint256 public psMintPrice = 0.0111 ether;
  uint256 public maxMintsPerWL = 5;
  uint256 public maxMintsPerPS = 5;
  uint256 public maxSupply = 1400;
  address payable internal _withdrawWallet;
  //URI
  string internal _revealUri;
  string public _baseExtension = ".jpg";
  string internal _baseTokenURI;
  string internal _prefName = "NftColorPremium #";
  string internal _description = "NftColorPremium Collection";
  uint256 internal _types = 7;
  //flags
  bool public isWlSaleEnabled;
  bool public isPublicSaleEnabled;
  bool internal _isRevealed;
  bool internal _jsonUri = false;
  //mint records.
  mapping(address => uint256) internal _wlMinted;
  mapping(address => uint256) internal _psMinted;
  mapping(uint256=>string) internal _traitNames;
  mapping(uint256=>string[10]) internal _traitValues;

  constructor (
  ) ERC721A ("NftColorPremium","NCP") {
  }
  //start from 1.djust for bueno.
  function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
  }
  //set Default Royalty._feeNumerator 500 = 5% Royalty
  function setDefaultRoyalty(address _receiver, uint96 _feeNumerator) external virtual onlyOwner {
      _setDefaultRoyalty(_receiver, _feeNumerator);
  }
  //for ERC2981
  function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, ERC2981) returns (bool) {
    return super.supportsInterface(interfaceId);
  }
  //for ERC2981 Opensea
  function contractURI() external view virtual returns (string memory) {
        return _formatContractURI();
  }
  //make contractURI
  function _formatContractURI() internal view returns (string memory) {
    (address receiver, uint256 royaltyFraction) = royaltyInfo(0,_feeDenominator());//tokenid=0
    return string(
      abi.encodePacked(
        "data:application/json;base64,",
        Base64.encode(
          bytes(
            abi.encodePacked(
                '{"seller_fee_basis_points":', Strings.toString(royaltyFraction),
                ', "fee_recipient":"', Strings.toHexString(uint256(uint160(receiver)), 20), '"}'
            )
          )
        )
      )
    );
  }
  //set owner's wallet.withdraw to this wallet.only owner.
  function setWithdrawWallet(address _owner) external virtual onlyOwner {
    _withdrawWallet = payable(_owner);
  }

  //set maxSupply.only owner.
  function setMaxSupply(uint256 _maxSupply) external virtual onlyOwner {
    require(totalSupply() <= _maxSupply, "Lower than _currentIndex.");
    maxSupply = _maxSupply;
  }

  // SET PRICES.
  function setWlPrice(uint256 newPrice) external virtual onlyOwner {
    wlMintPrice = newPrice;
  }
  function setPsPrice(uint256 newPrice) external virtual onlyOwner {
    psMintPrice = newPrice;
  }

  //set reveal.only owner.
  function setReveal(bool bool_) external virtual onlyOwner {
    _isRevealed = bool_;
  }
  //retuen _isRevealed.
  function isRevealed() external view virtual returns (bool){
    return _isRevealed;
  }

  // GET MINTED COUNT.
  function wlMinted(address _address) external view virtual returns (uint256){
    return _wlMinted[_address];
  }
  function psMinted(address _address) external view virtual returns (uint256){
    return _psMinted[_address];
  }

  // SET MAX MINTS.
  function setWlMaxMints(uint256 _max) external virtual onlyOwner {
    maxMintsPerWL = _max;
  }
  function setPsMaxMints(uint256 _max) external virtual onlyOwner {
    maxMintsPerPS = _max;
  }

  // SET SALES ENABLE.
  function setWhitelistSaleEnable(bool bool_) external virtual onlyOwner {
    isWlSaleEnabled = bool_;
  }
  function setPublicSaleEnable(bool bool_) external virtual onlyOwner {
    isPublicSaleEnabled = bool_;
  }

  // SET MERKLE ROOT.
  function setWlMerkleRoot(bytes32 merkleRoot_) external virtual onlyOwner {
    _setWlMerkleRoot(merkleRoot_);
  }

  //set HiddenBaseURI.only owner.
  function setHiddenURI(string memory uri_) external virtual onlyOwner {
    _revealUri = uri_;
  }

  //return _currentIndex
  function getCurrentIndex() external view virtual returns (uint256){
    return _currentIndex;
  }

  //set BaseURI at after reveal. only owner.
  function setBaseURI(string memory uri_) external virtual onlyOwner {
    _baseTokenURI = uri_;
  }
  //set _traitNames at after reveal. only owner.
  function setTraitName(uint256 ite_,string memory name_) external virtual onlyOwner {
    _traitNames[ite_] = name_;
  }
  //set _traitValues at after reveal. only owner.
  function setTraitValue(uint256 traitId_,uint256 ite_,string memory name_) external virtual onlyOwner {
    _traitValues[traitId_][ite_] = name_;
  }
// _description
  //set _description. only owner.
  function setHiddenDescription(string memory description_) external virtual onlyOwner {
    _description = description_;
  }
// _prefName
  //set _prefName. only owner.
  function setHiddenName(string memory prefName_) external virtual onlyOwner {
    _prefName = prefName_;
  }

// _jsonUri
  //set _jsonUri. only owner.
  function setJsonUri(bool bool_) external virtual onlyOwner {
    _jsonUri = bool_;
  }

  function setBaseExtension(string memory _newBaseExtension) external onlyOwner
  {
    _baseExtension = _newBaseExtension;
  }

    //setTypes
  function setTypes(uint256 types_) external onlyOwner
  {
    _types = types_;
  }
  //retuen BaseURI.internal.
  function _currentBaseURI() internal view returns (string memory){
    return _baseTokenURI;
  }

  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
    require(_exists(_tokenId), "URI query for nonexistent token");
    if(_jsonUri == false) {
        return _createJson(_tokenId);
    }
    return string(abi.encodePacked(_currentBaseURI(), Strings.toString(_tokenId), _baseExtension));
  }

  function imageURI(uint256 _tokenId) public view virtual returns (string memory) {
    require(_exists(_tokenId), "URI query for nonexistent token");
    if(_isRevealed) {
        return string(abi.encodePacked(_currentBaseURI(), Strings.toString((_tokenId % _types)+1), _baseExtension));
    }
    return _revealUri;
  }


function _createJson(uint256 _tokenId) internal view returns (string memory) {
    require( _exists( _tokenId ), "nonexsitent token" );
    //create.name
    bytes memory bytesName = abi.encodePacked(
        '"name":"', _prefName, Strings.toString(_tokenId), '"'
    );

    //create.description
    bytes memory bytesDesc = abi.encodePacked(
        '"description":"', _description, '"'
    );

    //create.image
    bytes memory bytesImage = abi.encodePacked(
        '"image":"', imageURI(_tokenId), '"'
    );
    //create.attributes
    bytes memory bytesAttris = ''; 

    for(uint256 i=1; i<10; i++){
        if(bytes(_traitValues[_tokenId % _types][i]).length != bytes("").length){
            if(i > 1){
                bytesAttris = abi.encodePacked(
                    ',',bytesAttris
                );
            }
            bytesAttris = abi.encodePacked(
                bytesAttris, '{"trait_type":"', _traitNames[i], '",',
                '"value":"', _traitValues[_tokenId % _types][i], '"}'
            );
        }
    }

    //create.attributes
    bytes memory bytesAttri = abi.encodePacked(
        '"attributes":[',bytesAttris, ']'
    );

    //create.json
    bytes memory bytesObject = abi.encodePacked(
        '{',
            bytesAttri, ',',
            bytesName, ',',
            bytesDesc, ',',
            bytesImage,
        '}'
    );

    //create.base64
        bytes memory bytesMetadata = abi.encodePacked(
            'data:application/json;base64,',
            Base64.encode( bytesObject )
        );

        return( string( bytesMetadata ) );
}


  //owner mint.transfer to _address.only owner.
  function ownerMint(uint256 _amount, address _address) external virtual onlyOwner { 
    require((_amount + totalSupply()) <= (maxSupply), "No more NFTs");
    _safeMint(_address, _amount);
  }


  //WL mint.
  function whitelistMint(uint256 _amount, bytes32[] memory proof_) external payable virtual nonReentrant {
    require(isWlSaleEnabled, "whitelistMint is Paused");
    require(isWhitelisted(msg.sender, proof_), "You are not whitelisted!");
    require(maxMintsPerWL >= _amount, "whitelistMint: Over max mints per wallet");
    require(maxMintsPerWL >= _wlMinted[msg.sender] + _amount, "You have no whitelistMint left");
    require(msg.value == wlMintPrice * _amount, "ETH value is not correct");
    require((_amount + totalSupply()) <= (maxSupply), "No more NFTs");

    _wlMinted[msg.sender] += _amount;
    _safeMint(msg.sender, _amount);
  }
  
  //Public mint.
  function publicMint(uint256 _amount) external payable virtual nonReentrant {
    require(isPublicSaleEnabled, "publicMint is Paused");
    require(maxMintsPerPS >= _amount, "publicMint: Over max mints per wallet");
    require(maxMintsPerPS >= _psMinted[msg.sender] + _amount, "You have no publicMint left");
    require(msg.value == psMintPrice * _amount, "ETH value is not correct");
    require((_amount + totalSupply()) <= (maxSupply), "No more NFTs");
      
    _psMinted[msg.sender] += _amount;
    _safeMint(msg.sender, _amount);
  }

  //burn
  function burn(uint256 tokenId) external virtual {
    _burn(tokenId, true);
  }

  //widraw ETH from this contract.only owner. 
  function withdraw() external payable virtual onlyOwner nonReentrant{
    // This will payout the owner 100% of the contract balance.
    // Do not remove this otherwise you will not be able to withdraw the funds.
    // =============================================================================
    bool os;
    if(_withdrawWallet != address(0)){//if _withdrawWallet has.
      (os, ) = payable(_withdrawWallet).call{value: address(this).balance}("");
    }else{
      (os, ) = payable(owner()).call{value: address(this).balance}("");
    }
    require(os);
    // =============================================================================
  }

  //return wallet owned tokenids.
  function walletOfOwner(address _address) external view virtual returns (uint256[] memory) {
    uint256 ownerTokenCount = balanceOf(_address);
    uint256[] memory tokenIds = new uint256[](ownerTokenCount);
    //search from all tonkenid. so spend high gas values.attention.
    uint256 tokenindex = 0;
    for (uint256 i = _startTokenId(); i < _currentIndex; i++) {
      if(_address == this.tryOwnerOf(i)) tokenIds[tokenindex++] = i;
    }
    return tokenIds;
  }

  //try catch vaersion ownerOf. support burned tokenid.
  function tryOwnerOf(uint256 tokenId) external view  virtual returns (address) {
    try this.ownerOf(tokenId) returns (address _address) {
      return(_address);
    } catch {
        return (address(0));//return 0x0 if error.
    }
  }
}
//CODE.BY.FRICKLIK

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":"_baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"imageURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"isPublicSaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWlSaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_amount","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"psMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"psMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"description_","type":"string"}],"name":"setHiddenDescription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"prefName_","type":"string"}],"name":"setHiddenName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setHiddenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setJsonUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setPsMaxMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPsPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setPublicSaleEnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ite_","type":"uint256"},{"internalType":"string","name":"name_","type":"string"}],"name":"setTraitName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"traitId_","type":"uint256"},{"internalType":"uint256","name":"ite_","type":"uint256"},{"internalType":"string","name":"name_","type":"string"}],"name":"setTraitValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"types_","type":"uint256"}],"name":"setTypes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setWhitelistSaleEnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setWithdrawWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setWlMaxMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setWlMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setWlPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tryOwnerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"wlMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"wlMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

662386f26fc10000600e5566276f642501c000600f556005601081905560115561057860125560c060405260046080819052632e6a706760e01b60a09081526200004d9160159190620001de565b50604080518082019091526011808252704e6674436f6c6f725072656d69756d202360781b60209092019182526200008891601791620001de565b5060408051808201909152601a8082527f4e6674436f6c6f725072656d69756d20436f6c6c656374696f6e0000000000006020909201918252620000cf91601891620001de565b506007601955601a805463ff00000019169055348015620000ef57600080fd5b506040518060400160405280600f81526020016e4e6674436f6c6f725072656d69756d60881b8152506040518060400160405280600381526020016204e43560ec1b8152506200014e620001486200018a60201b60201c565b6200018e565b815162000163906003906020850190620001de565b50805162000179906004906020840190620001de565b5050600180805560095550620002c1565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620001ec9062000284565b90600052602060002090601f0160209004810192826200021057600085556200025b565b82601f106200022b57805160ff19168380011785556200025b565b828001600101855582156200025b579182015b828111156200025b5782518255916020019190600101906200023e565b50620002699291506200026d565b5090565b5b808211156200026957600081556001016200026e565b600181811c908216806200029957607f821691505b60208210811415620002bb57634e487b7160e01b600052602260045260246000fd5b50919050565b613a5e80620002d16000396000f3fe6080604052600436106103975760003560e01c8063719eaef8116101dc578063bafec39b11610102578063d78be71c116100a0578063e985e9c51161006f578063e985e9c514610a7e578063ee725e1014610ac7578063f2fde38b14610ae7578063f3b759c914610b0757600080fd5b8063d78be71c14610a09578063da3ef23f14610a29578063e2f21c9914610a49578063e8a3d48514610a6957600080fd5b8063c87b56dd116100dc578063c87b56dd146109a0578063d2cab056146109c0578063d52c57e0146109d3578063d5abeb01146109f357600080fd5b8063bafec39b14610940578063bbaac02f14610960578063c3faf7241461098057600080fd5b80638f742d161161017a5780639970cc29116101495780639970cc29146108ca578063a22cb465146108e0578063a355fd2914610900578063b88d4fde1461092057600080fd5b80638f742d161461083f5780639373f4321461085f578063942958f41461087f57806395d89b41146108b557600080fd5b8063830b3a64116101b6578063830b3a64146107c15780638ac1e161146107e15780638da5cb5b146108015780638dd07d0f1461081f57600080fd5b8063719eaef81461074b57806378a923801461076b578063813779ef146107a157600080fd5b80632db11544116102c157806354214f691161025f5780636352211e1161022e5780636352211e146106d65780636f8b44b0146106f657806370a0823114610716578063715018a61461073657600080fd5b806354214f691461065857806355f804b3146106765780635a23dd99146106965780635def7abb146106b657600080fd5b806342454db91161029b57806342454db9146105d557806342842e0e146105eb57806342966c681461060b578063438b63001461062b57600080fd5b80632db115441461059b5780633ccfd60b146105ae5780634009920d146105b657600080fd5b806318160ddd116103395780632672c902116103085780632672c902146105115780632a3f300c146105265780632a55205a146105465780632c4e9fc61461058557600080fd5b806318160ddd146104ac578063189f3de1146104c15780631a09cfe2146104db57806323b872dd146104f157600080fd5b8063081812fc11610375578063081812fc14610415578063095ea7b31461044d5780630d9005ae1461046d5780631558f1c11461048c57600080fd5b806301ffc9a71461039c57806304634d8d146103d157806306fdde03146103f3575b600080fd5b3480156103a857600080fd5b506103bc6103b73660046131af565b610b27565b60405190151581526020015b60405180910390f35b3480156103dd57600080fd5b506103f16103ec366004613141565b610b38565b005b3480156103ff57600080fd5b50610408610b4e565b6040516103c89190613796565b34801561042157600080fd5b50610435610430366004613196565b610be0565b6040516001600160a01b0390911681526020016103c8565b34801561045957600080fd5b506103f1610468366004613115565b610c24565b34801561047957600080fd5b506001545b6040519081526020016103c8565b34801561049857600080fd5b506103f16104a73660046132d0565b610cab565b3480156104b857600080fd5b5061047e610cee565b3480156104cd57600080fd5b50601a546103bc9060ff1681565b3480156104e757600080fd5b5061047e60115481565b3480156104fd57600080fd5b506103f161050c366004612fd1565b610cfc565b34801561051d57600080fd5b50610408610d07565b34801561053257600080fd5b506103f161054136600461317b565b610d95565b34801561055257600080fd5b506105666105613660046132ae565b610db9565b604080516001600160a01b0390931683526020830191909152016103c8565b34801561059157600080fd5b5061047e600e5481565b6103f16105a9366004613196565b610e65565b6103f1611071565b3480156105c257600080fd5b50601a546103bc90610100900460ff1681565b3480156105e157600080fd5b5061047e600f5481565b3480156105f757600080fd5b506103f1610606366004612fd1565b61117d565b34801561061757600080fd5b506103f1610626366004613196565b611198565b34801561063757600080fd5b5061064b610646366004612f5e565b6111a6565b6040516103c89190613752565b34801561066457600080fd5b50601a5462010000900460ff166103bc565b34801561068257600080fd5b506103f16106913660046131e9565b6112d9565b3480156106a257600080fd5b506103bc6106b1366004613091565b6112f4565b3480156106c257600080fd5b506103f16106d1366004613272565b611418565b3480156106e257600080fd5b506104356106f1366004613196565b61143f565b34801561070257600080fd5b506103f1610711366004613196565b611451565b34801561072257600080fd5b5061047e610731366004612f5e565b6114b5565b34801561074257600080fd5b506103f1611503565b34801561075757600080fd5b506103f1610766366004613196565b611517565b34801561077757600080fd5b5061047e610786366004612f5e565b6001600160a01b03166000908152601b602052604090205490565b3480156107ad57600080fd5b506103f16107bc366004613196565b611524565b3480156107cd57600080fd5b506104356107dc366004613196565b611531565b3480156107ed57600080fd5b506103f16107fc366004613196565b6115ac565b34801561080d57600080fd5b506000546001600160a01b0316610435565b34801561082b57600080fd5b506103f161083a366004613196565b6115bd565b34801561084b57600080fd5b5061040861085a366004613196565b6115ca565b34801561086b57600080fd5b506103f161087a366004612f5e565b611717565b34801561088b57600080fd5b5061047e61089a366004612f5e565b6001600160a01b03166000908152601c602052604090205490565b3480156108c157600080fd5b50610408611741565b3480156108d657600080fd5b5061047e60105481565b3480156108ec57600080fd5b506103f16108fb3660046130e0565b611750565b34801561090c57600080fd5b506103f161091b36600461317b565b6117e6565b34801561092c57600080fd5b506103f161093b366004613012565b611808565b34801561094c57600080fd5b506103f161095b3660046131e9565b61184c565b34801561096c57600080fd5b506103f161097b3660046131e9565b611867565b34801561098c57600080fd5b506103f161099b36600461317b565b611882565b3480156109ac57600080fd5b506104086109bb366004613196565b61189d565b6103f16109ce366004613242565b61191f565b3480156109df57600080fd5b506103f16109ee36600461321d565b611b80565b3480156109ff57600080fd5b5061047e60125481565b348015610a1557600080fd5b506103f1610a24366004613196565b611bc5565b348015610a3557600080fd5b506103f1610a443660046131e9565b611bd2565b348015610a5557600080fd5b506103f1610a6436600461317b565b611bed565b348015610a7557600080fd5b50610408611c13565b348015610a8a57600080fd5b506103bc610a99366004612f98565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b348015610ad357600080fd5b506103f1610ae23660046131e9565b611c22565b348015610af357600080fd5b506103f1610b02366004612f5e565b611c3d565b348015610b1357600080fd5b506103f1610b22366004613196565b611cb3565b6000610b3282611cc0565b92915050565b610b40611ce5565b610b4a8282611d3f565b5050565b606060038054610b5d906138db565b80601f0160208091040260200160405190810160405280929190818152602001828054610b89906138db565b8015610bd65780601f10610bab57610100808354040283529160200191610bd6565b820191906000526020600020905b815481529060010190602001808311610bb957829003601f168201915b5050505050905090565b6000610beb82611e3c565b610c08576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610c2f8261143f565b9050806001600160a01b0316836001600160a01b03161415610c645760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610c9b57610c7e8133610a99565b610c9b576040516367d9dca160e11b815260040160405180910390fd5b610ca6838383611e75565b505050565b610cb3611ce5565b6000838152601e60205260409020819083600a8110610cd457610cd4613971565b019080519060200190610ce8929190612db9565b50505050565b600254600154036000190190565b610ca6838383611ed1565b60158054610d14906138db565b80601f0160208091040260200160405190810160405280929190818152602001828054610d40906138db565b8015610d8d5780601f10610d6257610100808354040283529160200191610d8d565b820191906000526020600020905b815481529060010190602001808311610d7057829003601f168201915b505050505081565b610d9d611ce5565b601a8054911515620100000262ff000019909216919091179055565b6000828152600d602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610e2e575060408051808201909152600c546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610e4d906001600160601b031687613862565b610e57919061384e565b915196919550909350505050565b60026009541415610e915760405162461bcd60e51b8152600401610e88906137cf565b60405180910390fd5b6002600955601a54610100900460ff16610ee45760405162461bcd60e51b81526020600482015260146024820152731c1d589b1a58d35a5b9d081a5cc814185d5cd95960621b6044820152606401610e88565b806011541015610f445760405162461bcd60e51b815260206004820152602560248201527f7075626c69634d696e743a204f766572206d6178206d696e7473207065722077604482015264185b1b195d60da1b6064820152608401610e88565b336000908152601c6020526040902054610f5f908290613836565b6011541015610fb05760405162461bcd60e51b815260206004820152601b60248201527f596f752068617665206e6f207075626c69634d696e74206c65667400000000006044820152606401610e88565b80600f54610fbe9190613862565b34146110075760405162461bcd60e51b8152602060048201526018602482015277115512081d985b1d59481a5cc81b9bdd0818dbdc9c9958dd60421b6044820152606401610e88565b601254611012610cee565b61101c9083613836565b111561103a5760405162461bcd60e51b8152600401610e88906137a9565b336000908152601c602052604081208054839290611059908490613836565b90915550611069905033826120ac565b506001600955565b611079611ce5565b6002600954141561109c5760405162461bcd60e51b8152600401610e88906137cf565b60026009556013546000906001600160a01b031615611112576013546040516001600160a01b03909116904790600081818185875af1925050503d8060008114611102576040519150601f19603f3d011682016040523d82523d6000602084013e611107565b606091505b505080915050611173565b6000546001600160a01b03166001600160a01b03164760405160006040518083038185875af1925050503d8060008114611168576040519150601f19603f3d011682016040523d82523d6000602084013e61116d565b606091505b50909150505b8061106957600080fd5b610ca683838360405180602001604052806000815250611808565b6111a38160016120c6565b50565b606060006111b3836114b5565b90506000816001600160401b038111156111cf576111cf613987565b6040519080825280602002602001820160405280156111f8578160200160208202803683370190505b509050600060015b6001548110156112cf576040516320c2ce9960e21b815260048101829052309063830b3a649060240160206040518083038186803b15801561124157600080fd5b505afa158015611255573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112799190612f7b565b6001600160a01b0316866001600160a01b031614156112bd5780838361129e81613916565b9450815181106112b0576112b0613971565b6020026020010181815250505b806112c781613916565b915050611200565b5090949350505050565b6112e1611ce5565b8051610b4a906016906020840190612db9565b6040516bffffffffffffffffffffffff19606084901b166020820152600090819060340160405160208183030381529060405280519060200120905060005b835181101561140c5783818151811061134e5761134e613971565b602002602001015182106113ac5783818151811061136e5761136e613971565b602002602001015182604051602001611391929190918252602082015260400190565b604051602081830303815290604052805190602001206113f8565b818482815181106113bf576113bf613971565b60200260200101516040516020016113e1929190918252602082015260400190565b604051602081830303815290604052805190602001205b91508061140481613916565b915050611333565b50600b54149392505050565b611420611ce5565b6000828152601d602090815260409091208251610ca692840190612db9565b600061144a8261227a565b5192915050565b611459611ce5565b80611462610cee565b11156114b05760405162461bcd60e51b815260206004820152601960248201527f4c6f776572207468616e205f63757272656e74496e6465782e000000000000006044820152606401610e88565b601255565b60006001600160a01b0382166114de576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b61150b611ce5565b611515600061239c565b565b61151f611ce5565b601055565b61152c611ce5565b601155565b6040516331a9108f60e11b8152600481018290526000903090636352211e9060240160206040518083038186803b15801561156b57600080fd5b505afa92505050801561159b575060408051601f3d908101601f1916820190925261159891810190612f7b565b60015b610b3257506000919050565b919050565b6115b4611ce5565b6111a381600b55565b6115c5611ce5565b600e55565b60606115d582611e3c565b6116215760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152606401610e88565b601a5462010000900460ff16156116855761163a6123ec565b61165b6019548461164b9190613931565b611656906001613836565b6123fb565b601560405160200161166f9392919061345b565b6040516020818303038152906040529050919050565b60148054611692906138db565b80601f01602080910402602001604051908101604052809291908181526020018280546116be906138db565b801561170b5780601f106116e05761010080835404028352916020019161170b565b820191906000526020600020905b8154815290600101906020018083116116ee57829003601f168201915b50505050509050919050565b61171f611ce5565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b606060048054610b5d906138db565b6001600160a01b03821633141561177a5760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6117ee611ce5565b601a80549115156101000261ff0019909216919091179055565b611813848484611ed1565b6001600160a01b0383163b15610ce85761182f84848484612500565b610ce8576040516368d2bf6b60e11b815260040160405180910390fd5b611854611ce5565b8051610b4a906018906020840190612db9565b61186f611ce5565b8051610b4a906014906020840190612db9565b61188a611ce5565b601a805460ff1916911515919091179055565b60606118a882611e3c565b6118f45760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152606401610e88565b601a546301000000900460ff1661190e57610b32826125f7565b6119166123ec565b61165b836123fb565b600260095414156119425760405162461bcd60e51b8152600401610e88906137cf565b6002600955601a5460ff166119995760405162461bcd60e51b815260206004820152601760248201527f77686974656c6973744d696e74206973205061757365640000000000000000006044820152606401610e88565b6119a333826112f4565b6119ef5760405162461bcd60e51b815260206004820152601860248201527f596f7520617265206e6f742077686974656c69737465642100000000000000006044820152606401610e88565b816010541015611a525760405162461bcd60e51b815260206004820152602860248201527f77686974656c6973744d696e743a204f766572206d6178206d696e74732070656044820152671c881dd85b1b195d60c21b6064820152608401610e88565b336000908152601b6020526040902054611a6d908390613836565b6010541015611abe5760405162461bcd60e51b815260206004820152601e60248201527f596f752068617665206e6f2077686974656c6973744d696e74206c65667400006044820152606401610e88565b81600e54611acc9190613862565b3414611b155760405162461bcd60e51b8152602060048201526018602482015277115512081d985b1d59481a5cc81b9bdd0818dbdc9c9958dd60421b6044820152606401610e88565b601254611b20610cee565b611b2a9084613836565b1115611b485760405162461bcd60e51b8152600401610e88906137a9565b336000908152601b602052604081208054849290611b67908490613836565b90915550611b77905033836120ac565b50506001600955565b611b88611ce5565b601254611b93610cee565b611b9d9084613836565b1115611bbb5760405162461bcd60e51b8152600401610e88906137a9565b610b4a81836120ac565b611bcd611ce5565b600f55565b611bda611ce5565b8051610b4a906015906020840190612db9565b611bf5611ce5565b601a805491151563010000000263ff00000019909216919091179055565b6060611c1d612855565b905090565b611c2a611ce5565b8051610b4a906017906020840190612db9565b611c45611ce5565b6001600160a01b038116611caa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e88565b6111a38161239c565b611cbb611ce5565b601955565b60006001600160e01b0319821663152a902d60e11b1480610b325750610b32826128d5565b6000546001600160a01b031633146115155760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e88565b6127106001600160601b0382161115611dad5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610e88565b6001600160a01b038216611e035760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610e88565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600c55565b600081600111158015611e50575060015482105b8015610b32575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611edc8261227a565b9050836001600160a01b031681600001516001600160a01b031614611f135760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611f315750611f318533610a99565b80611f4c575033611f4184610be0565b6001600160a01b0316145b905080611f6c57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611f9357604051633a954ecd60e21b815260040160405180910390fd5b611f9f60008487611e75565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661207357600154821461207357805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b0316600080516020613a0983398151915260405160405180910390a45050505050565b610b4a828260405180602001604052806000815250612925565b60006120d18361227a565b80519091508215612137576000336001600160a01b03831614806120fa57506120fa8233610a99565b8061211557503361210a86610be0565b6001600160a01b0316145b90508061213557604051632ce44b5f60e11b815260040160405180910390fd5b505b61214360008583611e75565b6001600160a01b0380821660008181526006602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526005909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b17855591890180845292208054919490911661224157600154821461224157805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b03841690600080516020613a09833981519152908390a450506002805460010190555050565b604080516060810182526000808252602082018190529181019190915281806001116123835760015481101561238357600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906123815780516001600160a01b031615612318579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521561237c579392505050565b612318565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606060168054610b5d906138db565b60608161241f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612449578061243381613916565b91506124429050600a8361384e565b9150612423565b6000816001600160401b0381111561246357612463613987565b6040519080825280601f01601f19166020018201604052801561248d576020820181803683370190505b5090505b84156124f8576124a2600183613881565b91506124af600a86613931565b6124ba906030613836565b60f81b8183815181106124cf576124cf613971565b60200101906001600160f81b031916908160001a9053506124f1600a8661384e565b9450612491565b949350505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612535903390899088908890600401613715565b602060405180830381600087803b15801561254f57600080fd5b505af192505050801561257f575060408051601f3d908101601f1916820190925261257c918101906131cc565b60015b6125da573d8080156125ad576040519150601f19603f3d011682016040523d82523d6000602084013e6125b2565b606091505b5080516125d2576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b606061260282611e3c565b6126425760405162461bcd60e51b81526020600482015260116024820152703737b732bc39b4ba32b73a103a37b5b2b760791b6044820152606401610e88565b6000601761264f846123fb565b60405160200161266092919061357c565b6040516020818303038152906040529050600060186040516020016126859190613498565b604051602081830303815290604052905060006126a1856115ca565b6040516020016126b191906135be565b60408051601f198184030181526020830190915260008252915060015b600a8110156127ce576040518060200160405280600081525051601e60006019548a6126fa9190613931565b815260200190815260200160002082600a811061271957612719613971565b018054612725906138db565b9050146127bc57600181111561275857816040516020016127469190613553565b60405160208183030381529060405291505b6000818152601d602052604081206019548492601e91612778908c613931565b815260200190815260200160002083600a811061279757612797613971565b016040516020016127aa939291906133e5565b60405160208183030381529060405291505b806127c681613916565b9150506126ce565b506000816040516020016127e291906136d3565b604051602081830303815290604052905060008186868660405160200161280c94939291906135fb565b6040516020818303038152906040529050600061282882612ac4565b604051602001612838919061368e565b60408051601f198184030181529190529998505050505050505050565b606060008061286681612710610db9565b915091506128af612876826123fb565b61288a846001600160a01b03166014612c17565b60405160200161289b9291906134cd565b604051602081830303815290604052612ac4565b6040516020016128bf919061368e565b6040516020818303038152906040529250505090565b60006001600160e01b031982166380ac58cd60e01b148061290657506001600160e01b03198216635b5e139f60e01b145b80610b3257506301ffc9a760e01b6001600160e01b0319831614610b32565b6001546001600160a01b03841661294e57604051622e076360e81b815260040160405180910390fd5b8261296c5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600590925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15612a82575b60405182906001600160a01b03881690600090600080516020613a09833981519152908290a4612a4b6000878480600101955087612500565b612a68576040516368d2bf6b60e11b815260040160405180910390fd5b808210612a12578260015414612a7d57600080fd5b612ab5565b5b6040516001830192906001600160a01b03881690600090600080516020613a09833981519152908290a4808210612a83575b50600155610ce8600085838684565b6060815160001415612ae457505060408051602081019091526000815290565b60006040518060600160405280604081526020016139c96040913990506000600384516002612b139190613836565b612b1d919061384e565b612b28906004613862565b6001600160401b03811115612b3f57612b3f613987565b6040519080825280601f01601f191660200182016040528015612b69576020820181803683370190505b509050600182016020820185865187015b80821015612bd5576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250612b7a565b5050600386510660018114612bf15760028114612c0457612c0c565b603d6001830353603d6002830353612c0c565b603d60018303535b509195945050505050565b60606000612c26836002613862565b612c31906002613836565b6001600160401b03811115612c4857612c48613987565b6040519080825280601f01601f191660200182016040528015612c72576020820181803683370190505b509050600360fc1b81600081518110612c8d57612c8d613971565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612cbc57612cbc613971565b60200101906001600160f81b031916908160001a9053506000612ce0846002613862565b612ceb906001613836565b90505b6001811115612d63576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612d1f57612d1f613971565b1a60f81b828281518110612d3557612d35613971565b60200101906001600160f81b031916908160001a90535060049490941c93612d5c816138c4565b9050612cee565b508315612db25760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610e88565b9392505050565b828054612dc5906138db565b90600052602060002090601f016020900481019282612de75760008555612e2d565b82601f10612e0057805160ff1916838001178555612e2d565b82800160010185558215612e2d579182015b82811115612e2d578251825591602001919060010190612e12565b50612e39929150612e3d565b5090565b5b80821115612e395760008155600101612e3e565b60006001600160401b03831115612e6b57612e6b613987565b612e7e601f8401601f1916602001613806565b9050828152838383011115612e9257600080fd5b828260208301376000602084830101529392505050565b600082601f830112612eba57600080fd5b813560206001600160401b03821115612ed557612ed5613987565b8160051b612ee4828201613806565b838152828101908684018388018501891015612eff57600080fd5b600093505b85841015612f22578035835260019390930192918401918401612f04565b50979650505050505050565b803580151581146115a757600080fd5b600082601f830112612f4f57600080fd5b612db283833560208501612e52565b600060208284031215612f7057600080fd5b8135612db28161399d565b600060208284031215612f8d57600080fd5b8151612db28161399d565b60008060408385031215612fab57600080fd5b8235612fb68161399d565b91506020830135612fc68161399d565b809150509250929050565b600080600060608486031215612fe657600080fd5b8335612ff18161399d565b925060208401356130018161399d565b929592945050506040919091013590565b6000806000806080858703121561302857600080fd5b84356130338161399d565b935060208501356130438161399d565b92506040850135915060608501356001600160401b0381111561306557600080fd5b8501601f8101871361307657600080fd5b61308587823560208401612e52565b91505092959194509250565b600080604083850312156130a457600080fd5b82356130af8161399d565b915060208301356001600160401b038111156130ca57600080fd5b6130d685828601612ea9565b9150509250929050565b600080604083850312156130f357600080fd5b82356130fe8161399d565b915061310c60208401612f2e565b90509250929050565b6000806040838503121561312857600080fd5b82356131338161399d565b946020939093013593505050565b6000806040838503121561315457600080fd5b823561315f8161399d565b915060208301356001600160601b0381168114612fc657600080fd5b60006020828403121561318d57600080fd5b612db282612f2e565b6000602082840312156131a857600080fd5b5035919050565b6000602082840312156131c157600080fd5b8135612db2816139b2565b6000602082840312156131de57600080fd5b8151612db2816139b2565b6000602082840312156131fb57600080fd5b81356001600160401b0381111561321157600080fd5b6124f884828501612f3e565b6000806040838503121561323057600080fd5b823591506020830135612fc68161399d565b6000806040838503121561325557600080fd5b8235915060208301356001600160401b038111156130ca57600080fd5b6000806040838503121561328557600080fd5b8235915060208301356001600160401b038111156132a257600080fd5b6130d685828601612f3e565b600080604083850312156132c157600080fd5b50508035926020909101359150565b6000806000606084860312156132e557600080fd5b833592506020840135915060408401356001600160401b0381111561330957600080fd5b61331586828701612f3e565b9150509250925092565b60008151808452613337816020860160208601613898565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061336557607f831692505b602080841082141561338757634e487b7160e01b600052602260045260246000fd5b81801561339b57600181146133ac576133d9565b60ff198616895284890196506133d9565b60008881526020902060005b868110156133d15781548b8201529085019083016133b8565b505084890196505b50505050505092915050565b600084516133f7818460208901613898565b6e3d913a3930b4ba2fba3cb832911d1160891b90830190815261341d600f82018661334b565b61088b60f21b815268113b30b63ab2911d1160b91b60028201529050613446600b82018561334b565b61227d60f01b81526002019695505050505050565b6000845161346d818460208901613898565b845190830190613481818360208901613898565b61348d8183018661334b565b979650505050505050565b6e113232b9b1b934b83a34b7b7111d1160891b815260006134bc600f83018461334b565b601160f91b81526001019392505050565b7f7b2273656c6c65725f6665655f62617369735f706f696e7473223a000000000081526000835161350581601b850160208801613898565b721610113332b2afb932b1b4b834b2b73a111d1160691b601b91840191820152835161353881602e840160208801613898565b61227d60f01b602e9290910191820152603001949350505050565b600b60fa1b81526000825161356f816001850160208701613898565b9190910160010192915050565b67113730b6b2911d1160c11b81526000613599600883018561334b565b83516135a9818360208801613898565b601160f91b9101908152600101949350505050565b681134b6b0b3b2911d1160b91b815281516000906135e3816009850160208701613898565b601160f91b6009939091019283015250600a01919050565b607b60f81b815260008551613617816001850160208a01613898565b8083019050600b60fa1b806001830152865161363a816002850160208b01613898565b600292019182018190528551613657816003850160208a01613898565b60039201918201528351613672816004840160208801613898565b607d60f81b600492909101918201526005019695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516136c681601d850160208701613898565b91909101601d0192915050565b6d2261747472696275746573223a5b60901b815281516000906136fd81600e850160208701613898565b605d60f81b600e939091019283015250600f01919050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906137489083018461331f565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561378a5783518352928401929184019160010161376e565b50909695505050505050565b602081526000612db2602083018461331f565b6020808252600c908201526b4e6f206d6f7265204e46547360a01b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f191681016001600160401b038111828210171561382e5761382e613987565b604052919050565b6000821982111561384957613849613945565b500190565b60008261385d5761385d61395b565b500490565b600081600019048311821515161561387c5761387c613945565b500290565b60008282101561389357613893613945565b500390565b60005b838110156138b357818101518382015260200161389b565b83811115610ce85750506000910152565b6000816138d3576138d3613945565b506000190190565b600181811c908216806138ef57607f821691505b6020821081141561391057634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561392a5761392a613945565b5060010190565b6000826139405761394061395b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146111a357600080fd5b6001600160e01b0319811681146111a357600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122097115ce2507a9590c7d08bcf1d6e8d46d92df422c33f3d0c38d01bcc6186001064736f6c63430008070033

Deployed Bytecode

0x6080604052600436106103975760003560e01c8063719eaef8116101dc578063bafec39b11610102578063d78be71c116100a0578063e985e9c51161006f578063e985e9c514610a7e578063ee725e1014610ac7578063f2fde38b14610ae7578063f3b759c914610b0757600080fd5b8063d78be71c14610a09578063da3ef23f14610a29578063e2f21c9914610a49578063e8a3d48514610a6957600080fd5b8063c87b56dd116100dc578063c87b56dd146109a0578063d2cab056146109c0578063d52c57e0146109d3578063d5abeb01146109f357600080fd5b8063bafec39b14610940578063bbaac02f14610960578063c3faf7241461098057600080fd5b80638f742d161161017a5780639970cc29116101495780639970cc29146108ca578063a22cb465146108e0578063a355fd2914610900578063b88d4fde1461092057600080fd5b80638f742d161461083f5780639373f4321461085f578063942958f41461087f57806395d89b41146108b557600080fd5b8063830b3a64116101b6578063830b3a64146107c15780638ac1e161146107e15780638da5cb5b146108015780638dd07d0f1461081f57600080fd5b8063719eaef81461074b57806378a923801461076b578063813779ef146107a157600080fd5b80632db11544116102c157806354214f691161025f5780636352211e1161022e5780636352211e146106d65780636f8b44b0146106f657806370a0823114610716578063715018a61461073657600080fd5b806354214f691461065857806355f804b3146106765780635a23dd99146106965780635def7abb146106b657600080fd5b806342454db91161029b57806342454db9146105d557806342842e0e146105eb57806342966c681461060b578063438b63001461062b57600080fd5b80632db115441461059b5780633ccfd60b146105ae5780634009920d146105b657600080fd5b806318160ddd116103395780632672c902116103085780632672c902146105115780632a3f300c146105265780632a55205a146105465780632c4e9fc61461058557600080fd5b806318160ddd146104ac578063189f3de1146104c15780631a09cfe2146104db57806323b872dd146104f157600080fd5b8063081812fc11610375578063081812fc14610415578063095ea7b31461044d5780630d9005ae1461046d5780631558f1c11461048c57600080fd5b806301ffc9a71461039c57806304634d8d146103d157806306fdde03146103f3575b600080fd5b3480156103a857600080fd5b506103bc6103b73660046131af565b610b27565b60405190151581526020015b60405180910390f35b3480156103dd57600080fd5b506103f16103ec366004613141565b610b38565b005b3480156103ff57600080fd5b50610408610b4e565b6040516103c89190613796565b34801561042157600080fd5b50610435610430366004613196565b610be0565b6040516001600160a01b0390911681526020016103c8565b34801561045957600080fd5b506103f1610468366004613115565b610c24565b34801561047957600080fd5b506001545b6040519081526020016103c8565b34801561049857600080fd5b506103f16104a73660046132d0565b610cab565b3480156104b857600080fd5b5061047e610cee565b3480156104cd57600080fd5b50601a546103bc9060ff1681565b3480156104e757600080fd5b5061047e60115481565b3480156104fd57600080fd5b506103f161050c366004612fd1565b610cfc565b34801561051d57600080fd5b50610408610d07565b34801561053257600080fd5b506103f161054136600461317b565b610d95565b34801561055257600080fd5b506105666105613660046132ae565b610db9565b604080516001600160a01b0390931683526020830191909152016103c8565b34801561059157600080fd5b5061047e600e5481565b6103f16105a9366004613196565b610e65565b6103f1611071565b3480156105c257600080fd5b50601a546103bc90610100900460ff1681565b3480156105e157600080fd5b5061047e600f5481565b3480156105f757600080fd5b506103f1610606366004612fd1565b61117d565b34801561061757600080fd5b506103f1610626366004613196565b611198565b34801561063757600080fd5b5061064b610646366004612f5e565b6111a6565b6040516103c89190613752565b34801561066457600080fd5b50601a5462010000900460ff166103bc565b34801561068257600080fd5b506103f16106913660046131e9565b6112d9565b3480156106a257600080fd5b506103bc6106b1366004613091565b6112f4565b3480156106c257600080fd5b506103f16106d1366004613272565b611418565b3480156106e257600080fd5b506104356106f1366004613196565b61143f565b34801561070257600080fd5b506103f1610711366004613196565b611451565b34801561072257600080fd5b5061047e610731366004612f5e565b6114b5565b34801561074257600080fd5b506103f1611503565b34801561075757600080fd5b506103f1610766366004613196565b611517565b34801561077757600080fd5b5061047e610786366004612f5e565b6001600160a01b03166000908152601b602052604090205490565b3480156107ad57600080fd5b506103f16107bc366004613196565b611524565b3480156107cd57600080fd5b506104356107dc366004613196565b611531565b3480156107ed57600080fd5b506103f16107fc366004613196565b6115ac565b34801561080d57600080fd5b506000546001600160a01b0316610435565b34801561082b57600080fd5b506103f161083a366004613196565b6115bd565b34801561084b57600080fd5b5061040861085a366004613196565b6115ca565b34801561086b57600080fd5b506103f161087a366004612f5e565b611717565b34801561088b57600080fd5b5061047e61089a366004612f5e565b6001600160a01b03166000908152601c602052604090205490565b3480156108c157600080fd5b50610408611741565b3480156108d657600080fd5b5061047e60105481565b3480156108ec57600080fd5b506103f16108fb3660046130e0565b611750565b34801561090c57600080fd5b506103f161091b36600461317b565b6117e6565b34801561092c57600080fd5b506103f161093b366004613012565b611808565b34801561094c57600080fd5b506103f161095b3660046131e9565b61184c565b34801561096c57600080fd5b506103f161097b3660046131e9565b611867565b34801561098c57600080fd5b506103f161099b36600461317b565b611882565b3480156109ac57600080fd5b506104086109bb366004613196565b61189d565b6103f16109ce366004613242565b61191f565b3480156109df57600080fd5b506103f16109ee36600461321d565b611b80565b3480156109ff57600080fd5b5061047e60125481565b348015610a1557600080fd5b506103f1610a24366004613196565b611bc5565b348015610a3557600080fd5b506103f1610a443660046131e9565b611bd2565b348015610a5557600080fd5b506103f1610a6436600461317b565b611bed565b348015610a7557600080fd5b50610408611c13565b348015610a8a57600080fd5b506103bc610a99366004612f98565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b348015610ad357600080fd5b506103f1610ae23660046131e9565b611c22565b348015610af357600080fd5b506103f1610b02366004612f5e565b611c3d565b348015610b1357600080fd5b506103f1610b22366004613196565b611cb3565b6000610b3282611cc0565b92915050565b610b40611ce5565b610b4a8282611d3f565b5050565b606060038054610b5d906138db565b80601f0160208091040260200160405190810160405280929190818152602001828054610b89906138db565b8015610bd65780601f10610bab57610100808354040283529160200191610bd6565b820191906000526020600020905b815481529060010190602001808311610bb957829003601f168201915b5050505050905090565b6000610beb82611e3c565b610c08576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610c2f8261143f565b9050806001600160a01b0316836001600160a01b03161415610c645760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610c9b57610c7e8133610a99565b610c9b576040516367d9dca160e11b815260040160405180910390fd5b610ca6838383611e75565b505050565b610cb3611ce5565b6000838152601e60205260409020819083600a8110610cd457610cd4613971565b019080519060200190610ce8929190612db9565b50505050565b600254600154036000190190565b610ca6838383611ed1565b60158054610d14906138db565b80601f0160208091040260200160405190810160405280929190818152602001828054610d40906138db565b8015610d8d5780601f10610d6257610100808354040283529160200191610d8d565b820191906000526020600020905b815481529060010190602001808311610d7057829003601f168201915b505050505081565b610d9d611ce5565b601a8054911515620100000262ff000019909216919091179055565b6000828152600d602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610e2e575060408051808201909152600c546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610e4d906001600160601b031687613862565b610e57919061384e565b915196919550909350505050565b60026009541415610e915760405162461bcd60e51b8152600401610e88906137cf565b60405180910390fd5b6002600955601a54610100900460ff16610ee45760405162461bcd60e51b81526020600482015260146024820152731c1d589b1a58d35a5b9d081a5cc814185d5cd95960621b6044820152606401610e88565b806011541015610f445760405162461bcd60e51b815260206004820152602560248201527f7075626c69634d696e743a204f766572206d6178206d696e7473207065722077604482015264185b1b195d60da1b6064820152608401610e88565b336000908152601c6020526040902054610f5f908290613836565b6011541015610fb05760405162461bcd60e51b815260206004820152601b60248201527f596f752068617665206e6f207075626c69634d696e74206c65667400000000006044820152606401610e88565b80600f54610fbe9190613862565b34146110075760405162461bcd60e51b8152602060048201526018602482015277115512081d985b1d59481a5cc81b9bdd0818dbdc9c9958dd60421b6044820152606401610e88565b601254611012610cee565b61101c9083613836565b111561103a5760405162461bcd60e51b8152600401610e88906137a9565b336000908152601c602052604081208054839290611059908490613836565b90915550611069905033826120ac565b506001600955565b611079611ce5565b6002600954141561109c5760405162461bcd60e51b8152600401610e88906137cf565b60026009556013546000906001600160a01b031615611112576013546040516001600160a01b03909116904790600081818185875af1925050503d8060008114611102576040519150601f19603f3d011682016040523d82523d6000602084013e611107565b606091505b505080915050611173565b6000546001600160a01b03166001600160a01b03164760405160006040518083038185875af1925050503d8060008114611168576040519150601f19603f3d011682016040523d82523d6000602084013e61116d565b606091505b50909150505b8061106957600080fd5b610ca683838360405180602001604052806000815250611808565b6111a38160016120c6565b50565b606060006111b3836114b5565b90506000816001600160401b038111156111cf576111cf613987565b6040519080825280602002602001820160405280156111f8578160200160208202803683370190505b509050600060015b6001548110156112cf576040516320c2ce9960e21b815260048101829052309063830b3a649060240160206040518083038186803b15801561124157600080fd5b505afa158015611255573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112799190612f7b565b6001600160a01b0316866001600160a01b031614156112bd5780838361129e81613916565b9450815181106112b0576112b0613971565b6020026020010181815250505b806112c781613916565b915050611200565b5090949350505050565b6112e1611ce5565b8051610b4a906016906020840190612db9565b6040516bffffffffffffffffffffffff19606084901b166020820152600090819060340160405160208183030381529060405280519060200120905060005b835181101561140c5783818151811061134e5761134e613971565b602002602001015182106113ac5783818151811061136e5761136e613971565b602002602001015182604051602001611391929190918252602082015260400190565b604051602081830303815290604052805190602001206113f8565b818482815181106113bf576113bf613971565b60200260200101516040516020016113e1929190918252602082015260400190565b604051602081830303815290604052805190602001205b91508061140481613916565b915050611333565b50600b54149392505050565b611420611ce5565b6000828152601d602090815260409091208251610ca692840190612db9565b600061144a8261227a565b5192915050565b611459611ce5565b80611462610cee565b11156114b05760405162461bcd60e51b815260206004820152601960248201527f4c6f776572207468616e205f63757272656e74496e6465782e000000000000006044820152606401610e88565b601255565b60006001600160a01b0382166114de576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b61150b611ce5565b611515600061239c565b565b61151f611ce5565b601055565b61152c611ce5565b601155565b6040516331a9108f60e11b8152600481018290526000903090636352211e9060240160206040518083038186803b15801561156b57600080fd5b505afa92505050801561159b575060408051601f3d908101601f1916820190925261159891810190612f7b565b60015b610b3257506000919050565b919050565b6115b4611ce5565b6111a381600b55565b6115c5611ce5565b600e55565b60606115d582611e3c565b6116215760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152606401610e88565b601a5462010000900460ff16156116855761163a6123ec565b61165b6019548461164b9190613931565b611656906001613836565b6123fb565b601560405160200161166f9392919061345b565b6040516020818303038152906040529050919050565b60148054611692906138db565b80601f01602080910402602001604051908101604052809291908181526020018280546116be906138db565b801561170b5780601f106116e05761010080835404028352916020019161170b565b820191906000526020600020905b8154815290600101906020018083116116ee57829003601f168201915b50505050509050919050565b61171f611ce5565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b606060048054610b5d906138db565b6001600160a01b03821633141561177a5760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6117ee611ce5565b601a80549115156101000261ff0019909216919091179055565b611813848484611ed1565b6001600160a01b0383163b15610ce85761182f84848484612500565b610ce8576040516368d2bf6b60e11b815260040160405180910390fd5b611854611ce5565b8051610b4a906018906020840190612db9565b61186f611ce5565b8051610b4a906014906020840190612db9565b61188a611ce5565b601a805460ff1916911515919091179055565b60606118a882611e3c565b6118f45760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152606401610e88565b601a546301000000900460ff1661190e57610b32826125f7565b6119166123ec565b61165b836123fb565b600260095414156119425760405162461bcd60e51b8152600401610e88906137cf565b6002600955601a5460ff166119995760405162461bcd60e51b815260206004820152601760248201527f77686974656c6973744d696e74206973205061757365640000000000000000006044820152606401610e88565b6119a333826112f4565b6119ef5760405162461bcd60e51b815260206004820152601860248201527f596f7520617265206e6f742077686974656c69737465642100000000000000006044820152606401610e88565b816010541015611a525760405162461bcd60e51b815260206004820152602860248201527f77686974656c6973744d696e743a204f766572206d6178206d696e74732070656044820152671c881dd85b1b195d60c21b6064820152608401610e88565b336000908152601b6020526040902054611a6d908390613836565b6010541015611abe5760405162461bcd60e51b815260206004820152601e60248201527f596f752068617665206e6f2077686974656c6973744d696e74206c65667400006044820152606401610e88565b81600e54611acc9190613862565b3414611b155760405162461bcd60e51b8152602060048201526018602482015277115512081d985b1d59481a5cc81b9bdd0818dbdc9c9958dd60421b6044820152606401610e88565b601254611b20610cee565b611b2a9084613836565b1115611b485760405162461bcd60e51b8152600401610e88906137a9565b336000908152601b602052604081208054849290611b67908490613836565b90915550611b77905033836120ac565b50506001600955565b611b88611ce5565b601254611b93610cee565b611b9d9084613836565b1115611bbb5760405162461bcd60e51b8152600401610e88906137a9565b610b4a81836120ac565b611bcd611ce5565b600f55565b611bda611ce5565b8051610b4a906015906020840190612db9565b611bf5611ce5565b601a805491151563010000000263ff00000019909216919091179055565b6060611c1d612855565b905090565b611c2a611ce5565b8051610b4a906017906020840190612db9565b611c45611ce5565b6001600160a01b038116611caa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e88565b6111a38161239c565b611cbb611ce5565b601955565b60006001600160e01b0319821663152a902d60e11b1480610b325750610b32826128d5565b6000546001600160a01b031633146115155760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e88565b6127106001600160601b0382161115611dad5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610e88565b6001600160a01b038216611e035760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610e88565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600c55565b600081600111158015611e50575060015482105b8015610b32575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611edc8261227a565b9050836001600160a01b031681600001516001600160a01b031614611f135760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611f315750611f318533610a99565b80611f4c575033611f4184610be0565b6001600160a01b0316145b905080611f6c57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611f9357604051633a954ecd60e21b815260040160405180910390fd5b611f9f60008487611e75565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661207357600154821461207357805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b0316600080516020613a0983398151915260405160405180910390a45050505050565b610b4a828260405180602001604052806000815250612925565b60006120d18361227a565b80519091508215612137576000336001600160a01b03831614806120fa57506120fa8233610a99565b8061211557503361210a86610be0565b6001600160a01b0316145b90508061213557604051632ce44b5f60e11b815260040160405180910390fd5b505b61214360008583611e75565b6001600160a01b0380821660008181526006602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526005909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b17855591890180845292208054919490911661224157600154821461224157805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b03841690600080516020613a09833981519152908390a450506002805460010190555050565b604080516060810182526000808252602082018190529181019190915281806001116123835760015481101561238357600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906123815780516001600160a01b031615612318579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521561237c579392505050565b612318565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606060168054610b5d906138db565b60608161241f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612449578061243381613916565b91506124429050600a8361384e565b9150612423565b6000816001600160401b0381111561246357612463613987565b6040519080825280601f01601f19166020018201604052801561248d576020820181803683370190505b5090505b84156124f8576124a2600183613881565b91506124af600a86613931565b6124ba906030613836565b60f81b8183815181106124cf576124cf613971565b60200101906001600160f81b031916908160001a9053506124f1600a8661384e565b9450612491565b949350505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612535903390899088908890600401613715565b602060405180830381600087803b15801561254f57600080fd5b505af192505050801561257f575060408051601f3d908101601f1916820190925261257c918101906131cc565b60015b6125da573d8080156125ad576040519150601f19603f3d011682016040523d82523d6000602084013e6125b2565b606091505b5080516125d2576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b606061260282611e3c565b6126425760405162461bcd60e51b81526020600482015260116024820152703737b732bc39b4ba32b73a103a37b5b2b760791b6044820152606401610e88565b6000601761264f846123fb565b60405160200161266092919061357c565b6040516020818303038152906040529050600060186040516020016126859190613498565b604051602081830303815290604052905060006126a1856115ca565b6040516020016126b191906135be565b60408051601f198184030181526020830190915260008252915060015b600a8110156127ce576040518060200160405280600081525051601e60006019548a6126fa9190613931565b815260200190815260200160002082600a811061271957612719613971565b018054612725906138db565b9050146127bc57600181111561275857816040516020016127469190613553565b60405160208183030381529060405291505b6000818152601d602052604081206019548492601e91612778908c613931565b815260200190815260200160002083600a811061279757612797613971565b016040516020016127aa939291906133e5565b60405160208183030381529060405291505b806127c681613916565b9150506126ce565b506000816040516020016127e291906136d3565b604051602081830303815290604052905060008186868660405160200161280c94939291906135fb565b6040516020818303038152906040529050600061282882612ac4565b604051602001612838919061368e565b60408051601f198184030181529190529998505050505050505050565b606060008061286681612710610db9565b915091506128af612876826123fb565b61288a846001600160a01b03166014612c17565b60405160200161289b9291906134cd565b604051602081830303815290604052612ac4565b6040516020016128bf919061368e565b6040516020818303038152906040529250505090565b60006001600160e01b031982166380ac58cd60e01b148061290657506001600160e01b03198216635b5e139f60e01b145b80610b3257506301ffc9a760e01b6001600160e01b0319831614610b32565b6001546001600160a01b03841661294e57604051622e076360e81b815260040160405180910390fd5b8261296c5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600590925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15612a82575b60405182906001600160a01b03881690600090600080516020613a09833981519152908290a4612a4b6000878480600101955087612500565b612a68576040516368d2bf6b60e11b815260040160405180910390fd5b808210612a12578260015414612a7d57600080fd5b612ab5565b5b6040516001830192906001600160a01b03881690600090600080516020613a09833981519152908290a4808210612a83575b50600155610ce8600085838684565b6060815160001415612ae457505060408051602081019091526000815290565b60006040518060600160405280604081526020016139c96040913990506000600384516002612b139190613836565b612b1d919061384e565b612b28906004613862565b6001600160401b03811115612b3f57612b3f613987565b6040519080825280601f01601f191660200182016040528015612b69576020820181803683370190505b509050600182016020820185865187015b80821015612bd5576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250612b7a565b5050600386510660018114612bf15760028114612c0457612c0c565b603d6001830353603d6002830353612c0c565b603d60018303535b509195945050505050565b60606000612c26836002613862565b612c31906002613836565b6001600160401b03811115612c4857612c48613987565b6040519080825280601f01601f191660200182016040528015612c72576020820181803683370190505b509050600360fc1b81600081518110612c8d57612c8d613971565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612cbc57612cbc613971565b60200101906001600160f81b031916908160001a9053506000612ce0846002613862565b612ceb906001613836565b90505b6001811115612d63576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612d1f57612d1f613971565b1a60f81b828281518110612d3557612d35613971565b60200101906001600160f81b031916908160001a90535060049490941c93612d5c816138c4565b9050612cee565b508315612db25760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610e88565b9392505050565b828054612dc5906138db565b90600052602060002090601f016020900481019282612de75760008555612e2d565b82601f10612e0057805160ff1916838001178555612e2d565b82800160010185558215612e2d579182015b82811115612e2d578251825591602001919060010190612e12565b50612e39929150612e3d565b5090565b5b80821115612e395760008155600101612e3e565b60006001600160401b03831115612e6b57612e6b613987565b612e7e601f8401601f1916602001613806565b9050828152838383011115612e9257600080fd5b828260208301376000602084830101529392505050565b600082601f830112612eba57600080fd5b813560206001600160401b03821115612ed557612ed5613987565b8160051b612ee4828201613806565b838152828101908684018388018501891015612eff57600080fd5b600093505b85841015612f22578035835260019390930192918401918401612f04565b50979650505050505050565b803580151581146115a757600080fd5b600082601f830112612f4f57600080fd5b612db283833560208501612e52565b600060208284031215612f7057600080fd5b8135612db28161399d565b600060208284031215612f8d57600080fd5b8151612db28161399d565b60008060408385031215612fab57600080fd5b8235612fb68161399d565b91506020830135612fc68161399d565b809150509250929050565b600080600060608486031215612fe657600080fd5b8335612ff18161399d565b925060208401356130018161399d565b929592945050506040919091013590565b6000806000806080858703121561302857600080fd5b84356130338161399d565b935060208501356130438161399d565b92506040850135915060608501356001600160401b0381111561306557600080fd5b8501601f8101871361307657600080fd5b61308587823560208401612e52565b91505092959194509250565b600080604083850312156130a457600080fd5b82356130af8161399d565b915060208301356001600160401b038111156130ca57600080fd5b6130d685828601612ea9565b9150509250929050565b600080604083850312156130f357600080fd5b82356130fe8161399d565b915061310c60208401612f2e565b90509250929050565b6000806040838503121561312857600080fd5b82356131338161399d565b946020939093013593505050565b6000806040838503121561315457600080fd5b823561315f8161399d565b915060208301356001600160601b0381168114612fc657600080fd5b60006020828403121561318d57600080fd5b612db282612f2e565b6000602082840312156131a857600080fd5b5035919050565b6000602082840312156131c157600080fd5b8135612db2816139b2565b6000602082840312156131de57600080fd5b8151612db2816139b2565b6000602082840312156131fb57600080fd5b81356001600160401b0381111561321157600080fd5b6124f884828501612f3e565b6000806040838503121561323057600080fd5b823591506020830135612fc68161399d565b6000806040838503121561325557600080fd5b8235915060208301356001600160401b038111156130ca57600080fd5b6000806040838503121561328557600080fd5b8235915060208301356001600160401b038111156132a257600080fd5b6130d685828601612f3e565b600080604083850312156132c157600080fd5b50508035926020909101359150565b6000806000606084860312156132e557600080fd5b833592506020840135915060408401356001600160401b0381111561330957600080fd5b61331586828701612f3e565b9150509250925092565b60008151808452613337816020860160208601613898565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061336557607f831692505b602080841082141561338757634e487b7160e01b600052602260045260246000fd5b81801561339b57600181146133ac576133d9565b60ff198616895284890196506133d9565b60008881526020902060005b868110156133d15781548b8201529085019083016133b8565b505084890196505b50505050505092915050565b600084516133f7818460208901613898565b6e3d913a3930b4ba2fba3cb832911d1160891b90830190815261341d600f82018661334b565b61088b60f21b815268113b30b63ab2911d1160b91b60028201529050613446600b82018561334b565b61227d60f01b81526002019695505050505050565b6000845161346d818460208901613898565b845190830190613481818360208901613898565b61348d8183018661334b565b979650505050505050565b6e113232b9b1b934b83a34b7b7111d1160891b815260006134bc600f83018461334b565b601160f91b81526001019392505050565b7f7b2273656c6c65725f6665655f62617369735f706f696e7473223a000000000081526000835161350581601b850160208801613898565b721610113332b2afb932b1b4b834b2b73a111d1160691b601b91840191820152835161353881602e840160208801613898565b61227d60f01b602e9290910191820152603001949350505050565b600b60fa1b81526000825161356f816001850160208701613898565b9190910160010192915050565b67113730b6b2911d1160c11b81526000613599600883018561334b565b83516135a9818360208801613898565b601160f91b9101908152600101949350505050565b681134b6b0b3b2911d1160b91b815281516000906135e3816009850160208701613898565b601160f91b6009939091019283015250600a01919050565b607b60f81b815260008551613617816001850160208a01613898565b8083019050600b60fa1b806001830152865161363a816002850160208b01613898565b600292019182018190528551613657816003850160208a01613898565b60039201918201528351613672816004840160208801613898565b607d60f81b600492909101918201526005019695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516136c681601d850160208701613898565b91909101601d0192915050565b6d2261747472696275746573223a5b60901b815281516000906136fd81600e850160208701613898565b605d60f81b600e939091019283015250600f01919050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906137489083018461331f565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561378a5783518352928401929184019160010161376e565b50909695505050505050565b602081526000612db2602083018461331f565b6020808252600c908201526b4e6f206d6f7265204e46547360a01b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f191681016001600160401b038111828210171561382e5761382e613987565b604052919050565b6000821982111561384957613849613945565b500190565b60008261385d5761385d61395b565b500490565b600081600019048311821515161561387c5761387c613945565b500290565b60008282101561389357613893613945565b500390565b60005b838110156138b357818101518382015260200161389b565b83811115610ce85750506000910152565b6000816138d3576138d3613945565b506000190190565b600181811c908216806138ef57607f821691505b6020821081141561391057634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561392a5761392a613945565b5060010190565b6000826139405761394061395b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146111a357600080fd5b6001600160e01b0319811681146111a357600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122097115ce2507a9590c7d08bcf1d6e8d46d92df422c33f3d0c38d01bcc6186001064736f6c63430008070033

Deployed Bytecode Sourcemap

60902:11195:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62327:165;;;;;;;;;;-1:-1:-1;62327:165:0;;;;;:::i;:::-;;:::i;:::-;;;19866:14:1;;19859:22;19841:41;;19829:2;19814:18;62327:165:0;;;;;;;;62152:154;;;;;;;;;;-1:-1:-1;62152:154:0;;;;;:::i;:::-;;:::i;:::-;;41757:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43261:204::-;;;;;;;;;;-1:-1:-1;43261:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;18248:32:1;;;18230:51;;18218:2;18203:18;43261:204:0;18084:203:1;42823:372:0;;;;;;;;;;-1:-1:-1;42823:372:0;;;;;:::i;:::-;;:::i;65142:99::-;;;;;;;;;;-1:-1:-1;65222:13:0;;65142:99;;;26855:25:1;;;26843:2;26828:18;65142:99:0;26709:177:1;65623:150:0;;;;;;;;;;-1:-1:-1;65623:150:0;;;;;:::i;:::-;;:::i;37882:312::-;;;;;;;;;;;;;:::i;61534:27::-;;;;;;;;;;-1:-1:-1;61534:27:0;;;;;;;;61141:32;;;;;;;;;;;;;;;;44126:170;;;;;;;;;;-1:-1:-1;44126:170:0;;;;;:::i;:::-;;:::i;61299:37::-;;;;;;;;;;;;;:::i;63882:90::-;;;;;;;;;;-1:-1:-1;63882:90:0;;;;;:::i;:::-;;:::i;29644:442::-;;;;;;;;;;-1:-1:-1;29644:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;18977:32:1;;;18959:51;;19041:2;19026:18;;19019:34;;;;18932:18;29644:442:0;18785:274:1;61014:39:0;;;;;;;;;;;;;;;;69910:550;;;;;;:::i;:::-;;:::i;70611:661::-;;;:::i;61566:31::-;;;;;;;;;;-1:-1:-1;61566:31:0;;;;;;;;;;;61058:41;;;;;;;;;;;;;;;;44367:185;;;;;;;;;;-1:-1:-1;44367:185:0;;;;;:::i;:::-;;:::i;70476:81::-;;;;;;;;;;-1:-1:-1;70476:81:0;;;;;:::i;:::-;;:::i;71313:475::-;;;;;;;;;;-1:-1:-1;71313:475:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;64001:89::-;;;;;;;;;;-1:-1:-1;64073:11:0;;;;;;;64001:89;;65293:100;;;;;;;;;;-1:-1:-1;65293:100:0;;;;;:::i;:::-;;:::i;12439:407::-;;;;;;;;;;-1:-1:-1;12439:407:0;;;;;:::i;:::-;;:::i;65447:121::-;;;;;;;;;;-1:-1:-1;65447:121:0;;;;;:::i;:::-;;:::i;41565:125::-;;;;;;;;;;-1:-1:-1;41565:125:0;;;;;:::i;:::-;;:::i;63444:176::-;;;;;;;;;;-1:-1:-1;63444:176:0;;;;;:::i;:::-;;:::i;39011:206::-;;;;;;;;;;-1:-1:-1;39011:206:0;;;;;:::i;:::-;;:::i;59339:103::-;;;;;;;;;;;;;:::i;64379:97::-;;;;;;;;;;-1:-1:-1;64379:97:0;;;;;:::i;:::-;;:::i;64120:114::-;;;;;;;;;;-1:-1:-1;64120:114:0;;;;;:::i;:::-;-1:-1:-1;;;;;64209:19:0;64187:7;64209:19;;;:9;:19;;;;;;;64120:114;64480:97;;;;;;;;;;-1:-1:-1;64480:97:0;;;;;:::i;:::-;;:::i;71851:243::-;;;;;;;;;;-1:-1:-1;71851:243:0;;;;;:::i;:::-;;:::i;64855:115::-;;;;;;;;;;-1:-1:-1;64855:115:0;;;;;:::i;:::-;;:::i;58691:87::-;;;;;;;;;;-1:-1:-1;58737:7:0;58764:6;-1:-1:-1;;;;;58764:6:0;58691:87;;63644:100;;;;;;;;;;-1:-1:-1;63644:100:0;;;;;:::i;:::-;;:::i;66973:326::-;;;;;;;;;;-1:-1:-1;66973:326:0;;;;;:::i;:::-;;:::i;63291:116::-;;;;;;;;;;-1:-1:-1;63291:116:0;;;;;:::i;:::-;;:::i;64238:114::-;;;;;;;;;;-1:-1:-1;64238:114:0;;;;;:::i;:::-;-1:-1:-1;;;;;64327:19:0;64305:7;64327:19;;;:9;:19;;;;;;;64238:114;41926:104;;;;;;;;;;;;;:::i;61104:32::-;;;;;;;;;;;;;;;;43537:287;;;;;;;;;;-1:-1:-1;43537:287:0;;;;;:::i;:::-;;:::i;64718:108::-;;;;;;;;;;-1:-1:-1;64718:108:0;;;;;:::i;:::-;;:::i;44623:370::-;;;;;;;;;;-1:-1:-1;44623:370:0;;;;;:::i;:::-;;:::i;65829:125::-;;;;;;;;;;-1:-1:-1;65829:125:0;;;;;:::i;:::-;;:::i;65011:99::-;;;;;;;;;;-1:-1:-1;65011:99:0;;;;;:::i;:::-;;:::i;64607:107::-;;;;;;;;;;-1:-1:-1;64607:107:0;;;;;:::i;:::-;;:::i;66628:339::-;;;;;;;;;;-1:-1:-1;66628:339:0;;;;;:::i;:::-;;:::i;69230:654::-;;;;;;:::i;:::-;;:::i;69013:195::-;;;;;;;;;;-1:-1:-1;69013:195:0;;;;;:::i;:::-;;:::i;61178:31::-;;;;;;;;;;;;;;;;63748:100;;;;;;;;;;-1:-1:-1;63748:100:0;;;;;:::i;:::-;;:::i;66257:128::-;;;;;;;;;;-1:-1:-1;66257:128:0;;;;;:::i;:::-;;:::i;66163:88::-;;;;;;;;;;-1:-1:-1;66163:88:0;;;;;:::i;:::-;;:::i;62521:113::-;;;;;;;;;;;;;:::i;43895:164::-;;;;;;;;;;-1:-1:-1;43895:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;44016:25:0;;;43992:4;44016:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;43895:164;66004:109;;;;;;;;;;-1:-1:-1;66004:109:0;;;;;:::i;:::-;;:::i;59597:201::-;;;;;;;;;;-1:-1:-1;59597:201:0;;;;;:::i;:::-;;:::i;66407:84::-;;;;;;;;;;-1:-1:-1;66407:84:0;;;;;:::i;:::-;;:::i;62327:165::-;62430:4;62450:36;62474:11;62450:23;:36::i;:::-;62443:43;62327:165;-1:-1:-1;;62327:165:0:o;62152:154::-;58577:13;:11;:13::i;:::-;62256:44:::1;62275:9;62286:13;62256:18;:44::i;:::-;62152:154:::0;;:::o;41757:100::-;41811:13;41844:5;41837:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41757:100;:::o;43261:204::-;43329:7;43354:16;43362:7;43354;:16::i;:::-;43349:64;;43379:34;;-1:-1:-1;;;43379:34:0;;;;;;;;;;;43349:64;-1:-1:-1;43433:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;43433:24:0;;43261:204::o;42823:372::-;42896:13;42912:24;42928:7;42912:15;:24::i;:::-;42896:40;;42957:5;-1:-1:-1;;;;;42951:11:0;:2;-1:-1:-1;;;;;42951:11:0;;42947:48;;;42971:24;;-1:-1:-1;;;42971:24:0;;;;;;;;;;;42947:48;35659:10;-1:-1:-1;;;;;43012:21:0;;;43008:139;;43039:37;43056:5;35659:10;43895:164;:::i;43039:37::-;43035:112;;43100:35;;-1:-1:-1;;;43100:35:0;;;;;;;;;;;43035:112;43159:28;43168:2;43172:7;43181:5;43159:8;:28::i;:::-;42885:310;42823:372;;:::o;65623:150::-;58577:13;:11;:13::i;:::-;65731:22:::1;::::0;;;:12:::1;:22;::::0;;;;65762:5;;65754:4;65731:28:::1;::::0;::::1;;;;;:::i;:::-;;:36;;;;;;;;;;;;:::i;:::-;;65623:150:::0;;;:::o;37882:312::-;38145:12;;62085:1;38129:13;:28;-1:-1:-1;;38129:46:0;;37882:312::o;44126:170::-;44260:28;44270:4;44276:2;44280:7;44260:9;:28::i;61299:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63882:90::-;58577:13;:11;:13::i;:::-;63947:11:::1;:19:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;63947:19:0;;::::1;::::0;;;::::1;::::0;;63882:90::o;29644:442::-;29741:7;29799:27;;;:17;:27;;;;;;;;29770:56;;;;;;;;;-1:-1:-1;;;;;29770:56:0;;;;;-1:-1:-1;;;29770:56:0;;;-1:-1:-1;;;;;29770:56:0;;;;;;;;29741:7;;29839:92;;-1:-1:-1;29890:29:0;;;;;;;;;29900:19;29890:29;-1:-1:-1;;;;;29890:29:0;;;;-1:-1:-1;;;29890:29:0;;-1:-1:-1;;;;;29890:29:0;;;;;29839:92;29981:23;;;;29943:21;;30452:5;;29968:36;;-1:-1:-1;;;;;29968:36:0;:10;:36;:::i;:::-;29967:58;;;;:::i;:::-;30046:16;;;;;-1:-1:-1;29644:442:0;;-1:-1:-1;;;;29644:442:0:o;69910:550::-;33953:1;34551:7;;:19;;34543:63;;;;-1:-1:-1;;;34543:63:0;;;;;;;:::i;:::-;;;;;;;;;33953:1;34684:7;:18;70000:19:::1;::::0;::::1;::::0;::::1;;;69992:52;;;::::0;-1:-1:-1;;;69992:52:0;;21034:2:1;69992:52:0::1;::::0;::::1;21016:21:1::0;21073:2;21053:18;;;21046:30;-1:-1:-1;;;21092:18:1;;;21085:50;21152:18;;69992:52:0::1;20832:344:1::0;69992:52:0::1;70076:7;70059:13;;:24;;70051:74;;;::::0;-1:-1:-1;;;70051:74:0;;23624:2:1;70051:74:0::1;::::0;::::1;23606:21:1::0;23663:2;23643:18;;;23636:30;23702:34;23682:18;;;23675:62;-1:-1:-1;;;23753:18:1;;;23746:35;23798:19;;70051:74:0::1;23422:401:1::0;70051:74:0::1;70167:10;70157:21;::::0;;;:9:::1;:21;::::0;;;;;:31:::1;::::0;70181:7;;70157:31:::1;:::i;:::-;70140:13;;:48;;70132:88;;;::::0;-1:-1:-1;;;70132:88:0;;24732:2:1;70132:88:0::1;::::0;::::1;24714:21:1::0;24771:2;24751:18;;;24744:30;24810:29;24790:18;;;24783:57;24857:18;;70132:88:0::1;24530:351:1::0;70132:88:0::1;70262:7;70248:11;;:21;;;;:::i;:::-;70235:9;:34;70227:71;;;::::0;-1:-1:-1;;;70227:71:0;;23271:2:1;70227:71:0::1;::::0;::::1;23253:21:1::0;23310:2;23290:18;;;23283:30;-1:-1:-1;;;23329:18:1;;;23322:54;23393:18;;70227:71:0::1;23069:348:1::0;70227:71:0::1;70343:9;;70324:13;:11;:13::i;:::-;70314:23;::::0;:7;:23:::1;:::i;:::-;70313:40;;70305:65;;;;-1:-1:-1::0;;;70305:65:0::1;;;;;;;:::i;:::-;70395:10;70385:21;::::0;;;:9:::1;:21;::::0;;;;:32;;70410:7;;70385:21;:32:::1;::::0;70410:7;;70385:32:::1;:::i;:::-;::::0;;;-1:-1:-1;70424:30:0::1;::::0;-1:-1:-1;70434:10:0::1;70446:7:::0;70424:9:::1;:30::i;:::-;-1:-1:-1::0;33909:1:0;34863:7;:22;69910:550::o;70611:661::-;58577:13;:11;:13::i;:::-;33953:1:::1;34551:7;;:19;;34543:63;;;;-1:-1:-1::0;;;34543:63:0::1;;;;;;;:::i;:::-;33953:1;34684:7;:18:::0;70934:15:::2;::::0;70917:7:::2;::::0;-1:-1:-1;;;;;70934:15:0::2;:29:::0;70931:232:::2;;71015:15;::::0;71007:63:::2;::::0;-1:-1:-1;;;;;71015:15:0;;::::2;::::0;71044:21:::2;::::0;71007:63:::2;::::0;;;71044:21;71015:15;71007:63:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70998:72;;;;;70931:232;;;58737:7:::0;58764:6;-1:-1:-1;;;;;58764:6:0;-1:-1:-1;;;;;71100:21:0::2;71129;71100:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;71091:64:0;;-1:-1:-1;;70931:232:0::2;71177:2;71169:11;;;::::0;::::2;44367:185:::0;44505:39;44522:4;44528:2;44532:7;44505:39;;;;;;;;;;;;:16;:39::i;70476:81::-;70531:20;70537:7;70546:4;70531:5;:20::i;:::-;70476:81;:::o;71313:475::-;71385:16;71410:23;71436:19;71446:8;71436:9;:19::i;:::-;71410:45;;71462:25;71504:15;-1:-1:-1;;;;;71490:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71490:30:0;-1:-1:-1;71462:58:0;-1:-1:-1;71596:18:0;62085:1;71625:136;71663:13;;71659:1;:17;71625:136;;;71707:18;;-1:-1:-1;;;71707:18:0;;;;;26855:25:1;;;71707:4:0;;:15;;26828:18:1;;71707::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;71695:30:0;:8;-1:-1:-1;;;;;71695:30:0;;71692:61;;;71752:1;71727:8;71736:12;;;;:::i;:::-;;;71727:22;;;;;;;;:::i;:::-;;;;;;:26;;;;;71692:61;71678:3;;;;:::i;:::-;;;;71625:136;;;-1:-1:-1;71774:8:0;;71313:475;-1:-1:-1;;;;71313:475:0:o;65293:100::-;58577:13;:11;:13::i;:::-;65367:20;;::::1;::::0;:13:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;12439:407::-:0;12569:26;;-1:-1:-1;;9900:2:1;9896:15;;;9892:53;12569:26:0;;;9880:66:1;12526:4:0;;;;9962:12:1;;12569:26:0;;;;;;;;;;;;12559:37;;;;;;12543:53;;12612:9;12607:192;12631:6;:13;12627:1;:17;12607:192;;;12682:6;12689:1;12682:9;;;;;;;;:::i;:::-;;;;;;;12674:5;:17;:113;;12769:6;12776:1;12769:9;;;;;;;;:::i;:::-;;;;;;;12780:5;12752:34;;;;;;;;10142:19:1;;;10186:2;10177:12;;10170:28;10223:2;10214:12;;9985:247;12752:34:0;;;;;;;;;;;;;12742:45;;;;;;12674:113;;;12721:5;12728:6;12735:1;12728:9;;;;;;;;:::i;:::-;;;;;;;12704:34;;;;;;;;10142:19:1;;;10186:2;10177:12;;10170:28;10223:2;10214:12;;9985:247;12704:34:0;;;;;;;;;;;;;12694:45;;;;;;12674:113;12666:121;-1:-1:-1;12646:3:0;;;;:::i;:::-;;;;12607:192;;;-1:-1:-1;12825:13:0;;12816:22;;12439:407;-1:-1:-1;;;12439:407:0:o;65447:121::-;58577:13;:11;:13::i;:::-;65537:17:::1;::::0;;;:11:::1;:17;::::0;;;;;;;:25;;::::1;::::0;;::::1;::::0;::::1;:::i;41565:125::-:0;41629:7;41656:21;41669:7;41656:12;:21::i;:::-;:26;;41565:125;-1:-1:-1;;41565:125:0:o;63444:176::-;58577:13;:11;:13::i;:::-;63545:10:::1;63528:13;:11;:13::i;:::-;:27;;63520:65;;;::::0;-1:-1:-1;;;63520:65:0;;20680:2:1;63520:65:0::1;::::0;::::1;20662:21:1::0;20719:2;20699:18;;;20692:30;20758:27;20738:18;;;20731:55;20803:18;;63520:65:0::1;20478:349:1::0;63520:65:0::1;63592:9;:22:::0;63444:176::o;39011:206::-;39075:7;-1:-1:-1;;;;;39099:19:0;;39095:60;;39127:28;;-1:-1:-1;;;39127:28:0;;;;;;;;;;;39095:60;-1:-1:-1;;;;;;39181:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;39181:27:0;;39011:206::o;59339:103::-;58577:13;:11;:13::i;:::-;59404:30:::1;59431:1;59404:18;:30::i;:::-;59339:103::o:0;64379:97::-;58577:13;:11;:13::i;:::-;64450::::1;:20:::0;64379:97::o;64480:::-;58577:13;:11;:13::i;:::-;64551::::1;:20:::0;64480:97::o;71851:243::-;71940:21;;-1:-1:-1;;;71940:21:0;;;;;26855:25:1;;;71920:7:0;;71940:4;;:12;;26828:18:1;;71940:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71940:21:0;;;;;;;;-1:-1:-1;;71940:21:0;;;;;;;;;;;;:::i;:::-;;;71936:153;;-1:-1:-1;72056:1:0;;71851:243;-1:-1:-1;71851:243:0:o;71936:153::-;71851:243;;;:::o;64855:115::-;58577:13;:11;:13::i;:::-;64935:29:::1;64952:11;12396:13:::0;:27;12321:110;63644:100;58577:13;:11;:13::i;:::-;63716:11:::1;:22:::0;63644:100::o;66973:326::-;67038:13;67068:17;67076:8;67068:7;:17::i;:::-;67060:61;;;;-1:-1:-1;;;67060:61:0;;21742:2:1;67060:61:0;;;21724:21:1;21781:2;21761:18;;;21754:30;21820:33;21800:18;;;21793:61;21871:18;;67060:61:0;21540:355:1;67060:61:0;67131:11;;;;;;;67128:142;;;67186:17;:15;:17::i;:::-;67205:39;67234:6;;67223:8;:17;;;;:::i;:::-;67222:21;;67242:1;67222:21;:::i;:::-;67205:16;:39::i;:::-;67246:14;67169:92;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67155:107;;66973:326;;;:::o;67128:142::-;67283:10;67276:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66973:326;;;:::o;63291:116::-;58577:13;:11;:13::i;:::-;63368:15:::1;:33:::0;;-1:-1:-1;;;;;;63368:33:0::1;-1:-1:-1::0;;;;;63368:33:0;;;::::1;::::0;;;::::1;::::0;;63291:116::o;41926:104::-;41982:13;42015:7;42008:14;;;;;:::i;43537:287::-;-1:-1:-1;;;;;43636:24:0;;35659:10;43636:24;43632:54;;;43669:17;;-1:-1:-1;;;43669:17:0;;;;;;;;;;;43632:54;35659:10;43699:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;43699:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;43699:53:0;;;;;;;;;;43768:48;;19841:41:1;;;43699:42:0;;35659:10;43768:48;;19814:18:1;43768:48:0;;;;;;;43537:287;;:::o;64718:108::-;58577:13;:11;:13::i;:::-;64793:19:::1;:27:::0;;;::::1;;;;-1:-1:-1::0;;64793:27:0;;::::1;::::0;;;::::1;::::0;;64718:108::o;44623:370::-;44790:28;44800:4;44806:2;44810:7;44790:9;:28::i;:::-;-1:-1:-1;;;;;44833:13:0;;1564:19;:23;44829:157;;44854:56;44885:4;44891:2;44895:7;44904:5;44854:30;:56::i;:::-;44850:136;;44934:40;;-1:-1:-1;;;44934:40:0;;;;;;;;;;;65829:125;58577:13;:11;:13::i;:::-;65921:27;;::::1;::::0;:12:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;65011:99::-:0;58577:13;:11;:13::i;:::-;65087:17;;::::1;::::0;:10:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;64607:107::-:0;58577:13;:11;:13::i;:::-;64685:15:::1;:23:::0;;-1:-1:-1;;64685:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;64607:107::o;66628:339::-;66702:13;66732:17;66740:8;66732:7;:17::i;:::-;66724:61;;;;-1:-1:-1;;;66724:61:0;;21742:2:1;66724:61:0;;;21724:21:1;21781:2;21761:18;;;21754:30;21820:33;21800:18;;;21793:61;21871:18;;66724:61:0;21540:355:1;66724:61:0;66795:8;;;;;;;66792:69;;66832:21;66844:8;66832:11;:21::i;66792:69::-;66898:17;:15;:17::i;:::-;66917:26;66934:8;66917:16;:26::i;69230:654::-;33953:1;34551:7;;:19;;34543:63;;;;-1:-1:-1;;;34543:63:0;;;;;;;:::i;:::-;33953:1;34684:7;:18;69348:15:::1;::::0;::::1;;69340:51;;;::::0;-1:-1:-1;;;69340:51:0;;26205:2:1;69340:51:0::1;::::0;::::1;26187:21:1::0;26244:2;26224:18;;;26217:30;26283:25;26263:18;;;26256:53;26326:18;;69340:51:0::1;26003:347:1::0;69340:51:0::1;69406:33;69420:10;69432:6;69406:13;:33::i;:::-;69398:70;;;::::0;-1:-1:-1;;;69398:70:0;;22918:2:1;69398:70:0::1;::::0;::::1;22900:21:1::0;22957:2;22937:18;;;22930:30;22996:26;22976:18;;;22969:54;23040:18;;69398:70:0::1;22716:348:1::0;69398:70:0::1;69500:7;69483:13;;:24;;69475:77;;;::::0;-1:-1:-1;;;69475:77:0;;22509:2:1;69475:77:0::1;::::0;::::1;22491:21:1::0;22548:2;22528:18;;;22521:30;22587:34;22567:18;;;22560:62;-1:-1:-1;;;22638:18:1;;;22631:38;22686:19;;69475:77:0::1;22307:404:1::0;69475:77:0::1;69594:10;69584:21;::::0;;;:9:::1;:21;::::0;;;;;:31:::1;::::0;69608:7;;69584:31:::1;:::i;:::-;69567:13;;:48;;69559:91;;;::::0;-1:-1:-1;;;69559:91:0;;21383:2:1;69559:91:0::1;::::0;::::1;21365:21:1::0;21422:2;21402:18;;;21395:30;21461:32;21441:18;;;21434:60;21511:18;;69559:91:0::1;21181:354:1::0;69559:91:0::1;69692:7;69678:11;;:21;;;;:::i;:::-;69665:9;:34;69657:71;;;::::0;-1:-1:-1;;;69657:71:0;;23271:2:1;69657:71:0::1;::::0;::::1;23253:21:1::0;23310:2;23290:18;;;23283:30;-1:-1:-1;;;23329:18:1;;;23322:54;23393:18;;69657:71:0::1;23069:348:1::0;69657:71:0::1;69773:9;;69754:13;:11;:13::i;:::-;69744:23;::::0;:7;:23:::1;:::i;:::-;69743:40;;69735:65;;;;-1:-1:-1::0;;;69735:65:0::1;;;;;;;:::i;:::-;69819:10;69809:21;::::0;;;:9:::1;:21;::::0;;;;:32;;69834:7;;69809:21;:32:::1;::::0;69834:7;;69809:32:::1;:::i;:::-;::::0;;;-1:-1:-1;69848:30:0::1;::::0;-1:-1:-1;69858:10:0::1;69870:7:::0;69848:9:::1;:30::i;:::-;-1:-1:-1::0;;33909:1:0;34863:7;:22;69230:654::o;69013:195::-;58577:13;:11;:13::i;:::-;69140:9:::1;;69121:13;:11;:13::i;:::-;69111:23;::::0;:7;:23:::1;:::i;:::-;69110:40;;69102:65;;;;-1:-1:-1::0;;;69102:65:0::1;;;;;;;:::i;:::-;69174:28;69184:8;69194:7;69174:9;:28::i;63748:100::-:0;58577:13;:11;:13::i;:::-;63820:11:::1;:22:::0;63748:100::o;66257:128::-;58577:13;:11;:13::i;:::-;66345:34;;::::1;::::0;:14:::1;::::0;:34:::1;::::0;::::1;::::0;::::1;:::i;66163:88::-:0;58577:13;:11;:13::i;:::-;66229:8:::1;:16:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;66229:16:0;;::::1;::::0;;;::::1;::::0;;66163:88::o;62521:113::-;62575:13;62608:20;:18;:20::i;:::-;62601:27;;62521:113;:::o;66004:109::-;58577:13;:11;:13::i;:::-;66086:21;;::::1;::::0;:9:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;59597:201::-:0;58577:13;:11;:13::i;:::-;-1:-1:-1;;;;;59686:22:0;::::1;59678:73;;;::::0;-1:-1:-1;;;59678:73:0;;22102:2:1;59678:73:0::1;::::0;::::1;22084:21:1::0;22141:2;22121:18;;;22114:30;22180:34;22160:18;;;22153:62;-1:-1:-1;;;22231:18:1;;;22224:36;22277:19;;59678:73:0::1;21900:402:1::0;59678:73:0::1;59762:28;59781:8;59762:18;:28::i;66407:84::-:0;58577:13;:11;:13::i;:::-;66470:6:::1;:15:::0;66407:84::o;29374:215::-;29476:4;-1:-1:-1;;;;;;29500:41:0;;-1:-1:-1;;;29500:41:0;;:81;;;29545:36;29569:11;29545:23;:36::i;58856:132::-;58737:7;58764:6;-1:-1:-1;;;;;58764:6:0;35659:10;58920:23;58912:68;;;;-1:-1:-1;;;58912:68:0;;24030:2:1;58912:68:0;;;24012:21:1;;;24049:18;;;24042:30;24108:34;24088:18;;;24081:62;24160:18;;58912:68:0;23828:356:1;30736:332:0;30452:5;-1:-1:-1;;;;;30839:33:0;;;;30831:88;;;;-1:-1:-1;;;30831:88:0;;25088:2:1;30831:88:0;;;25070:21:1;25127:2;25107:18;;;25100:30;25166:34;25146:18;;;25139:62;-1:-1:-1;;;25217:18:1;;;25210:40;25267:19;;30831:88:0;24886:406:1;30831:88:0;-1:-1:-1;;;;;30938:22:0;;30930:60;;;;-1:-1:-1;;;30930:60:0;;26557:2:1;30930:60:0;;;26539:21:1;26596:2;26576:18;;;26569:30;26635:27;26615:18;;;26608:55;26680:18;;30930:60:0;26355:349:1;30930:60:0;31025:35;;;;;;;;;-1:-1:-1;;;;;31025:35:0;;;;;;-1:-1:-1;;;;;31025:35:0;;;;;;;;;;-1:-1:-1;;;31003:57:0;;;;:19;:57;30736:332::o;45248:174::-;45305:4;45348:7;62085:1;45329:26;;:53;;;;;45369:13;;45359:7;:23;45329:53;:85;;;;-1:-1:-1;;45387:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;45387:27:0;;;;45386:28;;45248:174::o;54470:196::-;54585:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;54585:29:0;-1:-1:-1;;;;;54585:29:0;;;;;;;;;54630:28;;54585:24;;54630:28;;;;;;;54470:196;;;:::o;49418:2130::-;49533:35;49571:21;49584:7;49571:12;:21::i;:::-;49533:59;;49631:4;-1:-1:-1;;;;;49609:26:0;:13;:18;;;-1:-1:-1;;;;;49609:26:0;;49605:67;;49644:28;;-1:-1:-1;;;49644:28:0;;;;;;;;;;;49605:67;49685:22;35659:10;-1:-1:-1;;;;;49711:20:0;;;;:73;;-1:-1:-1;49748:36:0;49765:4;35659:10;43895:164;:::i;49748:36::-;49711:126;;;-1:-1:-1;35659:10:0;49801:20;49813:7;49801:11;:20::i;:::-;-1:-1:-1;;;;;49801:36:0;;49711:126;49685:153;;49856:17;49851:66;;49882:35;;-1:-1:-1;;;49882:35:0;;;;;;;;;;;49851:66;-1:-1:-1;;;;;49932:16:0;;49928:52;;49957:23;;-1:-1:-1;;;49957:23:0;;;;;;;;;;;49928:52;50101:35;50118:1;50122:7;50131:4;50101:8;:35::i;:::-;-1:-1:-1;;;;;50432:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;50432:31:0;;;-1:-1:-1;;;;;50432:31:0;;;-1:-1:-1;;50432:31:0;;;;;;;50478:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;50478:29:0;;;;;;;;;;;50558:20;;;:11;:20;;;;;;50593:18;;-1:-1:-1;;;;;;50626:49:0;;;;-1:-1:-1;;;50659:15:0;50626:49;;;;;;;;;;50949:11;;51009:24;;;;;51052:13;;50558:20;;51009:24;;51052:13;51048:384;;51262:13;;51247:11;:28;51243:174;;51300:20;;51369:28;;;;-1:-1:-1;;;;;51343:54:0;-1:-1:-1;;;51343:54:0;-1:-1:-1;;;;;;51343:54:0;;;-1:-1:-1;;;;;51300:20:0;;51343:54;;;;51243:174;50407:1036;;;51479:7;51475:2;-1:-1:-1;;;;;51460:27:0;51469:4;-1:-1:-1;;;;;51460:27:0;-1:-1:-1;;;;;;;;;;;51460:27:0;;;;;;;;;49522:2026;;49418:2130;;;:::o;45506:104::-;45575:27;45585:2;45589:8;45575:27;;;;;;;;;;;;:9;:27::i;51944:2408::-;52024:35;52062:21;52075:7;52062:12;:21::i;:::-;52111:18;;52024:59;;-1:-1:-1;52142:290:0;;;;52176:22;35659:10;-1:-1:-1;;;;;52202:20:0;;;;:77;;-1:-1:-1;52243:36:0;52260:4;35659:10;43895:164;:::i;52243:36::-;52202:134;;;-1:-1:-1;35659:10:0;52300:20;52312:7;52300:11;:20::i;:::-;-1:-1:-1;;;;;52300:36:0;;52202:134;52176:161;;52359:17;52354:66;;52385:35;;-1:-1:-1;;;52385:35:0;;;;;;;;;;;52354:66;52161:271;52142:290;52560:35;52577:1;52581:7;52590:4;52560:8;:35::i;:::-;-1:-1:-1;;;;;52925:18:0;;;52891:31;52925:18;;;:12;:18;;;;;;;;52958:24;;-1:-1:-1;;;;;;;;;;52958:24:0;;;;;;;;;-1:-1:-1;;52958:24:0;;;;52997:29;;;;;52981:1;52997:29;;;;;;;;-1:-1:-1;;52997:29:0;;;;;;;;;;53159:20;;;:11;:20;;;;;;53194;;-1:-1:-1;;;;53262:15:0;53229:49;;;-1:-1:-1;;;53229:49:0;-1:-1:-1;;;;;;53229:49:0;;;;;;;;;;53293:22;-1:-1:-1;;;53293:22:0;;;53585:11;;;53645:24;;;;;53688:13;;52925:18;;53645:24;;53688:13;53684:384;;53898:13;;53883:11;:28;53879:174;;53936:20;;54005:28;;;;-1:-1:-1;;;;;53979:54:0;-1:-1:-1;;;53979:54:0;-1:-1:-1;;;;;;53979:54:0;;;-1:-1:-1;;;;;53936:20:0;;53979:54;;;;53879:174;-1:-1:-1;;54096:35:0;;54123:7;;-1:-1:-1;54119:1:0;;-1:-1:-1;;;;;;54096:35:0;;;-1:-1:-1;;;;;;;;;;;54096:35:0;54119:1;;54096:35;-1:-1:-1;;54319:12:0;:14;;;;;;-1:-1:-1;;51944:2408:0:o;40392:1111::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;40503:7:0;;62085:1;40552:23;40548:888;;40588:13;;40581:4;:20;40577:859;;;40622:31;40656:17;;;:11;:17;;;;;;;;;40622:51;;;;;;;;;-1:-1:-1;;;;;40622:51:0;;;;-1:-1:-1;;;40622:51:0;;-1:-1:-1;;;;;40622:51:0;;;;;;;;-1:-1:-1;;;40622:51:0;;;;;;;;;;;;;;40692:729;;40742:14;;-1:-1:-1;;;;;40742:28:0;;40738:101;;40806:9;40392:1111;-1:-1:-1;;;40392:1111:0:o;40738:101::-;-1:-1:-1;;;41181:6:0;41226:17;;;;:11;:17;;;;;;;;;41214:29;;;;;;;;;-1:-1:-1;;;;;41214:29:0;;;;;-1:-1:-1;;;41214:29:0;;-1:-1:-1;;;;;41214:29:0;;;;;;;;-1:-1:-1;;;41214:29:0;;;;;;;;;;;;;41274:28;41270:109;;41342:9;40392:1111;-1:-1:-1;;;40392:1111:0:o;41270:109::-;41141:261;;;40603:833;40577:859;41464:31;;-1:-1:-1;;;41464:31:0;;;;;;;;;;;59958:191;60032:16;60051:6;;-1:-1:-1;;;;;60068:17:0;;;-1:-1:-1;;;;;;60068:17:0;;;;;;60101:40;;60051:6;;;;;;;60101:40;;60032:16;60101:40;60021:128;59958:191;:::o;66525:97::-;66575:13;66603;66596:20;;;;;:::i;10073:723::-;10129:13;10350:10;10346:53;;-1:-1:-1;;10377:10:0;;;;;;;;;;;;-1:-1:-1;;;10377:10:0;;;;;10073:723::o;10346:53::-;10424:5;10409:12;10465:78;10472:9;;10465:78;;10498:8;;;;:::i;:::-;;-1:-1:-1;10521:10:0;;-1:-1:-1;10529:2:0;10521:10;;:::i;:::-;;;10465:78;;;10553:19;10585:6;-1:-1:-1;;;;;10575:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10575:17:0;;10553:39;;10603:154;10610:10;;10603:154;;10637:11;10647:1;10637:11;;:::i;:::-;;-1:-1:-1;10706:10:0;10714:2;10706:5;:10;:::i;:::-;10693:24;;:2;:24;:::i;:::-;10680:39;;10663:6;10670;10663:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;10663:56:0;;;;;;;;-1:-1:-1;10734:11:0;10743:2;10734:11;;:::i;:::-;;;10603:154;;;10781:6;10073:723;-1:-1:-1;;;;10073:723:0:o;55158:667::-;55342:72;;-1:-1:-1;;;55342:72:0;;55321:4;;-1:-1:-1;;;;;55342:36:0;;;;;:72;;35659:10;;55393:4;;55399:7;;55408:5;;55342:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55342:72:0;;;;;;;;-1:-1:-1;;55342:72:0;;;;;;;;;;;;:::i;:::-;;;55338:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55576:13:0;;55572:235;;55622:40;;-1:-1:-1;;;55622:40:0;;;;;;;;;;;55572:235;55765:6;55759:13;55750:6;55746:2;55742:15;55735:38;55338:480;-1:-1:-1;;;;;;55461:55:0;-1:-1:-1;;;55461:55:0;;-1:-1:-1;55158:667:0;;;;;;:::o;67305:1651::-;67367:13;67398:19;67407:8;67398:7;:19::i;:::-;67389:51;;;;-1:-1:-1;;;67389:51:0;;25859:2:1;67389:51:0;;;25841:21:1;25898:2;25878:18;;;25871:30;-1:-1:-1;;;25917:18:1;;;25910:47;25974:18;;67389:51:0;25657:341:1;67389:51:0;67466:22;67530:9;67541:26;67558:8;67541:16;:26::i;:::-;67491:88;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67466:113;;67614:22;67685:12;67639:70;;;;;;;;:::i;:::-;;;;;;;;;;;;;67614:95;;67738:23;67804:18;67813:8;67804;:18::i;:::-;67764:70;;;;;;;;:::i;:::-;;;;-1:-1:-1;;67764:70:0;;;;;;;67866:29;;;;;:24;:29;;67764:70;-1:-1:-1;67919:1:0;67905:477;67924:2;67922:1;:4;67905:477;;;67998:9;;;;;;;;;;;;:16;67952:12;:31;67976:6;;67965:8;:17;;;;:::i;:::-;67952:31;;;;;;;;;;;67984:1;67952:34;;;;;;;:::i;:::-;;67946:48;;;;;:::i;:::-;;;:68;67943:432;;68037:1;68033;:5;68030:131;;;68115:11;68072:73;;;;;;;;:::i;:::-;;;;;;;;;;;;;68058:87;;68030:131;68256:14;;;;:11;:14;;;;;68332:6;;68224:11;;68308:12;;68321:17;;:8;:17;:::i;:::-;68308:31;;;;;;;;;;;68340:1;68308:34;;;;;;;:::i;:::-;;68189:174;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68175:188;;67943:432;67928:3;;;;:::i;:::-;;;;67905:477;;;;68415:23;68485:11;68441:67;;;;;;;;:::i;:::-;;;;;;;;;;;;;68415:93;;68536:24;68608:10;68638:9;68667;68696:10;68563:164;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68536:191;;68761:26;68867:28;68882:11;68867:13;:28::i;:::-;68790:116;;;;;;;;:::i;:::-;;;;-1:-1:-1;;68790:116:0;;;;;;;;;;67305:1651;-1:-1:-1;;;;;;;;;67305:1651:0:o;62660:567::-;62713:13;62736:16;;62781:32;62736:16;30452:5;62781:11;:32::i;:::-;62735:78;;;;62922:283;63034:33;63051:15;63034:16;:33::i;:::-;63109:51;63145:8;-1:-1:-1;;;;;63129:26:0;63157:2;63109:19;:51::i;:::-;62968:213;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62922:13;:283::i;:::-;62853:361;;;;;;;;:::i;:::-;;;;;;;;;;;;;62831:390;;;;62660:567;:::o;38642:305::-;38744:4;-1:-1:-1;;;;;;38781:40:0;;-1:-1:-1;;;38781:40:0;;:105;;-1:-1:-1;;;;;;;38838:48:0;;-1:-1:-1;;;38838:48:0;38781:105;:158;;;-1:-1:-1;;;;;;;;;;27035:40:0;;;38903:36;26926:157;45983:1749;46129:13;;-1:-1:-1;;;;;46157:16:0;;46153:48;;46182:19;;-1:-1:-1;;;46182:19:0;;;;;;;;;;;46153:48;46216:13;46212:44;;46238:18;;-1:-1:-1;;;46238:18:0;;;;;;;;;;;46212:44;-1:-1:-1;;;;;46607:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;46666:49:0;;-1:-1:-1;;;;;46607:44:0;;;;;;;46666:49;;;;-1:-1:-1;;46607:44:0;;;;;;46666:49;;;;;;;;;;;;;;;;46732:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;46782:66:0;;;-1:-1:-1;;;46832:15:0;46782:66;;;;;;;;;;;;;46732:25;;46929:23;;;;1564:19;:23;46969:631;;47009:313;47040:38;;47065:12;;-1:-1:-1;;;;;47040:38:0;;;47057:1;;-1:-1:-1;;;;;;;;;;;47040:38:0;47057:1;;47040:38;47106:69;47145:1;47149:2;47153:14;;;;;;47169:5;47106:30;:69::i;:::-;47101:174;;47211:40;;-1:-1:-1;;;47211:40:0;;;;;;;;;;;47101:174;47317:3;47302:12;:18;47009:313;;47403:12;47386:13;;:29;47382:43;;47417:8;;;47382:43;46969:631;;;47466:119;47497:40;;47522:14;;;;;-1:-1:-1;;;;;47497:40:0;;;47514:1;;-1:-1:-1;;;;;;;;;;;47497:40:0;47514:1;;47497:40;47580:3;47565:12;:18;47466:119;;46969:631;-1:-1:-1;47614:13:0;:28;47664:60;47693:1;47697:2;47701:12;47715:8;47664:60;:::i;13397:3097::-;13455:13;13692:4;:11;13707:1;13692:16;13688:31;;;-1:-1:-1;;13710:9:0;;;;;;;;;-1:-1:-1;13710:9:0;;;13397:3097::o;13688:31::-;13772:19;13794:6;;;;;;;;;;;;;;;;;13772:28;;14211:20;14270:1;14251:4;:11;14265:1;14251:15;;;;:::i;:::-;14250:21;;;;:::i;:::-;14245:27;;:1;:27;:::i;:::-;-1:-1:-1;;;;;14234:39:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14234:39:0;;14211:62;;14453:1;14446:5;14442:13;14557:2;14549:6;14545:15;14668:4;14720;14714:11;14708:4;14704:22;14630:1432;14754:6;14745:7;14742:19;14630:1432;;;14860:1;14851:7;14847:15;14836:26;;14899:7;14893:14;15552:4;15544:5;15540:2;15536:14;15532:25;15522:8;15518:40;15512:47;15501:9;15493:67;15606:1;15595:9;15591:17;15578:30;;15698:4;15690:5;15686:2;15682:14;15678:25;15668:8;15664:40;15658:47;15647:9;15639:67;15752:1;15741:9;15737:17;15724:30;;15843:4;15835:5;15832:1;15828:13;15824:24;15814:8;15810:39;15804:46;15793:9;15785:66;15897:1;15886:9;15882:17;15869:30;;15980:4;15973:5;15969:16;15959:8;15955:31;15949:38;15938:9;15930:58;;16034:1;16023:9;16019:17;16006:30;;14630:1432;;;14634:107;;16224:1;16217:4;16211:11;16207:19;16245:1;16240:123;;;;16382:1;16377:73;;;;16200:250;;16240:123;16293:4;16289:1;16278:9;16274:17;16266:32;16343:4;16339:1;16328:9;16324:17;16316:32;16240:123;;16377:73;16430:4;16426:1;16415:9;16411:17;16403:32;16200:250;-1:-1:-1;16480:6:0;;13397:3097;-1:-1:-1;;;;;13397:3097:0:o;11374:451::-;11449:13;11475:19;11507:10;11511:6;11507:1;:10;:::i;:::-;:14;;11520:1;11507:14;:::i;:::-;-1:-1:-1;;;;;11497:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11497:25:0;;11475:47;;-1:-1:-1;;;11533:6:0;11540:1;11533:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;11533:15:0;;;;;;;;;-1:-1:-1;;;11559:6:0;11566:1;11559:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;11559:15:0;;;;;;;;-1:-1:-1;11590:9:0;11602:10;11606:6;11602:1;:10;:::i;:::-;:14;;11615:1;11602:14;:::i;:::-;11590:26;;11585:135;11622:1;11618;:5;11585:135;;;-1:-1:-1;;;11670:5:0;11678:3;11670:11;11657:25;;;;;;;:::i;:::-;;;;11645:6;11652:1;11645:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;11645:37:0;;;;;;;;-1:-1:-1;11707:1:0;11697:11;;;;;11625:3;;;:::i;:::-;;;11585:135;;;-1:-1:-1;11738:10:0;;11730:55;;;;-1:-1:-1;;;11730:55:0;;20319:2:1;11730:55:0;;;20301:21:1;;;20338:18;;;20331:30;20397:34;20377:18;;;20370:62;20449:18;;11730:55:0;20117:356:1;11730:55:0;11810:6;11374:451;-1:-1:-1;;;11374:451:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:723::-;479:5;532:3;525:4;517:6;513:17;509:27;499:55;;550:1;547;540:12;499:55;586:6;573:20;612:4;-1:-1:-1;;;;;631:2:1;628:26;625:52;;;657:18;;:::i;:::-;703:2;700:1;696:10;726:28;750:2;746;742:11;726:28;:::i;:::-;788:15;;;819:12;;;;851:15;;;885;;;881:24;;878:33;-1:-1:-1;875:53:1;;;924:1;921;914:12;875:53;946:1;937:10;;956:163;970:2;967:1;964:9;956:163;;;1027:17;;1015:30;;988:1;981:9;;;;;1065:12;;;;1097;;956:163;;;-1:-1:-1;1137:5:1;425:723;-1:-1:-1;;;;;;;425:723:1:o;1153:160::-;1218:20;;1274:13;;1267:21;1257:32;;1247:60;;1303:1;1300;1293:12;1318:221;1361:5;1414:3;1407:4;1399:6;1395:17;1391:27;1381:55;;1432:1;1429;1422:12;1381:55;1454:79;1529:3;1520:6;1507:20;1500:4;1492:6;1488:17;1454:79;:::i;1544:247::-;1603:6;1656:2;1644:9;1635:7;1631:23;1627:32;1624:52;;;1672:1;1669;1662:12;1624:52;1711:9;1698:23;1730:31;1755:5;1730:31;:::i;1796:251::-;1866:6;1919:2;1907:9;1898:7;1894:23;1890:32;1887:52;;;1935:1;1932;1925:12;1887:52;1967:9;1961:16;1986:31;2011:5;1986:31;:::i;2052:388::-;2120:6;2128;2181:2;2169:9;2160:7;2156:23;2152:32;2149:52;;;2197:1;2194;2187:12;2149:52;2236:9;2223:23;2255:31;2280:5;2255:31;:::i;:::-;2305:5;-1:-1:-1;2362:2:1;2347:18;;2334:32;2375:33;2334:32;2375:33;:::i;:::-;2427:7;2417:17;;;2052:388;;;;;:::o;2445:456::-;2522:6;2530;2538;2591:2;2579:9;2570:7;2566:23;2562:32;2559:52;;;2607:1;2604;2597:12;2559:52;2646:9;2633:23;2665:31;2690:5;2665:31;:::i;:::-;2715:5;-1:-1:-1;2772:2:1;2757:18;;2744:32;2785:33;2744:32;2785:33;:::i;:::-;2445:456;;2837:7;;-1:-1:-1;;;2891:2:1;2876:18;;;;2863:32;;2445:456::o;2906:794::-;3001:6;3009;3017;3025;3078:3;3066:9;3057:7;3053:23;3049:33;3046:53;;;3095:1;3092;3085:12;3046:53;3134:9;3121:23;3153:31;3178:5;3153:31;:::i;:::-;3203:5;-1:-1:-1;3260:2:1;3245:18;;3232:32;3273:33;3232:32;3273:33;:::i;:::-;3325:7;-1:-1:-1;3379:2:1;3364:18;;3351:32;;-1:-1:-1;3434:2:1;3419:18;;3406:32;-1:-1:-1;;;;;3450:30:1;;3447:50;;;3493:1;3490;3483:12;3447:50;3516:22;;3569:4;3561:13;;3557:27;-1:-1:-1;3547:55:1;;3598:1;3595;3588:12;3547:55;3621:73;3686:7;3681:2;3668:16;3663:2;3659;3655:11;3621:73;:::i;:::-;3611:83;;;2906:794;;;;;;;:::o;3705:483::-;3798:6;3806;3859:2;3847:9;3838:7;3834:23;3830:32;3827:52;;;3875:1;3872;3865:12;3827:52;3914:9;3901:23;3933:31;3958:5;3933:31;:::i;:::-;3983:5;-1:-1:-1;4039:2:1;4024:18;;4011:32;-1:-1:-1;;;;;4055:30:1;;4052:50;;;4098:1;4095;4088:12;4052:50;4121:61;4174:7;4165:6;4154:9;4150:22;4121:61;:::i;:::-;4111:71;;;3705:483;;;;;:::o;4193:315::-;4258:6;4266;4319:2;4307:9;4298:7;4294:23;4290:32;4287:52;;;4335:1;4332;4325:12;4287:52;4374:9;4361:23;4393:31;4418:5;4393:31;:::i;:::-;4443:5;-1:-1:-1;4467:35:1;4498:2;4483:18;;4467:35;:::i;:::-;4457:45;;4193:315;;;;;:::o;4513:::-;4581:6;4589;4642:2;4630:9;4621:7;4617:23;4613:32;4610:52;;;4658:1;4655;4648:12;4610:52;4697:9;4684:23;4716:31;4741:5;4716:31;:::i;:::-;4766:5;4818:2;4803:18;;;;4790:32;;-1:-1:-1;;;4513:315:1:o;4833:435::-;4900:6;4908;4961:2;4949:9;4940:7;4936:23;4932:32;4929:52;;;4977:1;4974;4967:12;4929:52;5016:9;5003:23;5035:31;5060:5;5035:31;:::i;:::-;5085:5;-1:-1:-1;5142:2:1;5127:18;;5114:32;-1:-1:-1;;;;;5177:40:1;;5165:53;;5155:81;;5232:1;5229;5222:12;5273:180;5329:6;5382:2;5370:9;5361:7;5357:23;5353:32;5350:52;;;5398:1;5395;5388:12;5350:52;5421:26;5437:9;5421:26;:::i;5458:180::-;5517:6;5570:2;5558:9;5549:7;5545:23;5541:32;5538:52;;;5586:1;5583;5576:12;5538:52;-1:-1:-1;5609:23:1;;5458:180;-1:-1:-1;5458:180:1:o;5643:245::-;5701:6;5754:2;5742:9;5733:7;5729:23;5725:32;5722:52;;;5770:1;5767;5760:12;5722:52;5809:9;5796:23;5828:30;5852:5;5828:30;:::i;5893:249::-;5962:6;6015:2;6003:9;5994:7;5990:23;5986:32;5983:52;;;6031:1;6028;6021:12;5983:52;6063:9;6057:16;6082:30;6106:5;6082:30;:::i;6147:322::-;6216:6;6269:2;6257:9;6248:7;6244:23;6240:32;6237:52;;;6285:1;6282;6275:12;6237:52;6325:9;6312:23;-1:-1:-1;;;;;6350:6:1;6347:30;6344:50;;;6390:1;6387;6380:12;6344:50;6413;6455:7;6446:6;6435:9;6431:22;6413:50;:::i;6659:315::-;6727:6;6735;6788:2;6776:9;6767:7;6763:23;6759:32;6756:52;;;6804:1;6801;6794:12;6756:52;6840:9;6827:23;6817:33;;6900:2;6889:9;6885:18;6872:32;6913:31;6938:5;6913:31;:::i;6979:416::-;7072:6;7080;7133:2;7121:9;7112:7;7108:23;7104:32;7101:52;;;7149:1;7146;7139:12;7101:52;7185:9;7172:23;7162:33;;7246:2;7235:9;7231:18;7218:32;-1:-1:-1;;;;;7265:6:1;7262:30;7259:50;;;7305:1;7302;7295:12;7400:390;7478:6;7486;7539:2;7527:9;7518:7;7514:23;7510:32;7507:52;;;7555:1;7552;7545:12;7507:52;7591:9;7578:23;7568:33;;7652:2;7641:9;7637:18;7624:32;-1:-1:-1;;;;;7671:6:1;7668:30;7665:50;;;7711:1;7708;7701:12;7665:50;7734;7776:7;7767:6;7756:9;7752:22;7734:50;:::i;7795:248::-;7863:6;7871;7924:2;7912:9;7903:7;7899:23;7895:32;7892:52;;;7940:1;7937;7930:12;7892:52;-1:-1:-1;;7963:23:1;;;8033:2;8018:18;;;8005:32;;-1:-1:-1;7795:248:1:o;8048:458::-;8135:6;8143;8151;8204:2;8192:9;8183:7;8179:23;8175:32;8172:52;;;8220:1;8217;8210:12;8172:52;8256:9;8243:23;8233:33;;8313:2;8302:9;8298:18;8285:32;8275:42;;8368:2;8357:9;8353:18;8340:32;-1:-1:-1;;;;;8387:6:1;8384:30;8381:50;;;8427:1;8424;8417:12;8381:50;8450;8492:7;8483:6;8472:9;8468:22;8450:50;:::i;:::-;8440:60;;;8048:458;;;;;:::o;8511:257::-;8552:3;8590:5;8584:12;8617:6;8612:3;8605:19;8633:63;8689:6;8682:4;8677:3;8673:14;8666:4;8659:5;8655:16;8633:63;:::i;:::-;8750:2;8729:15;-1:-1:-1;;8725:29:1;8716:39;;;;8757:4;8712:50;;8511:257;-1:-1:-1;;8511:257:1:o;8773:973::-;8858:12;;8823:3;;8913:1;8933:18;;;;8986;;;;9013:61;;9067:4;9059:6;9055:17;9045:27;;9013:61;9093:2;9141;9133:6;9130:14;9110:18;9107:38;9104:161;;;9187:10;9182:3;9178:20;9175:1;9168:31;9222:4;9219:1;9212:15;9250:4;9247:1;9240:15;9104:161;9281:18;9308:104;;;;9426:1;9421:319;;;;9274:466;;9308:104;-1:-1:-1;;9341:24:1;;9329:37;;9386:16;;;;-1:-1:-1;9308:104:1;;9421:319;27244:1;27237:14;;;27281:4;27268:18;;9515:1;9529:165;9543:6;9540:1;9537:13;9529:165;;;9621:14;;9608:11;;;9601:35;9664:16;;;;9558:10;;9529:165;;;9533:3;;9723:6;9718:3;9714:16;9707:23;;9274:466;;;;;;;8773:973;;;;:::o;10237:1128::-;10860:3;10898:6;10892:13;10914:53;10960:6;10955:3;10948:4;10940:6;10936:17;10914:53;:::i;:::-;-1:-1:-1;;;10989:16:1;;;11014:57;;;11090:49;11135:2;11124:14;;11116:6;11090:49;:::i;:::-;-1:-1:-1;;;11148:26:1;;-1:-1:-1;;;11198:1:1;11190:10;;11183:50;11080:59;-1:-1:-1;11252:46:1;11294:2;11286:11;;11278:6;11252:46;:::i;:::-;-1:-1:-1;;;11307:26:1;;11357:1;11349:10;;10237:1128;-1:-1:-1;;;;;;10237:1128:1:o;11370:550::-;11594:3;11632:6;11626:13;11648:53;11694:6;11689:3;11682:4;11674:6;11670:17;11648:53;:::i;:::-;11764:13;;11723:16;;;;11786:57;11764:13;11723:16;11820:4;11808:17;;11786:57;:::i;:::-;11859:55;11904:8;11897:5;11893:20;11885:6;11859:55;:::i;:::-;11852:62;11370:550;-1:-1:-1;;;;;;;11370:550:1:o;11925:534::-;-1:-1:-1;;;12273:55:1;;12255:3;12347:47;12390:2;12381:12;;12373:6;12347:47;:::i;:::-;-1:-1:-1;;;12403:24:1;;12451:1;12443:10;;11925:534;-1:-1:-1;;;11925:534:1:o;12464:1024::-;12976:66;12971:3;12964:79;12946:3;13072:6;13066:13;13088:62;13143:6;13138:2;13133:3;13129:12;13122:4;13114:6;13110:17;13088:62;:::i;:::-;-1:-1:-1;;;13209:2:1;13169:16;;;13201:11;;;13194:71;13290:13;;13312:63;13290:13;13361:2;13353:11;;13346:4;13334:17;;13312:63;:::i;:::-;-1:-1:-1;;;13435:2:1;13394:17;;;;13427:11;;;13420:35;13479:2;13471:11;;12464:1024;-1:-1:-1;;;;12464:1024:1:o;13493:416::-;-1:-1:-1;;;13748:3:1;13741:16;13723:3;13786:6;13780:13;13802:61;13856:6;13852:1;13847:3;13843:11;13836:4;13828:6;13824:17;13802:61;:::i;:::-;13883:16;;;;13901:1;13879:24;;13493:416;-1:-1:-1;;13493:416:1:o;13914:707::-;-1:-1:-1;;;14310:41:1;;14292:3;14370:46;14413:1;14404:11;;14396:6;14370:46;:::i;:::-;14445:6;14439:13;14461:52;14506:6;14502:2;14495:4;14487:6;14483:17;14461:52;:::i;:::-;-1:-1:-1;;;14535:15:1;;14559:27;;;14613:1;14602:13;;13914:707;-1:-1:-1;;;;13914:707:1:o;14626:609::-;-1:-1:-1;;;14977:43:1;;15043:13;;14959:3;;15065:61;15043:13;15115:1;15106:11;;15099:4;15087:17;;15065:61;:::i;:::-;-1:-1:-1;;;15185:1:1;15145:16;;;;15177:10;;;15170:32;-1:-1:-1;15226:2:1;15218:11;;14626:609;-1:-1:-1;14626:609:1:o;15240:1561::-;-1:-1:-1;;;16037:3:1;16030:16;16012:3;16075:6;16069:13;16091:61;16145:6;16141:1;16136:3;16132:11;16125:4;16117:6;16113:17;16091:61;:::i;:::-;16180:6;16175:3;16171:16;16161:26;;-1:-1:-1;;;16237:2:1;16233:1;16229:2;16225:10;16218:22;16271:6;16265:13;16287:62;16340:8;16336:1;16332:2;16328:10;16321:4;16313:6;16309:17;16287:62;:::i;:::-;16409:1;16368:17;;16401:10;;;16394:22;;;16441:13;;16463:62;16441:13;16512:1;16504:10;;16497:4;16485:17;;16463:62;:::i;:::-;16585:1;16544:17;;16577:10;;;16570:22;16617:13;;16639:62;16617:13;16688:1;16680:10;;16673:4;16661:17;;16639:62;:::i;:::-;-1:-1:-1;;;16761:1:1;16720:17;;;;16753:10;;;16746:23;16793:1;16785:10;;15240:1561;-1:-1:-1;;;;;;15240:1561:1:o;16806:448::-;17068:31;17063:3;17056:44;17038:3;17129:6;17123:13;17145:62;17200:6;17195:2;17190:3;17186:12;17179:4;17171:6;17167:17;17145:62;:::i;:::-;17227:16;;;;17245:2;17223:25;;16806:448;-1:-1:-1;;16806:448:1:o;17469:610::-;-1:-1:-1;;;17818:53:1;;17894:13;;17800:3;;17916:62;17894:13;17966:2;17957:12;;17950:4;17938:17;;17916:62;:::i;:::-;-1:-1:-1;;;18037:2:1;17997:16;;;;18029:11;;;18022:24;-1:-1:-1;18070:2:1;18062:11;;17469:610;-1:-1:-1;17469:610:1:o;18292:488::-;-1:-1:-1;;;;;18561:15:1;;;18543:34;;18613:15;;18608:2;18593:18;;18586:43;18660:2;18645:18;;18638:34;;;18708:3;18703:2;18688:18;;18681:31;;;18486:4;;18729:45;;18754:19;;18746:6;18729:45;:::i;:::-;18721:53;18292:488;-1:-1:-1;;;;;;18292:488:1:o;19064:632::-;19235:2;19287:21;;;19357:13;;19260:18;;;19379:22;;;19206:4;;19235:2;19458:15;;;;19432:2;19417:18;;;19206:4;19501:169;19515:6;19512:1;19509:13;19501:169;;;19576:13;;19564:26;;19645:15;;;;19610:12;;;;19537:1;19530:9;19501:169;;;-1:-1:-1;19687:3:1;;19064:632;-1:-1:-1;;;;;;19064:632:1:o;19893:219::-;20042:2;20031:9;20024:21;20005:4;20062:44;20102:2;20091:9;20087:18;20079:6;20062:44;:::i;24189:336::-;24391:2;24373:21;;;24430:2;24410:18;;;24403:30;-1:-1:-1;;;24464:2:1;24449:18;;24442:42;24516:2;24501:18;;24189:336::o;25297:355::-;25499:2;25481:21;;;25538:2;25518:18;;;25511:30;25577:33;25572:2;25557:18;;25550:61;25643:2;25628:18;;25297:355::o;26891:275::-;26962:2;26956:9;27027:2;27008:13;;-1:-1:-1;;27004:27:1;26992:40;;-1:-1:-1;;;;;27047:34:1;;27083:22;;;27044:62;27041:88;;;27109:18;;:::i;:::-;27145:2;27138:22;26891:275;;-1:-1:-1;26891:275:1:o;27297:128::-;27337:3;27368:1;27364:6;27361:1;27358:13;27355:39;;;27374:18;;:::i;:::-;-1:-1:-1;27410:9:1;;27297:128::o;27430:120::-;27470:1;27496;27486:35;;27501:18;;:::i;:::-;-1:-1:-1;27535:9:1;;27430:120::o;27555:168::-;27595:7;27661:1;27657;27653:6;27649:14;27646:1;27643:21;27638:1;27631:9;27624:17;27620:45;27617:71;;;27668:18;;:::i;:::-;-1:-1:-1;27708:9:1;;27555:168::o;27728:125::-;27768:4;27796:1;27793;27790:8;27787:34;;;27801:18;;:::i;:::-;-1:-1:-1;27838:9:1;;27728:125::o;27858:258::-;27930:1;27940:113;27954:6;27951:1;27948:13;27940:113;;;28030:11;;;28024:18;28011:11;;;28004:39;27976:2;27969:10;27940:113;;;28071:6;28068:1;28065:13;28062:48;;;-1:-1:-1;;28106:1:1;28088:16;;28081:27;27858:258::o;28121:136::-;28160:3;28188:5;28178:39;;28197:18;;:::i;:::-;-1:-1:-1;;;28233:18:1;;28121:136::o;28262:380::-;28341:1;28337:12;;;;28384;;;28405:61;;28459:4;28451:6;28447:17;28437:27;;28405:61;28512:2;28504:6;28501:14;28481:18;28478:38;28475:161;;;28558:10;28553:3;28549:20;28546:1;28539:31;28593:4;28590:1;28583:15;28621:4;28618:1;28611:15;28475:161;;28262:380;;;:::o;28647:135::-;28686:3;-1:-1:-1;;28707:17:1;;28704:43;;;28727:18;;:::i;:::-;-1:-1:-1;28774:1:1;28763:13;;28647:135::o;28787:112::-;28819:1;28845;28835:35;;28850:18;;:::i;:::-;-1:-1:-1;28884:9:1;;28787:112::o;28904:127::-;28965:10;28960:3;28956:20;28953:1;28946:31;28996:4;28993:1;28986:15;29020:4;29017:1;29010:15;29036:127;29097:10;29092:3;29088:20;29085:1;29078:31;29128:4;29125:1;29118:15;29152:4;29149:1;29142:15;29168:127;29229:10;29224:3;29220:20;29217:1;29210:31;29260:4;29257:1;29250:15;29284:4;29281:1;29274:15;29300:127;29361:10;29356:3;29352:20;29349:1;29342:31;29392:4;29389:1;29382:15;29416:4;29413:1;29406:15;29432:131;-1:-1:-1;;;;;29507:31:1;;29497:42;;29487:70;;29553:1;29550;29543:12;29568:131;-1:-1:-1;;;;;;29642:32:1;;29632:43;;29622:71;;29689:1;29686;29679:12

Swarm Source

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