ETH Price: $2,387.25 (+2.38%)

Token

WOM (WOM)
 

Overview

Max Total Supply

1,000 WOM

Holders

244

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
10 WOM
0x51eef0016ff95201e44747a7e04028f4bdbe4279
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:
WOM

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: GPL-3.0
// File: extensions/operator-filter/IOperatorFilterRegistry.sol

pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

// File: extensions/operator-filter/OperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }
}

// File: extensions/operator-filter/DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

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


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

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

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

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/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.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/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: @openzeppelin/contracts/token/ERC721/ERC721.sol


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

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @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 virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

    /**
     * @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) {
        _requireMinted(tokenId);

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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 {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");

        _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 {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
        _safeTransfer(from, to, tokenId, data);
    }

    /**
     * @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.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * 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
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a 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 _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721Burnable.sol)

pragma solidity ^0.8.0;



/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
        _burn(tokenId);
    }
}

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


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

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: extensions/operator-filter/ContractAbstract.sol


pragma solidity ^0.8.13;





/**
 * @title  ERC721OnChain
 * @notice This example contract is configured to use the DefaultOperatorFilterer, which automatically registers the
 *         token and subscribes it to OpenSea's curated filters.
 *         Adding the onlyAllowedOperator modifier to the transferFrom and both safeTransferFrom methods ensures that
 *         the msg.sender (operator) is allowed by the OperatorFilterRegistry. Adding the onlyAllowedOperatorApproval
 *         modifier to the approval methods ensures that owners do not approve operators that are not allowed.
 */
abstract contract ERC721OnChain is ERC721Enumerable, DefaultOperatorFilterer, Ownable, ERC721Burnable {
    constructor(
    string memory _name,
    string memory _symbol,
    string memory _initBaseURI,
    string memory _contractURI
  ) ERC721(_name, _symbol) {}

    function setApprovalForAll(address operator, bool approved) public override(ERC721, IERC721) virtual onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public override(ERC721, IERC721) virtual onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

    function transferFrom(address from, address to, uint256 tokenId) public override(ERC721, IERC721) virtual onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override(ERC721, IERC721) virtual onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override(ERC721, IERC721)
        virtual
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }
     
    // The following functions are overrides required by Solidity.

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}
// File: contracts/WOM_MERKLE.sol



pragma solidity ^0.8.4;





contract WOM is ERC721OnChain {
  using Counters for Counters.Counter;
  using Strings for uint256;

  Counters.Counter private _tokenIdCounter;

  string public baseURI = "";
  string public baseExtension = ".json";
  string public customContractURI = "";
  uint256 public maxSupply = 1000;
  uint256 public maxMintAmount = 2;
  uint256 public maxNFTPerAddress = 2;
  bool public paused = false;
  bool public onlyWhitelisted = true;
  mapping(address => uint256) public addressMintedBalance;
  bytes32 public merkleRoot = 0x48b73e1b279cf47e870b8ed17a1257ddecd7beb6492cccf15c13f0a7fbea91a8;

  event Sale(
    uint256 id,
    uint256 cost,
    uint256 timestamp,
    address indexed buyer,
    string indexed tokenURI
  );

  struct SaleStruct {
    uint256 id;
    uint256 cost;
    uint256 timestamp;
    address buyer;
    string metadataURL;
  }

  SaleStruct[] minted;

  constructor(
    string memory _name,
    string memory _symbol,
    string memory _initBaseURI,
    string memory _contractURI
  ) ERC721OnChain(_name, _symbol, _initBaseURI, _contractURI) {
    setContractURI(_contractURI);
    setBaseURI(_initBaseURI);
  }

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

  // public
  function mint(uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable {
    require(!paused, "the contract is paused");
    uint256 supply = totalSupply();
    require(_mintAmount > 0, "need to mint at least 1 NFT");
    require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded");

    if (msg.sender != owner()) {
      uint256 ownerMintedCount = addressMintedBalance[msg.sender];
      require(ownerMintedCount + _mintAmount <= maxNFTPerAddress, "max NFT per address exceeded");
      require(_mintAmount <= maxMintAmount, "max mint amount per session exceeded");

      if(onlyWhitelisted == true) {
          require(isWhitelisted(msg.sender, _merkleProof), "user is not whitelisted");
      }
    }

    for (uint256 i = 1; i <= _mintAmount; i++) {
      addressMintedBalance[msg.sender]++;
      uint256 tokenId = _tokenIdCounter.current() + 1;
      _tokenIdCounter.increment();
      _safeMint(msg.sender, tokenId);

      minted.push(
        SaleStruct(
          tokenId,
          msg.value,
          block.timestamp,
          msg.sender,
          tokenURI(tokenId)
        )
      );
      
      emit Sale(tokenId, msg.value, block.timestamp, msg.sender, tokenURI(tokenId));
    }
  }
  
  function contractURI() public view returns (string memory) {
    return customContractURI;
  }

  function isWhitelisted(address _user, bytes32[] calldata _merkleProof) public view returns (bool) {
    bytes32 leaf = keccak256(abi.encodePacked(_user));
    return MerkleProof.verify(_merkleProof, merkleRoot, leaf);
  }

  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory tokenIds = new uint256[](ownerTokenCount);
    for (uint256 i; i < ownerTokenCount; i++) {
      tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
    }
    return tokenIds;
  }

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

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
      ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
      : "";
  }

  // Getters

  function getAllNFTs() public view onlyOwner returns (SaleStruct[] memory) {
    return minted;
  }
  
  function getAnNFT(uint256 tokenId) public view onlyOwner returns (SaleStruct memory) {
    return minted[tokenId - 1];
  }
  
  // Setters

  function setMaxMintAmount(uint256 _limit) public onlyOwner {
    maxMintAmount = _limit;
  }

  function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
    merkleRoot = _merkleRoot;
  }
  
  function setMaxNFTPerAddress(uint256 _limit) public onlyOwner {
    maxNFTPerAddress = _limit;
  }

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

  function setContractURI(string memory _newContractURI) public onlyOwner {
    customContractURI = _newContractURI;
  }

  function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
    baseExtension = _newBaseExtension;
  }

  function pause(bool _state) public onlyOwner {
    paused = _state;
  }
  
  function setOnlyWhitelisted(bool _state) public onlyOwner {
    onlyWhitelisted = _state;
  }

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_contractURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cost","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":true,"internalType":"string","name":"tokenURI","type":"string"}],"name":"Sale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"customContractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllNFTs","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"string","name":"metadataURL","type":"string"}],"internalType":"struct WOM.SaleStruct[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAnNFT","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"string","name":"metadataURL","type":"string"}],"internalType":"struct WOM.SaleStruct","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNFTPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setMaxNFTPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405260405180602001604052806000815250600c90805190602001906200002b929190620005bb565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d908051906020019062000079929190620005bb565b5060405180602001604052806000815250600e9080519060200190620000a1929190620005bb565b506103e8600f55600260105560026011556000601260006101000a81548160ff0219169083151502179055506001601260016101000a81548160ff0219169083151502179055507f48b73e1b279cf47e870b8ed17a1257ddecd7beb6492cccf15c13f0a7fbea91a860001b6014553480156200011c57600080fd5b50604051620062dd380380620062dd833981810160405281019062000142919062000808565b83838383733cc6cdda760b79bafa08df41ecfa224f810dceb660018585816000908051906020019062000177929190620005bb565b50806001908051906020019062000190929190620005bb565b50505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003885780156200024e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620002149291906200093b565b600060405180830381600087803b1580156200022f57600080fd5b505af115801562000244573d6000803e3d6000fd5b5050505062000387565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000308576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002ce9291906200093b565b600060405180830381600087803b158015620002e957600080fd5b505af1158015620002fe573d6000803e3d6000fd5b5050505062000386565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000351919062000968565b600060405180830381600087803b1580156200036c57600080fd5b505af115801562000381573d6000803e3d6000fd5b505050505b5b5b5050620003aa6200039e620003da60201b60201c565b620003e260201b60201c565b50505050620003bf81620004a860201b60201c565b620003d082620004d460201b60201c565b5050505062000a6c565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620004b86200050060201b60201c565b80600e9080519060200190620004d0929190620005bb565b5050565b620004e46200050060201b60201c565b80600c9080519060200190620004fc929190620005bb565b5050565b62000510620003da60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620005366200059160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200058f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200058690620009e6565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620005c99062000a37565b90600052602060002090601f016020900481019282620005ed576000855562000639565b82601f106200060857805160ff191683800117855562000639565b8280016001018555821562000639579182015b82811115620006385782518255916020019190600101906200061b565b5b5090506200064891906200064c565b5090565b5b80821115620006675760008160009055506001016200064d565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006d48262000689565b810181811067ffffffffffffffff82111715620006f657620006f56200069a565b5b80604052505050565b60006200070b6200066b565b9050620007198282620006c9565b919050565b600067ffffffffffffffff8211156200073c576200073b6200069a565b5b620007478262000689565b9050602081019050919050565b60005b838110156200077457808201518184015260208101905062000757565b8381111562000784576000848401525b50505050565b6000620007a16200079b846200071e565b620006ff565b905082815260208101848484011115620007c057620007bf62000684565b5b620007cd84828562000754565b509392505050565b600082601f830112620007ed57620007ec6200067f565b5b8151620007ff8482602086016200078a565b91505092915050565b6000806000806080858703121562000825576200082462000675565b5b600085015167ffffffffffffffff8111156200084657620008456200067a565b5b6200085487828801620007d5565b945050602085015167ffffffffffffffff8111156200087857620008776200067a565b5b6200088687828801620007d5565b935050604085015167ffffffffffffffff811115620008aa57620008a96200067a565b5b620008b887828801620007d5565b925050606085015167ffffffffffffffff811115620008dc57620008db6200067a565b5b620008ea87828801620007d5565b91505092959194509250565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200092382620008f6565b9050919050565b620009358162000916565b82525050565b60006040820190506200095260008301856200092a565b6200096160208301846200092a565b9392505050565b60006020820190506200097f60008301846200092a565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620009ce60208362000985565b9150620009db8262000996565b602082019050919050565b6000602082019050818103600083015262000a0181620009bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a5057607f821691505b60208210810362000a665762000a6562000a08565b5b50919050565b6158618062000a7c6000396000f3fe6080604052600436106102725760003560e01c80636352211e1161014f5780639c70b512116100c1578063d5abeb011161007a578063d5abeb011461096c578063da3ef23f14610997578063e0391b09146109c0578063e8a3d485146109eb578063e985e9c514610a16578063f2fde38b14610a5357610272565b80639c70b5121461086b578063a22cb46514610896578063b88d4fde146108bf578063ba41b0c6146108e8578063c668286214610904578063c87b56dd1461092f57610272565b80637cb64759116101135780637cb647591461076f578063837aea6c146107985780638da5cb5b146107c3578063938e3d7b146107ee57806395d89b41146108175780639b3ddaa81461084257610272565b80636352211e146106885780636c0360eb146106c55780636cbf6456146106f057806370a082311461071b578063715018a61461075857610272565b80632f745c59116101e8578063438b6300116101ac578063438b6300146105405780634f6ccce71461057d57806355f804b3146105ba5780635a23dd99146105e35780635c975abb1461062057806360249a941461064b57610272565b80632f745c591461047e5780633c952764146104bb5780633ccfd60b146104e457806342842e0e146104ee57806342966c681461051757610272565b8063095ea7b31161023a578063095ea7b31461036e57806318160ddd1461039757806318cae269146103c2578063239c70ae146103ff57806323b872dd1461042a5780632eb4a7ab1461045357610272565b806301ffc9a71461027757806302329a29146102b457806306fdde03146102dd578063081812fc14610308578063088a4ed014610345575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613c10565b610a7c565b6040516102ab9190613c58565b60405180910390f35b3480156102c057600080fd5b506102db60048036038101906102d69190613c9f565b610a8e565b005b3480156102e957600080fd5b506102f2610ab3565b6040516102ff9190613d65565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a9190613dbd565b610b45565b60405161033c9190613e2b565b60405180910390f35b34801561035157600080fd5b5061036c60048036038101906103679190613dbd565b610b8b565b005b34801561037a57600080fd5b5061039560048036038101906103909190613e72565b610b9d565b005b3480156103a357600080fd5b506103ac610ca7565b6040516103b99190613ec1565b60405180910390f35b3480156103ce57600080fd5b506103e960048036038101906103e49190613edc565b610cb4565b6040516103f69190613ec1565b60405180910390f35b34801561040b57600080fd5b50610414610ccc565b6040516104219190613ec1565b60405180910390f35b34801561043657600080fd5b50610451600480360381019061044c9190613f09565b610cd2565b005b34801561045f57600080fd5b50610468610e22565b6040516104759190613f75565b60405180910390f35b34801561048a57600080fd5b506104a560048036038101906104a09190613e72565b610e28565b6040516104b29190613ec1565b60405180910390f35b3480156104c757600080fd5b506104e260048036038101906104dd9190613c9f565b610ecd565b005b6104ec610ef2565b005b3480156104fa57600080fd5b5061051560048036038101906105109190613f09565b610f7e565b005b34801561052357600080fd5b5061053e60048036038101906105399190613dbd565b6110ce565b005b34801561054c57600080fd5b5061056760048036038101906105629190613edc565b61112a565b604051610574919061404e565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f9190613dbd565b6111d8565b6040516105b19190613ec1565b60405180910390f35b3480156105c657600080fd5b506105e160048036038101906105dc91906141a5565b611249565b005b3480156105ef57600080fd5b5061060a6004803603810190610605919061424e565b61126b565b6040516106179190613c58565b60405180910390f35b34801561062c57600080fd5b506106356112ef565b6040516106429190613c58565b60405180910390f35b34801561065757600080fd5b50610672600480360381019061066d9190613dbd565b611302565b60405161067f919061437d565b60405180910390f35b34801561069457600080fd5b506106af60048036038101906106aa9190613dbd565b611458565b6040516106bc9190613e2b565b60405180910390f35b3480156106d157600080fd5b506106da611509565b6040516106e79190613d65565b60405180910390f35b3480156106fc57600080fd5b50610705611597565b6040516107129190613d65565b60405180910390f35b34801561072757600080fd5b50610742600480360381019061073d9190613edc565b611625565b60405161074f9190613ec1565b60405180910390f35b34801561076457600080fd5b5061076d6116dc565b005b34801561077b57600080fd5b50610796600480360381019061079191906143cb565b6116f0565b005b3480156107a457600080fd5b506107ad611702565b6040516107ba9190613ec1565b60405180910390f35b3480156107cf57600080fd5b506107d8611708565b6040516107e59190613e2b565b60405180910390f35b3480156107fa57600080fd5b50610815600480360381019061081091906141a5565b611732565b005b34801561082357600080fd5b5061082c611754565b6040516108399190613d65565b60405180910390f35b34801561084e57600080fd5b5061086960048036038101906108649190613dbd565b6117e6565b005b34801561087757600080fd5b506108806117f8565b60405161088d9190613c58565b60405180910390f35b3480156108a257600080fd5b506108bd60048036038101906108b891906143f8565b61180b565b005b3480156108cb57600080fd5b506108e660048036038101906108e191906144d9565b611915565b005b61090260048036038101906108fd919061455c565b611a68565b005b34801561091057600080fd5b50610919611ee2565b6040516109269190613d65565b60405180910390f35b34801561093b57600080fd5b5061095660048036038101906109519190613dbd565b611f70565b6040516109639190613d65565b60405180910390f35b34801561097857600080fd5b5061098161201a565b60405161098e9190613ec1565b60405180910390f35b3480156109a357600080fd5b506109be60048036038101906109b991906141a5565b612020565b005b3480156109cc57600080fd5b506109d5612042565b6040516109e291906146f4565b60405180910390f35b3480156109f757600080fd5b50610a006121af565b604051610a0d9190613d65565b60405180910390f35b348015610a2257600080fd5b50610a3d6004803603810190610a389190614716565b612241565b604051610a4a9190613c58565b60405180910390f35b348015610a5f57600080fd5b50610a7a6004803603810190610a759190613edc565b6122d5565b005b6000610a8782612358565b9050919050565b610a966123d2565b80601260006101000a81548160ff02191690831515021790555050565b606060008054610ac290614785565b80601f0160208091040260200160405190810160405280929190818152602001828054610aee90614785565b8015610b3b5780601f10610b1057610100808354040283529160200191610b3b565b820191906000526020600020905b815481529060010190602001808311610b1e57829003601f168201915b5050505050905090565b6000610b5082612450565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610b936123d2565b8060108190555050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610c98576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610c159291906147b6565b602060405180830381865afa158015610c32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5691906147f4565b610c9757806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610c8e9190613e2b565b60405180910390fd5b5b610ca2838361249b565b505050565b6000600880549050905090565b60136020528060005260406000206000915090505481565b60105481565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610e10573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d4457610d3f8484846125b2565b610e1c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610d8d9291906147b6565b602060405180830381865afa158015610daa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dce91906147f4565b610e0f57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610e069190613e2b565b60405180910390fd5b5b610e1b8484846125b2565b5b50505050565b60145481565b6000610e3383611625565b8210610e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6b90614893565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ed56123d2565b80601260016101000a81548160ff02191690831515021790555050565b610efa6123d2565b6000610f04611708565b73ffffffffffffffffffffffffffffffffffffffff1647604051610f27906148e4565b60006040518083038185875af1925050503d8060008114610f64576040519150601f19603f3d011682016040523d82523d6000602084013e610f69565b606091505b5050905080610f7b57610f7a6148f9565b5b50565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156110bc573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ff057610feb848484612612565b6110c8565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016110399291906147b6565b602060405180830381865afa158015611056573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107a91906147f4565b6110bb57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016110b29190613e2b565b60405180910390fd5b5b6110c7848484612612565b5b50505050565b6110df6110d9612632565b8261263a565b61111e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111159061499a565b60405180910390fd5b611127816126cf565b50565b6060600061113783611625565b905060008167ffffffffffffffff8111156111555761115461407a565b5b6040519080825280602002602001820160405280156111835781602001602082028036833780820191505090505b50905060005b828110156111cd5761119b8582610e28565b8282815181106111ae576111ad6149ba565b5b60200260200101818152505080806111c590614a18565b915050611189565b508092505050919050565b60006111e2610ca7565b8210611223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121a90614ad2565b60405180910390fd5b60088281548110611237576112366149ba565b5b90600052602060002001549050919050565b6112516123d2565b80600c9080519060200190611267929190613abc565b5050565b6000808460405160200161127f9190614b3a565b6040516020818303038152906040528051906020012090506112e5848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601454836127ec565b9150509392505050565b601260009054906101000a900460ff1681565b61130a613b42565b6113126123d2565b60156001836113219190614b55565b81548110611332576113316149ba565b5b90600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016004820180546113cf90614785565b80601f01602080910402602001604051908101604052809291908181526020018280546113fb90614785565b80156114485780601f1061141d57610100808354040283529160200191611448565b820191906000526020600020905b81548152906001019060200180831161142b57829003601f168201915b5050505050815250509050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f790614bd5565b60405180910390fd5b80915050919050565b600c805461151690614785565b80601f016020809104026020016040519081016040528092919081815260200182805461154290614785565b801561158f5780601f106115645761010080835404028352916020019161158f565b820191906000526020600020905b81548152906001019060200180831161157257829003601f168201915b505050505081565b600e80546115a490614785565b80601f01602080910402602001604051908101604052809291908181526020018280546115d090614785565b801561161d5780601f106115f25761010080835404028352916020019161161d565b820191906000526020600020905b81548152906001019060200180831161160057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611695576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168c90614c67565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116e46123d2565b6116ee6000612803565b565b6116f86123d2565b8060148190555050565b60115481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61173a6123d2565b80600e9080519060200190611750929190613abc565b5050565b60606001805461176390614785565b80601f016020809104026020016040519081016040528092919081815260200182805461178f90614785565b80156117dc5780601f106117b1576101008083540402835291602001916117dc565b820191906000526020600020905b8154815290600101906020018083116117bf57829003601f168201915b5050505050905090565b6117ee6123d2565b8060118190555050565b601260019054906101000a900460ff1681565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611906576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016118839291906147b6565b602060405180830381865afa1580156118a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c491906147f4565b61190557806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016118fc9190613e2b565b60405180910390fd5b5b61191083836128c9565b505050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611a54573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361198857611983858585856128df565b611a61565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016119d19291906147b6565b602060405180830381865afa1580156119ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1291906147f4565b611a5357336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611a4a9190613e2b565b60405180910390fd5b5b611a60858585856128df565b5b5050505050565b601260009054906101000a900460ff1615611ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaf90614cd3565b60405180910390fd5b6000611ac2610ca7565b905060008411611b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afe90614d3f565b60405180910390fd5b600f548482611b169190614d5f565b1115611b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4e90614e01565b60405180910390fd5b611b5f611708565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cd2576000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506011548582611be49190614d5f565b1115611c25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1c90614e6d565b60405180910390fd5b601054851115611c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6190614eff565b60405180910390fd5b60011515601260019054906101000a900460ff16151503611cd057611c9033858561126b565b611ccf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc690614f6b565b60405180910390fd5b5b505b6000600190505b848111611edb57601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611d3090614a18565b919050555060006001611d43600b612941565b611d4d9190614d5f565b9050611d59600b61294f565b611d633382612965565b60156040518060a001604052808381526020013481526020014281526020013373ffffffffffffffffffffffffffffffffffffffff168152602001611da784611f70565b815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506080820151816004019080519060200190611e54929190613abc565b505050611e6081611f70565b604051611e6d9190614fc7565b60405180910390203373ffffffffffffffffffffffffffffffffffffffff167f3328437ef526a83b70ad0cf55449d2eee902258f17c450ec11bc9b6adc43aae3833442604051611ebf93929190614fde565b60405180910390a3508080611ed390614a18565b915050611cd9565b5050505050565b600d8054611eef90614785565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1b90614785565b8015611f685780601f10611f3d57610100808354040283529160200191611f68565b820191906000526020600020905b815481529060010190602001808311611f4b57829003601f168201915b505050505081565b6060611f7b82612983565b611fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb190615087565b60405180910390fd5b6000611fc46129ef565b90506000815111611fe45760405180602001604052806000815250612012565b80611fee84612a81565b600d6040516020016120029392919061513b565b6040516020818303038152906040525b915050919050565b600f5481565b6120286123d2565b80600d908051906020019061203e929190613abc565b5050565b606061204c6123d2565b6015805480602002602001604051908101604052809291908181526020016000905b828210156121a657838290600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160048201805461211590614785565b80601f016020809104026020016040519081016040528092919081815260200182805461214190614785565b801561218e5780601f106121635761010080835404028352916020019161218e565b820191906000526020600020905b81548152906001019060200180831161217157829003601f168201915b5050505050815250508152602001906001019061206e565b50505050905090565b6060600e80546121be90614785565b80601f01602080910402602001604051908101604052809291908181526020018280546121ea90614785565b80156122375780601f1061220c57610100808354040283529160200191612237565b820191906000526020600020905b81548152906001019060200180831161221a57829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122dd6123d2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361234c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612343906151de565b60405180910390fd5b61235581612803565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123cb57506123ca82612be1565b5b9050919050565b6123da612632565b73ffffffffffffffffffffffffffffffffffffffff166123f8611708565b73ffffffffffffffffffffffffffffffffffffffff161461244e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124459061524a565b60405180910390fd5b565b61245981612983565b612498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248f90614bd5565b60405180910390fd5b50565b60006124a682611458565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250d906152dc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16612535612632565b73ffffffffffffffffffffffffffffffffffffffff16148061256457506125638161255e612632565b612241565b5b6125a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259a9061536e565b60405180910390fd5b6125ad8383612cc3565b505050565b6125c36125bd612632565b8261263a565b612602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f99061499a565b60405180910390fd5b61260d838383612d7c565b505050565b61262d83838360405180602001604052806000815250611915565b505050565b600033905090565b60008061264683611458565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061268857506126878185612241565b5b806126c657508373ffffffffffffffffffffffffffffffffffffffff166126ae84610b45565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b60006126da82611458565b90506126e881600084612fe2565b6126f3600083612cc3565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127439190614b55565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127e881600084612ff2565b5050565b6000826127f98584612ff7565b1490509392505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6128db6128d4612632565b838361304d565b5050565b6128f06128ea612632565b8361263a565b61292f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129269061499a565b60405180910390fd5b61293b848484846131b9565b50505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b61297f828260405180602001604052806000815250613215565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600c80546129fe90614785565b80601f0160208091040260200160405190810160405280929190818152602001828054612a2a90614785565b8015612a775780601f10612a4c57610100808354040283529160200191612a77565b820191906000526020600020905b815481529060010190602001808311612a5a57829003601f168201915b5050505050905090565b606060008203612ac8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bdc565b600082905060005b60008214612afa578080612ae390614a18565b915050600a82612af391906153bd565b9150612ad0565b60008167ffffffffffffffff811115612b1657612b1561407a565b5b6040519080825280601f01601f191660200182016040528015612b485781602001600182028036833780820191505090505b5090505b60008514612bd557600182612b619190614b55565b9150600a85612b7091906153ee565b6030612b7c9190614d5f565b60f81b818381518110612b9257612b916149ba565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bce91906153bd565b9450612b4c565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cac57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612cbc5750612cbb82613270565b5b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612d3683611458565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8273ffffffffffffffffffffffffffffffffffffffff16612d9c82611458565b73ffffffffffffffffffffffffffffffffffffffff1614612df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de990615491565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5890615523565b60405180910390fd5b612e6c838383612fe2565b612e77600082612cc3565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ec79190614b55565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f1e9190614d5f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612fdd838383612ff2565b505050565b612fed8383836132da565b505050565b505050565b60008082905060005b84518110156130425761302d828683815181106130205761301f6149ba565b5b60200260200101516133ec565b9150808061303a90614a18565b915050613000565b508091505092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036130bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b29061558f565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516131ac9190613c58565b60405180910390a3505050565b6131c4848484612d7c565b6131d084848484613417565b61320f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320690615621565b60405180910390fd5b50505050565b61321f838361359e565b61322c6000848484613417565b61326b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326290615621565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6132e5838383613777565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613327576133228161377c565b613366565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146133655761336483826137c5565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036133a8576133a381613932565b6133e7565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146133e6576133e58282613a03565b5b5b505050565b6000818310613404576133ff8284613a82565b61340f565b61340e8383613a82565b5b905092915050565b60006134388473ffffffffffffffffffffffffffffffffffffffff16613a99565b15613591578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613461612632565b8786866040518563ffffffff1660e01b81526004016134839493929190615696565b6020604051808303816000875af19250505080156134bf57506040513d601f19601f820116820180604052508101906134bc91906156f7565b60015b613541573d80600081146134ef576040519150601f19603f3d011682016040523d82523d6000602084013e6134f4565b606091505b506000815103613539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353090615621565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613596565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361360d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360490615770565b60405180910390fd5b61361681612983565b15613656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161364d906157dc565b60405180910390fd5b61366260008383612fe2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136b29190614d5f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461377360008383612ff2565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016137d284611625565b6137dc9190614b55565b90506000600760008481526020019081526020016000205490508181146138c1576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506139469190614b55565b9050600060096000848152602001908152602001600020549050600060088381548110613976576139756149ba565b5b906000526020600020015490508060088381548110613998576139976149ba565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806139e7576139e66157fc565b5b6001900381819060005260206000200160009055905550505050565b6000613a0e83611625565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600082600052816020526040600020905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054613ac890614785565b90600052602060002090601f016020900481019282613aea5760008555613b31565b82601f10613b0357805160ff1916838001178555613b31565b82800160010185558215613b31579182015b82811115613b30578251825591602001919060010190613b15565b5b509050613b3e9190613b87565b5090565b6040518060a00160405280600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b5b80821115613ba0576000816000905550600101613b88565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613bed81613bb8565b8114613bf857600080fd5b50565b600081359050613c0a81613be4565b92915050565b600060208284031215613c2657613c25613bae565b5b6000613c3484828501613bfb565b91505092915050565b60008115159050919050565b613c5281613c3d565b82525050565b6000602082019050613c6d6000830184613c49565b92915050565b613c7c81613c3d565b8114613c8757600080fd5b50565b600081359050613c9981613c73565b92915050565b600060208284031215613cb557613cb4613bae565b5b6000613cc384828501613c8a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d06578082015181840152602081019050613ceb565b83811115613d15576000848401525b50505050565b6000601f19601f8301169050919050565b6000613d3782613ccc565b613d418185613cd7565b9350613d51818560208601613ce8565b613d5a81613d1b565b840191505092915050565b60006020820190508181036000830152613d7f8184613d2c565b905092915050565b6000819050919050565b613d9a81613d87565b8114613da557600080fd5b50565b600081359050613db781613d91565b92915050565b600060208284031215613dd357613dd2613bae565b5b6000613de184828501613da8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e1582613dea565b9050919050565b613e2581613e0a565b82525050565b6000602082019050613e406000830184613e1c565b92915050565b613e4f81613e0a565b8114613e5a57600080fd5b50565b600081359050613e6c81613e46565b92915050565b60008060408385031215613e8957613e88613bae565b5b6000613e9785828601613e5d565b9250506020613ea885828601613da8565b9150509250929050565b613ebb81613d87565b82525050565b6000602082019050613ed66000830184613eb2565b92915050565b600060208284031215613ef257613ef1613bae565b5b6000613f0084828501613e5d565b91505092915050565b600080600060608486031215613f2257613f21613bae565b5b6000613f3086828701613e5d565b9350506020613f4186828701613e5d565b9250506040613f5286828701613da8565b9150509250925092565b6000819050919050565b613f6f81613f5c565b82525050565b6000602082019050613f8a6000830184613f66565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613fc581613d87565b82525050565b6000613fd78383613fbc565b60208301905092915050565b6000602082019050919050565b6000613ffb82613f90565b6140058185613f9b565b935061401083613fac565b8060005b838110156140415781516140288882613fcb565b975061403383613fe3565b925050600181019050614014565b5085935050505092915050565b600060208201905081810360008301526140688184613ff0565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6140b282613d1b565b810181811067ffffffffffffffff821117156140d1576140d061407a565b5b80604052505050565b60006140e4613ba4565b90506140f082826140a9565b919050565b600067ffffffffffffffff8211156141105761410f61407a565b5b61411982613d1b565b9050602081019050919050565b82818337600083830152505050565b6000614148614143846140f5565b6140da565b90508281526020810184848401111561416457614163614075565b5b61416f848285614126565b509392505050565b600082601f83011261418c5761418b614070565b5b813561419c848260208601614135565b91505092915050565b6000602082840312156141bb576141ba613bae565b5b600082013567ffffffffffffffff8111156141d9576141d8613bb3565b5b6141e584828501614177565b91505092915050565b600080fd5b600080fd5b60008083601f84011261420e5761420d614070565b5b8235905067ffffffffffffffff81111561422b5761422a6141ee565b5b602083019150836020820283011115614247576142466141f3565b5b9250929050565b60008060006040848603121561426757614266613bae565b5b600061427586828701613e5d565b935050602084013567ffffffffffffffff81111561429657614295613bb3565b5b6142a2868287016141f8565b92509250509250925092565b6142b781613e0a565b82525050565b600082825260208201905092915050565b60006142d982613ccc565b6142e381856142bd565b93506142f3818560208601613ce8565b6142fc81613d1b565b840191505092915050565b600060a08301600083015161431f6000860182613fbc565b5060208301516143326020860182613fbc565b5060408301516143456040860182613fbc565b50606083015161435860608601826142ae565b506080830151848203608086015261437082826142ce565b9150508091505092915050565b600060208201905081810360008301526143978184614307565b905092915050565b6143a881613f5c565b81146143b357600080fd5b50565b6000813590506143c58161439f565b92915050565b6000602082840312156143e1576143e0613bae565b5b60006143ef848285016143b6565b91505092915050565b6000806040838503121561440f5761440e613bae565b5b600061441d85828601613e5d565b925050602061442e85828601613c8a565b9150509250929050565b600067ffffffffffffffff8211156144535761445261407a565b5b61445c82613d1b565b9050602081019050919050565b600061447c61447784614438565b6140da565b90508281526020810184848401111561449857614497614075565b5b6144a3848285614126565b509392505050565b600082601f8301126144c0576144bf614070565b5b81356144d0848260208601614469565b91505092915050565b600080600080608085870312156144f3576144f2613bae565b5b600061450187828801613e5d565b945050602061451287828801613e5d565b935050604061452387828801613da8565b925050606085013567ffffffffffffffff81111561454457614543613bb3565b5b614550878288016144ab565b91505092959194509250565b60008060006040848603121561457557614574613bae565b5b600061458386828701613da8565b935050602084013567ffffffffffffffff8111156145a4576145a3613bb3565b5b6145b0868287016141f8565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060a0830160008301516146006000860182613fbc565b5060208301516146136020860182613fbc565b5060408301516146266040860182613fbc565b50606083015161463960608601826142ae565b506080830151848203608086015261465182826142ce565b9150508091505092915050565b600061466a83836145e8565b905092915050565b6000602082019050919050565b600061468a826145bc565b61469481856145c7565b9350836020820285016146a6856145d8565b8060005b858110156146e257848403895281516146c3858261465e565b94506146ce83614672565b925060208a019950506001810190506146aa565b50829750879550505050505092915050565b6000602082019050818103600083015261470e818461467f565b905092915050565b6000806040838503121561472d5761472c613bae565b5b600061473b85828601613e5d565b925050602061474c85828601613e5d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061479d57607f821691505b6020821081036147b0576147af614756565b5b50919050565b60006040820190506147cb6000830185613e1c565b6147d86020830184613e1c565b9392505050565b6000815190506147ee81613c73565b92915050565b60006020828403121561480a57614809613bae565b5b6000614818848285016147df565b91505092915050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061487d602b83613cd7565b915061488882614821565b604082019050919050565b600060208201905081810360008301526148ac81614870565b9050919050565b600081905092915050565b50565b60006148ce6000836148b3565b91506148d9826148be565b600082019050919050565b60006148ef826148c1565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000614984602e83613cd7565b915061498f82614928565b604082019050919050565b600060208201905081810360008301526149b381614977565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614a2382613d87565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a5557614a546149e9565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614abc602c83613cd7565b9150614ac782614a60565b604082019050919050565b60006020820190508181036000830152614aeb81614aaf565b9050919050565b60008160601b9050919050565b6000614b0a82614af2565b9050919050565b6000614b1c82614aff565b9050919050565b614b34614b2f82613e0a565b614b11565b82525050565b6000614b468284614b23565b60148201915081905092915050565b6000614b6082613d87565b9150614b6b83613d87565b925082821015614b7e57614b7d6149e9565b5b828203905092915050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614bbf601883613cd7565b9150614bca82614b89565b602082019050919050565b60006020820190508181036000830152614bee81614bb2565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614c51602983613cd7565b9150614c5c82614bf5565b604082019050919050565b60006020820190508181036000830152614c8081614c44565b9050919050565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b6000614cbd601683613cd7565b9150614cc882614c87565b602082019050919050565b60006020820190508181036000830152614cec81614cb0565b9050919050565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b6000614d29601b83613cd7565b9150614d3482614cf3565b602082019050919050565b60006020820190508181036000830152614d5881614d1c565b9050919050565b6000614d6a82613d87565b9150614d7583613d87565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614daa57614da96149e9565b5b828201905092915050565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b6000614deb601683613cd7565b9150614df682614db5565b602082019050919050565b60006020820190508181036000830152614e1a81614dde565b9050919050565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b6000614e57601c83613cd7565b9150614e6282614e21565b602082019050919050565b60006020820190508181036000830152614e8681614e4a565b9050919050565b7f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b6000614ee9602483613cd7565b9150614ef482614e8d565b604082019050919050565b60006020820190508181036000830152614f1881614edc565b9050919050565b7f75736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b6000614f55601783613cd7565b9150614f6082614f1f565b602082019050919050565b60006020820190508181036000830152614f8481614f48565b9050919050565b600081905092915050565b6000614fa182613ccc565b614fab8185614f8b565b9350614fbb818560208601613ce8565b80840191505092915050565b6000614fd38284614f96565b915081905092915050565b6000606082019050614ff36000830186613eb2565b6150006020830185613eb2565b61500d6040830184613eb2565b949350505050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615071602f83613cd7565b915061507c82615015565b604082019050919050565b600060208201905081810360008301526150a081615064565b9050919050565b60008190508160005260206000209050919050565b600081546150c981614785565b6150d38186614f8b565b945060018216600081146150ee57600181146150ff57615132565b60ff19831686528186019350615132565b615108856150a7565b60005b8381101561512a5781548189015260018201915060208101905061510b565b838801955050505b50505092915050565b60006151478286614f96565b91506151538285614f96565b915061515f82846150bc565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006151c8602683613cd7565b91506151d38261516c565b604082019050919050565b600060208201905081810360008301526151f7816151bb565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615234602083613cd7565b915061523f826151fe565b602082019050919050565b6000602082019050818103600083015261526381615227565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006152c6602183613cd7565b91506152d18261526a565b604082019050919050565b600060208201905081810360008301526152f5816152b9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000615358603e83613cd7565b9150615363826152fc565b604082019050919050565b600060208201905081810360008301526153878161534b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006153c882613d87565b91506153d383613d87565b9250826153e3576153e261538e565b5b828204905092915050565b60006153f982613d87565b915061540483613d87565b9250826154145761541361538e565b5b828206905092915050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061547b602583613cd7565b91506154868261541f565b604082019050919050565b600060208201905081810360008301526154aa8161546e565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061550d602483613cd7565b9150615518826154b1565b604082019050919050565b6000602082019050818103600083015261553c81615500565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615579601983613cd7565b915061558482615543565b602082019050919050565b600060208201905081810360008301526155a88161556c565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061560b603283613cd7565b9150615616826155af565b604082019050919050565b6000602082019050818103600083015261563a816155fe565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061566882615641565b615672818561564c565b9350615682818560208601613ce8565b61568b81613d1b565b840191505092915050565b60006080820190506156ab6000830187613e1c565b6156b86020830186613e1c565b6156c56040830185613eb2565b81810360608301526156d7818461565d565b905095945050505050565b6000815190506156f181613be4565b92915050565b60006020828403121561570d5761570c613bae565b5b600061571b848285016156e2565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061575a602083613cd7565b915061576582615724565b602082019050919050565b600060208201905081810360008301526157898161574d565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006157c6601c83613cd7565b91506157d182615790565b602082019050919050565b600060208201905081810360008301526157f5816157b9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220d6684a95b48a7c0b0e1a0b1eccfc5284aed48dd9bcc64cec5651703a9c42238364736f6c634300080d0033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000003574f4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003574f4d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005968747470733a2f2f6261667962656966697236746162686773347a7562777878776871696e75636e656d7a6b65637473726b7276696464697871616636356537756a712e697066732e6e667473746f726167652e6c696e6b2f00000000000000000000000000000000000000000000000000000000000000000000000000005968747470733a2f2f6261666b726569677a776161646e747632636e76736e34786d66716661746474716a336f6b3768327135623673746e677a6e7962376261753471792e697066732e6e667473746f726167652e6c696e6b2f00000000000000

Deployed Bytecode

0x6080604052600436106102725760003560e01c80636352211e1161014f5780639c70b512116100c1578063d5abeb011161007a578063d5abeb011461096c578063da3ef23f14610997578063e0391b09146109c0578063e8a3d485146109eb578063e985e9c514610a16578063f2fde38b14610a5357610272565b80639c70b5121461086b578063a22cb46514610896578063b88d4fde146108bf578063ba41b0c6146108e8578063c668286214610904578063c87b56dd1461092f57610272565b80637cb64759116101135780637cb647591461076f578063837aea6c146107985780638da5cb5b146107c3578063938e3d7b146107ee57806395d89b41146108175780639b3ddaa81461084257610272565b80636352211e146106885780636c0360eb146106c55780636cbf6456146106f057806370a082311461071b578063715018a61461075857610272565b80632f745c59116101e8578063438b6300116101ac578063438b6300146105405780634f6ccce71461057d57806355f804b3146105ba5780635a23dd99146105e35780635c975abb1461062057806360249a941461064b57610272565b80632f745c591461047e5780633c952764146104bb5780633ccfd60b146104e457806342842e0e146104ee57806342966c681461051757610272565b8063095ea7b31161023a578063095ea7b31461036e57806318160ddd1461039757806318cae269146103c2578063239c70ae146103ff57806323b872dd1461042a5780632eb4a7ab1461045357610272565b806301ffc9a71461027757806302329a29146102b457806306fdde03146102dd578063081812fc14610308578063088a4ed014610345575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613c10565b610a7c565b6040516102ab9190613c58565b60405180910390f35b3480156102c057600080fd5b506102db60048036038101906102d69190613c9f565b610a8e565b005b3480156102e957600080fd5b506102f2610ab3565b6040516102ff9190613d65565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a9190613dbd565b610b45565b60405161033c9190613e2b565b60405180910390f35b34801561035157600080fd5b5061036c60048036038101906103679190613dbd565b610b8b565b005b34801561037a57600080fd5b5061039560048036038101906103909190613e72565b610b9d565b005b3480156103a357600080fd5b506103ac610ca7565b6040516103b99190613ec1565b60405180910390f35b3480156103ce57600080fd5b506103e960048036038101906103e49190613edc565b610cb4565b6040516103f69190613ec1565b60405180910390f35b34801561040b57600080fd5b50610414610ccc565b6040516104219190613ec1565b60405180910390f35b34801561043657600080fd5b50610451600480360381019061044c9190613f09565b610cd2565b005b34801561045f57600080fd5b50610468610e22565b6040516104759190613f75565b60405180910390f35b34801561048a57600080fd5b506104a560048036038101906104a09190613e72565b610e28565b6040516104b29190613ec1565b60405180910390f35b3480156104c757600080fd5b506104e260048036038101906104dd9190613c9f565b610ecd565b005b6104ec610ef2565b005b3480156104fa57600080fd5b5061051560048036038101906105109190613f09565b610f7e565b005b34801561052357600080fd5b5061053e60048036038101906105399190613dbd565b6110ce565b005b34801561054c57600080fd5b5061056760048036038101906105629190613edc565b61112a565b604051610574919061404e565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f9190613dbd565b6111d8565b6040516105b19190613ec1565b60405180910390f35b3480156105c657600080fd5b506105e160048036038101906105dc91906141a5565b611249565b005b3480156105ef57600080fd5b5061060a6004803603810190610605919061424e565b61126b565b6040516106179190613c58565b60405180910390f35b34801561062c57600080fd5b506106356112ef565b6040516106429190613c58565b60405180910390f35b34801561065757600080fd5b50610672600480360381019061066d9190613dbd565b611302565b60405161067f919061437d565b60405180910390f35b34801561069457600080fd5b506106af60048036038101906106aa9190613dbd565b611458565b6040516106bc9190613e2b565b60405180910390f35b3480156106d157600080fd5b506106da611509565b6040516106e79190613d65565b60405180910390f35b3480156106fc57600080fd5b50610705611597565b6040516107129190613d65565b60405180910390f35b34801561072757600080fd5b50610742600480360381019061073d9190613edc565b611625565b60405161074f9190613ec1565b60405180910390f35b34801561076457600080fd5b5061076d6116dc565b005b34801561077b57600080fd5b50610796600480360381019061079191906143cb565b6116f0565b005b3480156107a457600080fd5b506107ad611702565b6040516107ba9190613ec1565b60405180910390f35b3480156107cf57600080fd5b506107d8611708565b6040516107e59190613e2b565b60405180910390f35b3480156107fa57600080fd5b50610815600480360381019061081091906141a5565b611732565b005b34801561082357600080fd5b5061082c611754565b6040516108399190613d65565b60405180910390f35b34801561084e57600080fd5b5061086960048036038101906108649190613dbd565b6117e6565b005b34801561087757600080fd5b506108806117f8565b60405161088d9190613c58565b60405180910390f35b3480156108a257600080fd5b506108bd60048036038101906108b891906143f8565b61180b565b005b3480156108cb57600080fd5b506108e660048036038101906108e191906144d9565b611915565b005b61090260048036038101906108fd919061455c565b611a68565b005b34801561091057600080fd5b50610919611ee2565b6040516109269190613d65565b60405180910390f35b34801561093b57600080fd5b5061095660048036038101906109519190613dbd565b611f70565b6040516109639190613d65565b60405180910390f35b34801561097857600080fd5b5061098161201a565b60405161098e9190613ec1565b60405180910390f35b3480156109a357600080fd5b506109be60048036038101906109b991906141a5565b612020565b005b3480156109cc57600080fd5b506109d5612042565b6040516109e291906146f4565b60405180910390f35b3480156109f757600080fd5b50610a006121af565b604051610a0d9190613d65565b60405180910390f35b348015610a2257600080fd5b50610a3d6004803603810190610a389190614716565b612241565b604051610a4a9190613c58565b60405180910390f35b348015610a5f57600080fd5b50610a7a6004803603810190610a759190613edc565b6122d5565b005b6000610a8782612358565b9050919050565b610a966123d2565b80601260006101000a81548160ff02191690831515021790555050565b606060008054610ac290614785565b80601f0160208091040260200160405190810160405280929190818152602001828054610aee90614785565b8015610b3b5780601f10610b1057610100808354040283529160200191610b3b565b820191906000526020600020905b815481529060010190602001808311610b1e57829003601f168201915b5050505050905090565b6000610b5082612450565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610b936123d2565b8060108190555050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610c98576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610c159291906147b6565b602060405180830381865afa158015610c32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5691906147f4565b610c9757806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610c8e9190613e2b565b60405180910390fd5b5b610ca2838361249b565b505050565b6000600880549050905090565b60136020528060005260406000206000915090505481565b60105481565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610e10573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d4457610d3f8484846125b2565b610e1c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610d8d9291906147b6565b602060405180830381865afa158015610daa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dce91906147f4565b610e0f57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610e069190613e2b565b60405180910390fd5b5b610e1b8484846125b2565b5b50505050565b60145481565b6000610e3383611625565b8210610e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6b90614893565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ed56123d2565b80601260016101000a81548160ff02191690831515021790555050565b610efa6123d2565b6000610f04611708565b73ffffffffffffffffffffffffffffffffffffffff1647604051610f27906148e4565b60006040518083038185875af1925050503d8060008114610f64576040519150601f19603f3d011682016040523d82523d6000602084013e610f69565b606091505b5050905080610f7b57610f7a6148f9565b5b50565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156110bc573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ff057610feb848484612612565b6110c8565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016110399291906147b6565b602060405180830381865afa158015611056573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107a91906147f4565b6110bb57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016110b29190613e2b565b60405180910390fd5b5b6110c7848484612612565b5b50505050565b6110df6110d9612632565b8261263a565b61111e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111159061499a565b60405180910390fd5b611127816126cf565b50565b6060600061113783611625565b905060008167ffffffffffffffff8111156111555761115461407a565b5b6040519080825280602002602001820160405280156111835781602001602082028036833780820191505090505b50905060005b828110156111cd5761119b8582610e28565b8282815181106111ae576111ad6149ba565b5b60200260200101818152505080806111c590614a18565b915050611189565b508092505050919050565b60006111e2610ca7565b8210611223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121a90614ad2565b60405180910390fd5b60088281548110611237576112366149ba565b5b90600052602060002001549050919050565b6112516123d2565b80600c9080519060200190611267929190613abc565b5050565b6000808460405160200161127f9190614b3a565b6040516020818303038152906040528051906020012090506112e5848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601454836127ec565b9150509392505050565b601260009054906101000a900460ff1681565b61130a613b42565b6113126123d2565b60156001836113219190614b55565b81548110611332576113316149ba565b5b90600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016004820180546113cf90614785565b80601f01602080910402602001604051908101604052809291908181526020018280546113fb90614785565b80156114485780601f1061141d57610100808354040283529160200191611448565b820191906000526020600020905b81548152906001019060200180831161142b57829003601f168201915b5050505050815250509050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f790614bd5565b60405180910390fd5b80915050919050565b600c805461151690614785565b80601f016020809104026020016040519081016040528092919081815260200182805461154290614785565b801561158f5780601f106115645761010080835404028352916020019161158f565b820191906000526020600020905b81548152906001019060200180831161157257829003601f168201915b505050505081565b600e80546115a490614785565b80601f01602080910402602001604051908101604052809291908181526020018280546115d090614785565b801561161d5780601f106115f25761010080835404028352916020019161161d565b820191906000526020600020905b81548152906001019060200180831161160057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611695576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168c90614c67565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116e46123d2565b6116ee6000612803565b565b6116f86123d2565b8060148190555050565b60115481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61173a6123d2565b80600e9080519060200190611750929190613abc565b5050565b60606001805461176390614785565b80601f016020809104026020016040519081016040528092919081815260200182805461178f90614785565b80156117dc5780601f106117b1576101008083540402835291602001916117dc565b820191906000526020600020905b8154815290600101906020018083116117bf57829003601f168201915b5050505050905090565b6117ee6123d2565b8060118190555050565b601260019054906101000a900460ff1681565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611906576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016118839291906147b6565b602060405180830381865afa1580156118a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c491906147f4565b61190557806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016118fc9190613e2b565b60405180910390fd5b5b61191083836128c9565b505050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611a54573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361198857611983858585856128df565b611a61565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016119d19291906147b6565b602060405180830381865afa1580156119ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1291906147f4565b611a5357336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611a4a9190613e2b565b60405180910390fd5b5b611a60858585856128df565b5b5050505050565b601260009054906101000a900460ff1615611ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaf90614cd3565b60405180910390fd5b6000611ac2610ca7565b905060008411611b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afe90614d3f565b60405180910390fd5b600f548482611b169190614d5f565b1115611b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4e90614e01565b60405180910390fd5b611b5f611708565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cd2576000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506011548582611be49190614d5f565b1115611c25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1c90614e6d565b60405180910390fd5b601054851115611c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6190614eff565b60405180910390fd5b60011515601260019054906101000a900460ff16151503611cd057611c9033858561126b565b611ccf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc690614f6b565b60405180910390fd5b5b505b6000600190505b848111611edb57601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611d3090614a18565b919050555060006001611d43600b612941565b611d4d9190614d5f565b9050611d59600b61294f565b611d633382612965565b60156040518060a001604052808381526020013481526020014281526020013373ffffffffffffffffffffffffffffffffffffffff168152602001611da784611f70565b815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506080820151816004019080519060200190611e54929190613abc565b505050611e6081611f70565b604051611e6d9190614fc7565b60405180910390203373ffffffffffffffffffffffffffffffffffffffff167f3328437ef526a83b70ad0cf55449d2eee902258f17c450ec11bc9b6adc43aae3833442604051611ebf93929190614fde565b60405180910390a3508080611ed390614a18565b915050611cd9565b5050505050565b600d8054611eef90614785565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1b90614785565b8015611f685780601f10611f3d57610100808354040283529160200191611f68565b820191906000526020600020905b815481529060010190602001808311611f4b57829003601f168201915b505050505081565b6060611f7b82612983565b611fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb190615087565b60405180910390fd5b6000611fc46129ef565b90506000815111611fe45760405180602001604052806000815250612012565b80611fee84612a81565b600d6040516020016120029392919061513b565b6040516020818303038152906040525b915050919050565b600f5481565b6120286123d2565b80600d908051906020019061203e929190613abc565b5050565b606061204c6123d2565b6015805480602002602001604051908101604052809291908181526020016000905b828210156121a657838290600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160048201805461211590614785565b80601f016020809104026020016040519081016040528092919081815260200182805461214190614785565b801561218e5780601f106121635761010080835404028352916020019161218e565b820191906000526020600020905b81548152906001019060200180831161217157829003601f168201915b5050505050815250508152602001906001019061206e565b50505050905090565b6060600e80546121be90614785565b80601f01602080910402602001604051908101604052809291908181526020018280546121ea90614785565b80156122375780601f1061220c57610100808354040283529160200191612237565b820191906000526020600020905b81548152906001019060200180831161221a57829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122dd6123d2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361234c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612343906151de565b60405180910390fd5b61235581612803565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123cb57506123ca82612be1565b5b9050919050565b6123da612632565b73ffffffffffffffffffffffffffffffffffffffff166123f8611708565b73ffffffffffffffffffffffffffffffffffffffff161461244e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124459061524a565b60405180910390fd5b565b61245981612983565b612498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248f90614bd5565b60405180910390fd5b50565b60006124a682611458565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250d906152dc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16612535612632565b73ffffffffffffffffffffffffffffffffffffffff16148061256457506125638161255e612632565b612241565b5b6125a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259a9061536e565b60405180910390fd5b6125ad8383612cc3565b505050565b6125c36125bd612632565b8261263a565b612602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f99061499a565b60405180910390fd5b61260d838383612d7c565b505050565b61262d83838360405180602001604052806000815250611915565b505050565b600033905090565b60008061264683611458565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061268857506126878185612241565b5b806126c657508373ffffffffffffffffffffffffffffffffffffffff166126ae84610b45565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b60006126da82611458565b90506126e881600084612fe2565b6126f3600083612cc3565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127439190614b55565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127e881600084612ff2565b5050565b6000826127f98584612ff7565b1490509392505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6128db6128d4612632565b838361304d565b5050565b6128f06128ea612632565b8361263a565b61292f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129269061499a565b60405180910390fd5b61293b848484846131b9565b50505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b61297f828260405180602001604052806000815250613215565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600c80546129fe90614785565b80601f0160208091040260200160405190810160405280929190818152602001828054612a2a90614785565b8015612a775780601f10612a4c57610100808354040283529160200191612a77565b820191906000526020600020905b815481529060010190602001808311612a5a57829003601f168201915b5050505050905090565b606060008203612ac8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bdc565b600082905060005b60008214612afa578080612ae390614a18565b915050600a82612af391906153bd565b9150612ad0565b60008167ffffffffffffffff811115612b1657612b1561407a565b5b6040519080825280601f01601f191660200182016040528015612b485781602001600182028036833780820191505090505b5090505b60008514612bd557600182612b619190614b55565b9150600a85612b7091906153ee565b6030612b7c9190614d5f565b60f81b818381518110612b9257612b916149ba565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bce91906153bd565b9450612b4c565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cac57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612cbc5750612cbb82613270565b5b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612d3683611458565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8273ffffffffffffffffffffffffffffffffffffffff16612d9c82611458565b73ffffffffffffffffffffffffffffffffffffffff1614612df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de990615491565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5890615523565b60405180910390fd5b612e6c838383612fe2565b612e77600082612cc3565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ec79190614b55565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f1e9190614d5f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612fdd838383612ff2565b505050565b612fed8383836132da565b505050565b505050565b60008082905060005b84518110156130425761302d828683815181106130205761301f6149ba565b5b60200260200101516133ec565b9150808061303a90614a18565b915050613000565b508091505092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036130bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b29061558f565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516131ac9190613c58565b60405180910390a3505050565b6131c4848484612d7c565b6131d084848484613417565b61320f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320690615621565b60405180910390fd5b50505050565b61321f838361359e565b61322c6000848484613417565b61326b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326290615621565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6132e5838383613777565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613327576133228161377c565b613366565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146133655761336483826137c5565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036133a8576133a381613932565b6133e7565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146133e6576133e58282613a03565b5b5b505050565b6000818310613404576133ff8284613a82565b61340f565b61340e8383613a82565b5b905092915050565b60006134388473ffffffffffffffffffffffffffffffffffffffff16613a99565b15613591578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613461612632565b8786866040518563ffffffff1660e01b81526004016134839493929190615696565b6020604051808303816000875af19250505080156134bf57506040513d601f19601f820116820180604052508101906134bc91906156f7565b60015b613541573d80600081146134ef576040519150601f19603f3d011682016040523d82523d6000602084013e6134f4565b606091505b506000815103613539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353090615621565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613596565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361360d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360490615770565b60405180910390fd5b61361681612983565b15613656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161364d906157dc565b60405180910390fd5b61366260008383612fe2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136b29190614d5f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461377360008383612ff2565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016137d284611625565b6137dc9190614b55565b90506000600760008481526020019081526020016000205490508181146138c1576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506139469190614b55565b9050600060096000848152602001908152602001600020549050600060088381548110613976576139756149ba565b5b906000526020600020015490508060088381548110613998576139976149ba565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806139e7576139e66157fc565b5b6001900381819060005260206000200160009055905550505050565b6000613a0e83611625565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600082600052816020526040600020905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054613ac890614785565b90600052602060002090601f016020900481019282613aea5760008555613b31565b82601f10613b0357805160ff1916838001178555613b31565b82800160010185558215613b31579182015b82811115613b30578251825591602001919060010190613b15565b5b509050613b3e9190613b87565b5090565b6040518060a00160405280600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b5b80821115613ba0576000816000905550600101613b88565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613bed81613bb8565b8114613bf857600080fd5b50565b600081359050613c0a81613be4565b92915050565b600060208284031215613c2657613c25613bae565b5b6000613c3484828501613bfb565b91505092915050565b60008115159050919050565b613c5281613c3d565b82525050565b6000602082019050613c6d6000830184613c49565b92915050565b613c7c81613c3d565b8114613c8757600080fd5b50565b600081359050613c9981613c73565b92915050565b600060208284031215613cb557613cb4613bae565b5b6000613cc384828501613c8a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d06578082015181840152602081019050613ceb565b83811115613d15576000848401525b50505050565b6000601f19601f8301169050919050565b6000613d3782613ccc565b613d418185613cd7565b9350613d51818560208601613ce8565b613d5a81613d1b565b840191505092915050565b60006020820190508181036000830152613d7f8184613d2c565b905092915050565b6000819050919050565b613d9a81613d87565b8114613da557600080fd5b50565b600081359050613db781613d91565b92915050565b600060208284031215613dd357613dd2613bae565b5b6000613de184828501613da8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e1582613dea565b9050919050565b613e2581613e0a565b82525050565b6000602082019050613e406000830184613e1c565b92915050565b613e4f81613e0a565b8114613e5a57600080fd5b50565b600081359050613e6c81613e46565b92915050565b60008060408385031215613e8957613e88613bae565b5b6000613e9785828601613e5d565b9250506020613ea885828601613da8565b9150509250929050565b613ebb81613d87565b82525050565b6000602082019050613ed66000830184613eb2565b92915050565b600060208284031215613ef257613ef1613bae565b5b6000613f0084828501613e5d565b91505092915050565b600080600060608486031215613f2257613f21613bae565b5b6000613f3086828701613e5d565b9350506020613f4186828701613e5d565b9250506040613f5286828701613da8565b9150509250925092565b6000819050919050565b613f6f81613f5c565b82525050565b6000602082019050613f8a6000830184613f66565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613fc581613d87565b82525050565b6000613fd78383613fbc565b60208301905092915050565b6000602082019050919050565b6000613ffb82613f90565b6140058185613f9b565b935061401083613fac565b8060005b838110156140415781516140288882613fcb565b975061403383613fe3565b925050600181019050614014565b5085935050505092915050565b600060208201905081810360008301526140688184613ff0565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6140b282613d1b565b810181811067ffffffffffffffff821117156140d1576140d061407a565b5b80604052505050565b60006140e4613ba4565b90506140f082826140a9565b919050565b600067ffffffffffffffff8211156141105761410f61407a565b5b61411982613d1b565b9050602081019050919050565b82818337600083830152505050565b6000614148614143846140f5565b6140da565b90508281526020810184848401111561416457614163614075565b5b61416f848285614126565b509392505050565b600082601f83011261418c5761418b614070565b5b813561419c848260208601614135565b91505092915050565b6000602082840312156141bb576141ba613bae565b5b600082013567ffffffffffffffff8111156141d9576141d8613bb3565b5b6141e584828501614177565b91505092915050565b600080fd5b600080fd5b60008083601f84011261420e5761420d614070565b5b8235905067ffffffffffffffff81111561422b5761422a6141ee565b5b602083019150836020820283011115614247576142466141f3565b5b9250929050565b60008060006040848603121561426757614266613bae565b5b600061427586828701613e5d565b935050602084013567ffffffffffffffff81111561429657614295613bb3565b5b6142a2868287016141f8565b92509250509250925092565b6142b781613e0a565b82525050565b600082825260208201905092915050565b60006142d982613ccc565b6142e381856142bd565b93506142f3818560208601613ce8565b6142fc81613d1b565b840191505092915050565b600060a08301600083015161431f6000860182613fbc565b5060208301516143326020860182613fbc565b5060408301516143456040860182613fbc565b50606083015161435860608601826142ae565b506080830151848203608086015261437082826142ce565b9150508091505092915050565b600060208201905081810360008301526143978184614307565b905092915050565b6143a881613f5c565b81146143b357600080fd5b50565b6000813590506143c58161439f565b92915050565b6000602082840312156143e1576143e0613bae565b5b60006143ef848285016143b6565b91505092915050565b6000806040838503121561440f5761440e613bae565b5b600061441d85828601613e5d565b925050602061442e85828601613c8a565b9150509250929050565b600067ffffffffffffffff8211156144535761445261407a565b5b61445c82613d1b565b9050602081019050919050565b600061447c61447784614438565b6140da565b90508281526020810184848401111561449857614497614075565b5b6144a3848285614126565b509392505050565b600082601f8301126144c0576144bf614070565b5b81356144d0848260208601614469565b91505092915050565b600080600080608085870312156144f3576144f2613bae565b5b600061450187828801613e5d565b945050602061451287828801613e5d565b935050604061452387828801613da8565b925050606085013567ffffffffffffffff81111561454457614543613bb3565b5b614550878288016144ab565b91505092959194509250565b60008060006040848603121561457557614574613bae565b5b600061458386828701613da8565b935050602084013567ffffffffffffffff8111156145a4576145a3613bb3565b5b6145b0868287016141f8565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060a0830160008301516146006000860182613fbc565b5060208301516146136020860182613fbc565b5060408301516146266040860182613fbc565b50606083015161463960608601826142ae565b506080830151848203608086015261465182826142ce565b9150508091505092915050565b600061466a83836145e8565b905092915050565b6000602082019050919050565b600061468a826145bc565b61469481856145c7565b9350836020820285016146a6856145d8565b8060005b858110156146e257848403895281516146c3858261465e565b94506146ce83614672565b925060208a019950506001810190506146aa565b50829750879550505050505092915050565b6000602082019050818103600083015261470e818461467f565b905092915050565b6000806040838503121561472d5761472c613bae565b5b600061473b85828601613e5d565b925050602061474c85828601613e5d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061479d57607f821691505b6020821081036147b0576147af614756565b5b50919050565b60006040820190506147cb6000830185613e1c565b6147d86020830184613e1c565b9392505050565b6000815190506147ee81613c73565b92915050565b60006020828403121561480a57614809613bae565b5b6000614818848285016147df565b91505092915050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061487d602b83613cd7565b915061488882614821565b604082019050919050565b600060208201905081810360008301526148ac81614870565b9050919050565b600081905092915050565b50565b60006148ce6000836148b3565b91506148d9826148be565b600082019050919050565b60006148ef826148c1565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000614984602e83613cd7565b915061498f82614928565b604082019050919050565b600060208201905081810360008301526149b381614977565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614a2382613d87565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a5557614a546149e9565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614abc602c83613cd7565b9150614ac782614a60565b604082019050919050565b60006020820190508181036000830152614aeb81614aaf565b9050919050565b60008160601b9050919050565b6000614b0a82614af2565b9050919050565b6000614b1c82614aff565b9050919050565b614b34614b2f82613e0a565b614b11565b82525050565b6000614b468284614b23565b60148201915081905092915050565b6000614b6082613d87565b9150614b6b83613d87565b925082821015614b7e57614b7d6149e9565b5b828203905092915050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614bbf601883613cd7565b9150614bca82614b89565b602082019050919050565b60006020820190508181036000830152614bee81614bb2565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614c51602983613cd7565b9150614c5c82614bf5565b604082019050919050565b60006020820190508181036000830152614c8081614c44565b9050919050565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b6000614cbd601683613cd7565b9150614cc882614c87565b602082019050919050565b60006020820190508181036000830152614cec81614cb0565b9050919050565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b6000614d29601b83613cd7565b9150614d3482614cf3565b602082019050919050565b60006020820190508181036000830152614d5881614d1c565b9050919050565b6000614d6a82613d87565b9150614d7583613d87565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614daa57614da96149e9565b5b828201905092915050565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b6000614deb601683613cd7565b9150614df682614db5565b602082019050919050565b60006020820190508181036000830152614e1a81614dde565b9050919050565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b6000614e57601c83613cd7565b9150614e6282614e21565b602082019050919050565b60006020820190508181036000830152614e8681614e4a565b9050919050565b7f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b6000614ee9602483613cd7565b9150614ef482614e8d565b604082019050919050565b60006020820190508181036000830152614f1881614edc565b9050919050565b7f75736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b6000614f55601783613cd7565b9150614f6082614f1f565b602082019050919050565b60006020820190508181036000830152614f8481614f48565b9050919050565b600081905092915050565b6000614fa182613ccc565b614fab8185614f8b565b9350614fbb818560208601613ce8565b80840191505092915050565b6000614fd38284614f96565b915081905092915050565b6000606082019050614ff36000830186613eb2565b6150006020830185613eb2565b61500d6040830184613eb2565b949350505050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615071602f83613cd7565b915061507c82615015565b604082019050919050565b600060208201905081810360008301526150a081615064565b9050919050565b60008190508160005260206000209050919050565b600081546150c981614785565b6150d38186614f8b565b945060018216600081146150ee57600181146150ff57615132565b60ff19831686528186019350615132565b615108856150a7565b60005b8381101561512a5781548189015260018201915060208101905061510b565b838801955050505b50505092915050565b60006151478286614f96565b91506151538285614f96565b915061515f82846150bc565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006151c8602683613cd7565b91506151d38261516c565b604082019050919050565b600060208201905081810360008301526151f7816151bb565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615234602083613cd7565b915061523f826151fe565b602082019050919050565b6000602082019050818103600083015261526381615227565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006152c6602183613cd7565b91506152d18261526a565b604082019050919050565b600060208201905081810360008301526152f5816152b9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000615358603e83613cd7565b9150615363826152fc565b604082019050919050565b600060208201905081810360008301526153878161534b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006153c882613d87565b91506153d383613d87565b9250826153e3576153e261538e565b5b828204905092915050565b60006153f982613d87565b915061540483613d87565b9250826154145761541361538e565b5b828206905092915050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061547b602583613cd7565b91506154868261541f565b604082019050919050565b600060208201905081810360008301526154aa8161546e565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061550d602483613cd7565b9150615518826154b1565b604082019050919050565b6000602082019050818103600083015261553c81615500565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615579601983613cd7565b915061558482615543565b602082019050919050565b600060208201905081810360008301526155a88161556c565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061560b603283613cd7565b9150615616826155af565b604082019050919050565b6000602082019050818103600083015261563a816155fe565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061566882615641565b615672818561564c565b9350615682818560208601613ce8565b61568b81613d1b565b840191505092915050565b60006080820190506156ab6000830187613e1c565b6156b86020830186613e1c565b6156c56040830185613eb2565b81810360608301526156d7818461565d565b905095945050505050565b6000815190506156f181613be4565b92915050565b60006020828403121561570d5761570c613bae565b5b600061571b848285016156e2565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061575a602083613cd7565b915061576582615724565b602082019050919050565b600060208201905081810360008301526157898161574d565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006157c6601c83613cd7565b91506157d182615790565b602082019050919050565b600060208201905081810360008301526157f5816157b9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220d6684a95b48a7c0b0e1a0b1eccfc5284aed48dd9bcc64cec5651703a9c42238364736f6c634300080d0033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000003574f4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003574f4d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005968747470733a2f2f6261667962656966697236746162686773347a7562777878776871696e75636e656d7a6b65637473726b7276696464697871616636356537756a712e697066732e6e667473746f726167652e6c696e6b2f00000000000000000000000000000000000000000000000000000000000000000000000000005968747470733a2f2f6261666b726569677a776161646e747632636e76736e34786d66716661746474716a336f6b3768327135623673746e677a6e7962376261753471792e697066732e6e667473746f726167652e6c696e6b2f00000000000000

-----Decoded View---------------
Arg [0] : _name (string): WOM
Arg [1] : _symbol (string): WOM
Arg [2] : _initBaseURI (string): https://bafybeifir6tabhgs4zubwxxwhqinucnemzkectsrkrviddixqaf65e7ujq.ipfs.nftstorage.link/
Arg [3] : _contractURI (string): https://bafkreigzwaadntv2cnvsn4xmfqfatdtqj3ok7h2q5b6stngznyb7bau4qy.ipfs.nftstorage.link/

-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 574f4d0000000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 574f4d0000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000059
Arg [9] : 68747470733a2f2f6261667962656966697236746162686773347a7562777878
Arg [10] : 776871696e75636e656d7a6b65637473726b7276696464697871616636356537
Arg [11] : 756a712e697066732e6e667473746f726167652e6c696e6b2f00000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000059
Arg [13] : 68747470733a2f2f6261666b726569677a776161646e747632636e76736e3478
Arg [14] : 6d66716661746474716a336f6b3768327135623673746e677a6e796237626175
Arg [15] : 3471792e697066732e6e667473746f726167652e6c696e6b2f00000000000000


Deployed Bytecode Sourcemap

65948:5283:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65655:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70589:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43150:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44663:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69919:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64508:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57844:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66399:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66252:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64698:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66459:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57512:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70670:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70771:457;;;:::i;:::-;;64894:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55943:243;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68868:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58034:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70231:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68638:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66329:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69771:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42861:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66102:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66175:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42592:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21679:103;;;;;;;;;;;;;:::i;:::-;;70019:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66289:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21031:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70335:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43319:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70125:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66360:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64299:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65098:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67270:1258;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66133:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69222:419;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66216:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70461:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69663:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68536:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45132:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21937:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65655:212;65794:4;65823:36;65847:11;65823:23;:36::i;:::-;65816:43;;65655:212;;;:::o;70589:73::-;20917:13;:11;:13::i;:::-;70650:6:::1;70641;;:15;;;;;;;;;;;;;;;;;;70589:73:::0;:::o;43150:100::-;43204:13;43237:5;43230:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43150:100;:::o;44663:171::-;44739:7;44759:23;44774:7;44759:14;:23::i;:::-;44802:15;:24;44818:7;44802:24;;;;;;;;;;;;;;;;;;;;;44795:31;;44663:171;;;:::o;69919:94::-;20917:13;:11;:13::i;:::-;70001:6:::1;69985:13;:22;;;;69919:94:::0;:::o;64508:182::-;64629:8;4690:1;2748:42;4642:45;;;:49;4638:225;;;2748:42;4713;;;4764:4;4771:8;4713:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4708:144;;4827:8;4808:28;;;;;;;;;;;:::i;:::-;;;;;;;;4708:144;4638:225;64650:32:::1;64664:8;64674:7;64650:13;:32::i;:::-;64508:182:::0;;;:::o;57844:113::-;57905:7;57932:10;:17;;;;57925:24;;57844:113;:::o;66399:55::-;;;;;;;;;;;;;;;;;:::o;66252:32::-;;;;:::o;64698:188::-;64824:4;3944:1;2748:42;3896:45;;;:49;3892:539;;;4185:10;4177:18;;:4;:18;;;4173:85;;64841:37:::1;64860:4;64866:2;64870:7;64841:18;:37::i;:::-;4236:7:::0;;4173:85;2748:42;4277;;;4328:4;4335:10;4277:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4272:148;;4393:10;4374:30;;;;;;;;;;;:::i;:::-;;;;;;;;4272:148;3892:539;64841:37:::1;64860:4;64866:2;64870:7;64841:18;:37::i;:::-;64698:188:::0;;;;;:::o;66459:94::-;;;;:::o;57512:256::-;57609:7;57645:23;57662:5;57645:16;:23::i;:::-;57637:5;:31;57629:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;57734:12;:19;57747:5;57734:19;;;;;;;;;;;;;;;:26;57754:5;57734:26;;;;;;;;;;;;57727:33;;57512:256;;;;:::o;70670:95::-;20917:13;:11;:13::i;:::-;70753:6:::1;70735:15;;:24;;;;;;;;;;;;;;;;;;70670:95:::0;:::o;70771:457::-;20917:13;:11;:13::i;:::-;71051:7:::1;71072;:5;:7::i;:::-;71064:21;;71093;71064:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71050:69;;;71133:2;71126:10;;;;:::i;:::-;;70816:412;70771:457::o:0;64894:196::-;65024:4;3944:1;2748:42;3896:45;;;:49;3892:539;;;4185:10;4177:18;;:4;:18;;;4173:85;;65041:41:::1;65064:4;65070:2;65074:7;65041:22;:41::i;:::-;4236:7:::0;;4173:85;2748:42;4277;;;4328:4;4335:10;4277:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4272:148;;4393:10;4374:30;;;;;;;;;;;:::i;:::-;;;;;;;;4272:148;3892:539;65041:41:::1;65064:4;65070:2;65074:7;65041:22;:41::i;:::-;64894:196:::0;;;;;:::o;55943:243::-;56061:41;56080:12;:10;:12::i;:::-;56094:7;56061:18;:41::i;:::-;56053:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;56164:14;56170:7;56164:5;:14::i;:::-;55943:243;:::o;68868:348::-;68943:16;68971:23;68997:17;69007:6;68997:9;:17::i;:::-;68971:43;;69021:25;69063:15;69049:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69021:58;;69091:9;69086:103;69106:15;69102:1;:19;69086:103;;;69151:30;69171:6;69179:1;69151:19;:30::i;:::-;69137:8;69146:1;69137:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;69123:3;;;;;:::i;:::-;;;;69086:103;;;;69202:8;69195:15;;;;68868:348;;;:::o;58034:233::-;58109:7;58145:30;:28;:30::i;:::-;58137:5;:38;58129:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;58242:10;58253:5;58242:17;;;;;;;;:::i;:::-;;;;;;;;;;58235:24;;58034:233;;;:::o;70231:98::-;20917:13;:11;:13::i;:::-;70312:11:::1;70302:7;:21;;;;;;;;;;;;:::i;:::-;;70231:98:::0;:::o;68638:224::-;68730:4;68743:12;68785:5;68768:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;68758:34;;;;;;68743:49;;68806:50;68825:12;;68806:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68839:10;;68851:4;68806:18;:50::i;:::-;68799:57;;;68638:224;;;;;:::o;66329:26::-;;;;;;;;;;;;;:::o;69771:124::-;69837:17;;:::i;:::-;20917:13;:11;:13::i;:::-;69870:6:::1;69887:1;69877:7;:11;;;;:::i;:::-;69870:19;;;;;;;;:::i;:::-;;;;;;;;;;;;69863:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;69771:124:::0;;;:::o;42861:222::-;42933:7;42953:13;42969:7;:16;42977:7;42969:16;;;;;;;;;;;;;;;;;;;;;42953:32;;43021:1;43004:19;;:5;:19;;;42996:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;43070:5;43063:12;;;42861:222;;;:::o;66102:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66175:36::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42592:207::-;42664:7;42709:1;42692:19;;:5;:19;;;42684:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42775:9;:16;42785:5;42775:16;;;;;;;;;;;;;;;;42768:23;;42592:207;;;:::o;21679:103::-;20917:13;:11;:13::i;:::-;21744:30:::1;21771:1;21744:18;:30::i;:::-;21679:103::o:0;70019:98::-;20917:13;:11;:13::i;:::-;70100:11:::1;70087:10;:24;;;;70019:98:::0;:::o;66289:35::-;;;;:::o;21031:87::-;21077:7;21104:6;;;;;;;;;;;21097:13;;21031:87;:::o;70335:120::-;20917:13;:11;:13::i;:::-;70434:15:::1;70414:17;:35;;;;;;;;;;;;:::i;:::-;;70335:120:::0;:::o;43319:104::-;43375:13;43408:7;43401:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43319:104;:::o;70125:100::-;20917:13;:11;:13::i;:::-;70213:6:::1;70194:16;:25;;;;70125:100:::0;:::o;66360:34::-;;;;;;;;;;;;;:::o;64299:201::-;64428:8;4690:1;2748:42;4642:45;;;:49;4638:225;;;2748:42;4713;;;4764:4;4771:8;4713:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4708:144;;4827:8;4808:28;;;;;;;;;;;:::i;:::-;;;;;;;;4708:144;4638:225;64449:43:::1;64473:8;64483;64449:23;:43::i;:::-;64299:201:::0;;;:::o;65098:262::-;65283:4;3944:1;2748:42;3896:45;;;:49;3892:539;;;4185:10;4177:18;;:4;:18;;;4173:85;;65305:47:::1;65328:4;65334:2;65338:7;65347:4;65305:22;:47::i;:::-;4236:7:::0;;4173:85;2748:42;4277;;;4328:4;4335:10;4277:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4272:148;;4393:10;4374:30;;;;;;;;;;;:::i;:::-;;;;;;;;4272:148;3892:539;65305:47:::1;65328:4;65334:2;65338:7;65347:4;65305:22;:47::i;:::-;65098:262:::0;;;;;;:::o;67270:1258::-;67369:6;;;;;;;;;;;67368:7;67360:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;67409:14;67426:13;:11;:13::i;:::-;67409:30;;67468:1;67454:11;:15;67446:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;67540:9;;67525:11;67516:6;:20;;;;:::i;:::-;:33;;67508:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67603:7;:5;:7::i;:::-;67589:21;;:10;:21;;;67585:425;;67621:24;67648:20;:32;67669:10;67648:32;;;;;;;;;;;;;;;;67621:59;;67731:16;;67716:11;67697:16;:30;;;;:::i;:::-;:50;;67689:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;67812:13;;67797:11;:28;;67789:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;67899:4;67880:23;;:15;;;;;;;;;;;:23;;;67877:126;;67926:39;67940:10;67952:12;;67926:13;:39::i;:::-;67918:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;67877:126;67612:398;67585:425;68023:9;68035:1;68023:13;;68018:505;68043:11;68038:1;:16;68018:505;;68070:20;:32;68091:10;68070:32;;;;;;;;;;;;;;;;:34;;;;;;;;;:::i;:::-;;;;;;68113:15;68159:1;68131:25;:15;:23;:25::i;:::-;:29;;;;:::i;:::-;68113:47;;68169:27;:15;:25;:27::i;:::-;68205:30;68215:10;68227:7;68205:9;:30::i;:::-;68246:6;68268:144;;;;;;;;68291:7;68268:144;;;;68311:9;68268:144;;;;68333:15;68268:144;;;;68361:10;68268:144;;;;;;68384:17;68393:7;68384:8;:17::i;:::-;68268:144;;;68246:175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;68497:17;68506:7;68497:8;:17::i;:::-;68443:72;;;;;;:::i;:::-;;;;;;;;68485:10;68443:72;;;68448:7;68457:9;68468:15;68443:72;;;;;;;;:::i;:::-;;;;;;;;68061:462;68056:3;;;;;:::i;:::-;;;;68018:505;;;;67353:1175;67270:1258;;;:::o;66133:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;69222:419::-;69320:13;69361:16;69369:7;69361;:16::i;:::-;69345:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;69451:28;69482:10;:8;:10::i;:::-;69451:41;;69537:1;69512:14;69506:28;:32;:129;;;;;;;;;;;;;;;;;69572:14;69588:18;:7;:16;:18::i;:::-;69608:13;69555:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69506:129;69499:136;;;69222:419;;;:::o;66216:31::-;;;;:::o;70461:122::-;20917:13;:11;:13::i;:::-;70560:17:::1;70544:13;:33;;;;;;;;;;;;:::i;:::-;;70461:122:::0;:::o;69663:100::-;69716:19;20917:13;:11;:13::i;:::-;69751:6:::1;69744:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;69663:100:::0;:::o;68536:96::-;68580:13;68609:17;68602:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68536:96;:::o;45132:164::-;45229:4;45253:18;:25;45272:5;45253:25;;;;;;;;;;;;;;;:35;45279:8;45253:35;;;;;;;;;;;;;;;;;;;;;;;;;45246:42;;45132:164;;;;:::o;21937:201::-;20917:13;:11;:13::i;:::-;22046:1:::1;22026:22;;:8;:22;;::::0;22018:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22102:28;22121:8;22102:18;:28::i;:::-;21937:201:::0;:::o;57204:224::-;57306:4;57345:35;57330:50;;;:11;:50;;;;:90;;;;57384:36;57408:11;57384:23;:36::i;:::-;57330:90;57323:97;;57204:224;;;:::o;21196:132::-;21271:12;:10;:12::i;:::-;21260:23;;:7;:5;:7::i;:::-;:23;;;21252:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21196:132::o;52638:135::-;52720:16;52728:7;52720;:16::i;:::-;52712:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;52638:135;:::o;44180:417::-;44261:13;44277:23;44292:7;44277:14;:23::i;:::-;44261:39;;44325:5;44319:11;;:2;:11;;;44311:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;44419:5;44403:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;44428:37;44445:5;44452:12;:10;:12::i;:::-;44428:16;:37::i;:::-;44403:62;44381:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;44568:21;44577:2;44581:7;44568:8;:21::i;:::-;44250:347;44180:417;;:::o;45363:336::-;45558:41;45577:12;:10;:12::i;:::-;45591:7;45558:18;:41::i;:::-;45550:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;45663:28;45673:4;45679:2;45683:7;45663:9;:28::i;:::-;45363:336;;;:::o;45770:185::-;45908:39;45925:4;45931:2;45935:7;45908:39;;;;;;;;;;;;:16;:39::i;:::-;45770:185;;;:::o;19582:98::-;19635:7;19662:10;19655:17;;19582:98;:::o;48150:264::-;48243:4;48260:13;48276:23;48291:7;48276:14;:23::i;:::-;48260:39;;48329:5;48318:16;;:7;:16;;;:52;;;;48338:32;48355:5;48362:7;48338:16;:32::i;:::-;48318:52;:87;;;;48398:7;48374:31;;:20;48386:7;48374:11;:20::i;:::-;:31;;;48318:87;48310:96;;;48150:264;;;;:::o;50416:420::-;50476:13;50492:23;50507:7;50492:14;:23::i;:::-;50476:39;;50528:48;50549:5;50564:1;50568:7;50528:20;:48::i;:::-;50617:29;50634:1;50638:7;50617:8;:29::i;:::-;50679:1;50659:9;:16;50669:5;50659:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;50698:7;:16;50706:7;50698:16;;;;;;;;;;;;50691:23;;;;;;;;;;;50760:7;50756:1;50732:36;;50741:5;50732:36;;;;;;;;;;;;50781:47;50801:5;50816:1;50820:7;50781:19;:47::i;:::-;50465:371;50416:420;:::o;6602:190::-;6727:4;6780;6751:25;6764:5;6771:4;6751:12;:25::i;:::-;:33;6744:40;;6602:190;;;;;:::o;22298:191::-;22372:16;22391:6;;;;;;;;;;;22372:25;;22417:8;22408:6;;:17;;;;;;;;;;;;;;;;;;22472:8;22441:40;;22462:8;22441:40;;;;;;;;;;;;22361:128;22298:191;:::o;44906:155::-;45001:52;45020:12;:10;:12::i;:::-;45034:8;45044;45001:18;:52::i;:::-;44906:155;;:::o;46026:323::-;46200:41;46219:12;:10;:12::i;:::-;46233:7;46200:18;:41::i;:::-;46192:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;46303:38;46317:4;46323:2;46327:7;46336:4;46303:13;:38::i;:::-;46026:323;;;;:::o;15813:114::-;15878:7;15905;:14;;;15898:21;;15813:114;;;:::o;15935:127::-;16042:1;16024:7;:14;;;:19;;;;;;;;;;;15935:127;:::o;48756:110::-;48832:26;48842:2;48846:7;48832:26;;;;;;;;;;;;:9;:26::i;:::-;48756:110;;:::o;47856:127::-;47921:4;47973:1;47945:30;;:7;:16;47953:7;47945:16;;;;;;;;;;;;;;;;;;;;;:30;;;;47938:37;;47856:127;;;:::o;67149:102::-;67209:13;67238:7;67231:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67149:102;:::o;16836:723::-;16892:13;17122:1;17113:5;:10;17109:53;;17140:10;;;;;;;;;;;;;;;;;;;;;17109:53;17172:12;17187:5;17172:20;;17203:14;17228:78;17243:1;17235:4;:9;17228:78;;17261:8;;;;;:::i;:::-;;;;17292:2;17284:10;;;;;:::i;:::-;;;17228:78;;;17316:19;17348:6;17338:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17316:39;;17366:154;17382:1;17373:5;:10;17366:154;;17410:1;17400:11;;;;;:::i;:::-;;;17477:2;17469:5;:10;;;;:::i;:::-;17456:2;:24;;;;:::i;:::-;17443:39;;17426:6;17433;17426:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17506:2;17497:11;;;;;:::i;:::-;;;17366:154;;;17544:6;17530:21;;;;;16836:723;;;;:::o;42223:305::-;42325:4;42377:25;42362:40;;;:11;:40;;;;:105;;;;42434:33;42419:48;;;:11;:48;;;;42362:105;:158;;;;42484:36;42508:11;42484:23;:36::i;:::-;42362:158;42342:178;;42223:305;;;:::o;51917:174::-;52019:2;51992:15;:24;52008:7;51992:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;52075:7;52071:2;52037:46;;52046:23;52061:7;52046:14;:23::i;:::-;52037:46;;;;;;;;;;;;51917:174;;:::o;51173:625::-;51332:4;51305:31;;:23;51320:7;51305:14;:23::i;:::-;:31;;;51297:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;51411:1;51397:16;;:2;:16;;;51389:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;51467:39;51488:4;51494:2;51498:7;51467:20;:39::i;:::-;51571:29;51588:1;51592:7;51571:8;:29::i;:::-;51632:1;51613:9;:15;51623:4;51613:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;51661:1;51644:9;:13;51654:2;51644:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;51692:2;51673:7;:16;51681:7;51673:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;51731:7;51727:2;51712:27;;51721:4;51712:27;;;;;;;;;;;;51752:38;51772:4;51778:2;51782:7;51752:19;:38::i;:::-;51173:625;;;:::o;65443:204::-;65594:45;65621:4;65627:2;65631:7;65594:26;:45::i;:::-;65443:204;;;:::o;55273:125::-;;;;:::o;7469:296::-;7552:7;7572:20;7595:4;7572:27;;7615:9;7610:118;7634:5;:12;7630:1;:16;7610:118;;;7683:33;7693:12;7707:5;7713:1;7707:8;;;;;;;;:::i;:::-;;;;;;;;7683:9;:33::i;:::-;7668:48;;7648:3;;;;;:::i;:::-;;;;7610:118;;;;7745:12;7738:19;;;7469:296;;;;:::o;52234:315::-;52389:8;52380:17;;:5;:17;;;52372:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;52476:8;52438:18;:25;52457:5;52438:25;;;;;;;;;;;;;;;:35;52464:8;52438:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;52522:8;52500:41;;52515:5;52500:41;;;52532:8;52500:41;;;;;;:::i;:::-;;;;;;;;52234:315;;;:::o;47230:313::-;47386:28;47396:4;47402:2;47406:7;47386:9;:28::i;:::-;47433:47;47456:4;47462:2;47466:7;47475:4;47433:22;:47::i;:::-;47425:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;47230:313;;;;:::o;49093:319::-;49222:18;49228:2;49232:7;49222:5;:18::i;:::-;49273:53;49304:1;49308:2;49312:7;49321:4;49273:22;:53::i;:::-;49251:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;49093:319;;;:::o;33885:157::-;33970:4;34009:25;33994:40;;;:11;:40;;;;33987:47;;33885:157;;;:::o;58880:589::-;59024:45;59051:4;59057:2;59061:7;59024:26;:45::i;:::-;59102:1;59086:18;;:4;:18;;;59082:187;;59121:40;59153:7;59121:31;:40::i;:::-;59082:187;;;59191:2;59183:10;;:4;:10;;;59179:90;;59210:47;59243:4;59249:7;59210:32;:47::i;:::-;59179:90;59082:187;59297:1;59283:16;;:2;:16;;;59279:183;;59316:45;59353:7;59316:36;:45::i;:::-;59279:183;;;59389:4;59383:10;;:2;:10;;;59379:83;;59410:40;59438:2;59442:7;59410:27;:40::i;:::-;59379:83;59279:183;58880:589;;;:::o;14509:149::-;14572:7;14603:1;14599;:5;:51;;14630:20;14645:1;14648;14630:14;:20::i;:::-;14599:51;;;14607:20;14622:1;14625;14607:14;:20::i;:::-;14599:51;14592:58;;14509:149;;;;:::o;53337:853::-;53491:4;53512:15;:2;:13;;;:15::i;:::-;53508:675;;;53564:2;53548:36;;;53585:12;:10;:12::i;:::-;53599:4;53605:7;53614:4;53548:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53544:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53806:1;53789:6;:13;:18;53785:328;;53832:60;;;;;;;;;;:::i;:::-;;;;;;;;53785:328;54063:6;54057:13;54048:6;54044:2;54040:15;54033:38;53544:584;53680:41;;;53670:51;;;:6;:51;;;;53663:58;;;;;53508:675;54167:4;54160:11;;53337:853;;;;;;;:::o;49748:439::-;49842:1;49828:16;;:2;:16;;;49820:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;49901:16;49909:7;49901;:16::i;:::-;49900:17;49892:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49963:45;49992:1;49996:2;50000:7;49963:20;:45::i;:::-;50038:1;50021:9;:13;50031:2;50021:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;50069:2;50050:7;:16;50058:7;50050:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;50114:7;50110:2;50089:33;;50106:1;50089:33;;;;;;;;;;;;50135:44;50163:1;50167:2;50171:7;50135:19;:44::i;:::-;49748:439;;:::o;54762:126::-;;;;:::o;60192:164::-;60296:10;:17;;;;60269:15;:24;60285:7;60269:24;;;;;;;;;;;:44;;;;60324:10;60340:7;60324:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60192:164;:::o;60983:988::-;61249:22;61299:1;61274:22;61291:4;61274:16;:22::i;:::-;:26;;;;:::i;:::-;61249:51;;61311:18;61332:17;:26;61350:7;61332:26;;;;;;;;;;;;61311:47;;61479:14;61465:10;:28;61461:328;;61510:19;61532:12;:18;61545:4;61532:18;;;;;;;;;;;;;;;:34;61551:14;61532:34;;;;;;;;;;;;61510:56;;61616:11;61583:12;:18;61596:4;61583:18;;;;;;;;;;;;;;;:30;61602:10;61583:30;;;;;;;;;;;:44;;;;61733:10;61700:17;:30;61718:11;61700:30;;;;;;;;;;;:43;;;;61495:294;61461:328;61885:17;:26;61903:7;61885:26;;;;;;;;;;;61878:33;;;61929:12;:18;61942:4;61929:18;;;;;;;;;;;;;;;:34;61948:14;61929:34;;;;;;;;;;;61922:41;;;61064:907;;60983:988;;:::o;62266:1079::-;62519:22;62564:1;62544:10;:17;;;;:21;;;;:::i;:::-;62519:46;;62576:18;62597:15;:24;62613:7;62597:24;;;;;;;;;;;;62576:45;;62948:19;62970:10;62981:14;62970:26;;;;;;;;:::i;:::-;;;;;;;;;;62948:48;;63034:11;63009:10;63020;63009:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;63145:10;63114:15;:28;63130:11;63114:28;;;;;;;;;;;:41;;;;63286:15;:24;63302:7;63286:24;;;;;;;;;;;63279:31;;;63321:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;62337:1008;;;62266:1079;:::o;59770:221::-;59855:14;59872:20;59889:2;59872:16;:20::i;:::-;59855:37;;59930:7;59903:12;:16;59916:2;59903:16;;;;;;;;;;;;;;;:24;59920:6;59903:24;;;;;;;;;;;:34;;;;59977:6;59948:17;:26;59966:7;59948:26;;;;;;;;;;;:35;;;;59844:147;59770:221;;:::o;14666:268::-;14734:13;14841:1;14835:4;14828:15;14870:1;14864:4;14857:15;14911:4;14905;14895:21;14886:30;;14666:268;;;;:::o;23729:326::-;23789:4;24046:1;24024:7;:19;;;:23;24017:30;;23729:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:116::-;1588:21;1603:5;1588:21;:::i;:::-;1581:5;1578:32;1568:60;;1624:1;1621;1614:12;1568:60;1518:116;:::o;1640:133::-;1683:5;1721:6;1708:20;1699:29;;1737:30;1761:5;1737:30;:::i;:::-;1640:133;;;;:::o;1779:323::-;1835:6;1884:2;1872:9;1863:7;1859:23;1855:32;1852:119;;;1890:79;;:::i;:::-;1852:119;2010:1;2035:50;2077:7;2068:6;2057:9;2053:22;2035:50;:::i;:::-;2025:60;;1981:114;1779:323;;;;:::o;2108:99::-;2160:6;2194:5;2188:12;2178:22;;2108:99;;;:::o;2213:169::-;2297:11;2331:6;2326:3;2319:19;2371:4;2366:3;2362:14;2347:29;;2213:169;;;;:::o;2388:307::-;2456:1;2466:113;2480:6;2477:1;2474:13;2466:113;;;2565:1;2560:3;2556:11;2550:18;2546:1;2541:3;2537:11;2530:39;2502:2;2499:1;2495:10;2490:15;;2466:113;;;2597:6;2594:1;2591:13;2588:101;;;2677:1;2668:6;2663:3;2659:16;2652:27;2588:101;2437:258;2388:307;;;:::o;2701:102::-;2742:6;2793:2;2789:7;2784:2;2777:5;2773:14;2769:28;2759:38;;2701:102;;;:::o;2809:364::-;2897:3;2925:39;2958:5;2925:39;:::i;:::-;2980:71;3044:6;3039:3;2980:71;:::i;:::-;2973:78;;3060:52;3105:6;3100:3;3093:4;3086:5;3082:16;3060:52;:::i;:::-;3137:29;3159:6;3137:29;:::i;:::-;3132:3;3128:39;3121:46;;2901:272;2809:364;;;;:::o;3179:313::-;3292:4;3330:2;3319:9;3315:18;3307:26;;3379:9;3373:4;3369:20;3365:1;3354:9;3350:17;3343:47;3407:78;3480:4;3471:6;3407:78;:::i;:::-;3399:86;;3179:313;;;;:::o;3498:77::-;3535:7;3564:5;3553:16;;3498:77;;;:::o;3581:122::-;3654:24;3672:5;3654:24;:::i;:::-;3647:5;3644:35;3634:63;;3693:1;3690;3683:12;3634:63;3581:122;:::o;3709:139::-;3755:5;3793:6;3780:20;3771:29;;3809:33;3836:5;3809:33;:::i;:::-;3709:139;;;;:::o;3854:329::-;3913:6;3962:2;3950:9;3941:7;3937:23;3933:32;3930:119;;;3968:79;;:::i;:::-;3930:119;4088:1;4113:53;4158:7;4149:6;4138:9;4134:22;4113:53;:::i;:::-;4103:63;;4059:117;3854:329;;;;:::o;4189:126::-;4226:7;4266:42;4259:5;4255:54;4244:65;;4189:126;;;:::o;4321:96::-;4358:7;4387:24;4405:5;4387:24;:::i;:::-;4376:35;;4321:96;;;:::o;4423:118::-;4510:24;4528:5;4510:24;:::i;:::-;4505:3;4498:37;4423:118;;:::o;4547:222::-;4640:4;4678:2;4667:9;4663:18;4655:26;;4691:71;4759:1;4748:9;4744:17;4735:6;4691:71;:::i;:::-;4547:222;;;;:::o;4775:122::-;4848:24;4866:5;4848:24;:::i;:::-;4841:5;4838:35;4828:63;;4887:1;4884;4877:12;4828:63;4775:122;:::o;4903:139::-;4949:5;4987:6;4974:20;4965:29;;5003:33;5030:5;5003:33;:::i;:::-;4903:139;;;;:::o;5048:474::-;5116:6;5124;5173:2;5161:9;5152:7;5148:23;5144:32;5141:119;;;5179:79;;:::i;:::-;5141:119;5299:1;5324:53;5369:7;5360:6;5349:9;5345:22;5324:53;:::i;:::-;5314:63;;5270:117;5426:2;5452:53;5497:7;5488:6;5477:9;5473:22;5452:53;:::i;:::-;5442:63;;5397:118;5048:474;;;;;:::o;5528:118::-;5615:24;5633:5;5615:24;:::i;:::-;5610:3;5603:37;5528:118;;:::o;5652:222::-;5745:4;5783:2;5772:9;5768:18;5760:26;;5796:71;5864:1;5853:9;5849:17;5840:6;5796:71;:::i;:::-;5652:222;;;;:::o;5880:329::-;5939:6;5988:2;5976:9;5967:7;5963:23;5959:32;5956:119;;;5994:79;;:::i;:::-;5956:119;6114:1;6139:53;6184:7;6175:6;6164:9;6160:22;6139:53;:::i;:::-;6129:63;;6085:117;5880:329;;;;:::o;6215:619::-;6292:6;6300;6308;6357:2;6345:9;6336:7;6332:23;6328:32;6325:119;;;6363:79;;:::i;:::-;6325:119;6483:1;6508:53;6553:7;6544:6;6533:9;6529:22;6508:53;:::i;:::-;6498:63;;6454:117;6610:2;6636:53;6681:7;6672:6;6661:9;6657:22;6636:53;:::i;:::-;6626:63;;6581:118;6738:2;6764:53;6809:7;6800:6;6789:9;6785:22;6764:53;:::i;:::-;6754:63;;6709:118;6215:619;;;;;:::o;6840:77::-;6877:7;6906:5;6895:16;;6840:77;;;:::o;6923:118::-;7010:24;7028:5;7010:24;:::i;:::-;7005:3;6998:37;6923:118;;:::o;7047:222::-;7140:4;7178:2;7167:9;7163:18;7155:26;;7191:71;7259:1;7248:9;7244:17;7235:6;7191:71;:::i;:::-;7047:222;;;;:::o;7275:114::-;7342:6;7376:5;7370:12;7360:22;;7275:114;;;:::o;7395:184::-;7494:11;7528:6;7523:3;7516:19;7568:4;7563:3;7559:14;7544:29;;7395:184;;;;:::o;7585:132::-;7652:4;7675:3;7667:11;;7705:4;7700:3;7696:14;7688:22;;7585:132;;;:::o;7723:108::-;7800:24;7818:5;7800:24;:::i;:::-;7795:3;7788:37;7723:108;;:::o;7837:179::-;7906:10;7927:46;7969:3;7961:6;7927:46;:::i;:::-;8005:4;8000:3;7996:14;7982:28;;7837:179;;;;:::o;8022:113::-;8092:4;8124;8119:3;8115:14;8107:22;;8022:113;;;:::o;8171:732::-;8290:3;8319:54;8367:5;8319:54;:::i;:::-;8389:86;8468:6;8463:3;8389:86;:::i;:::-;8382:93;;8499:56;8549:5;8499:56;:::i;:::-;8578:7;8609:1;8594:284;8619:6;8616:1;8613:13;8594:284;;;8695:6;8689:13;8722:63;8781:3;8766:13;8722:63;:::i;:::-;8715:70;;8808:60;8861:6;8808:60;:::i;:::-;8798:70;;8654:224;8641:1;8638;8634:9;8629:14;;8594:284;;;8598:14;8894:3;8887:10;;8295:608;;;8171:732;;;;:::o;8909:373::-;9052:4;9090:2;9079:9;9075:18;9067:26;;9139:9;9133:4;9129:20;9125:1;9114:9;9110:17;9103:47;9167:108;9270:4;9261:6;9167:108;:::i;:::-;9159:116;;8909:373;;;;:::o;9288:117::-;9397:1;9394;9387:12;9411:117;9520:1;9517;9510:12;9534:180;9582:77;9579:1;9572:88;9679:4;9676:1;9669:15;9703:4;9700:1;9693:15;9720:281;9803:27;9825:4;9803:27;:::i;:::-;9795:6;9791:40;9933:6;9921:10;9918:22;9897:18;9885:10;9882:34;9879:62;9876:88;;;9944:18;;:::i;:::-;9876:88;9984:10;9980:2;9973:22;9763:238;9720:281;;:::o;10007:129::-;10041:6;10068:20;;:::i;:::-;10058:30;;10097:33;10125:4;10117:6;10097:33;:::i;:::-;10007:129;;;:::o;10142:308::-;10204:4;10294:18;10286:6;10283:30;10280:56;;;10316:18;;:::i;:::-;10280:56;10354:29;10376:6;10354:29;:::i;:::-;10346:37;;10438:4;10432;10428:15;10420:23;;10142:308;;;:::o;10456:154::-;10540:6;10535:3;10530;10517:30;10602:1;10593:6;10588:3;10584:16;10577:27;10456:154;;;:::o;10616:412::-;10694:5;10719:66;10735:49;10777:6;10735:49;:::i;:::-;10719:66;:::i;:::-;10710:75;;10808:6;10801:5;10794:21;10846:4;10839:5;10835:16;10884:3;10875:6;10870:3;10866:16;10863:25;10860:112;;;10891:79;;:::i;:::-;10860:112;10981:41;11015:6;11010:3;11005;10981:41;:::i;:::-;10700:328;10616:412;;;;;:::o;11048:340::-;11104:5;11153:3;11146:4;11138:6;11134:17;11130:27;11120:122;;11161:79;;:::i;:::-;11120:122;11278:6;11265:20;11303:79;11378:3;11370:6;11363:4;11355:6;11351:17;11303:79;:::i;:::-;11294:88;;11110:278;11048:340;;;;:::o;11394:509::-;11463:6;11512:2;11500:9;11491:7;11487:23;11483:32;11480:119;;;11518:79;;:::i;:::-;11480:119;11666:1;11655:9;11651:17;11638:31;11696:18;11688:6;11685:30;11682:117;;;11718:79;;:::i;:::-;11682:117;11823:63;11878:7;11869:6;11858:9;11854:22;11823:63;:::i;:::-;11813:73;;11609:287;11394:509;;;;:::o;11909:117::-;12018:1;12015;12008:12;12032:117;12141:1;12138;12131:12;12172:568;12245:8;12255:6;12305:3;12298:4;12290:6;12286:17;12282:27;12272:122;;12313:79;;:::i;:::-;12272:122;12426:6;12413:20;12403:30;;12456:18;12448:6;12445:30;12442:117;;;12478:79;;:::i;:::-;12442:117;12592:4;12584:6;12580:17;12568:29;;12646:3;12638:4;12630:6;12626:17;12616:8;12612:32;12609:41;12606:128;;;12653:79;;:::i;:::-;12606:128;12172:568;;;;;:::o;12746:704::-;12841:6;12849;12857;12906:2;12894:9;12885:7;12881:23;12877:32;12874:119;;;12912:79;;:::i;:::-;12874:119;13032:1;13057:53;13102:7;13093:6;13082:9;13078:22;13057:53;:::i;:::-;13047:63;;13003:117;13187:2;13176:9;13172:18;13159:32;13218:18;13210:6;13207:30;13204:117;;;13240:79;;:::i;:::-;13204:117;13353:80;13425:7;13416:6;13405:9;13401:22;13353:80;:::i;:::-;13335:98;;;;13130:313;12746:704;;;;;:::o;13456:108::-;13533:24;13551:5;13533:24;:::i;:::-;13528:3;13521:37;13456:108;;:::o;13570:159::-;13644:11;13678:6;13673:3;13666:19;13718:4;13713:3;13709:14;13694:29;;13570:159;;;;:::o;13735:344::-;13813:3;13841:39;13874:5;13841:39;:::i;:::-;13896:61;13950:6;13945:3;13896:61;:::i;:::-;13889:68;;13966:52;14011:6;14006:3;13999:4;13992:5;13988:16;13966:52;:::i;:::-;14043:29;14065:6;14043:29;:::i;:::-;14038:3;14034:39;14027:46;;13817:262;13735:344;;;;:::o;14139:1145::-;14264:3;14300:4;14295:3;14291:14;14385:4;14378:5;14374:16;14368:23;14404:63;14461:4;14456:3;14452:14;14438:12;14404:63;:::i;:::-;14315:162;14559:4;14552:5;14548:16;14542:23;14578:63;14635:4;14630:3;14626:14;14612:12;14578:63;:::i;:::-;14487:164;14738:4;14731:5;14727:16;14721:23;14757:63;14814:4;14809:3;14805:14;14791:12;14757:63;:::i;:::-;14661:169;14913:4;14906:5;14902:16;14896:23;14932:63;14989:4;14984:3;14980:14;14966:12;14932:63;:::i;:::-;14840:165;15094:4;15087:5;15083:16;15077:23;15147:3;15141:4;15137:14;15130:4;15125:3;15121:14;15114:38;15173:73;15241:4;15227:12;15173:73;:::i;:::-;15165:81;;15015:242;15274:4;15267:11;;14269:1015;14139:1145;;;;:::o;15290:385::-;15439:4;15477:2;15466:9;15462:18;15454:26;;15526:9;15520:4;15516:20;15512:1;15501:9;15497:17;15490:47;15554:114;15663:4;15654:6;15554:114;:::i;:::-;15546:122;;15290:385;;;;:::o;15681:122::-;15754:24;15772:5;15754:24;:::i;:::-;15747:5;15744:35;15734:63;;15793:1;15790;15783:12;15734:63;15681:122;:::o;15809:139::-;15855:5;15893:6;15880:20;15871:29;;15909:33;15936:5;15909:33;:::i;:::-;15809:139;;;;:::o;15954:329::-;16013:6;16062:2;16050:9;16041:7;16037:23;16033:32;16030:119;;;16068:79;;:::i;:::-;16030:119;16188:1;16213:53;16258:7;16249:6;16238:9;16234:22;16213:53;:::i;:::-;16203:63;;16159:117;15954:329;;;;:::o;16289:468::-;16354:6;16362;16411:2;16399:9;16390:7;16386:23;16382:32;16379:119;;;16417:79;;:::i;:::-;16379:119;16537:1;16562:53;16607:7;16598:6;16587:9;16583:22;16562:53;:::i;:::-;16552:63;;16508:117;16664:2;16690:50;16732:7;16723:6;16712:9;16708:22;16690:50;:::i;:::-;16680:60;;16635:115;16289:468;;;;;:::o;16763:307::-;16824:4;16914:18;16906:6;16903:30;16900:56;;;16936:18;;:::i;:::-;16900:56;16974:29;16996:6;16974:29;:::i;:::-;16966:37;;17058:4;17052;17048:15;17040:23;;16763:307;;;:::o;17076:410::-;17153:5;17178:65;17194:48;17235:6;17194:48;:::i;:::-;17178:65;:::i;:::-;17169:74;;17266:6;17259:5;17252:21;17304:4;17297:5;17293:16;17342:3;17333:6;17328:3;17324:16;17321:25;17318:112;;;17349:79;;:::i;:::-;17318:112;17439:41;17473:6;17468:3;17463;17439:41;:::i;:::-;17159:327;17076:410;;;;;:::o;17505:338::-;17560:5;17609:3;17602:4;17594:6;17590:17;17586:27;17576:122;;17617:79;;:::i;:::-;17576:122;17734:6;17721:20;17759:78;17833:3;17825:6;17818:4;17810:6;17806:17;17759:78;:::i;:::-;17750:87;;17566:277;17505:338;;;;:::o;17849:943::-;17944:6;17952;17960;17968;18017:3;18005:9;17996:7;17992:23;17988:33;17985:120;;;18024:79;;:::i;:::-;17985:120;18144:1;18169:53;18214:7;18205:6;18194:9;18190:22;18169:53;:::i;:::-;18159:63;;18115:117;18271:2;18297:53;18342:7;18333:6;18322:9;18318:22;18297:53;:::i;:::-;18287:63;;18242:118;18399:2;18425:53;18470:7;18461:6;18450:9;18446:22;18425:53;:::i;:::-;18415:63;;18370:118;18555:2;18544:9;18540:18;18527:32;18586:18;18578:6;18575:30;18572:117;;;18608:79;;:::i;:::-;18572:117;18713:62;18767:7;18758:6;18747:9;18743:22;18713:62;:::i;:::-;18703:72;;18498:287;17849:943;;;;;;;:::o;18798:704::-;18893:6;18901;18909;18958:2;18946:9;18937:7;18933:23;18929:32;18926:119;;;18964:79;;:::i;:::-;18926:119;19084:1;19109:53;19154:7;19145:6;19134:9;19130:22;19109:53;:::i;:::-;19099:63;;19055:117;19239:2;19228:9;19224:18;19211:32;19270:18;19262:6;19259:30;19256:117;;;19292:79;;:::i;:::-;19256:117;19405:80;19477:7;19468:6;19457:9;19453:22;19405:80;:::i;:::-;19387:98;;;;19182:313;18798:704;;;;;:::o;19508:142::-;19603:6;19637:5;19631:12;19621:22;;19508:142;;;:::o;19656:212::-;19783:11;19817:6;19812:3;19805:19;19857:4;19852:3;19848:14;19833:29;;19656:212;;;;:::o;19874:160::-;19969:4;19992:3;19984:11;;20022:4;20017:3;20013:14;20005:22;;19874:160;;;:::o;20094:1135::-;20209:3;20245:4;20240:3;20236:14;20330:4;20323:5;20319:16;20313:23;20349:63;20406:4;20401:3;20397:14;20383:12;20349:63;:::i;:::-;20260:162;20504:4;20497:5;20493:16;20487:23;20523:63;20580:4;20575:3;20571:14;20557:12;20523:63;:::i;:::-;20432:164;20683:4;20676:5;20672:16;20666:23;20702:63;20759:4;20754:3;20750:14;20736:12;20702:63;:::i;:::-;20606:169;20858:4;20851:5;20847:16;20841:23;20877:63;20934:4;20929:3;20925:14;20911:12;20877:63;:::i;:::-;20785:165;21039:4;21032:5;21028:16;21022:23;21092:3;21086:4;21082:14;21075:4;21070:3;21066:14;21059:38;21118:73;21186:4;21172:12;21118:73;:::i;:::-;21110:81;;20960:242;21219:4;21212:11;;20214:1015;20094:1135;;;;:::o;21235:268::-;21360:10;21395:102;21493:3;21485:6;21395:102;:::i;:::-;21381:116;;21235:268;;;;:::o;21509:141::-;21607:4;21639;21634:3;21630:14;21622:22;;21509:141;;;:::o;21714:1135::-;21889:3;21918:82;21994:5;21918:82;:::i;:::-;22016:114;22123:6;22118:3;22016:114;:::i;:::-;22009:121;;22156:3;22201:4;22193:6;22189:17;22184:3;22180:27;22231:84;22309:5;22231:84;:::i;:::-;22338:7;22369:1;22354:450;22379:6;22376:1;22373:13;22354:450;;;22450:9;22444:4;22440:20;22435:3;22428:33;22501:6;22495:13;22529:120;22644:4;22629:13;22529:120;:::i;:::-;22521:128;;22672:88;22753:6;22672:88;:::i;:::-;22662:98;;22789:4;22784:3;22780:14;22773:21;;22414:390;22401:1;22398;22394:9;22389:14;;22354:450;;;22358:14;22820:4;22813:11;;22840:3;22833:10;;21894:955;;;;;21714:1135;;;;:::o;22855:485::-;23054:4;23092:2;23081:9;23077:18;23069:26;;23141:9;23135:4;23131:20;23127:1;23116:9;23112:17;23105:47;23169:164;23328:4;23319:6;23169:164;:::i;:::-;23161:172;;22855:485;;;;:::o;23346:474::-;23414:6;23422;23471:2;23459:9;23450:7;23446:23;23442:32;23439:119;;;23477:79;;:::i;:::-;23439:119;23597:1;23622:53;23667:7;23658:6;23647:9;23643:22;23622:53;:::i;:::-;23612:63;;23568:117;23724:2;23750:53;23795:7;23786:6;23775:9;23771:22;23750:53;:::i;:::-;23740:63;;23695:118;23346:474;;;;;:::o;23826:180::-;23874:77;23871:1;23864:88;23971:4;23968:1;23961:15;23995:4;23992:1;23985:15;24012:320;24056:6;24093:1;24087:4;24083:12;24073:22;;24140:1;24134:4;24130:12;24161:18;24151:81;;24217:4;24209:6;24205:17;24195:27;;24151:81;24279:2;24271:6;24268:14;24248:18;24245:38;24242:84;;24298:18;;:::i;:::-;24242:84;24063:269;24012:320;;;:::o;24338:332::-;24459:4;24497:2;24486:9;24482:18;24474:26;;24510:71;24578:1;24567:9;24563:17;24554:6;24510:71;:::i;:::-;24591:72;24659:2;24648:9;24644:18;24635:6;24591:72;:::i;:::-;24338:332;;;;;:::o;24676:137::-;24730:5;24761:6;24755:13;24746:22;;24777:30;24801:5;24777:30;:::i;:::-;24676:137;;;;:::o;24819:345::-;24886:6;24935:2;24923:9;24914:7;24910:23;24906:32;24903:119;;;24941:79;;:::i;:::-;24903:119;25061:1;25086:61;25139:7;25130:6;25119:9;25115:22;25086:61;:::i;:::-;25076:71;;25032:125;24819:345;;;;:::o;25170:230::-;25310:34;25306:1;25298:6;25294:14;25287:58;25379:13;25374:2;25366:6;25362:15;25355:38;25170:230;:::o;25406:366::-;25548:3;25569:67;25633:2;25628:3;25569:67;:::i;:::-;25562:74;;25645:93;25734:3;25645:93;:::i;:::-;25763:2;25758:3;25754:12;25747:19;;25406:366;;;:::o;25778:419::-;25944:4;25982:2;25971:9;25967:18;25959:26;;26031:9;26025:4;26021:20;26017:1;26006:9;26002:17;25995:47;26059:131;26185:4;26059:131;:::i;:::-;26051:139;;25778:419;;;:::o;26203:147::-;26304:11;26341:3;26326:18;;26203:147;;;;:::o;26356:114::-;;:::o;26476:398::-;26635:3;26656:83;26737:1;26732:3;26656:83;:::i;:::-;26649:90;;26748:93;26837:3;26748:93;:::i;:::-;26866:1;26861:3;26857:11;26850:18;;26476:398;;;:::o;26880:379::-;27064:3;27086:147;27229:3;27086:147;:::i;:::-;27079:154;;27250:3;27243:10;;26880:379;;;:::o;27265:180::-;27313:77;27310:1;27303:88;27410:4;27407:1;27400:15;27434:4;27431:1;27424:15;27451:233;27591:34;27587:1;27579:6;27575:14;27568:58;27660:16;27655:2;27647:6;27643:15;27636:41;27451:233;:::o;27690:366::-;27832:3;27853:67;27917:2;27912:3;27853:67;:::i;:::-;27846:74;;27929:93;28018:3;27929:93;:::i;:::-;28047:2;28042:3;28038:12;28031:19;;27690:366;;;:::o;28062:419::-;28228:4;28266:2;28255:9;28251:18;28243:26;;28315:9;28309:4;28305:20;28301:1;28290:9;28286:17;28279:47;28343:131;28469:4;28343:131;:::i;:::-;28335:139;;28062:419;;;:::o;28487:180::-;28535:77;28532:1;28525:88;28632:4;28629:1;28622:15;28656:4;28653:1;28646:15;28673:180;28721:77;28718:1;28711:88;28818:4;28815:1;28808:15;28842:4;28839:1;28832:15;28859:233;28898:3;28921:24;28939:5;28921:24;:::i;:::-;28912:33;;28967:66;28960:5;28957:77;28954:103;;29037:18;;:::i;:::-;28954:103;29084:1;29077:5;29073:13;29066:20;;28859:233;;;:::o;29098:231::-;29238:34;29234:1;29226:6;29222:14;29215:58;29307:14;29302:2;29294:6;29290:15;29283:39;29098:231;:::o;29335:366::-;29477:3;29498:67;29562:2;29557:3;29498:67;:::i;:::-;29491:74;;29574:93;29663:3;29574:93;:::i;:::-;29692:2;29687:3;29683:12;29676:19;;29335:366;;;:::o;29707:419::-;29873:4;29911:2;29900:9;29896:18;29888:26;;29960:9;29954:4;29950:20;29946:1;29935:9;29931:17;29924:47;29988:131;30114:4;29988:131;:::i;:::-;29980:139;;29707:419;;;:::o;30132:94::-;30165:8;30213:5;30209:2;30205:14;30184:35;;30132:94;;;:::o;30232:::-;30271:7;30300:20;30314:5;30300:20;:::i;:::-;30289:31;;30232:94;;;:::o;30332:100::-;30371:7;30400:26;30420:5;30400:26;:::i;:::-;30389:37;;30332:100;;;:::o;30438:157::-;30543:45;30563:24;30581:5;30563:24;:::i;:::-;30543:45;:::i;:::-;30538:3;30531:58;30438:157;;:::o;30601:256::-;30713:3;30728:75;30799:3;30790:6;30728:75;:::i;:::-;30828:2;30823:3;30819:12;30812:19;;30848:3;30841:10;;30601:256;;;;:::o;30863:191::-;30903:4;30923:20;30941:1;30923:20;:::i;:::-;30918:25;;30957:20;30975:1;30957:20;:::i;:::-;30952:25;;30996:1;30993;30990:8;30987:34;;;31001:18;;:::i;:::-;30987:34;31046:1;31043;31039:9;31031:17;;30863:191;;;;:::o;31060:174::-;31200:26;31196:1;31188:6;31184:14;31177:50;31060:174;:::o;31240:366::-;31382:3;31403:67;31467:2;31462:3;31403:67;:::i;:::-;31396:74;;31479:93;31568:3;31479:93;:::i;:::-;31597:2;31592:3;31588:12;31581:19;;31240:366;;;:::o;31612:419::-;31778:4;31816:2;31805:9;31801:18;31793:26;;31865:9;31859:4;31855:20;31851:1;31840:9;31836:17;31829:47;31893:131;32019:4;31893:131;:::i;:::-;31885:139;;31612:419;;;:::o;32037:228::-;32177:34;32173:1;32165:6;32161:14;32154:58;32246:11;32241:2;32233:6;32229:15;32222:36;32037:228;:::o;32271:366::-;32413:3;32434:67;32498:2;32493:3;32434:67;:::i;:::-;32427:74;;32510:93;32599:3;32510:93;:::i;:::-;32628:2;32623:3;32619:12;32612:19;;32271:366;;;:::o;32643:419::-;32809:4;32847:2;32836:9;32832:18;32824:26;;32896:9;32890:4;32886:20;32882:1;32871:9;32867:17;32860:47;32924:131;33050:4;32924:131;:::i;:::-;32916:139;;32643:419;;;:::o;33068:172::-;33208:24;33204:1;33196:6;33192:14;33185:48;33068:172;:::o;33246:366::-;33388:3;33409:67;33473:2;33468:3;33409:67;:::i;:::-;33402:74;;33485:93;33574:3;33485:93;:::i;:::-;33603:2;33598:3;33594:12;33587:19;;33246:366;;;:::o;33618:419::-;33784:4;33822:2;33811:9;33807:18;33799:26;;33871:9;33865:4;33861:20;33857:1;33846:9;33842:17;33835:47;33899:131;34025:4;33899:131;:::i;:::-;33891:139;;33618:419;;;:::o;34043:177::-;34183:29;34179:1;34171:6;34167:14;34160:53;34043:177;:::o;34226:366::-;34368:3;34389:67;34453:2;34448:3;34389:67;:::i;:::-;34382:74;;34465:93;34554:3;34465:93;:::i;:::-;34583:2;34578:3;34574:12;34567:19;;34226:366;;;:::o;34598:419::-;34764:4;34802:2;34791:9;34787:18;34779:26;;34851:9;34845:4;34841:20;34837:1;34826:9;34822:17;34815:47;34879:131;35005:4;34879:131;:::i;:::-;34871:139;;34598:419;;;:::o;35023:305::-;35063:3;35082:20;35100:1;35082:20;:::i;:::-;35077:25;;35116:20;35134:1;35116:20;:::i;:::-;35111:25;;35270:1;35202:66;35198:74;35195:1;35192:81;35189:107;;;35276:18;;:::i;:::-;35189:107;35320:1;35317;35313:9;35306:16;;35023:305;;;;:::o;35334:172::-;35474:24;35470:1;35462:6;35458:14;35451:48;35334:172;:::o;35512:366::-;35654:3;35675:67;35739:2;35734:3;35675:67;:::i;:::-;35668:74;;35751:93;35840:3;35751:93;:::i;:::-;35869:2;35864:3;35860:12;35853:19;;35512:366;;;:::o;35884:419::-;36050:4;36088:2;36077:9;36073:18;36065:26;;36137:9;36131:4;36127:20;36123:1;36112:9;36108:17;36101:47;36165:131;36291:4;36165:131;:::i;:::-;36157:139;;35884:419;;;:::o;36309:178::-;36449:30;36445:1;36437:6;36433:14;36426:54;36309:178;:::o;36493:366::-;36635:3;36656:67;36720:2;36715:3;36656:67;:::i;:::-;36649:74;;36732:93;36821:3;36732:93;:::i;:::-;36850:2;36845:3;36841:12;36834:19;;36493:366;;;:::o;36865:419::-;37031:4;37069:2;37058:9;37054:18;37046:26;;37118:9;37112:4;37108:20;37104:1;37093:9;37089:17;37082:47;37146:131;37272:4;37146:131;:::i;:::-;37138:139;;36865:419;;;:::o;37290:223::-;37430:34;37426:1;37418:6;37414:14;37407:58;37499:6;37494:2;37486:6;37482:15;37475:31;37290:223;:::o;37519:366::-;37661:3;37682:67;37746:2;37741:3;37682:67;:::i;:::-;37675:74;;37758:93;37847:3;37758:93;:::i;:::-;37876:2;37871:3;37867:12;37860:19;;37519:366;;;:::o;37891:419::-;38057:4;38095:2;38084:9;38080:18;38072:26;;38144:9;38138:4;38134:20;38130:1;38119:9;38115:17;38108:47;38172:131;38298:4;38172:131;:::i;:::-;38164:139;;37891:419;;;:::o;38316:173::-;38456:25;38452:1;38444:6;38440:14;38433:49;38316:173;:::o;38495:366::-;38637:3;38658:67;38722:2;38717:3;38658:67;:::i;:::-;38651:74;;38734:93;38823:3;38734:93;:::i;:::-;38852:2;38847:3;38843:12;38836:19;;38495:366;;;:::o;38867:419::-;39033:4;39071:2;39060:9;39056:18;39048:26;;39120:9;39114:4;39110:20;39106:1;39095:9;39091:17;39084:47;39148:131;39274:4;39148:131;:::i;:::-;39140:139;;38867:419;;;:::o;39292:148::-;39394:11;39431:3;39416:18;;39292:148;;;;:::o;39446:377::-;39552:3;39580:39;39613:5;39580:39;:::i;:::-;39635:89;39717:6;39712:3;39635:89;:::i;:::-;39628:96;;39733:52;39778:6;39773:3;39766:4;39759:5;39755:16;39733:52;:::i;:::-;39810:6;39805:3;39801:16;39794:23;;39556:267;39446:377;;;;:::o;39829:275::-;39961:3;39983:95;40074:3;40065:6;39983:95;:::i;:::-;39976:102;;40095:3;40088:10;;39829:275;;;;:::o;40110:442::-;40259:4;40297:2;40286:9;40282:18;40274:26;;40310:71;40378:1;40367:9;40363:17;40354:6;40310:71;:::i;:::-;40391:72;40459:2;40448:9;40444:18;40435:6;40391:72;:::i;:::-;40473;40541:2;40530:9;40526:18;40517:6;40473:72;:::i;:::-;40110:442;;;;;;:::o;40558:234::-;40698:34;40694:1;40686:6;40682:14;40675:58;40767:17;40762:2;40754:6;40750:15;40743:42;40558:234;:::o;40798:366::-;40940:3;40961:67;41025:2;41020:3;40961:67;:::i;:::-;40954:74;;41037:93;41126:3;41037:93;:::i;:::-;41155:2;41150:3;41146:12;41139:19;;40798:366;;;:::o;41170:419::-;41336:4;41374:2;41363:9;41359:18;41351:26;;41423:9;41417:4;41413:20;41409:1;41398:9;41394:17;41387:47;41451:131;41577:4;41451:131;:::i;:::-;41443:139;;41170:419;;;:::o;41595:141::-;41644:4;41667:3;41659:11;;41690:3;41687:1;41680:14;41724:4;41721:1;41711:18;41703:26;;41595:141;;;:::o;41766:845::-;41869:3;41906:5;41900:12;41935:36;41961:9;41935:36;:::i;:::-;41987:89;42069:6;42064:3;41987:89;:::i;:::-;41980:96;;42107:1;42096:9;42092:17;42123:1;42118:137;;;;42269:1;42264:341;;;;42085:520;;42118:137;42202:4;42198:9;42187;42183:25;42178:3;42171:38;42238:6;42233:3;42229:16;42222:23;;42118:137;;42264:341;42331:38;42363:5;42331:38;:::i;:::-;42391:1;42405:154;42419:6;42416:1;42413:13;42405:154;;;42493:7;42487:14;42483:1;42478:3;42474:11;42467:35;42543:1;42534:7;42530:15;42519:26;;42441:4;42438:1;42434:12;42429:17;;42405:154;;;42588:6;42583:3;42579:16;42572:23;;42271:334;;42085:520;;41873:738;;41766:845;;;;:::o;42617:589::-;42842:3;42864:95;42955:3;42946:6;42864:95;:::i;:::-;42857:102;;42976:95;43067:3;43058:6;42976:95;:::i;:::-;42969:102;;43088:92;43176:3;43167:6;43088:92;:::i;:::-;43081:99;;43197:3;43190:10;;42617:589;;;;;;:::o;43212:225::-;43352:34;43348:1;43340:6;43336:14;43329:58;43421:8;43416:2;43408:6;43404:15;43397:33;43212:225;:::o;43443:366::-;43585:3;43606:67;43670:2;43665:3;43606:67;:::i;:::-;43599:74;;43682:93;43771:3;43682:93;:::i;:::-;43800:2;43795:3;43791:12;43784:19;;43443:366;;;:::o;43815:419::-;43981:4;44019:2;44008:9;44004:18;43996:26;;44068:9;44062:4;44058:20;44054:1;44043:9;44039:17;44032:47;44096:131;44222:4;44096:131;:::i;:::-;44088:139;;43815:419;;;:::o;44240:182::-;44380:34;44376:1;44368:6;44364:14;44357:58;44240:182;:::o;44428:366::-;44570:3;44591:67;44655:2;44650:3;44591:67;:::i;:::-;44584:74;;44667:93;44756:3;44667:93;:::i;:::-;44785:2;44780:3;44776:12;44769:19;;44428:366;;;:::o;44800:419::-;44966:4;45004:2;44993:9;44989:18;44981:26;;45053:9;45047:4;45043:20;45039:1;45028:9;45024:17;45017:47;45081:131;45207:4;45081:131;:::i;:::-;45073:139;;44800:419;;;:::o;45225:220::-;45365:34;45361:1;45353:6;45349:14;45342:58;45434:3;45429:2;45421:6;45417:15;45410:28;45225:220;:::o;45451:366::-;45593:3;45614:67;45678:2;45673:3;45614:67;:::i;:::-;45607:74;;45690:93;45779:3;45690:93;:::i;:::-;45808:2;45803:3;45799:12;45792:19;;45451:366;;;:::o;45823:419::-;45989:4;46027:2;46016:9;46012:18;46004:26;;46076:9;46070:4;46066:20;46062:1;46051:9;46047:17;46040:47;46104:131;46230:4;46104:131;:::i;:::-;46096:139;;45823:419;;;:::o;46248:249::-;46388:34;46384:1;46376:6;46372:14;46365:58;46457:32;46452:2;46444:6;46440:15;46433:57;46248:249;:::o;46503:366::-;46645:3;46666:67;46730:2;46725:3;46666:67;:::i;:::-;46659:74;;46742:93;46831:3;46742:93;:::i;:::-;46860:2;46855:3;46851:12;46844:19;;46503:366;;;:::o;46875:419::-;47041:4;47079:2;47068:9;47064:18;47056:26;;47128:9;47122:4;47118:20;47114:1;47103:9;47099:17;47092:47;47156:131;47282:4;47156:131;:::i;:::-;47148:139;;46875:419;;;:::o;47300:180::-;47348:77;47345:1;47338:88;47445:4;47442:1;47435:15;47469:4;47466:1;47459:15;47486:185;47526:1;47543:20;47561:1;47543:20;:::i;:::-;47538:25;;47577:20;47595:1;47577:20;:::i;:::-;47572:25;;47616:1;47606:35;;47621:18;;:::i;:::-;47606:35;47663:1;47660;47656:9;47651:14;;47486:185;;;;:::o;47677:176::-;47709:1;47726:20;47744:1;47726:20;:::i;:::-;47721:25;;47760:20;47778:1;47760:20;:::i;:::-;47755:25;;47799:1;47789:35;;47804:18;;:::i;:::-;47789:35;47845:1;47842;47838:9;47833:14;;47677:176;;;;:::o;47859:224::-;47999:34;47995:1;47987:6;47983:14;47976:58;48068:7;48063:2;48055:6;48051:15;48044:32;47859:224;:::o;48089:366::-;48231:3;48252:67;48316:2;48311:3;48252:67;:::i;:::-;48245:74;;48328:93;48417:3;48328:93;:::i;:::-;48446:2;48441:3;48437:12;48430:19;;48089:366;;;:::o;48461:419::-;48627:4;48665:2;48654:9;48650:18;48642:26;;48714:9;48708:4;48704:20;48700:1;48689:9;48685:17;48678:47;48742:131;48868:4;48742:131;:::i;:::-;48734:139;;48461:419;;;:::o;48886:223::-;49026:34;49022:1;49014:6;49010:14;49003:58;49095:6;49090:2;49082:6;49078:15;49071:31;48886:223;:::o;49115:366::-;49257:3;49278:67;49342:2;49337:3;49278:67;:::i;:::-;49271:74;;49354:93;49443:3;49354:93;:::i;:::-;49472:2;49467:3;49463:12;49456:19;;49115:366;;;:::o;49487:419::-;49653:4;49691:2;49680:9;49676:18;49668:26;;49740:9;49734:4;49730:20;49726:1;49715:9;49711:17;49704:47;49768:131;49894:4;49768:131;:::i;:::-;49760:139;;49487:419;;;:::o;49912:175::-;50052:27;50048:1;50040:6;50036:14;50029:51;49912:175;:::o;50093:366::-;50235:3;50256:67;50320:2;50315:3;50256:67;:::i;:::-;50249:74;;50332:93;50421:3;50332:93;:::i;:::-;50450:2;50445:3;50441:12;50434:19;;50093:366;;;:::o;50465:419::-;50631:4;50669:2;50658:9;50654:18;50646:26;;50718:9;50712:4;50708:20;50704:1;50693:9;50689:17;50682:47;50746:131;50872:4;50746:131;:::i;:::-;50738:139;;50465:419;;;:::o;50890:237::-;51030:34;51026:1;51018:6;51014:14;51007:58;51099:20;51094:2;51086:6;51082:15;51075:45;50890:237;:::o;51133:366::-;51275:3;51296:67;51360:2;51355:3;51296:67;:::i;:::-;51289:74;;51372:93;51461:3;51372:93;:::i;:::-;51490:2;51485:3;51481:12;51474:19;;51133:366;;;:::o;51505:419::-;51671:4;51709:2;51698:9;51694:18;51686:26;;51758:9;51752:4;51748:20;51744:1;51733:9;51729:17;51722:47;51786:131;51912:4;51786:131;:::i;:::-;51778:139;;51505:419;;;:::o;51930:98::-;51981:6;52015:5;52009:12;51999:22;;51930:98;;;:::o;52034:168::-;52117:11;52151:6;52146:3;52139:19;52191:4;52186:3;52182:14;52167:29;;52034:168;;;;:::o;52208:360::-;52294:3;52322:38;52354:5;52322:38;:::i;:::-;52376:70;52439:6;52434:3;52376:70;:::i;:::-;52369:77;;52455:52;52500:6;52495:3;52488:4;52481:5;52477:16;52455:52;:::i;:::-;52532:29;52554:6;52532:29;:::i;:::-;52527:3;52523:39;52516:46;;52298:270;52208:360;;;;:::o;52574:640::-;52769:4;52807:3;52796:9;52792:19;52784:27;;52821:71;52889:1;52878:9;52874:17;52865:6;52821:71;:::i;:::-;52902:72;52970:2;52959:9;52955:18;52946:6;52902:72;:::i;:::-;52984;53052:2;53041:9;53037:18;53028:6;52984:72;:::i;:::-;53103:9;53097:4;53093:20;53088:2;53077:9;53073:18;53066:48;53131:76;53202:4;53193:6;53131:76;:::i;:::-;53123:84;;52574:640;;;;;;;:::o;53220:141::-;53276:5;53307:6;53301:13;53292:22;;53323:32;53349:5;53323:32;:::i;:::-;53220:141;;;;:::o;53367:349::-;53436:6;53485:2;53473:9;53464:7;53460:23;53456:32;53453:119;;;53491:79;;:::i;:::-;53453:119;53611:1;53636:63;53691:7;53682:6;53671:9;53667:22;53636:63;:::i;:::-;53626:73;;53582:127;53367:349;;;;:::o;53722:182::-;53862:34;53858:1;53850:6;53846:14;53839:58;53722:182;:::o;53910:366::-;54052:3;54073:67;54137:2;54132:3;54073:67;:::i;:::-;54066:74;;54149:93;54238:3;54149:93;:::i;:::-;54267:2;54262:3;54258:12;54251:19;;53910:366;;;:::o;54282:419::-;54448:4;54486:2;54475:9;54471:18;54463:26;;54535:9;54529:4;54525:20;54521:1;54510:9;54506:17;54499:47;54563:131;54689:4;54563:131;:::i;:::-;54555:139;;54282:419;;;:::o;54707:178::-;54847:30;54843:1;54835:6;54831:14;54824:54;54707:178;:::o;54891:366::-;55033:3;55054:67;55118:2;55113:3;55054:67;:::i;:::-;55047:74;;55130:93;55219:3;55130:93;:::i;:::-;55248:2;55243:3;55239:12;55232:19;;54891:366;;;:::o;55263:419::-;55429:4;55467:2;55456:9;55452:18;55444:26;;55516:9;55510:4;55506:20;55502:1;55491:9;55487:17;55480:47;55544:131;55670:4;55544:131;:::i;:::-;55536:139;;55263:419;;;:::o;55688:180::-;55736:77;55733:1;55726:88;55833:4;55830:1;55823:15;55857:4;55854:1;55847:15

Swarm Source

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