ETH Price: $3,501.81 (+3.88%)
Gas: 4 Gwei

Token

NFTerrarium (NFTR)
 

Overview

Max Total Supply

777 NFTR

Holders

237

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 NFTR
0x74e163959d171d49a042058de03cb9608d5cc94f
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:
NFTerrarium

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: GPL-3.0

/**

    ╔╗╔╔═╗╔╦╗┌─┐┬─┐┬─┐┌─┐┬─┐┬┬ ┬┌┬┐
    ║║║╠╣  ║ ├┤ ├┬┘├┬┘├─┤├┬┘││ ││││
    ╝╚╝╚   ╩ └─┘┴└─┴└─┴ ┴┴└─┴└─┘┴ ┴
    Contract by @texoid__

*/

// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)
pragma solidity ^0.8.0;
/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}



// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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


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


// OpenZeppelin Contracts (last updated v4.5.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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


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


// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        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);
    }
}



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

// OpenZeppelin Contracts v4.4.1 (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`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) 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 Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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


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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)
pragma solidity ^0.8.0;
/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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


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


// OpenZeppelin Contracts v4.4.1 (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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


// Creator: Chiru Labs
pragma solidity ^0.8.4;

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error AuxQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @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, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

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

    // 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 See {IERC721Enumerable-totalSupply}.
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view 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) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        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) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        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) {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        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 {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        _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 && 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 && !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 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() && !_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;
    }

    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 {
        _mint(to, quantity, _data, true);
    }

    /**
     * @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,
        bytes memory _data,
        bool safe
    ) 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 (safe && 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 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);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // 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;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].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;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

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

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // 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[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].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;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, 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 {}
}


pragma solidity >=0.8.9 <0.9.0;

contract NFTerrarium is ERC721A, Ownable, ReentrancyGuard {
  using Strings for uint256;

    //---------------[ Whitelist ]---------------\\
    bytes32 public merkleRoot;
    mapping(address => bool) public whitelistClaimed;

    //---------------[ Token URI ]---------------\\
    string public baseURI = '';
    string public uriSuffix = '.json';

    //---------------[ Cost & Supply ]---------------\\
    uint256 public maxSupply = 777;
    uint256 public maxAmountPerWallet;
    mapping(address => uint8) public amountClaimed;

    //---------------[ Setting Toggles ]---------------\\
    bool public paused = true;
    bool public whitelistMintEnabled = false;
    bool public revealed = false;

    //---------------[  ]---------------\\
    constructor(
        string memory _tokenName,
        string memory _tokenSymbol,
        uint256 _maxAmountPerWallet,
        string memory _initBaseURI
    ) ERC721A(_tokenName, _tokenSymbol) {
        maxAmountPerWallet = _maxAmountPerWallet;
        baseURI = _initBaseURI;
    }

    //---------------[ Modifiers ]---------------\\
    modifier mintCompliance(uint256 _mintAmount) {
        require(_mintAmount > 0 && _mintAmount <= maxAmountPerWallet, 'Invalid mint amount submitted');
        require(totalSupply() + _mintAmount <= maxSupply, 'Maximum NFT supply exceeded');
        require(amountClaimed[_msgSender()] + _mintAmount <= maxAmountPerWallet, 'Maximum wallet amount exceeded');
        _;
    }

    //---------------[ Mint Functions ]---------------\\
    function whitelistMint(uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable mintCompliance(_mintAmount) nonReentrant {

        // Verify whitelist requirements
        require(whitelistMintEnabled, 'Whitelist sale is not active');
        require(!whitelistClaimed[_msgSender()], 'Address already claimed whitelist');

        // cheking merkle proof
        bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
        require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), 'Invalid whitelist proof submitted');

        // minting
        whitelistClaimed[_msgSender()] = true;
        amountClaimed[_msgSender()] += uint8(_mintAmount);
        _safeMint(_msgSender(), _mintAmount);
    }

    function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) nonReentrant {
        require(!paused, 'Minting is currently paused');
        amountClaimed[_msgSender()] += uint8(_mintAmount);
        _safeMint(_msgSender(), _mintAmount);
    }

    function airdrop(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner nonReentrant {
        _safeMint(_receiver, _mintAmount);
    }

    //---------------[ Public Functions ]---------------\\
    function walletOfOwner(address _owner) public view returns (uint256[] memory) {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = _startTokenId();
        uint256 ownedTokenIndex = 0;
        address latestOwnerAddress;

        while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
            TokenOwnership memory ownership = _ownerships[currentTokenId];

            if (!ownership.burned && ownership.addr != address(0)) {
                latestOwnerAddress = ownership.addr;
            }

            if (latestOwnerAddress == _owner) {
                ownedTokenIds[ownedTokenIndex] = currentTokenId;
                ownedTokenIndex++;
            }

            currentTokenId++;
        }

        return ownedTokenIds;
    }

    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token');

        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0
            ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
            : '';
    }

    //---------------[ Internal Functions ]---------------\\
    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    //---------------[ onlyOwner Functions ]---------------\\
    function setmaxAmountPerWallet(uint256 _maxAmountPerWallet) public onlyOwner {
        maxAmountPerWallet = _maxAmountPerWallet;
    }

    function setBaseURI(string memory _newURI) public onlyOwner {
        baseURI = _newURI;
    }

    function setUriSuffix(string memory _uriSuffix) public onlyOwner {
        uriSuffix = _uriSuffix;
    }

    function flipPaused() public onlyOwner {
        paused = !paused;
    }

    function flipReveal() public onlyOwner {
        revealed = !revealed;
    }

    function flipWhitelistMint() public onlyOwner {
        whitelistMintEnabled = !whitelistMintEnabled;
    }

    function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
        merkleRoot = _merkleRoot;
    }

    function withdraw() public onlyOwner nonReentrant {
        (bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
        require(success);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"uint256","name":"_maxAmountPerWallet","type":"uint256"},{"internalType":"string","name":"_initBaseURI","type":"string"}],"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"},{"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":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"amountClaimed","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipWhitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAmountPerWallet","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":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"_newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxAmountPerWallet","type":"uint256"}],"name":"setmaxAmountPerWallet","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":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600c9081620000249190620004d0565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d90816200006b9190620004d0565b50610309600e556001601160006101000a81548160ff0219169083151502179055506000601160016101000a81548160ff0219169083151502179055506000601160026101000a81548160ff021916908315150217905550348015620000d057600080fd5b5060405162005497380380620054978339818101604052810190620000f691906200074c565b83838160029081620001099190620004d0565b5080600390816200011b9190620004d0565b506200012c6200017f60201b60201c565b600081905550505062000154620001486200018860201b60201c565b6200019060201b60201c565b600160098190555081600f8190555080600c9081620001749190620004d0565b50505050506200081b565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002d857607f821691505b602082108103620002ee57620002ed62000290565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003587fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000319565b62000364868362000319565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003b1620003ab620003a5846200037c565b62000386565b6200037c565b9050919050565b6000819050919050565b620003cd8362000390565b620003e5620003dc82620003b8565b84845462000326565b825550505050565b600090565b620003fc620003ed565b62000409818484620003c2565b505050565b5b81811015620004315762000425600082620003f2565b6001810190506200040f565b5050565b601f82111562000480576200044a81620002f4565b620004558462000309565b8101602085101562000465578190505b6200047d620004748562000309565b8301826200040e565b50505b505050565b600082821c905092915050565b6000620004a56000198460080262000485565b1980831691505092915050565b6000620004c0838362000492565b9150826002028217905092915050565b620004db8262000256565b67ffffffffffffffff811115620004f757620004f662000261565b5b620005038254620002bf565b6200051082828562000435565b600060209050601f83116001811462000548576000841562000533578287015190505b6200053f8582620004b2565b865550620005af565b601f1984166200055886620002f4565b60005b8281101562000582578489015182556001820191506020850194506020810190506200055b565b86831015620005a257848901516200059e601f89168262000492565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620005f182620005d5565b810181811067ffffffffffffffff8211171562000613576200061262000261565b5b80604052505050565b600062000628620005b7565b9050620006368282620005e6565b919050565b600067ffffffffffffffff82111562000659576200065862000261565b5b6200066482620005d5565b9050602081019050919050565b60005b838110156200069157808201518184015260208101905062000674565b60008484015250505050565b6000620006b4620006ae846200063b565b6200061c565b905082815260208101848484011115620006d357620006d2620005d0565b5b620006e084828562000671565b509392505050565b600082601f8301126200070057620006ff620005cb565b5b8151620007128482602086016200069d565b91505092915050565b62000726816200037c565b81146200073257600080fd5b50565b60008151905062000746816200071b565b92915050565b60008060008060808587031215620007695762000768620005c1565b5b600085015167ffffffffffffffff8111156200078a5762000789620005c6565b5b6200079887828801620006e8565b945050602085015167ffffffffffffffff811115620007bc57620007bb620005c6565b5b620007ca87828801620006e8565b9350506040620007dd8782880162000735565b925050606085015167ffffffffffffffff811115620008015762000800620005c6565b5b6200080f87828801620006e8565b91505092959194509250565b614c6c806200082b6000396000f3fe6080604052600436106102305760003560e01c806369cc4f861161012e578063b88d4fde116100ab578063d5abeb011161006f578063d5abeb01146107c1578063d7e1ea17146107ec578063db4bec4414610829578063e985e9c514610866578063f2fde38b146108a357610230565b8063b88d4fde146106ed578063bc63f02e14610716578063c7d2dc1d1461073f578063c87b56dd14610768578063d2cab056146107a557610230565b80637cb64759116100f25780637cb64759146106295780638da5cb5b1461065257806395d89b411461067d578063a0712d68146106a8578063a22cb465146106c457610230565b806369cc4f86146105685780636c0360eb1461057f5780636caede3d146105aa57806370a08231146105d5578063715018a61461061257610230565b806336db7129116101bc578063518302271161018057806351830227146104815780635503a0e8146104ac57806355f804b3146104d75780635c975abb146105005780636352211e1461052b57610230565b806336db7129146103c25780633b84d9c6146103ed5780633ccfd60b1461040457806342842e0e1461041b578063438b63001461044457610230565b806316ba10e01161020357806316ba10e01461030357806318160ddd1461032c57806323b872dd146103575780632eb4a7ab14610380578063333171bb146103ab57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c600480360381019061025791906136f0565b6108cc565b6040516102699190613738565b60405180910390f35b34801561027e57600080fd5b506102876109ae565b60405161029491906137e3565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf919061383b565b610a40565b6040516102d191906138a9565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc91906138f0565b610abc565b005b34801561030f57600080fd5b5061032a60048036038101906103259190613a65565b610bc6565b005b34801561033857600080fd5b50610341610c55565b60405161034e9190613abd565b60405180910390f35b34801561036357600080fd5b5061037e60048036038101906103799190613ad8565b610c6c565b005b34801561038c57600080fd5b50610395610c7c565b6040516103a29190613b44565b60405180910390f35b3480156103b757600080fd5b506103c0610c82565b005b3480156103ce57600080fd5b506103d7610d2a565b6040516103e49190613abd565b60405180910390f35b3480156103f957600080fd5b50610402610d30565b005b34801561041057600080fd5b50610419610dd8565b005b34801561042757600080fd5b50610442600480360381019061043d9190613ad8565b610f22565b005b34801561045057600080fd5b5061046b60048036038101906104669190613b5f565b610f42565b6040516104789190613c4a565b60405180910390f35b34801561048d57600080fd5b5061049661115c565b6040516104a39190613738565b60405180910390f35b3480156104b857600080fd5b506104c161116f565b6040516104ce91906137e3565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190613a65565b6111fd565b005b34801561050c57600080fd5b5061051561128c565b6040516105229190613738565b60405180910390f35b34801561053757600080fd5b50610552600480360381019061054d919061383b565b61129f565b60405161055f91906138a9565b60405180910390f35b34801561057457600080fd5b5061057d6112b5565b005b34801561058b57600080fd5b5061059461135d565b6040516105a191906137e3565b60405180910390f35b3480156105b657600080fd5b506105bf6113eb565b6040516105cc9190613738565b60405180910390f35b3480156105e157600080fd5b506105fc60048036038101906105f79190613b5f565b6113fe565b6040516106099190613abd565b60405180910390f35b34801561061e57600080fd5b506106276114cd565b005b34801561063557600080fd5b50610650600480360381019061064b9190613c98565b611555565b005b34801561065e57600080fd5b506106676115db565b60405161067491906138a9565b60405180910390f35b34801561068957600080fd5b50610692611605565b60405161069f91906137e3565b60405180910390f35b6106c260048036038101906106bd919061383b565b611697565b005b3480156106d057600080fd5b506106eb60048036038101906106e69190613cf1565b61191a565b005b3480156106f957600080fd5b50610714600480360381019061070f9190613dd2565b611a91565b005b34801561072257600080fd5b5061073d60048036038101906107389190613e55565b611b0d565b005b34801561074b57600080fd5b506107666004803603810190610761919061383b565b611d3c565b005b34801561077457600080fd5b5061078f600480360381019061078a919061383b565b611dc2565b60405161079c91906137e3565b60405180910390f35b6107bf60048036038101906107ba9190613ef5565b611e6c565b005b3480156107cd57600080fd5b506107d66122a3565b6040516107e39190613abd565b60405180910390f35b3480156107f857600080fd5b50610813600480360381019061080e9190613b5f565b6122a9565b6040516108209190613f71565b60405180910390f35b34801561083557600080fd5b50610850600480360381019061084b9190613b5f565b6122c9565b60405161085d9190613738565b60405180910390f35b34801561087257600080fd5b5061088d60048036038101906108889190613f8c565b6122e9565b60405161089a9190613738565b60405180910390f35b3480156108af57600080fd5b506108ca60048036038101906108c59190613b5f565b61237d565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061099757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109a757506109a682612474565b5b9050919050565b6060600280546109bd90613ffb565b80601f01602080910402602001604051908101604052809291908181526020018280546109e990613ffb565b8015610a365780601f10610a0b57610100808354040283529160200191610a36565b820191906000526020600020905b815481529060010190602001808311610a1957829003601f168201915b5050505050905090565b6000610a4b826124de565b610a81576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ac78261129f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b2e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b4d61252c565b73ffffffffffffffffffffffffffffffffffffffff1614158015610b7f5750610b7d81610b7861252c565b6122e9565b155b15610bb6576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bc1838383612534565b505050565b610bce61252c565b73ffffffffffffffffffffffffffffffffffffffff16610bec6115db565b73ffffffffffffffffffffffffffffffffffffffff1614610c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3990614078565b60405180910390fd5b80600d9081610c519190614244565b5050565b6000610c5f6125e6565b6001546000540303905090565b610c778383836125ef565b505050565b600a5481565b610c8a61252c565b73ffffffffffffffffffffffffffffffffffffffff16610ca86115db565b73ffffffffffffffffffffffffffffffffffffffff1614610cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf590614078565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b600f5481565b610d3861252c565b73ffffffffffffffffffffffffffffffffffffffff16610d566115db565b73ffffffffffffffffffffffffffffffffffffffff1614610dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da390614078565b60405180910390fd5b601160029054906101000a900460ff1615601160026101000a81548160ff021916908315150217905550565b610de061252c565b73ffffffffffffffffffffffffffffffffffffffff16610dfe6115db565b73ffffffffffffffffffffffffffffffffffffffff1614610e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4b90614078565b60405180910390fd5b600260095403610e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9090614362565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610ec7906143b3565b60006040518083038185875af1925050503d8060008114610f04576040519150601f19603f3d011682016040523d82523d6000602084013e610f09565b606091505b5050905080610f1757600080fd5b506001600981905550565b610f3d83838360405180602001604052806000815250611a91565b505050565b60606000610f4f836113fe565b905060008167ffffffffffffffff811115610f6d57610f6c61393a565b5b604051908082528060200260200182016040528015610f9b5781602001602082028036833780820191505090505b5090506000610fa86125e6565b90506000805b8482108015610fbf5750600e548311155b1561114f576000600460008581526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511580156110cc5750600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614155b156110d957806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361113b57838584815181106111205761111f6143c8565b5b602002602001018181525050828061113790614426565b9350505b838061114690614426565b94505050610fae565b8395505050505050919050565b601160029054906101000a900460ff1681565b600d805461117c90613ffb565b80601f01602080910402602001604051908101604052809291908181526020018280546111a890613ffb565b80156111f55780601f106111ca576101008083540402835291602001916111f5565b820191906000526020600020905b8154815290600101906020018083116111d857829003601f168201915b505050505081565b61120561252c565b73ffffffffffffffffffffffffffffffffffffffff166112236115db565b73ffffffffffffffffffffffffffffffffffffffff1614611279576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127090614078565b60405180910390fd5b80600c90816112889190614244565b5050565b601160009054906101000a900460ff1681565b60006112aa82612ade565b600001519050919050565b6112bd61252c565b73ffffffffffffffffffffffffffffffffffffffff166112db6115db565b73ffffffffffffffffffffffffffffffffffffffff1614611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132890614078565b60405180910390fd5b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b600c805461136a90613ffb565b80601f016020809104026020016040519081016040528092919081815260200182805461139690613ffb565b80156113e35780601f106113b8576101008083540402835291602001916113e3565b820191906000526020600020905b8154815290600101906020018083116113c657829003601f168201915b505050505081565b601160019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611465576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6114d561252c565b73ffffffffffffffffffffffffffffffffffffffff166114f36115db565b73ffffffffffffffffffffffffffffffffffffffff1614611549576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154090614078565b60405180910390fd5b6115536000612d6d565b565b61155d61252c565b73ffffffffffffffffffffffffffffffffffffffff1661157b6115db565b73ffffffffffffffffffffffffffffffffffffffff16146115d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c890614078565b60405180910390fd5b80600a8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461161490613ffb565b80601f016020809104026020016040519081016040528092919081815260200182805461164090613ffb565b801561168d5780601f106116625761010080835404028352916020019161168d565b820191906000526020600020905b81548152906001019060200180831161167057829003601f168201915b5050505050905090565b806000811180156116aa5750600f548111155b6116e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e0906144ba565b60405180910390fd5b600e54816116f5610c55565b6116ff91906144da565b1115611740576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117379061455a565b60405180910390fd5b600f54816010600061175061252c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff166117a591906144da565b11156117e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117dd906145c6565b60405180910390fd5b60026009540361182b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182290614362565b60405180910390fd5b6002600981905550601160009054906101000a900460ff1615611883576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187a90614632565b60405180910390fd5b816010600061189061252c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff166118e59190614652565b92506101000a81548160ff021916908360ff16021790555061190e61190861252c565b83612e33565b60016009819055505050565b61192261252c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611986576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061199361252c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a4061252c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a859190613738565b60405180910390a35050565b611a9c8484846125ef565b611abb8373ffffffffffffffffffffffffffffffffffffffff16612e51565b8015611ad05750611ace84848484612e74565b155b15611b07576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b81600081118015611b205750600f548111155b611b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b56906144ba565b60405180910390fd5b600e5481611b6b610c55565b611b7591906144da565b1115611bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bad9061455a565b60405180910390fd5b600f548160106000611bc661252c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16611c1b91906144da565b1115611c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c53906145c6565b60405180910390fd5b611c6461252c565b73ffffffffffffffffffffffffffffffffffffffff16611c826115db565b73ffffffffffffffffffffffffffffffffffffffff1614611cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccf90614078565b60405180910390fd5b600260095403611d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1490614362565b60405180910390fd5b6002600981905550611d2f8284612e33565b6001600981905550505050565b611d4461252c565b73ffffffffffffffffffffffffffffffffffffffff16611d626115db565b73ffffffffffffffffffffffffffffffffffffffff1614611db8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daf90614078565b60405180910390fd5b80600f8190555050565b6060611dcd826124de565b611e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e03906146f9565b60405180910390fd5b6000611e16612fc4565b90506000815111611e365760405180602001604052806000815250611e64565b80611e4084613056565b600d604051602001611e54939291906147d8565b6040516020818303038152906040525b915050919050565b82600081118015611e7f5750600f548111155b611ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb5906144ba565b60405180910390fd5b600e5481611eca610c55565b611ed491906144da565b1115611f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0c9061455a565b60405180910390fd5b600f548160106000611f2561252c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16611f7a91906144da565b1115611fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb2906145c6565b60405180910390fd5b600260095403612000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff790614362565b60405180910390fd5b6002600981905550601160019054906101000a900460ff16612057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204e90614855565b60405180910390fd5b600b600061206361252c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156120eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e2906148e7565b60405180910390fd5b60006120f561252c565b604051602001612105919061494f565b60405160208183030381529060405280519060200120905061216b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a54836131b6565b6121aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a1906149dc565b60405180910390fd5b6001600b60006121b861252c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550846010600061221661252c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff1661226b9190614652565b92506101000a81548160ff021916908360ff16021790555061229461228e61252c565b86612e33565b50600160098190555050505050565b600e5481565b60106020528060005260406000206000915054906101000a900460ff1681565b600b6020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61238561252c565b73ffffffffffffffffffffffffffffffffffffffff166123a36115db565b73ffffffffffffffffffffffffffffffffffffffff16146123f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f090614078565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245f90614a6e565b60405180910390fd5b61247181612d6d565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816124e96125e6565b111580156124f8575060005482105b8015612525575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006125fa82612ade565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661262161252c565b73ffffffffffffffffffffffffffffffffffffffff1614806126545750612653826000015161264e61252c565b6122e9565b5b80612699575061266261252c565b73ffffffffffffffffffffffffffffffffffffffff1661268184610a40565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806126d2576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461273b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036127a1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127ae85858560016131cd565b6127be6000848460000151612534565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612a6e57600054811015612a6d5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ad785858560016131d3565b5050505050565b612ae6613641565b600082905080612af46125e6565b11158015612b03575060005481105b15612d36576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612d3457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612c18578092505050612d68565b5b600115612d3357818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d2e578092505050612d68565b612c19565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612e4d8282604051806020016040528060008152506131d9565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e9a61252c565b8786866040518563ffffffff1660e01b8152600401612ebc9493929190614ae3565b6020604051808303816000875af1925050508015612ef857506040513d601f19601f82011682018060405250810190612ef59190614b44565b60015b612f71573d8060008114612f28576040519150601f19603f3d011682016040523d82523d6000602084013e612f2d565b606091505b506000815103612f69576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c8054612fd390613ffb565b80601f0160208091040260200160405190810160405280929190818152602001828054612fff90613ffb565b801561304c5780601f106130215761010080835404028352916020019161304c565b820191906000526020600020905b81548152906001019060200180831161302f57829003601f168201915b5050505050905090565b60606000820361309d576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131b1565b600082905060005b600082146130cf5780806130b890614426565b915050600a826130c89190614ba0565b91506130a5565b60008167ffffffffffffffff8111156130eb576130ea61393a565b5b6040519080825280601f01601f19166020018201604052801561311d5781602001600182028036833780820191505090505b5090505b600085146131aa576001826131369190614bd1565b9150600a856131459190614c05565b603061315191906144da565b60f81b818381518110613167576131666143c8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131a39190614ba0565b9450613121565b8093505050505b919050565b6000826131c385846131eb565b1490509392505050565b50505050565b50505050565b6131e68383836001613260565b505050565b60008082905060005b8451811015613255576000858281518110613212576132116143c8565b5b602002602001015190508083116132345761322d838261362a565b9250613241565b61323e818461362a565b92505b50808061324d90614426565b9150506131f4565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036132cc576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613306576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61331360008683876131cd565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156134dd57506134dc8773ffffffffffffffffffffffffffffffffffffffff16612e51565b5b156135a2575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135526000888480600101955088612e74565b613588576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036134e357826000541461359d57600080fd5b61360d565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082036135a3575b81600081905550505061362360008683876131d3565b5050505050565b600082600052816020526040600020905092915050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6136cd81613698565b81146136d857600080fd5b50565b6000813590506136ea816136c4565b92915050565b6000602082840312156137065761370561368e565b5b6000613714848285016136db565b91505092915050565b60008115159050919050565b6137328161371d565b82525050565b600060208201905061374d6000830184613729565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561378d578082015181840152602081019050613772565b60008484015250505050565b6000601f19601f8301169050919050565b60006137b582613753565b6137bf818561375e565b93506137cf81856020860161376f565b6137d881613799565b840191505092915050565b600060208201905081810360008301526137fd81846137aa565b905092915050565b6000819050919050565b61381881613805565b811461382357600080fd5b50565b6000813590506138358161380f565b92915050565b6000602082840312156138515761385061368e565b5b600061385f84828501613826565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061389382613868565b9050919050565b6138a381613888565b82525050565b60006020820190506138be600083018461389a565b92915050565b6138cd81613888565b81146138d857600080fd5b50565b6000813590506138ea816138c4565b92915050565b600080604083850312156139075761390661368e565b5b6000613915858286016138db565b925050602061392685828601613826565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61397282613799565b810181811067ffffffffffffffff821117156139915761399061393a565b5b80604052505050565b60006139a4613684565b90506139b08282613969565b919050565b600067ffffffffffffffff8211156139d0576139cf61393a565b5b6139d982613799565b9050602081019050919050565b82818337600083830152505050565b6000613a08613a03846139b5565b61399a565b905082815260208101848484011115613a2457613a23613935565b5b613a2f8482856139e6565b509392505050565b600082601f830112613a4c57613a4b613930565b5b8135613a5c8482602086016139f5565b91505092915050565b600060208284031215613a7b57613a7a61368e565b5b600082013567ffffffffffffffff811115613a9957613a98613693565b5b613aa584828501613a37565b91505092915050565b613ab781613805565b82525050565b6000602082019050613ad26000830184613aae565b92915050565b600080600060608486031215613af157613af061368e565b5b6000613aff868287016138db565b9350506020613b10868287016138db565b9250506040613b2186828701613826565b9150509250925092565b6000819050919050565b613b3e81613b2b565b82525050565b6000602082019050613b596000830184613b35565b92915050565b600060208284031215613b7557613b7461368e565b5b6000613b83848285016138db565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613bc181613805565b82525050565b6000613bd38383613bb8565b60208301905092915050565b6000602082019050919050565b6000613bf782613b8c565b613c018185613b97565b9350613c0c83613ba8565b8060005b83811015613c3d578151613c248882613bc7565b9750613c2f83613bdf565b925050600181019050613c10565b5085935050505092915050565b60006020820190508181036000830152613c648184613bec565b905092915050565b613c7581613b2b565b8114613c8057600080fd5b50565b600081359050613c9281613c6c565b92915050565b600060208284031215613cae57613cad61368e565b5b6000613cbc84828501613c83565b91505092915050565b613cce8161371d565b8114613cd957600080fd5b50565b600081359050613ceb81613cc5565b92915050565b60008060408385031215613d0857613d0761368e565b5b6000613d16858286016138db565b9250506020613d2785828601613cdc565b9150509250929050565b600067ffffffffffffffff821115613d4c57613d4b61393a565b5b613d5582613799565b9050602081019050919050565b6000613d75613d7084613d31565b61399a565b905082815260208101848484011115613d9157613d90613935565b5b613d9c8482856139e6565b509392505050565b600082601f830112613db957613db8613930565b5b8135613dc9848260208601613d62565b91505092915050565b60008060008060808587031215613dec57613deb61368e565b5b6000613dfa878288016138db565b9450506020613e0b878288016138db565b9350506040613e1c87828801613826565b925050606085013567ffffffffffffffff811115613e3d57613e3c613693565b5b613e4987828801613da4565b91505092959194509250565b60008060408385031215613e6c57613e6b61368e565b5b6000613e7a85828601613826565b9250506020613e8b858286016138db565b9150509250929050565b600080fd5b600080fd5b60008083601f840112613eb557613eb4613930565b5b8235905067ffffffffffffffff811115613ed257613ed1613e95565b5b602083019150836020820283011115613eee57613eed613e9a565b5b9250929050565b600080600060408486031215613f0e57613f0d61368e565b5b6000613f1c86828701613826565b935050602084013567ffffffffffffffff811115613f3d57613f3c613693565b5b613f4986828701613e9f565b92509250509250925092565b600060ff82169050919050565b613f6b81613f55565b82525050565b6000602082019050613f866000830184613f62565b92915050565b60008060408385031215613fa357613fa261368e565b5b6000613fb1858286016138db565b9250506020613fc2858286016138db565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061401357607f821691505b60208210810361402657614025613fcc565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061406260208361375e565b915061406d8261402c565b602082019050919050565b6000602082019050818103600083015261409181614055565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026140fa7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826140bd565b61410486836140bd565b95508019841693508086168417925050509392505050565b6000819050919050565b600061414161413c61413784613805565b61411c565b613805565b9050919050565b6000819050919050565b61415b83614126565b61416f61416782614148565b8484546140ca565b825550505050565b600090565b614184614177565b61418f818484614152565b505050565b5b818110156141b3576141a860008261417c565b600181019050614195565b5050565b601f8211156141f8576141c981614098565b6141d2846140ad565b810160208510156141e1578190505b6141f56141ed856140ad565b830182614194565b50505b505050565b600082821c905092915050565b600061421b600019846008026141fd565b1980831691505092915050565b6000614234838361420a565b9150826002028217905092915050565b61424d82613753565b67ffffffffffffffff8111156142665761426561393a565b5b6142708254613ffb565b61427b8282856141b7565b600060209050601f8311600181146142ae576000841561429c578287015190505b6142a68582614228565b86555061430e565b601f1984166142bc86614098565b60005b828110156142e4578489015182556001820191506020850194506020810190506142bf565b8683101561430157848901516142fd601f89168261420a565b8355505b6001600288020188555050505b505050505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061434c601f8361375e565b915061435782614316565b602082019050919050565b6000602082019050818103600083015261437b8161433f565b9050919050565b600081905092915050565b50565b600061439d600083614382565b91506143a88261438d565b600082019050919050565b60006143be82614390565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061443182613805565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614463576144626143f7565b5b600182019050919050565b7f496e76616c6964206d696e7420616d6f756e74207375626d6974746564000000600082015250565b60006144a4601d8361375e565b91506144af8261446e565b602082019050919050565b600060208201905081810360008301526144d381614497565b9050919050565b60006144e582613805565b91506144f083613805565b9250828201905080821115614508576145076143f7565b5b92915050565b7f4d6178696d756d204e465420737570706c792065786365656465640000000000600082015250565b6000614544601b8361375e565b915061454f8261450e565b602082019050919050565b6000602082019050818103600083015261457381614537565b9050919050565b7f4d6178696d756d2077616c6c657420616d6f756e742065786365656465640000600082015250565b60006145b0601e8361375e565b91506145bb8261457a565b602082019050919050565b600060208201905081810360008301526145df816145a3565b9050919050565b7f4d696e74696e672069732063757272656e746c79207061757365640000000000600082015250565b600061461c601b8361375e565b9150614627826145e6565b602082019050919050565b6000602082019050818103600083015261464b8161460f565b9050919050565b600061465d82613f55565b915061466883613f55565b9250828201905060ff811115614681576146806143f7565b5b92915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006146e3602f8361375e565b91506146ee82614687565b604082019050919050565b60006020820190508181036000830152614712816146d6565b9050919050565b600081905092915050565b600061472f82613753565b6147398185614719565b935061474981856020860161376f565b80840191505092915050565b6000815461476281613ffb565b61476c8186614719565b94506001821660008114614787576001811461479c576147cf565b60ff19831686528115158202860193506147cf565b6147a585614098565b60005b838110156147c7578154818901526001820191506020810190506147a8565b838801955050505b50505092915050565b60006147e48286614724565b91506147f08285614724565b91506147fc8284614755565b9150819050949350505050565b7f57686974656c6973742073616c65206973206e6f742061637469766500000000600082015250565b600061483f601c8361375e565b915061484a82614809565b602082019050919050565b6000602082019050818103600083015261486e81614832565b9050919050565b7f4164647265737320616c726561647920636c61696d65642077686974656c697360008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b60006148d160218361375e565b91506148dc82614875565b604082019050919050565b60006020820190508181036000830152614900816148c4565b9050919050565b60008160601b9050919050565b600061491f82614907565b9050919050565b600061493182614914565b9050919050565b61494961494482613888565b614926565b82525050565b600061495b8284614938565b60148201915081905092915050565b7f496e76616c69642077686974656c6973742070726f6f66207375626d6974746560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b60006149c660218361375e565b91506149d18261496a565b604082019050919050565b600060208201905081810360008301526149f5816149b9565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614a5860268361375e565b9150614a63826149fc565b604082019050919050565b60006020820190508181036000830152614a8781614a4b565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614ab582614a8e565b614abf8185614a99565b9350614acf81856020860161376f565b614ad881613799565b840191505092915050565b6000608082019050614af8600083018761389a565b614b05602083018661389a565b614b126040830185613aae565b8181036060830152614b248184614aaa565b905095945050505050565b600081519050614b3e816136c4565b92915050565b600060208284031215614b5a57614b5961368e565b5b6000614b6884828501614b2f565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614bab82613805565b9150614bb683613805565b925082614bc657614bc5614b71565b5b828204905092915050565b6000614bdc82613805565b9150614be783613805565b9250828203905081811115614bff57614bfe6143f7565b5b92915050565b6000614c1082613805565b9150614c1b83613805565b925082614c2b57614c2a614b71565b5b82820690509291505056fea2646970667358221220742124a453db74b1ac27350e58889637a6e53b0cbd4bfc23fdfbd1147b17c5cc64736f6c63430008100033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000b4e4654657272617269756d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044e46545200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f6170692e6e6674657272617269756d2e78797a2f67656e657369732f00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102305760003560e01c806369cc4f861161012e578063b88d4fde116100ab578063d5abeb011161006f578063d5abeb01146107c1578063d7e1ea17146107ec578063db4bec4414610829578063e985e9c514610866578063f2fde38b146108a357610230565b8063b88d4fde146106ed578063bc63f02e14610716578063c7d2dc1d1461073f578063c87b56dd14610768578063d2cab056146107a557610230565b80637cb64759116100f25780637cb64759146106295780638da5cb5b1461065257806395d89b411461067d578063a0712d68146106a8578063a22cb465146106c457610230565b806369cc4f86146105685780636c0360eb1461057f5780636caede3d146105aa57806370a08231146105d5578063715018a61461061257610230565b806336db7129116101bc578063518302271161018057806351830227146104815780635503a0e8146104ac57806355f804b3146104d75780635c975abb146105005780636352211e1461052b57610230565b806336db7129146103c25780633b84d9c6146103ed5780633ccfd60b1461040457806342842e0e1461041b578063438b63001461044457610230565b806316ba10e01161020357806316ba10e01461030357806318160ddd1461032c57806323b872dd146103575780632eb4a7ab14610380578063333171bb146103ab57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c600480360381019061025791906136f0565b6108cc565b6040516102699190613738565b60405180910390f35b34801561027e57600080fd5b506102876109ae565b60405161029491906137e3565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf919061383b565b610a40565b6040516102d191906138a9565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc91906138f0565b610abc565b005b34801561030f57600080fd5b5061032a60048036038101906103259190613a65565b610bc6565b005b34801561033857600080fd5b50610341610c55565b60405161034e9190613abd565b60405180910390f35b34801561036357600080fd5b5061037e60048036038101906103799190613ad8565b610c6c565b005b34801561038c57600080fd5b50610395610c7c565b6040516103a29190613b44565b60405180910390f35b3480156103b757600080fd5b506103c0610c82565b005b3480156103ce57600080fd5b506103d7610d2a565b6040516103e49190613abd565b60405180910390f35b3480156103f957600080fd5b50610402610d30565b005b34801561041057600080fd5b50610419610dd8565b005b34801561042757600080fd5b50610442600480360381019061043d9190613ad8565b610f22565b005b34801561045057600080fd5b5061046b60048036038101906104669190613b5f565b610f42565b6040516104789190613c4a565b60405180910390f35b34801561048d57600080fd5b5061049661115c565b6040516104a39190613738565b60405180910390f35b3480156104b857600080fd5b506104c161116f565b6040516104ce91906137e3565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190613a65565b6111fd565b005b34801561050c57600080fd5b5061051561128c565b6040516105229190613738565b60405180910390f35b34801561053757600080fd5b50610552600480360381019061054d919061383b565b61129f565b60405161055f91906138a9565b60405180910390f35b34801561057457600080fd5b5061057d6112b5565b005b34801561058b57600080fd5b5061059461135d565b6040516105a191906137e3565b60405180910390f35b3480156105b657600080fd5b506105bf6113eb565b6040516105cc9190613738565b60405180910390f35b3480156105e157600080fd5b506105fc60048036038101906105f79190613b5f565b6113fe565b6040516106099190613abd565b60405180910390f35b34801561061e57600080fd5b506106276114cd565b005b34801561063557600080fd5b50610650600480360381019061064b9190613c98565b611555565b005b34801561065e57600080fd5b506106676115db565b60405161067491906138a9565b60405180910390f35b34801561068957600080fd5b50610692611605565b60405161069f91906137e3565b60405180910390f35b6106c260048036038101906106bd919061383b565b611697565b005b3480156106d057600080fd5b506106eb60048036038101906106e69190613cf1565b61191a565b005b3480156106f957600080fd5b50610714600480360381019061070f9190613dd2565b611a91565b005b34801561072257600080fd5b5061073d60048036038101906107389190613e55565b611b0d565b005b34801561074b57600080fd5b506107666004803603810190610761919061383b565b611d3c565b005b34801561077457600080fd5b5061078f600480360381019061078a919061383b565b611dc2565b60405161079c91906137e3565b60405180910390f35b6107bf60048036038101906107ba9190613ef5565b611e6c565b005b3480156107cd57600080fd5b506107d66122a3565b6040516107e39190613abd565b60405180910390f35b3480156107f857600080fd5b50610813600480360381019061080e9190613b5f565b6122a9565b6040516108209190613f71565b60405180910390f35b34801561083557600080fd5b50610850600480360381019061084b9190613b5f565b6122c9565b60405161085d9190613738565b60405180910390f35b34801561087257600080fd5b5061088d60048036038101906108889190613f8c565b6122e9565b60405161089a9190613738565b60405180910390f35b3480156108af57600080fd5b506108ca60048036038101906108c59190613b5f565b61237d565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061099757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109a757506109a682612474565b5b9050919050565b6060600280546109bd90613ffb565b80601f01602080910402602001604051908101604052809291908181526020018280546109e990613ffb565b8015610a365780601f10610a0b57610100808354040283529160200191610a36565b820191906000526020600020905b815481529060010190602001808311610a1957829003601f168201915b5050505050905090565b6000610a4b826124de565b610a81576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ac78261129f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b2e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b4d61252c565b73ffffffffffffffffffffffffffffffffffffffff1614158015610b7f5750610b7d81610b7861252c565b6122e9565b155b15610bb6576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bc1838383612534565b505050565b610bce61252c565b73ffffffffffffffffffffffffffffffffffffffff16610bec6115db565b73ffffffffffffffffffffffffffffffffffffffff1614610c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3990614078565b60405180910390fd5b80600d9081610c519190614244565b5050565b6000610c5f6125e6565b6001546000540303905090565b610c778383836125ef565b505050565b600a5481565b610c8a61252c565b73ffffffffffffffffffffffffffffffffffffffff16610ca86115db565b73ffffffffffffffffffffffffffffffffffffffff1614610cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf590614078565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b600f5481565b610d3861252c565b73ffffffffffffffffffffffffffffffffffffffff16610d566115db565b73ffffffffffffffffffffffffffffffffffffffff1614610dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da390614078565b60405180910390fd5b601160029054906101000a900460ff1615601160026101000a81548160ff021916908315150217905550565b610de061252c565b73ffffffffffffffffffffffffffffffffffffffff16610dfe6115db565b73ffffffffffffffffffffffffffffffffffffffff1614610e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4b90614078565b60405180910390fd5b600260095403610e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9090614362565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610ec7906143b3565b60006040518083038185875af1925050503d8060008114610f04576040519150601f19603f3d011682016040523d82523d6000602084013e610f09565b606091505b5050905080610f1757600080fd5b506001600981905550565b610f3d83838360405180602001604052806000815250611a91565b505050565b60606000610f4f836113fe565b905060008167ffffffffffffffff811115610f6d57610f6c61393a565b5b604051908082528060200260200182016040528015610f9b5781602001602082028036833780820191505090505b5090506000610fa86125e6565b90506000805b8482108015610fbf5750600e548311155b1561114f576000600460008581526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511580156110cc5750600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614155b156110d957806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361113b57838584815181106111205761111f6143c8565b5b602002602001018181525050828061113790614426565b9350505b838061114690614426565b94505050610fae565b8395505050505050919050565b601160029054906101000a900460ff1681565b600d805461117c90613ffb565b80601f01602080910402602001604051908101604052809291908181526020018280546111a890613ffb565b80156111f55780601f106111ca576101008083540402835291602001916111f5565b820191906000526020600020905b8154815290600101906020018083116111d857829003601f168201915b505050505081565b61120561252c565b73ffffffffffffffffffffffffffffffffffffffff166112236115db565b73ffffffffffffffffffffffffffffffffffffffff1614611279576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127090614078565b60405180910390fd5b80600c90816112889190614244565b5050565b601160009054906101000a900460ff1681565b60006112aa82612ade565b600001519050919050565b6112bd61252c565b73ffffffffffffffffffffffffffffffffffffffff166112db6115db565b73ffffffffffffffffffffffffffffffffffffffff1614611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132890614078565b60405180910390fd5b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b600c805461136a90613ffb565b80601f016020809104026020016040519081016040528092919081815260200182805461139690613ffb565b80156113e35780601f106113b8576101008083540402835291602001916113e3565b820191906000526020600020905b8154815290600101906020018083116113c657829003601f168201915b505050505081565b601160019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611465576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6114d561252c565b73ffffffffffffffffffffffffffffffffffffffff166114f36115db565b73ffffffffffffffffffffffffffffffffffffffff1614611549576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154090614078565b60405180910390fd5b6115536000612d6d565b565b61155d61252c565b73ffffffffffffffffffffffffffffffffffffffff1661157b6115db565b73ffffffffffffffffffffffffffffffffffffffff16146115d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c890614078565b60405180910390fd5b80600a8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461161490613ffb565b80601f016020809104026020016040519081016040528092919081815260200182805461164090613ffb565b801561168d5780601f106116625761010080835404028352916020019161168d565b820191906000526020600020905b81548152906001019060200180831161167057829003601f168201915b5050505050905090565b806000811180156116aa5750600f548111155b6116e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e0906144ba565b60405180910390fd5b600e54816116f5610c55565b6116ff91906144da565b1115611740576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117379061455a565b60405180910390fd5b600f54816010600061175061252c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff166117a591906144da565b11156117e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117dd906145c6565b60405180910390fd5b60026009540361182b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182290614362565b60405180910390fd5b6002600981905550601160009054906101000a900460ff1615611883576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187a90614632565b60405180910390fd5b816010600061189061252c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff166118e59190614652565b92506101000a81548160ff021916908360ff16021790555061190e61190861252c565b83612e33565b60016009819055505050565b61192261252c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611986576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061199361252c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a4061252c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a859190613738565b60405180910390a35050565b611a9c8484846125ef565b611abb8373ffffffffffffffffffffffffffffffffffffffff16612e51565b8015611ad05750611ace84848484612e74565b155b15611b07576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b81600081118015611b205750600f548111155b611b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b56906144ba565b60405180910390fd5b600e5481611b6b610c55565b611b7591906144da565b1115611bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bad9061455a565b60405180910390fd5b600f548160106000611bc661252c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16611c1b91906144da565b1115611c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c53906145c6565b60405180910390fd5b611c6461252c565b73ffffffffffffffffffffffffffffffffffffffff16611c826115db565b73ffffffffffffffffffffffffffffffffffffffff1614611cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccf90614078565b60405180910390fd5b600260095403611d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1490614362565b60405180910390fd5b6002600981905550611d2f8284612e33565b6001600981905550505050565b611d4461252c565b73ffffffffffffffffffffffffffffffffffffffff16611d626115db565b73ffffffffffffffffffffffffffffffffffffffff1614611db8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daf90614078565b60405180910390fd5b80600f8190555050565b6060611dcd826124de565b611e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e03906146f9565b60405180910390fd5b6000611e16612fc4565b90506000815111611e365760405180602001604052806000815250611e64565b80611e4084613056565b600d604051602001611e54939291906147d8565b6040516020818303038152906040525b915050919050565b82600081118015611e7f5750600f548111155b611ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb5906144ba565b60405180910390fd5b600e5481611eca610c55565b611ed491906144da565b1115611f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0c9061455a565b60405180910390fd5b600f548160106000611f2561252c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16611f7a91906144da565b1115611fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb2906145c6565b60405180910390fd5b600260095403612000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff790614362565b60405180910390fd5b6002600981905550601160019054906101000a900460ff16612057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204e90614855565b60405180910390fd5b600b600061206361252c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156120eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e2906148e7565b60405180910390fd5b60006120f561252c565b604051602001612105919061494f565b60405160208183030381529060405280519060200120905061216b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a54836131b6565b6121aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a1906149dc565b60405180910390fd5b6001600b60006121b861252c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550846010600061221661252c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff1661226b9190614652565b92506101000a81548160ff021916908360ff16021790555061229461228e61252c565b86612e33565b50600160098190555050505050565b600e5481565b60106020528060005260406000206000915054906101000a900460ff1681565b600b6020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61238561252c565b73ffffffffffffffffffffffffffffffffffffffff166123a36115db565b73ffffffffffffffffffffffffffffffffffffffff16146123f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f090614078565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245f90614a6e565b60405180910390fd5b61247181612d6d565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816124e96125e6565b111580156124f8575060005482105b8015612525575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006125fa82612ade565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661262161252c565b73ffffffffffffffffffffffffffffffffffffffff1614806126545750612653826000015161264e61252c565b6122e9565b5b80612699575061266261252c565b73ffffffffffffffffffffffffffffffffffffffff1661268184610a40565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806126d2576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461273b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036127a1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127ae85858560016131cd565b6127be6000848460000151612534565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612a6e57600054811015612a6d5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ad785858560016131d3565b5050505050565b612ae6613641565b600082905080612af46125e6565b11158015612b03575060005481105b15612d36576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612d3457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612c18578092505050612d68565b5b600115612d3357818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d2e578092505050612d68565b612c19565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612e4d8282604051806020016040528060008152506131d9565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e9a61252c565b8786866040518563ffffffff1660e01b8152600401612ebc9493929190614ae3565b6020604051808303816000875af1925050508015612ef857506040513d601f19601f82011682018060405250810190612ef59190614b44565b60015b612f71573d8060008114612f28576040519150601f19603f3d011682016040523d82523d6000602084013e612f2d565b606091505b506000815103612f69576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c8054612fd390613ffb565b80601f0160208091040260200160405190810160405280929190818152602001828054612fff90613ffb565b801561304c5780601f106130215761010080835404028352916020019161304c565b820191906000526020600020905b81548152906001019060200180831161302f57829003601f168201915b5050505050905090565b60606000820361309d576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131b1565b600082905060005b600082146130cf5780806130b890614426565b915050600a826130c89190614ba0565b91506130a5565b60008167ffffffffffffffff8111156130eb576130ea61393a565b5b6040519080825280601f01601f19166020018201604052801561311d5781602001600182028036833780820191505090505b5090505b600085146131aa576001826131369190614bd1565b9150600a856131459190614c05565b603061315191906144da565b60f81b818381518110613167576131666143c8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131a39190614ba0565b9450613121565b8093505050505b919050565b6000826131c385846131eb565b1490509392505050565b50505050565b50505050565b6131e68383836001613260565b505050565b60008082905060005b8451811015613255576000858281518110613212576132116143c8565b5b602002602001015190508083116132345761322d838261362a565b9250613241565b61323e818461362a565b92505b50808061324d90614426565b9150506131f4565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036132cc576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613306576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61331360008683876131cd565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156134dd57506134dc8773ffffffffffffffffffffffffffffffffffffffff16612e51565b5b156135a2575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135526000888480600101955088612e74565b613588576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036134e357826000541461359d57600080fd5b61360d565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082036135a3575b81600081905550505061362360008683876131d3565b5050505050565b600082600052816020526040600020905092915050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6136cd81613698565b81146136d857600080fd5b50565b6000813590506136ea816136c4565b92915050565b6000602082840312156137065761370561368e565b5b6000613714848285016136db565b91505092915050565b60008115159050919050565b6137328161371d565b82525050565b600060208201905061374d6000830184613729565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561378d578082015181840152602081019050613772565b60008484015250505050565b6000601f19601f8301169050919050565b60006137b582613753565b6137bf818561375e565b93506137cf81856020860161376f565b6137d881613799565b840191505092915050565b600060208201905081810360008301526137fd81846137aa565b905092915050565b6000819050919050565b61381881613805565b811461382357600080fd5b50565b6000813590506138358161380f565b92915050565b6000602082840312156138515761385061368e565b5b600061385f84828501613826565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061389382613868565b9050919050565b6138a381613888565b82525050565b60006020820190506138be600083018461389a565b92915050565b6138cd81613888565b81146138d857600080fd5b50565b6000813590506138ea816138c4565b92915050565b600080604083850312156139075761390661368e565b5b6000613915858286016138db565b925050602061392685828601613826565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61397282613799565b810181811067ffffffffffffffff821117156139915761399061393a565b5b80604052505050565b60006139a4613684565b90506139b08282613969565b919050565b600067ffffffffffffffff8211156139d0576139cf61393a565b5b6139d982613799565b9050602081019050919050565b82818337600083830152505050565b6000613a08613a03846139b5565b61399a565b905082815260208101848484011115613a2457613a23613935565b5b613a2f8482856139e6565b509392505050565b600082601f830112613a4c57613a4b613930565b5b8135613a5c8482602086016139f5565b91505092915050565b600060208284031215613a7b57613a7a61368e565b5b600082013567ffffffffffffffff811115613a9957613a98613693565b5b613aa584828501613a37565b91505092915050565b613ab781613805565b82525050565b6000602082019050613ad26000830184613aae565b92915050565b600080600060608486031215613af157613af061368e565b5b6000613aff868287016138db565b9350506020613b10868287016138db565b9250506040613b2186828701613826565b9150509250925092565b6000819050919050565b613b3e81613b2b565b82525050565b6000602082019050613b596000830184613b35565b92915050565b600060208284031215613b7557613b7461368e565b5b6000613b83848285016138db565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613bc181613805565b82525050565b6000613bd38383613bb8565b60208301905092915050565b6000602082019050919050565b6000613bf782613b8c565b613c018185613b97565b9350613c0c83613ba8565b8060005b83811015613c3d578151613c248882613bc7565b9750613c2f83613bdf565b925050600181019050613c10565b5085935050505092915050565b60006020820190508181036000830152613c648184613bec565b905092915050565b613c7581613b2b565b8114613c8057600080fd5b50565b600081359050613c9281613c6c565b92915050565b600060208284031215613cae57613cad61368e565b5b6000613cbc84828501613c83565b91505092915050565b613cce8161371d565b8114613cd957600080fd5b50565b600081359050613ceb81613cc5565b92915050565b60008060408385031215613d0857613d0761368e565b5b6000613d16858286016138db565b9250506020613d2785828601613cdc565b9150509250929050565b600067ffffffffffffffff821115613d4c57613d4b61393a565b5b613d5582613799565b9050602081019050919050565b6000613d75613d7084613d31565b61399a565b905082815260208101848484011115613d9157613d90613935565b5b613d9c8482856139e6565b509392505050565b600082601f830112613db957613db8613930565b5b8135613dc9848260208601613d62565b91505092915050565b60008060008060808587031215613dec57613deb61368e565b5b6000613dfa878288016138db565b9450506020613e0b878288016138db565b9350506040613e1c87828801613826565b925050606085013567ffffffffffffffff811115613e3d57613e3c613693565b5b613e4987828801613da4565b91505092959194509250565b60008060408385031215613e6c57613e6b61368e565b5b6000613e7a85828601613826565b9250506020613e8b858286016138db565b9150509250929050565b600080fd5b600080fd5b60008083601f840112613eb557613eb4613930565b5b8235905067ffffffffffffffff811115613ed257613ed1613e95565b5b602083019150836020820283011115613eee57613eed613e9a565b5b9250929050565b600080600060408486031215613f0e57613f0d61368e565b5b6000613f1c86828701613826565b935050602084013567ffffffffffffffff811115613f3d57613f3c613693565b5b613f4986828701613e9f565b92509250509250925092565b600060ff82169050919050565b613f6b81613f55565b82525050565b6000602082019050613f866000830184613f62565b92915050565b60008060408385031215613fa357613fa261368e565b5b6000613fb1858286016138db565b9250506020613fc2858286016138db565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061401357607f821691505b60208210810361402657614025613fcc565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061406260208361375e565b915061406d8261402c565b602082019050919050565b6000602082019050818103600083015261409181614055565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026140fa7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826140bd565b61410486836140bd565b95508019841693508086168417925050509392505050565b6000819050919050565b600061414161413c61413784613805565b61411c565b613805565b9050919050565b6000819050919050565b61415b83614126565b61416f61416782614148565b8484546140ca565b825550505050565b600090565b614184614177565b61418f818484614152565b505050565b5b818110156141b3576141a860008261417c565b600181019050614195565b5050565b601f8211156141f8576141c981614098565b6141d2846140ad565b810160208510156141e1578190505b6141f56141ed856140ad565b830182614194565b50505b505050565b600082821c905092915050565b600061421b600019846008026141fd565b1980831691505092915050565b6000614234838361420a565b9150826002028217905092915050565b61424d82613753565b67ffffffffffffffff8111156142665761426561393a565b5b6142708254613ffb565b61427b8282856141b7565b600060209050601f8311600181146142ae576000841561429c578287015190505b6142a68582614228565b86555061430e565b601f1984166142bc86614098565b60005b828110156142e4578489015182556001820191506020850194506020810190506142bf565b8683101561430157848901516142fd601f89168261420a565b8355505b6001600288020188555050505b505050505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061434c601f8361375e565b915061435782614316565b602082019050919050565b6000602082019050818103600083015261437b8161433f565b9050919050565b600081905092915050565b50565b600061439d600083614382565b91506143a88261438d565b600082019050919050565b60006143be82614390565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061443182613805565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614463576144626143f7565b5b600182019050919050565b7f496e76616c6964206d696e7420616d6f756e74207375626d6974746564000000600082015250565b60006144a4601d8361375e565b91506144af8261446e565b602082019050919050565b600060208201905081810360008301526144d381614497565b9050919050565b60006144e582613805565b91506144f083613805565b9250828201905080821115614508576145076143f7565b5b92915050565b7f4d6178696d756d204e465420737570706c792065786365656465640000000000600082015250565b6000614544601b8361375e565b915061454f8261450e565b602082019050919050565b6000602082019050818103600083015261457381614537565b9050919050565b7f4d6178696d756d2077616c6c657420616d6f756e742065786365656465640000600082015250565b60006145b0601e8361375e565b91506145bb8261457a565b602082019050919050565b600060208201905081810360008301526145df816145a3565b9050919050565b7f4d696e74696e672069732063757272656e746c79207061757365640000000000600082015250565b600061461c601b8361375e565b9150614627826145e6565b602082019050919050565b6000602082019050818103600083015261464b8161460f565b9050919050565b600061465d82613f55565b915061466883613f55565b9250828201905060ff811115614681576146806143f7565b5b92915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006146e3602f8361375e565b91506146ee82614687565b604082019050919050565b60006020820190508181036000830152614712816146d6565b9050919050565b600081905092915050565b600061472f82613753565b6147398185614719565b935061474981856020860161376f565b80840191505092915050565b6000815461476281613ffb565b61476c8186614719565b94506001821660008114614787576001811461479c576147cf565b60ff19831686528115158202860193506147cf565b6147a585614098565b60005b838110156147c7578154818901526001820191506020810190506147a8565b838801955050505b50505092915050565b60006147e48286614724565b91506147f08285614724565b91506147fc8284614755565b9150819050949350505050565b7f57686974656c6973742073616c65206973206e6f742061637469766500000000600082015250565b600061483f601c8361375e565b915061484a82614809565b602082019050919050565b6000602082019050818103600083015261486e81614832565b9050919050565b7f4164647265737320616c726561647920636c61696d65642077686974656c697360008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b60006148d160218361375e565b91506148dc82614875565b604082019050919050565b60006020820190508181036000830152614900816148c4565b9050919050565b60008160601b9050919050565b600061491f82614907565b9050919050565b600061493182614914565b9050919050565b61494961494482613888565b614926565b82525050565b600061495b8284614938565b60148201915081905092915050565b7f496e76616c69642077686974656c6973742070726f6f66207375626d6974746560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b60006149c660218361375e565b91506149d18261496a565b604082019050919050565b600060208201905081810360008301526149f5816149b9565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614a5860268361375e565b9150614a63826149fc565b604082019050919050565b60006020820190508181036000830152614a8781614a4b565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614ab582614a8e565b614abf8185614a99565b9350614acf81856020860161376f565b614ad881613799565b840191505092915050565b6000608082019050614af8600083018761389a565b614b05602083018661389a565b614b126040830185613aae565b8181036060830152614b248184614aaa565b905095945050505050565b600081519050614b3e816136c4565b92915050565b600060208284031215614b5a57614b5961368e565b5b6000614b6884828501614b2f565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614bab82613805565b9150614bb683613805565b925082614bc657614bc5614b71565b5b828204905092915050565b6000614bdc82613805565b9150614be783613805565b9250828203905081811115614bff57614bfe6143f7565b5b92915050565b6000614c1082613805565b9150614c1b83613805565b925082614c2b57614c2a614b71565b5b82820690509291505056fea2646970667358221220742124a453db74b1ac27350e58889637a6e53b0cbd4bfc23fdfbd1147b17c5cc64736f6c63430008100033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000b4e4654657272617269756d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044e46545200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f6170692e6e6674657272617269756d2e78797a2f67656e657369732f00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _tokenName (string): NFTerrarium
Arg [1] : _tokenSymbol (string): NFTR
Arg [2] : _maxAmountPerWallet (uint256): 3
Arg [3] : _initBaseURI (string): https://api.nfterrarium.xyz/genesis/

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [5] : 4e4654657272617269756d000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 4e46545200000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000024
Arg [9] : 68747470733a2f2f6170692e6e6674657272617269756d2e78797a2f67656e65
Arg [10] : 7369732f00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

50376:5404:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32876:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36261:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37764:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37327:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55091:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32125:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38621:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50526:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55205:74;;;;;;;;;;;;;:::i;:::-;;50837:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55287:78;;;;;;;;;;;;;:::i;:::-;;55602:173;;;;;;;;;;;;;:::i;:::-;;38862:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53194:888;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51070:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50701:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54987:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50991:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36070:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55373:109;;;;;;;;;;;;;:::i;:::-;;50668:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51023:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33245:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18356:103;;;;;;;;;;;;;:::i;:::-;;55490:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17705:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36430:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52687:264;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38040:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39118:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52959:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54843:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54090:395;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51948:731;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50800:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50877:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50558:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38390:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18614:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32876:305;32978:4;33030:25;33015:40;;;:11;:40;;;;:105;;;;33087:33;33072:48;;;:11;:48;;;;33015:105;:158;;;;33137:36;33161:11;33137:23;:36::i;:::-;33015:158;32995:178;;32876:305;;;:::o;36261:100::-;36315:13;36348:5;36341:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36261:100;:::o;37764:204::-;37832:7;37857:16;37865:7;37857;:16::i;:::-;37852:64;;37882:34;;;;;;;;;;;;;;37852:64;37936:15;:24;37952:7;37936:24;;;;;;;;;;;;;;;;;;;;;37929:31;;37764:204;;;:::o;37327:371::-;37400:13;37416:24;37432:7;37416:15;:24::i;:::-;37400:40;;37461:5;37455:11;;:2;:11;;;37451:48;;37475:24;;;;;;;;;;;;;;37451:48;37532:5;37516:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;37542:37;37559:5;37566:12;:10;:12::i;:::-;37542:16;:37::i;:::-;37541:38;37516:63;37512:138;;;37603:35;;;;;;;;;;;;;;37512:138;37662:28;37671:2;37675:7;37684:5;37662:8;:28::i;:::-;37389:309;37327:371;;:::o;55091:106::-;17936:12;:10;:12::i;:::-;17925:23;;:7;:5;:7::i;:::-;:23;;;17917:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55179:10:::1;55167:9;:22;;;;;;:::i;:::-;;55091:106:::0;:::o;32125:303::-;32169:7;32394:15;:13;:15::i;:::-;32379:12;;32363:13;;:28;:46;32356:53;;32125:303;:::o;38621:170::-;38755:28;38765:4;38771:2;38775:7;38755:9;:28::i;:::-;38621:170;;;:::o;50526:25::-;;;;:::o;55205:74::-;17936:12;:10;:12::i;:::-;17925:23;;:7;:5;:7::i;:::-;:23;;;17917:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55265:6:::1;;;;;;;;;;;55264:7;55255:6;;:16;;;;;;;;;;;;;;;;;;55205:74::o:0;50837:33::-;;;;:::o;55287:78::-;17936:12;:10;:12::i;:::-;17925:23;;:7;:5;:7::i;:::-;:23;;;17917:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55349:8:::1;;;;;;;;;;;55348:9;55337:8;;:20;;;;;;;;;;;;;;;;;;55287:78::o:0;55602:173::-;17936:12;:10;:12::i;:::-;17925:23;;:7;:5;:7::i;:::-;:23;;;17917:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15757:1:::1;16355:7;;:19:::0;16347:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;15757:1;16488:7;:18;;;;55664:12:::2;55690:10;55682:24;;55714:21;55682:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55663:77;;;55759:7;55751:16;;;::::0;::::2;;55652:123;15713:1:::1;16667:7;:22;;;;55602:173::o:0;38862:185::-;39000:39;39017:4;39023:2;39027:7;39000:39;;;;;;;;;;;;:16;:39::i;:::-;38862:185;;;:::o;53194:888::-;53254:16;53283:23;53309:17;53319:6;53309:9;:17::i;:::-;53283:43;;53337:30;53384:15;53370:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53337:63;;53411:22;53436:15;:13;:15::i;:::-;53411:40;;53462:23;53500:26;53539:503;53564:15;53546;:33;:64;;;;;53601:9;;53583:14;:27;;53546:64;53539:503;;;53627:31;53661:11;:27;53673:14;53661:27;;;;;;;;;;;53627:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53710:9;:16;;;53709:17;:49;;;;;53756:1;53730:28;;:9;:14;;;:28;;;;53709:49;53705:125;;;53800:9;:14;;;53779:35;;53705:125;53872:6;53850:28;;:18;:28;;;53846:152;;53932:14;53899:13;53913:15;53899:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;53965:17;;;;;:::i;:::-;;;;53846:152;54014:16;;;;;:::i;:::-;;;;53612:430;53539:503;;;54061:13;54054:20;;;;;;;53194:888;;;:::o;51070:28::-;;;;;;;;;;;;;:::o;50701:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54987:96::-;17936:12;:10;:12::i;:::-;17925:23;;:7;:5;:7::i;:::-;:23;;;17917:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55068:7:::1;55058;:17;;;;;;:::i;:::-;;54987:96:::0;:::o;50991:25::-;;;;;;;;;;;;;:::o;36070:124::-;36134:7;36161:20;36173:7;36161:11;:20::i;:::-;:25;;;36154:32;;36070:124;;;:::o;55373:109::-;17936:12;:10;:12::i;:::-;17925:23;;:7;:5;:7::i;:::-;:23;;;17917:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55454:20:::1;;;;;;;;;;;55453:21;55430:20;;:44;;;;;;;;;;;;;;;;;;55373:109::o:0;50668:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51023:40::-;;;;;;;;;;;;;:::o;33245:206::-;33309:7;33350:1;33333:19;;:5;:19;;;33329:60;;33361:28;;;;;;;;;;;;;;33329:60;33415:12;:19;33428:5;33415:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;33407:36;;33400:43;;33245:206;;;:::o;18356:103::-;17936:12;:10;:12::i;:::-;17925:23;;:7;:5;:7::i;:::-;:23;;;17917:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18421:30:::1;18448:1;18421:18;:30::i;:::-;18356:103::o:0;55490:104::-;17936:12;:10;:12::i;:::-;17925:23;;:7;:5;:7::i;:::-;:23;;;17917:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55575:11:::1;55562:10;:24;;;;55490:104:::0;:::o;17705:87::-;17751:7;17778:6;;;;;;;;;;;17771:13;;17705:87;:::o;36430:104::-;36486:13;36519:7;36512:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36430:104;:::o;52687:264::-;52752:11;51582:1;51568:11;:15;:52;;;;;51602:18;;51587:11;:33;;51568:52;51560:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;51704:9;;51689:11;51673:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;51665:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;51809:18;;51794:11;51764:13;:27;51778:12;:10;:12::i;:::-;51764:27;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;;;;:::i;:::-;:63;;51756:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;15757:1:::1;16355:7;;:19:::0;16347:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;15757:1;16488:7;:18;;;;52798:6:::2;;;;;;;;;;;52797:7;52789:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;52884:11;52847:13;:27;52861:12;:10;:12::i;:::-;52847:27;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;52907:36;52917:12;:10;:12::i;:::-;52931:11;52907:9;:36::i;:::-;15713:1:::1;16667:7;:22;;;;52687:264:::0;;:::o;38040:279::-;38143:12;:10;:12::i;:::-;38131:24;;:8;:24;;;38127:54;;38164:17;;;;;;;;;;;;;;38127:54;38239:8;38194:18;:32;38213:12;:10;:12::i;:::-;38194:32;;;;;;;;;;;;;;;:42;38227:8;38194:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;38292:8;38263:48;;38278:12;:10;:12::i;:::-;38263:48;;;38302:8;38263:48;;;;;;:::i;:::-;;;;;;;;38040:279;;:::o;39118:369::-;39285:28;39295:4;39301:2;39305:7;39285:9;:28::i;:::-;39328:15;:2;:13;;;:15::i;:::-;:76;;;;;39348:56;39379:4;39385:2;39389:7;39398:5;39348:30;:56::i;:::-;39347:57;39328:76;39324:156;;;39428:40;;;;;;;;;;;;;;39324:156;39118:369;;;;:::o;52959:167::-;53038:11;51582:1;51568:11;:15;:52;;;;;51602:18;;51587:11;:33;;51568:52;51560:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;51704:9;;51689:11;51673:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;51665:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;51809:18;;51794:11;51764:13;:27;51778:12;:10;:12::i;:::-;51764:27;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;;;;:::i;:::-;:63;;51756:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;17936:12:::1;:10;:12::i;:::-;17925:23;;:7;:5;:7::i;:::-;:23;;;17917:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15757:1:::2;16355:7;;:19:::0;16347:63:::2;;;;;;;;;;;;:::i;:::-;;;;;;;;;15757:1;16488:7;:18;;;;53085:33:::3;53095:9;53106:11;53085:9;:33::i;:::-;15713:1:::2;16667:7;:22;;;;52959:167:::0;;;:::o;54843:136::-;17936:12;:10;:12::i;:::-;17925:23;;:7;:5;:7::i;:::-;:23;;;17917:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54952:19:::1;54931:18;:40;;;;54843:136:::0;:::o;54090:395::-;54164:13;54198:17;54206:8;54198:7;:17::i;:::-;54190:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;54280:28;54311:10;:8;:10::i;:::-;54280:41;;54370:1;54345:14;54339:28;:32;:138;;;;;;;;;;;;;;;;;54411:14;54427:19;:8;:17;:19::i;:::-;54448:9;54394:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54339:138;54332:145;;;54090:395;;;:::o;51948:731::-;52055:11;51582:1;51568:11;:15;:52;;;;;51602:18;;51587:11;:33;;51568:52;51560:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;51704:9;;51689:11;51673:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;51665:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;51809:18;;51794:11;51764:13;:27;51778:12;:10;:12::i;:::-;51764:27;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;;;;:::i;:::-;:63;;51756:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;15757:1:::1;16355:7;;:19:::0;16347:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;15757:1;16488:7;:18;;;;52144:20:::2;;;;;;;;;;;52136:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;52217:16;:30;52234:12;:10;:12::i;:::-;52217:30;;;;;;;;;;;;;;;;;;;;;;;;;52216:31;52208:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;52331:12;52373;:10;:12::i;:::-;52356:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;52346:41;;;;;;52331:56;;52406:50;52425:12;;52406:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52439:10;;52451:4;52406:18;:50::i;:::-;52398:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;52560:4;52527:16;:30;52544:12;:10;:12::i;:::-;52527:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;52612:11;52575:13;:27;52589:12;:10;:12::i;:::-;52575:27;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;52635:36;52645:12;:10;:12::i;:::-;52659:11;52635:9;:36::i;:::-;52081:598;15713:1:::1;16667:7;:22;;;;51948:731:::0;;;;:::o;50800:30::-;;;;:::o;50877:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;50558:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;38390:164::-;38487:4;38511:18;:25;38530:5;38511:25;;;;;;;;;;;;;;;:35;38537:8;38511:35;;;;;;;;;;;;;;;;;;;;;;;;;38504:42;;38390:164;;;;:::o;18614:201::-;17936:12;:10;:12::i;:::-;17925:23;;:7;:5;:7::i;:::-;:23;;;17917:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18723:1:::1;18703:22;;:8;:22;;::::0;18695:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;18779:28;18798:8;18779:18;:28::i;:::-;18614:201:::0;:::o;25605:157::-;25690:4;25729:25;25714:40;;;:11;:40;;;;25707:47;;25605:157;;;:::o;39742:187::-;39799:4;39842:7;39823:15;:13;:15::i;:::-;:26;;:53;;;;;39863:13;;39853:7;:23;39823:53;:98;;;;;39894:11;:20;39906:7;39894:20;;;;;;;;;;;:27;;;;;;;;;;;;39893:28;39823:98;39816:105;;39742:187;;;:::o;5355:98::-;5408:7;5435:10;5428:17;;5355:98;:::o;47353:196::-;47495:2;47468:15;:24;47484:7;47468:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;47533:7;47529:2;47513:28;;47522:5;47513:28;;;;;;;;;;;;47353:196;;;:::o;54555:101::-;54620:7;54647:1;54640:8;;54555:101;:::o;42855:2112::-;42970:35;43008:20;43020:7;43008:11;:20::i;:::-;42970:58;;43041:22;43083:13;:18;;;43067:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;43118:50;43135:13;:18;;;43155:12;:10;:12::i;:::-;43118:16;:50::i;:::-;43067:101;:154;;;;43209:12;:10;:12::i;:::-;43185:36;;:20;43197:7;43185:11;:20::i;:::-;:36;;;43067:154;43041:181;;43240:17;43235:66;;43266:35;;;;;;;;;;;;;;43235:66;43338:4;43316:26;;:13;:18;;;:26;;;43312:67;;43351:28;;;;;;;;;;;;;;43312:67;43408:1;43394:16;;:2;:16;;;43390:52;;43419:23;;;;;;;;;;;;;;43390:52;43455:43;43477:4;43483:2;43487:7;43496:1;43455:21;:43::i;:::-;43563:49;43580:1;43584:7;43593:13;:18;;;43563:8;:49::i;:::-;43938:1;43908:12;:18;43921:4;43908:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43982:1;43954:12;:16;43967:2;43954:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44028:2;44000:11;:20;44012:7;44000:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;44090:15;44045:11;:20;44057:7;44045:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;44358:19;44390:1;44380:7;:11;44358:33;;44451:1;44410:43;;:11;:24;44422:11;44410:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;44406:445;;44635:13;;44621:11;:27;44617:219;;;44705:13;:18;;;44673:11;:24;44685:11;44673:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;44788:13;:28;;;44746:11;:24;44758:11;44746:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;44617:219;44406:445;43883:979;44898:7;44894:2;44879:27;;44888:4;44879:27;;;;;;;;;;;;44917:42;44938:4;44944:2;44948:7;44957:1;44917:20;:42::i;:::-;42959:2008;;42855:2112;;;:::o;34900:1108::-;34961:21;;:::i;:::-;34995:12;35010:7;34995:22;;35078:4;35059:15;:13;:15::i;:::-;:23;;:47;;;;;35093:13;;35086:4;:20;35059:47;35055:886;;;35127:31;35161:11;:17;35173:4;35161:17;;;;;;;;;;;35127:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35202:9;:16;;;35197:729;;35273:1;35247:28;;:9;:14;;;:28;;;35243:101;;35311:9;35304:16;;;;;;35243:101;35646:261;35653:4;35646:261;;;35686:6;;;;;;;;35731:11;:17;35743:4;35731:17;;;;;;;;;;;35719:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35805:1;35779:28;;:9;:14;;;:28;;;35775:109;;35847:9;35840:16;;;;;;35775:109;35646:261;;;35197:729;35108:833;35055:886;35969:31;;;;;;;;;;;;;;34900:1108;;;;:::o;18975:191::-;19049:16;19068:6;;;;;;;;;;;19049:25;;19094:8;19085:6;;:17;;;;;;;;;;;;;;;;;;19149:8;19118:40;;19139:8;19118:40;;;;;;;;;;;;19038:128;18975:191;:::o;39937:104::-;40006:27;40016:2;40020:8;40006:27;;;;;;;;;;;;:9;:27::i;:::-;39937:104;;:::o;6744:326::-;6804:4;7061:1;7039:7;:19;;;:23;7032:30;;6744:326;;;:::o;48041:667::-;48204:4;48241:2;48225:36;;;48262:12;:10;:12::i;:::-;48276:4;48282:7;48291:5;48225:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;48221:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48476:1;48459:6;:13;:18;48455:235;;48505:40;;;;;;;;;;;;;;48455:235;48648:6;48642:13;48633:6;48629:2;48625:15;48618:38;48221:480;48354:45;;;48344:55;;;:6;:55;;;;48337:62;;;48041:667;;;;;;:::o;54664:108::-;54724:13;54757:7;54750:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54664:108;:::o;2975:723::-;3031:13;3261:1;3252:5;:10;3248:53;;3279:10;;;;;;;;;;;;;;;;;;;;;3248:53;3311:12;3326:5;3311:20;;3342:14;3367:78;3382:1;3374:4;:9;3367:78;;3400:8;;;;;:::i;:::-;;;;3431:2;3423:10;;;;;:::i;:::-;;;3367:78;;;3455:19;3487:6;3477:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3455:39;;3505:154;3521:1;3512:5;:10;3505:154;;3549:1;3539:11;;;;;:::i;:::-;;;3616:2;3608:5;:10;;;;:::i;:::-;3595:2;:24;;;;:::i;:::-;3582:39;;3565:6;3572;3565:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3645:2;3636:11;;;;;:::i;:::-;;;3505:154;;;3683:6;3669:21;;;;;2975:723;;;;:::o;1200:190::-;1325:4;1378;1349:25;1362:5;1369:4;1349:12;:25::i;:::-;:33;1342:40;;1200:190;;;;;:::o;49356:159::-;;;;;:::o;50174:158::-;;;;;:::o;40404:163::-;40527:32;40533:2;40537:8;40547:5;40554:4;40527:5;:32::i;:::-;40404:163;;;:::o;1752:675::-;1835:7;1855:20;1878:4;1855:27;;1898:9;1893:497;1917:5;:12;1913:1;:16;1893:497;;;1951:20;1974:5;1980:1;1974:8;;;;;;;;:::i;:::-;;;;;;;;1951:31;;2017:12;2001;:28;1997:382;;2144:42;2159:12;2173;2144:14;:42::i;:::-;2129:57;;1997:382;;;2321:42;2336:12;2350;2321:14;:42::i;:::-;2306:57;;1997:382;1936:454;1931:3;;;;;:::i;:::-;;;;1893:497;;;;2407:12;2400:19;;;1752:675;;;;:::o;40826:1775::-;40965:20;40988:13;;40965:36;;41030:1;41016:16;;:2;:16;;;41012:48;;41041:19;;;;;;;;;;;;;;41012:48;41087:1;41075:8;:13;41071:44;;41097:18;;;;;;;;;;;;;;41071:44;41128:61;41158:1;41162:2;41166:12;41180:8;41128:21;:61::i;:::-;41501:8;41466:12;:16;41479:2;41466:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41565:8;41525:12;:16;41538:2;41525:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41624:2;41591:11;:25;41603:12;41591:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;41691:15;41641:11;:25;41653:12;41641:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;41724:20;41747:12;41724:35;;41774:11;41803:8;41788:12;:23;41774:37;;41832:4;:23;;;;;41840:15;:2;:13;;;:15::i;:::-;41832:23;41828:641;;;41876:314;41932:12;41928:2;41907:38;;41924:1;41907:38;;;;;;;;;;;;41973:69;42012:1;42016:2;42020:14;;;;;;42036:5;41973:30;:69::i;:::-;41968:174;;42078:40;;;;;;;;;;;;;;41968:174;42185:3;42169:12;:19;41876:314;;42271:12;42254:13;;:29;42250:43;;42285:8;;;42250:43;41828:641;;;42334:120;42390:14;;;;;;42386:2;42365:40;;42382:1;42365:40;;;;;;;;;;;;42449:3;42433:12;:19;42334:120;;41828:641;42499:12;42483:13;:28;;;;41441:1082;;42533:60;42562:1;42566:2;42570:12;42584:8;42533:20;:60::i;:::-;40954:1647;40826:1775;;;;:::o;2435:224::-;2503:13;2566:1;2560:4;2553:15;2595:1;2589:4;2582:15;2636:4;2630;2620:21;2611:30;;2435:224;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:117::-;4999:1;4996;4989:12;5013:117;5122:1;5119;5112:12;5136:180;5184:77;5181:1;5174:88;5281:4;5278:1;5271:15;5305:4;5302:1;5295:15;5322:281;5405:27;5427:4;5405:27;:::i;:::-;5397:6;5393:40;5535:6;5523:10;5520:22;5499:18;5487:10;5484:34;5481:62;5478:88;;;5546:18;;:::i;:::-;5478:88;5586:10;5582:2;5575:22;5365:238;5322:281;;:::o;5609:129::-;5643:6;5670:20;;:::i;:::-;5660:30;;5699:33;5727:4;5719:6;5699:33;:::i;:::-;5609:129;;;:::o;5744:308::-;5806:4;5896:18;5888:6;5885:30;5882:56;;;5918:18;;:::i;:::-;5882:56;5956:29;5978:6;5956:29;:::i;:::-;5948:37;;6040:4;6034;6030:15;6022:23;;5744:308;;;:::o;6058:146::-;6155:6;6150:3;6145;6132:30;6196:1;6187:6;6182:3;6178:16;6171:27;6058:146;;;:::o;6210:425::-;6288:5;6313:66;6329:49;6371:6;6329:49;:::i;:::-;6313:66;:::i;:::-;6304:75;;6402:6;6395:5;6388:21;6440:4;6433:5;6429:16;6478:3;6469:6;6464:3;6460:16;6457:25;6454:112;;;6485:79;;:::i;:::-;6454:112;6575:54;6622:6;6617:3;6612;6575:54;:::i;:::-;6294:341;6210:425;;;;;:::o;6655:340::-;6711:5;6760:3;6753:4;6745:6;6741:17;6737:27;6727:122;;6768:79;;:::i;:::-;6727:122;6885:6;6872:20;6910:79;6985:3;6977:6;6970:4;6962:6;6958:17;6910:79;:::i;:::-;6901:88;;6717:278;6655:340;;;;:::o;7001:509::-;7070:6;7119:2;7107:9;7098:7;7094:23;7090:32;7087:119;;;7125:79;;:::i;:::-;7087:119;7273:1;7262:9;7258:17;7245:31;7303:18;7295:6;7292:30;7289:117;;;7325:79;;:::i;:::-;7289:117;7430:63;7485:7;7476:6;7465:9;7461:22;7430:63;:::i;:::-;7420:73;;7216:287;7001:509;;;;:::o;7516:118::-;7603:24;7621:5;7603:24;:::i;:::-;7598:3;7591:37;7516:118;;:::o;7640:222::-;7733:4;7771:2;7760:9;7756:18;7748:26;;7784:71;7852:1;7841:9;7837:17;7828:6;7784:71;:::i;:::-;7640:222;;;;:::o;7868:619::-;7945:6;7953;7961;8010:2;7998:9;7989:7;7985:23;7981:32;7978:119;;;8016:79;;:::i;:::-;7978:119;8136:1;8161:53;8206:7;8197:6;8186:9;8182:22;8161:53;:::i;:::-;8151:63;;8107:117;8263:2;8289:53;8334:7;8325:6;8314:9;8310:22;8289:53;:::i;:::-;8279:63;;8234:118;8391:2;8417:53;8462:7;8453:6;8442:9;8438:22;8417:53;:::i;:::-;8407:63;;8362:118;7868:619;;;;;:::o;8493:77::-;8530:7;8559:5;8548:16;;8493:77;;;:::o;8576:118::-;8663:24;8681:5;8663:24;:::i;:::-;8658:3;8651:37;8576:118;;:::o;8700:222::-;8793:4;8831:2;8820:9;8816:18;8808:26;;8844:71;8912:1;8901:9;8897:17;8888:6;8844:71;:::i;:::-;8700:222;;;;:::o;8928:329::-;8987:6;9036:2;9024:9;9015:7;9011:23;9007:32;9004:119;;;9042:79;;:::i;:::-;9004:119;9162:1;9187:53;9232:7;9223:6;9212:9;9208:22;9187:53;:::i;:::-;9177:63;;9133:117;8928:329;;;;:::o;9263:114::-;9330:6;9364:5;9358:12;9348:22;;9263:114;;;:::o;9383:184::-;9482:11;9516:6;9511:3;9504:19;9556:4;9551:3;9547:14;9532:29;;9383:184;;;;:::o;9573:132::-;9640:4;9663:3;9655:11;;9693:4;9688:3;9684:14;9676:22;;9573:132;;;:::o;9711:108::-;9788:24;9806:5;9788:24;:::i;:::-;9783:3;9776:37;9711:108;;:::o;9825:179::-;9894:10;9915:46;9957:3;9949:6;9915:46;:::i;:::-;9993:4;9988:3;9984:14;9970:28;;9825:179;;;;:::o;10010:113::-;10080:4;10112;10107:3;10103:14;10095:22;;10010:113;;;:::o;10159:732::-;10278:3;10307:54;10355:5;10307:54;:::i;:::-;10377:86;10456:6;10451:3;10377:86;:::i;:::-;10370:93;;10487:56;10537:5;10487:56;:::i;:::-;10566:7;10597:1;10582:284;10607:6;10604:1;10601:13;10582:284;;;10683:6;10677:13;10710:63;10769:3;10754:13;10710:63;:::i;:::-;10703:70;;10796:60;10849:6;10796:60;:::i;:::-;10786:70;;10642:224;10629:1;10626;10622:9;10617:14;;10582:284;;;10586:14;10882:3;10875:10;;10283:608;;;10159:732;;;;:::o;10897:373::-;11040:4;11078:2;11067:9;11063:18;11055:26;;11127:9;11121:4;11117:20;11113:1;11102:9;11098:17;11091:47;11155:108;11258:4;11249:6;11155:108;:::i;:::-;11147:116;;10897:373;;;;:::o;11276:122::-;11349:24;11367:5;11349:24;:::i;:::-;11342:5;11339:35;11329:63;;11388:1;11385;11378:12;11329:63;11276:122;:::o;11404:139::-;11450:5;11488:6;11475:20;11466:29;;11504:33;11531:5;11504:33;:::i;:::-;11404:139;;;;:::o;11549:329::-;11608:6;11657:2;11645:9;11636:7;11632:23;11628:32;11625:119;;;11663:79;;:::i;:::-;11625:119;11783:1;11808:53;11853:7;11844:6;11833:9;11829:22;11808:53;:::i;:::-;11798:63;;11754:117;11549:329;;;;:::o;11884:116::-;11954:21;11969:5;11954:21;:::i;:::-;11947:5;11944:32;11934:60;;11990:1;11987;11980:12;11934:60;11884:116;:::o;12006:133::-;12049:5;12087:6;12074:20;12065:29;;12103:30;12127:5;12103:30;:::i;:::-;12006:133;;;;:::o;12145:468::-;12210:6;12218;12267:2;12255:9;12246:7;12242:23;12238:32;12235:119;;;12273:79;;:::i;:::-;12235:119;12393:1;12418:53;12463:7;12454:6;12443:9;12439:22;12418:53;:::i;:::-;12408:63;;12364:117;12520:2;12546:50;12588:7;12579:6;12568:9;12564:22;12546:50;:::i;:::-;12536:60;;12491:115;12145:468;;;;;:::o;12619:307::-;12680:4;12770:18;12762:6;12759:30;12756:56;;;12792:18;;:::i;:::-;12756:56;12830:29;12852:6;12830:29;:::i;:::-;12822:37;;12914:4;12908;12904:15;12896:23;;12619:307;;;:::o;12932:423::-;13009:5;13034:65;13050:48;13091:6;13050:48;:::i;:::-;13034:65;:::i;:::-;13025:74;;13122:6;13115:5;13108:21;13160:4;13153:5;13149:16;13198:3;13189:6;13184:3;13180:16;13177:25;13174:112;;;13205:79;;:::i;:::-;13174:112;13295:54;13342:6;13337:3;13332;13295:54;:::i;:::-;13015:340;12932:423;;;;;:::o;13374:338::-;13429:5;13478:3;13471:4;13463:6;13459:17;13455:27;13445:122;;13486:79;;:::i;:::-;13445:122;13603:6;13590:20;13628:78;13702:3;13694:6;13687:4;13679:6;13675:17;13628:78;:::i;:::-;13619:87;;13435:277;13374:338;;;;:::o;13718:943::-;13813:6;13821;13829;13837;13886:3;13874:9;13865:7;13861:23;13857:33;13854:120;;;13893:79;;:::i;:::-;13854:120;14013:1;14038:53;14083:7;14074:6;14063:9;14059:22;14038:53;:::i;:::-;14028:63;;13984:117;14140:2;14166:53;14211:7;14202:6;14191:9;14187:22;14166:53;:::i;:::-;14156:63;;14111:118;14268:2;14294:53;14339:7;14330:6;14319:9;14315:22;14294:53;:::i;:::-;14284:63;;14239:118;14424:2;14413:9;14409:18;14396:32;14455:18;14447:6;14444:30;14441:117;;;14477:79;;:::i;:::-;14441:117;14582:62;14636:7;14627:6;14616:9;14612:22;14582:62;:::i;:::-;14572:72;;14367:287;13718:943;;;;;;;:::o;14667:474::-;14735:6;14743;14792:2;14780:9;14771:7;14767:23;14763:32;14760:119;;;14798:79;;:::i;:::-;14760:119;14918:1;14943:53;14988:7;14979:6;14968:9;14964:22;14943:53;:::i;:::-;14933:63;;14889:117;15045:2;15071:53;15116:7;15107:6;15096:9;15092:22;15071:53;:::i;:::-;15061:63;;15016:118;14667:474;;;;;:::o;15147:117::-;15256:1;15253;15246:12;15270:117;15379:1;15376;15369:12;15410:568;15483:8;15493:6;15543:3;15536:4;15528:6;15524:17;15520:27;15510:122;;15551:79;;:::i;:::-;15510:122;15664:6;15651:20;15641:30;;15694:18;15686:6;15683:30;15680:117;;;15716:79;;:::i;:::-;15680:117;15830:4;15822:6;15818:17;15806:29;;15884:3;15876:4;15868:6;15864:17;15854:8;15850:32;15847:41;15844:128;;;15891:79;;:::i;:::-;15844:128;15410:568;;;;;:::o;15984:704::-;16079:6;16087;16095;16144:2;16132:9;16123:7;16119:23;16115:32;16112:119;;;16150:79;;:::i;:::-;16112:119;16270:1;16295:53;16340:7;16331:6;16320:9;16316:22;16295:53;:::i;:::-;16285:63;;16241:117;16425:2;16414:9;16410:18;16397:32;16456:18;16448:6;16445:30;16442:117;;;16478:79;;:::i;:::-;16442:117;16591:80;16663:7;16654:6;16643:9;16639:22;16591:80;:::i;:::-;16573:98;;;;16368:313;15984:704;;;;;:::o;16694:86::-;16729:7;16769:4;16762:5;16758:16;16747:27;;16694:86;;;:::o;16786:112::-;16869:22;16885:5;16869:22;:::i;:::-;16864:3;16857:35;16786:112;;:::o;16904:214::-;16993:4;17031:2;17020:9;17016:18;17008:26;;17044:67;17108:1;17097:9;17093:17;17084:6;17044:67;:::i;:::-;16904:214;;;;:::o;17124:474::-;17192:6;17200;17249:2;17237:9;17228:7;17224:23;17220:32;17217:119;;;17255:79;;:::i;:::-;17217:119;17375:1;17400:53;17445:7;17436:6;17425:9;17421:22;17400:53;:::i;:::-;17390:63;;17346:117;17502:2;17528:53;17573:7;17564:6;17553:9;17549:22;17528:53;:::i;:::-;17518:63;;17473:118;17124:474;;;;;:::o;17604:180::-;17652:77;17649:1;17642:88;17749:4;17746:1;17739:15;17773:4;17770:1;17763:15;17790:320;17834:6;17871:1;17865:4;17861:12;17851:22;;17918:1;17912:4;17908:12;17939:18;17929:81;;17995:4;17987:6;17983:17;17973:27;;17929:81;18057:2;18049:6;18046:14;18026:18;18023:38;18020:84;;18076:18;;:::i;:::-;18020:84;17841:269;17790:320;;;:::o;18116:182::-;18256:34;18252:1;18244:6;18240:14;18233:58;18116:182;:::o;18304:366::-;18446:3;18467:67;18531:2;18526:3;18467:67;:::i;:::-;18460:74;;18543:93;18632:3;18543:93;:::i;:::-;18661:2;18656:3;18652:12;18645:19;;18304:366;;;:::o;18676:419::-;18842:4;18880:2;18869:9;18865:18;18857:26;;18929:9;18923:4;18919:20;18915:1;18904:9;18900:17;18893:47;18957:131;19083:4;18957:131;:::i;:::-;18949:139;;18676:419;;;:::o;19101:141::-;19150:4;19173:3;19165:11;;19196:3;19193:1;19186:14;19230:4;19227:1;19217:18;19209:26;;19101:141;;;:::o;19248:93::-;19285:6;19332:2;19327;19320:5;19316:14;19312:23;19302:33;;19248:93;;;:::o;19347:107::-;19391:8;19441:5;19435:4;19431:16;19410:37;;19347:107;;;;:::o;19460:393::-;19529:6;19579:1;19567:10;19563:18;19602:97;19632:66;19621:9;19602:97;:::i;:::-;19720:39;19750:8;19739:9;19720:39;:::i;:::-;19708:51;;19792:4;19788:9;19781:5;19777:21;19768:30;;19841:4;19831:8;19827:19;19820:5;19817:30;19807:40;;19536:317;;19460:393;;;;;:::o;19859:60::-;19887:3;19908:5;19901:12;;19859:60;;;:::o;19925:142::-;19975:9;20008:53;20026:34;20035:24;20053:5;20035:24;:::i;:::-;20026:34;:::i;:::-;20008:53;:::i;:::-;19995:66;;19925:142;;;:::o;20073:75::-;20116:3;20137:5;20130:12;;20073:75;;;:::o;20154:269::-;20264:39;20295:7;20264:39;:::i;:::-;20325:91;20374:41;20398:16;20374:41;:::i;:::-;20366:6;20359:4;20353:11;20325:91;:::i;:::-;20319:4;20312:105;20230:193;20154:269;;;:::o;20429:73::-;20474:3;20429:73;:::o;20508:189::-;20585:32;;:::i;:::-;20626:65;20684:6;20676;20670:4;20626:65;:::i;:::-;20561:136;20508:189;;:::o;20703:186::-;20763:120;20780:3;20773:5;20770:14;20763:120;;;20834:39;20871:1;20864:5;20834:39;:::i;:::-;20807:1;20800:5;20796:13;20787:22;;20763:120;;;20703:186;;:::o;20895:543::-;20996:2;20991:3;20988:11;20985:446;;;21030:38;21062:5;21030:38;:::i;:::-;21114:29;21132:10;21114:29;:::i;:::-;21104:8;21100:44;21297:2;21285:10;21282:18;21279:49;;;21318:8;21303:23;;21279:49;21341:80;21397:22;21415:3;21397:22;:::i;:::-;21387:8;21383:37;21370:11;21341:80;:::i;:::-;21000:431;;20985:446;20895:543;;;:::o;21444:117::-;21498:8;21548:5;21542:4;21538:16;21517:37;;21444:117;;;;:::o;21567:169::-;21611:6;21644:51;21692:1;21688:6;21680:5;21677:1;21673:13;21644:51;:::i;:::-;21640:56;21725:4;21719;21715:15;21705:25;;21618:118;21567:169;;;;:::o;21741:295::-;21817:4;21963:29;21988:3;21982:4;21963:29;:::i;:::-;21955:37;;22025:3;22022:1;22018:11;22012:4;22009:21;22001:29;;21741:295;;;;:::o;22041:1395::-;22158:37;22191:3;22158:37;:::i;:::-;22260:18;22252:6;22249:30;22246:56;;;22282:18;;:::i;:::-;22246:56;22326:38;22358:4;22352:11;22326:38;:::i;:::-;22411:67;22471:6;22463;22457:4;22411:67;:::i;:::-;22505:1;22529:4;22516:17;;22561:2;22553:6;22550:14;22578:1;22573:618;;;;23235:1;23252:6;23249:77;;;23301:9;23296:3;23292:19;23286:26;23277:35;;23249:77;23352:67;23412:6;23405:5;23352:67;:::i;:::-;23346:4;23339:81;23208:222;22543:887;;22573:618;22625:4;22621:9;22613:6;22609:22;22659:37;22691:4;22659:37;:::i;:::-;22718:1;22732:208;22746:7;22743:1;22740:14;22732:208;;;22825:9;22820:3;22816:19;22810:26;22802:6;22795:42;22876:1;22868:6;22864:14;22854:24;;22923:2;22912:9;22908:18;22895:31;;22769:4;22766:1;22762:12;22757:17;;22732:208;;;22968:6;22959:7;22956:19;22953:179;;;23026:9;23021:3;23017:19;23011:26;23069:48;23111:4;23103:6;23099:17;23088:9;23069:48;:::i;:::-;23061:6;23054:64;22976:156;22953:179;23178:1;23174;23166:6;23162:14;23158:22;23152:4;23145:36;22580:611;;;22543:887;;22133:1303;;;22041:1395;;:::o;23442:181::-;23582:33;23578:1;23570:6;23566:14;23559:57;23442:181;:::o;23629:366::-;23771:3;23792:67;23856:2;23851:3;23792:67;:::i;:::-;23785:74;;23868:93;23957:3;23868:93;:::i;:::-;23986:2;23981:3;23977:12;23970:19;;23629:366;;;:::o;24001:419::-;24167:4;24205:2;24194:9;24190:18;24182:26;;24254:9;24248:4;24244:20;24240:1;24229:9;24225:17;24218:47;24282:131;24408:4;24282:131;:::i;:::-;24274:139;;24001:419;;;:::o;24426:147::-;24527:11;24564:3;24549:18;;24426:147;;;;:::o;24579:114::-;;:::o;24699:398::-;24858:3;24879:83;24960:1;24955:3;24879:83;:::i;:::-;24872:90;;24971:93;25060:3;24971:93;:::i;:::-;25089:1;25084:3;25080:11;25073:18;;24699:398;;;:::o;25103:379::-;25287:3;25309:147;25452:3;25309:147;:::i;:::-;25302:154;;25473:3;25466:10;;25103:379;;;:::o;25488:180::-;25536:77;25533:1;25526:88;25633:4;25630:1;25623:15;25657:4;25654:1;25647:15;25674:180;25722:77;25719:1;25712:88;25819:4;25816:1;25809:15;25843:4;25840:1;25833:15;25860:233;25899:3;25922:24;25940:5;25922:24;:::i;:::-;25913:33;;25968:66;25961:5;25958:77;25955:103;;26038:18;;:::i;:::-;25955:103;26085:1;26078:5;26074:13;26067:20;;25860:233;;;:::o;26099:179::-;26239:31;26235:1;26227:6;26223:14;26216:55;26099:179;:::o;26284:366::-;26426:3;26447:67;26511:2;26506:3;26447:67;:::i;:::-;26440:74;;26523:93;26612:3;26523:93;:::i;:::-;26641:2;26636:3;26632:12;26625:19;;26284:366;;;:::o;26656:419::-;26822:4;26860:2;26849:9;26845:18;26837:26;;26909:9;26903:4;26899:20;26895:1;26884:9;26880:17;26873:47;26937:131;27063:4;26937:131;:::i;:::-;26929:139;;26656:419;;;:::o;27081:191::-;27121:3;27140:20;27158:1;27140:20;:::i;:::-;27135:25;;27174:20;27192:1;27174:20;:::i;:::-;27169:25;;27217:1;27214;27210:9;27203:16;;27238:3;27235:1;27232:10;27229:36;;;27245:18;;:::i;:::-;27229:36;27081:191;;;;:::o;27278:177::-;27418:29;27414:1;27406:6;27402:14;27395:53;27278:177;:::o;27461:366::-;27603:3;27624:67;27688:2;27683:3;27624:67;:::i;:::-;27617:74;;27700:93;27789:3;27700:93;:::i;:::-;27818:2;27813:3;27809:12;27802:19;;27461:366;;;:::o;27833:419::-;27999:4;28037:2;28026:9;28022:18;28014:26;;28086:9;28080:4;28076:20;28072:1;28061:9;28057:17;28050:47;28114:131;28240:4;28114:131;:::i;:::-;28106:139;;27833:419;;;:::o;28258:180::-;28398:32;28394:1;28386:6;28382:14;28375:56;28258:180;:::o;28444:366::-;28586:3;28607:67;28671:2;28666:3;28607:67;:::i;:::-;28600:74;;28683:93;28772:3;28683:93;:::i;:::-;28801:2;28796:3;28792:12;28785:19;;28444:366;;;:::o;28816:419::-;28982:4;29020:2;29009:9;29005:18;28997:26;;29069:9;29063:4;29059:20;29055:1;29044:9;29040:17;29033:47;29097:131;29223:4;29097:131;:::i;:::-;29089:139;;28816:419;;;:::o;29241:177::-;29381:29;29377:1;29369:6;29365:14;29358:53;29241:177;:::o;29424:366::-;29566:3;29587:67;29651:2;29646:3;29587:67;:::i;:::-;29580:74;;29663:93;29752:3;29663:93;:::i;:::-;29781:2;29776:3;29772:12;29765:19;;29424:366;;;:::o;29796:419::-;29962:4;30000:2;29989:9;29985:18;29977:26;;30049:9;30043:4;30039:20;30035:1;30024:9;30020:17;30013:47;30077:131;30203:4;30077:131;:::i;:::-;30069:139;;29796:419;;;:::o;30221:188::-;30259:3;30278:18;30294:1;30278:18;:::i;:::-;30273:23;;30310:18;30326:1;30310:18;:::i;:::-;30305:23;;30351:1;30348;30344:9;30337:16;;30374:4;30369:3;30366:13;30363:39;;;30382:18;;:::i;:::-;30363:39;30221:188;;;;:::o;30415:234::-;30555:34;30551:1;30543:6;30539:14;30532:58;30624:17;30619:2;30611:6;30607:15;30600:42;30415:234;:::o;30655:366::-;30797:3;30818:67;30882:2;30877:3;30818:67;:::i;:::-;30811:74;;30894:93;30983:3;30894:93;:::i;:::-;31012:2;31007:3;31003:12;30996:19;;30655:366;;;:::o;31027:419::-;31193:4;31231:2;31220:9;31216:18;31208:26;;31280:9;31274:4;31270:20;31266:1;31255:9;31251:17;31244:47;31308:131;31434:4;31308:131;:::i;:::-;31300:139;;31027:419;;;:::o;31452:148::-;31554:11;31591:3;31576:18;;31452:148;;;;:::o;31606:390::-;31712:3;31740:39;31773:5;31740:39;:::i;:::-;31795:89;31877:6;31872:3;31795:89;:::i;:::-;31788:96;;31893:65;31951:6;31946:3;31939:4;31932:5;31928:16;31893:65;:::i;:::-;31983:6;31978:3;31974:16;31967:23;;31716:280;31606:390;;;;:::o;32026:874::-;32129:3;32166:5;32160:12;32195:36;32221:9;32195:36;:::i;:::-;32247:89;32329:6;32324:3;32247:89;:::i;:::-;32240:96;;32367:1;32356:9;32352:17;32383:1;32378:166;;;;32558:1;32553:341;;;;32345:549;;32378:166;32462:4;32458:9;32447;32443:25;32438:3;32431:38;32524:6;32517:14;32510:22;32502:6;32498:35;32493:3;32489:45;32482:52;;32378:166;;32553:341;32620:38;32652:5;32620:38;:::i;:::-;32680:1;32694:154;32708:6;32705:1;32702:13;32694:154;;;32782:7;32776:14;32772:1;32767:3;32763:11;32756:35;32832:1;32823:7;32819:15;32808:26;;32730:4;32727:1;32723:12;32718:17;;32694:154;;;32877:6;32872:3;32868:16;32861:23;;32560:334;;32345:549;;32133:767;;32026:874;;;;:::o;32906:589::-;33131:3;33153:95;33244:3;33235:6;33153:95;:::i;:::-;33146:102;;33265:95;33356:3;33347:6;33265:95;:::i;:::-;33258:102;;33377:92;33465:3;33456:6;33377:92;:::i;:::-;33370:99;;33486:3;33479:10;;32906:589;;;;;;:::o;33501:178::-;33641:30;33637:1;33629:6;33625:14;33618:54;33501:178;:::o;33685:366::-;33827:3;33848:67;33912:2;33907:3;33848:67;:::i;:::-;33841:74;;33924:93;34013:3;33924:93;:::i;:::-;34042:2;34037:3;34033:12;34026:19;;33685:366;;;:::o;34057:419::-;34223:4;34261:2;34250:9;34246:18;34238:26;;34310:9;34304:4;34300:20;34296:1;34285:9;34281:17;34274:47;34338:131;34464:4;34338:131;:::i;:::-;34330:139;;34057:419;;;:::o;34482:220::-;34622:34;34618:1;34610:6;34606:14;34599:58;34691:3;34686:2;34678:6;34674:15;34667:28;34482:220;:::o;34708:366::-;34850:3;34871:67;34935:2;34930:3;34871:67;:::i;:::-;34864:74;;34947:93;35036:3;34947:93;:::i;:::-;35065:2;35060:3;35056:12;35049:19;;34708:366;;;:::o;35080:419::-;35246:4;35284:2;35273:9;35269:18;35261:26;;35333:9;35327:4;35323:20;35319:1;35308:9;35304:17;35297:47;35361:131;35487:4;35361:131;:::i;:::-;35353:139;;35080:419;;;:::o;35505:94::-;35538:8;35586:5;35582:2;35578:14;35557:35;;35505:94;;;:::o;35605:::-;35644:7;35673:20;35687:5;35673:20;:::i;:::-;35662:31;;35605:94;;;:::o;35705:100::-;35744:7;35773:26;35793:5;35773:26;:::i;:::-;35762:37;;35705:100;;;:::o;35811:157::-;35916:45;35936:24;35954:5;35936:24;:::i;:::-;35916:45;:::i;:::-;35911:3;35904:58;35811:157;;:::o;35974:256::-;36086:3;36101:75;36172:3;36163:6;36101:75;:::i;:::-;36201:2;36196:3;36192:12;36185:19;;36221:3;36214:10;;35974:256;;;;:::o;36236:220::-;36376:34;36372:1;36364:6;36360:14;36353:58;36445:3;36440:2;36432:6;36428:15;36421:28;36236:220;:::o;36462:366::-;36604:3;36625:67;36689:2;36684:3;36625:67;:::i;:::-;36618:74;;36701:93;36790:3;36701:93;:::i;:::-;36819:2;36814:3;36810:12;36803:19;;36462:366;;;:::o;36834:419::-;37000:4;37038:2;37027:9;37023:18;37015:26;;37087:9;37081:4;37077:20;37073:1;37062:9;37058:17;37051:47;37115:131;37241:4;37115:131;:::i;:::-;37107:139;;36834:419;;;:::o;37259:225::-;37399:34;37395:1;37387:6;37383:14;37376:58;37468:8;37463:2;37455:6;37451:15;37444:33;37259:225;:::o;37490:366::-;37632:3;37653:67;37717:2;37712:3;37653:67;:::i;:::-;37646:74;;37729:93;37818:3;37729:93;:::i;:::-;37847:2;37842:3;37838:12;37831:19;;37490:366;;;:::o;37862:419::-;38028:4;38066:2;38055:9;38051:18;38043:26;;38115:9;38109:4;38105:20;38101:1;38090:9;38086:17;38079:47;38143:131;38269:4;38143:131;:::i;:::-;38135:139;;37862:419;;;:::o;38287:98::-;38338:6;38372:5;38366:12;38356:22;;38287:98;;;:::o;38391:168::-;38474:11;38508:6;38503:3;38496:19;38548:4;38543:3;38539:14;38524:29;;38391:168;;;;:::o;38565:373::-;38651:3;38679:38;38711:5;38679:38;:::i;:::-;38733:70;38796:6;38791:3;38733:70;:::i;:::-;38726:77;;38812:65;38870:6;38865:3;38858:4;38851:5;38847:16;38812:65;:::i;:::-;38902:29;38924:6;38902:29;:::i;:::-;38897:3;38893:39;38886:46;;38655:283;38565:373;;;;:::o;38944:640::-;39139:4;39177:3;39166:9;39162:19;39154:27;;39191:71;39259:1;39248:9;39244:17;39235:6;39191:71;:::i;:::-;39272:72;39340:2;39329:9;39325:18;39316:6;39272:72;:::i;:::-;39354;39422:2;39411:9;39407:18;39398:6;39354:72;:::i;:::-;39473:9;39467:4;39463:20;39458:2;39447:9;39443:18;39436:48;39501:76;39572:4;39563:6;39501:76;:::i;:::-;39493:84;;38944:640;;;;;;;:::o;39590:141::-;39646:5;39677:6;39671:13;39662:22;;39693:32;39719:5;39693:32;:::i;:::-;39590:141;;;;:::o;39737:349::-;39806:6;39855:2;39843:9;39834:7;39830:23;39826:32;39823:119;;;39861:79;;:::i;:::-;39823:119;39981:1;40006:63;40061:7;40052:6;40041:9;40037:22;40006:63;:::i;:::-;39996:73;;39952:127;39737:349;;;;:::o;40092:180::-;40140:77;40137:1;40130:88;40237:4;40234:1;40227:15;40261:4;40258:1;40251:15;40278:185;40318:1;40335:20;40353:1;40335:20;:::i;:::-;40330:25;;40369:20;40387:1;40369:20;:::i;:::-;40364:25;;40408:1;40398:35;;40413:18;;:::i;:::-;40398:35;40455:1;40452;40448:9;40443:14;;40278:185;;;;:::o;40469:194::-;40509:4;40529:20;40547:1;40529:20;:::i;:::-;40524:25;;40563:20;40581:1;40563:20;:::i;:::-;40558:25;;40607:1;40604;40600:9;40592:17;;40631:1;40625:4;40622:11;40619:37;;;40636:18;;:::i;:::-;40619:37;40469:194;;;;:::o;40669:176::-;40701:1;40718:20;40736:1;40718:20;:::i;:::-;40713:25;;40752:20;40770:1;40752:20;:::i;:::-;40747:25;;40791:1;40781:35;;40796:18;;:::i;:::-;40781:35;40837:1;40834;40830:9;40825:14;;40669:176;;;;:::o

Swarm Source

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