ETH Price: $2,378.06 (+2.64%)

Token

NFTversion9 (NFTv9)
 

Overview

Max Total Supply

1,000 NFTv9

Holders

259

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 NFTv9
0xe1031a765778ec990c040bae8d698360a32851c5
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:
NFTversion9

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-04
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/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.6.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: balance query for the zero address");
        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: owner query for nonexistent token");
        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) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        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 owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        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: transfer caller is not 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: transfer caller is not 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) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        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 a {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 a {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 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 {
                    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/ERC721URIStorage.sol


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

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[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: contracts/NFTv9.sol


pragma solidity ^0.8.4;






contract NFTversion9 is ERC721, ERC721Enumerable, ERC721URIStorage, Ownable {
    using ECDSA for bytes32;
    address private _systemAddress;
    mapping(string => bool) public _usedNonces;
    
    constructor() ERC721("NFTversion9", "NFTv9") { }

    function safeMint(uint256 tokenId, string memory uri, string memory nonce, bytes32 hash, bytes memory signature) public payable {
        // signature related
        require(matchSigner(hash, signature), "Plz mint through website");
        require(!_usedNonces[nonce], "Hash reused");
        require(
            hashTransaction(msg.sender, tokenId, nonce) == hash,
            "Hash failed"
        );
        _usedNonces[nonce] = true;
        
        _safeMint(msg.sender, tokenId);
        _setTokenURI(tokenId, uri);
    }

    function matchSigner(bytes32 hash, bytes memory signature) public view returns (bool) {
        return _systemAddress == hash.toEthSignedMessageHash().recover(signature);
    }

    function matchSignerTemp1() public view returns (address) {
        return _systemAddress;
    }

    function matchSignerTemp2(bytes32 hash, bytes memory signature) public pure returns (address) {
        return hash.toEthSignedMessageHash().recover(signature);
    }

    function hashTransaction(
        address sender,
        uint256 tokenId,
        string memory nonce
    ) public view returns (bytes32) {
        bytes32 hash = keccak256(
            abi.encodePacked(sender, tokenId, nonce, address(this))
        );
        return hash;
    }

    function setSystemAddress() public onlyOwner {
        _systemAddress = msg.sender;
    }

    function updateTokenURI(uint256 tokenId, string memory uri) public onlyOwner {
        _setTokenURI(tokenId, uri);
    }

    // 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 _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) {
        return super.tokenURI(tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"_usedNonces","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"nonce","type":"string"}],"name":"hashTransaction","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"matchSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"matchSignerTemp1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"matchSignerTemp2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"string","name":"nonce","type":"string"},{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"payable","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":[],"name":"setSystemAddress","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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"updateTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600b81526020017f4e465476657273696f6e390000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4e46547639000000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620001a6565b508060019080519060200190620000af929190620001a6565b505050620000d2620000c6620000d860201b60201c565b620000e060201b60201c565b620002bb565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001b49062000256565b90600052602060002090601f016020900481019282620001d8576000855562000224565b82601f10620001f357805160ff191683800117855562000224565b8280016001018555821562000224579182015b828111156200022357825182559160200191906001019062000206565b5b50905062000233919062000237565b5090565b5b808211156200025257600081600090555060010162000238565b5090565b600060028204905060018216806200026f57607f821691505b602082108114156200028657620002856200028c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614b0580620002cb6000396000f3fe60806040526004361061019c5760003560e01c806367717e2a116100ec578063b0c95cc31161008a578063dd8d74d811610064578063dd8d74d814610603578063e91a67e814610640578063e985e9c514610657578063f2fde38b146106945761019c565b8063b0c95cc314610581578063b88d4fde1461059d578063c87b56dd146105c65761019c565b80638da5cb5b116100c65780638da5cb5b146104c557806395d89b41146104f0578063a22cb4651461051b578063a6ba55c7146105445761019c565b806367717e2a1461043457806370a0823114610471578063715018a6146104ae5761019c565b806318e97fd11161015957806342842e0e1161013357806342842e0e146103545780634f6ccce71461037d57806360f3747c146103ba5780636352211e146103f75761019c565b806318e97fd1146102c557806323b872dd146102ee5780632f745c59146103175761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b31461024657806318160ddd1461026f578063189107951461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c391906132f3565b6106bd565b6040516101d59190613adb565b60405180910390f35b3480156101ea57600080fd5b506101f36106cf565b6040516102009190613b56565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190613386565b610761565b60405161023d9190613a74565b60405180910390f35b34801561025257600080fd5b5061026d600480360381019061026891906131fc565b6107e6565b005b34801561027b57600080fd5b506102846108fe565b6040516102919190613ed8565b60405180910390f35b3480156102a657600080fd5b506102af61090b565b6040516102bc9190613a74565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e791906133af565b610935565b005b3480156102fa57600080fd5b50610315600480360381019061031091906130f6565b6109bf565b005b34801561032357600080fd5b5061033e600480360381019061033991906131fc565b610a1f565b60405161034b9190613ed8565b60405180910390f35b34801561036057600080fd5b5061037b600480360381019061037691906130f6565b610ac4565b005b34801561038957600080fd5b506103a4600480360381019061039f9190613386565b610ae4565b6040516103b19190613ed8565b60405180910390f35b3480156103c657600080fd5b506103e160048036038101906103dc919061329f565b610b7b565b6040516103ee9190613a74565b60405180910390f35b34801561040357600080fd5b5061041e60048036038101906104199190613386565b610ba0565b60405161042b9190613a74565b60405180910390f35b34801561044057600080fd5b5061045b60048036038101906104569190613238565b610c52565b6040516104689190613af6565b60405180910390f35b34801561047d57600080fd5b5061049860048036038101906104939190613091565b610c8f565b6040516104a59190613ed8565b60405180910390f35b3480156104ba57600080fd5b506104c3610d47565b005b3480156104d157600080fd5b506104da610dcf565b6040516104e79190613a74565b60405180910390f35b3480156104fc57600080fd5b50610505610df9565b6040516105129190613b56565b60405180910390f35b34801561052757600080fd5b50610542600480360381019061053d91906131c0565b610e8b565b005b34801561055057600080fd5b5061056b60048036038101906105669190613345565b610ea1565b6040516105789190613adb565b60405180910390f35b61059b60048036038101906105969190613403565b610ed7565b005b3480156105a957600080fd5b506105c460048036038101906105bf9190613145565b61102a565b005b3480156105d257600080fd5b506105ed60048036038101906105e89190613386565b61108c565b6040516105fa9190613b56565b60405180910390f35b34801561060f57600080fd5b5061062a6004803603810190610625919061329f565b61109e565b6040516106379190613adb565b60405180910390f35b34801561064c57600080fd5b50610655611113565b005b34801561066357600080fd5b5061067e600480360381019061067991906130ba565b6111d2565b60405161068b9190613adb565b60405180910390f35b3480156106a057600080fd5b506106bb60048036038101906106b69190613091565b611266565b005b60006106c88261135e565b9050919050565b6060600080546106de90614145565b80601f016020809104026020016040519081016040528092919081815260200182805461070a90614145565b80156107575780601f1061072c57610100808354040283529160200191610757565b820191906000526020600020905b81548152906001019060200180831161073a57829003601f168201915b5050505050905090565b600061076c826113d8565b6107ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a290613df8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107f182610ba0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085990613e58565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610881611444565b73ffffffffffffffffffffffffffffffffffffffff1614806108b057506108af816108aa611444565b6111d2565b5b6108ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e690613cf8565b60405180910390fd5b6108f9838361144c565b505050565b6000600880549050905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61093d611444565b73ffffffffffffffffffffffffffffffffffffffff1661095b610dcf565b73ffffffffffffffffffffffffffffffffffffffff16146109b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a890613e18565b60405180910390fd5b6109bb8282611505565b5050565b6109d06109ca611444565b82611579565b610a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0690613e98565b60405180910390fd5b610a1a838383611657565b505050565b6000610a2a83610c8f565b8210610a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6290613bb8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610adf8383836040518060200160405280600081525061102a565b505050565b6000610aee6108fe565b8210610b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2690613eb8565b60405180910390fd5b60088281548110610b69577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000610b9882610b8a856118be565b6118ee90919063ffffffff16565b905092915050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4090613d38565b60405180910390fd5b80915050919050565b60008084848430604051602001610c6c94939291906139c9565b604051602081830303815290604052805190602001209050809150509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf790613d18565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d4f611444565b73ffffffffffffffffffffffffffffffffffffffff16610d6d610dcf565b73ffffffffffffffffffffffffffffffffffffffff1614610dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba90613e18565b60405180910390fd5b610dcd6000611915565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e0890614145565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3490614145565b8015610e815780601f10610e5657610100808354040283529160200191610e81565b820191906000526020600020905b815481529060010190602001808311610e6457829003601f168201915b5050505050905090565b610e9d610e96611444565b83836119db565b5050565b600d818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b610ee1828261109e565b610f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1790613d78565b60405180910390fd5b600d83604051610f309190613a13565b908152602001604051809103902060009054906101000a900460ff1615610f8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8390613bf8565b60405180910390fd5b81610f98338786610c52565b14610fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcf90613e78565b60405180910390fd5b6001600d84604051610fea9190613a13565b908152602001604051809103902060006101000a81548160ff0219169083151502179055506110193386611b48565b6110238585611505565b5050505050565b61103b611035611444565b83611579565b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190613e98565b60405180910390fd5b61108684848484611b66565b50505050565b606061109782611bc2565b9050919050565b60006110bb826110ad856118be565b6118ee90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b61111b611444565b73ffffffffffffffffffffffffffffffffffffffff16611139610dcf565b73ffffffffffffffffffffffffffffffffffffffff161461118f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118690613e18565b60405180910390fd5b33600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61126e611444565b73ffffffffffffffffffffffffffffffffffffffff1661128c610dcf565b73ffffffffffffffffffffffffffffffffffffffff16146112e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d990613e18565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611352576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134990613c18565b60405180910390fd5b61135b81611915565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806113d157506113d082611d14565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166114bf83610ba0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61150e826113d8565b61154d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154490613d58565b60405180910390fd5b80600a60008481526020019081526020016000209080519060200190611574929190612ea0565b505050565b6000611584826113d8565b6115c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ba90613cd8565b60405180910390fd5b60006115ce83610ba0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611610575061160f81856111d2565b5b8061164e57508373ffffffffffffffffffffffffffffffffffffffff1661163684610761565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661167782610ba0565b73ffffffffffffffffffffffffffffffffffffffff16146116cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c490613c38565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561173d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173490613c78565b60405180910390fd5b611748838383611df6565b61175360008261144c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117a39190614044565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117fa9190613fbd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118b9838383611e06565b505050565b6000816040516020016118d19190613a4e565b604051602081830303815290604052805190602001209050919050565b60008060006118fd8585611e0b565b9150915061190a81611e8e565b819250505092915050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4190613c98565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b3b9190613adb565b60405180910390a3505050565b611b628282604051806020016040528060008152506121df565b5050565b611b71848484611657565b611b7d8484848461223a565b611bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb390613bd8565b60405180910390fd5b50505050565b6060611bcd826113d8565b611c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0390613dd8565b60405180910390fd5b6000600a60008481526020019081526020016000208054611c2c90614145565b80601f0160208091040260200160405190810160405280929190818152602001828054611c5890614145565b8015611ca55780601f10611c7a57610100808354040283529160200191611ca5565b820191906000526020600020905b815481529060010190602001808311611c8857829003601f168201915b505050505090506000611cb66123d1565b9050600081511415611ccc578192505050611d0f565b600082511115611d01578082604051602001611ce9929190613a2a565b60405160208183030381529060405292505050611d0f565b611d0a846123e8565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ddf57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611def5750611dee8261248f565b5b9050919050565b611e018383836124f9565b505050565b505050565b600080604183511415611e4d5760008060006020860151925060408601519150606086015160001a9050611e418782858561260d565b94509450505050611e87565b604083511415611e7e576000806020850151915060408501519050611e7386838361271a565b935093505050611e87565b60006002915091505b9250929050565b60006004811115611ec8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611f01577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611f0c576121dc565b60016004811115611f46577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611f7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb790613b78565b60405180910390fd5b60026004811115611ffa577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612033577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206b90613b98565b60405180910390fd5b600360048111156120ae577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156120e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f90613cb8565b60405180910390fd5b600480811115612161577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561219a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156121db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d290613d98565b60405180910390fd5b5b50565b6121e98383612779565b6121f6600084848461223a565b612235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222c90613bd8565b60405180910390fd5b505050565b600061225b8473ffffffffffffffffffffffffffffffffffffffff16612953565b156123c4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612284611444565b8786866040518563ffffffff1660e01b81526004016122a69493929190613a8f565b602060405180830381600087803b1580156122c057600080fd5b505af19250505080156122f157506040513d601f19601f820116820180604052508101906122ee919061331c565b60015b612374573d8060008114612321576040519150601f19603f3d011682016040523d82523d6000602084013e612326565b606091505b5060008151141561236c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236390613bd8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506123c9565b600190505b949350505050565b606060405180602001604052806000815250905090565b60606123f3826113d8565b612432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242990613e38565b60405180910390fd5b600061243c6123d1565b9050600081511161245c5760405180602001604052806000815250612487565b8061246684612976565b604051602001612477929190613a2a565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612504838383612b23565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125475761254281612b28565b612586565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612585576125848382612b71565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125c9576125c481612cde565b612608565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612607576126068282612e21565b5b5b505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612648576000600391509150612711565b601b8560ff16141580156126605750601c8560ff1614155b15612672576000600491509150612711565b6000600187878787604051600081526020016040526040516126979493929190613b11565b6020604051602081039080840390855afa1580156126b9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561270857600060019250925050612711565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c61275d9190613fbd565b905061276b8782888561260d565b935093505050935093915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e090613db8565b60405180910390fd5b6127f2816113d8565b15612832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282990613c58565b60405180910390fd5b61283e60008383611df6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461288e9190613fbd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461294f60008383611e06565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060008214156129be576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b1e565b600082905060005b600082146129f05780806129d9906141a8565b915050600a826129e99190614013565b91506129c6565b60008167ffffffffffffffff811115612a32577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a645781602001600182028036833780820191505090505b5090505b60008514612b1757600182612a7d9190614044565b9150600a85612a8c9190614229565b6030612a989190613fbd565b60f81b818381518110612ad4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b109190614013565b9450612a68565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612b7e84610c8f565b612b889190614044565b9050600060076000848152602001908152602001600020549050818114612c6d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612cf29190614044565b9050600060096000848152602001908152602001600020549050600060088381548110612d48577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612d90577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e05577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612e2c83610c8f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612eac90614145565b90600052602060002090601f016020900481019282612ece5760008555612f15565b82601f10612ee757805160ff1916838001178555612f15565b82800160010185558215612f15579182015b82811115612f14578251825591602001919060010190612ef9565b5b509050612f229190612f26565b5090565b5b80821115612f3f576000816000905550600101612f27565b5090565b6000612f56612f5184613f18565b613ef3565b905082815260208101848484011115612f6e57600080fd5b612f79848285614103565b509392505050565b6000612f94612f8f84613f49565b613ef3565b905082815260208101848484011115612fac57600080fd5b612fb7848285614103565b509392505050565b600081359050612fce81614a5c565b92915050565b600081359050612fe381614a73565b92915050565b600081359050612ff881614a8a565b92915050565b60008135905061300d81614aa1565b92915050565b60008151905061302281614aa1565b92915050565b600082601f83011261303957600080fd5b8135613049848260208601612f43565b91505092915050565b600082601f83011261306357600080fd5b8135613073848260208601612f81565b91505092915050565b60008135905061308b81614ab8565b92915050565b6000602082840312156130a357600080fd5b60006130b184828501612fbf565b91505092915050565b600080604083850312156130cd57600080fd5b60006130db85828601612fbf565b92505060206130ec85828601612fbf565b9150509250929050565b60008060006060848603121561310b57600080fd5b600061311986828701612fbf565b935050602061312a86828701612fbf565b925050604061313b8682870161307c565b9150509250925092565b6000806000806080858703121561315b57600080fd5b600061316987828801612fbf565b945050602061317a87828801612fbf565b935050604061318b8782880161307c565b925050606085013567ffffffffffffffff8111156131a857600080fd5b6131b487828801613028565b91505092959194509250565b600080604083850312156131d357600080fd5b60006131e185828601612fbf565b92505060206131f285828601612fd4565b9150509250929050565b6000806040838503121561320f57600080fd5b600061321d85828601612fbf565b925050602061322e8582860161307c565b9150509250929050565b60008060006060848603121561324d57600080fd5b600061325b86828701612fbf565b935050602061326c8682870161307c565b925050604084013567ffffffffffffffff81111561328957600080fd5b61329586828701613052565b9150509250925092565b600080604083850312156132b257600080fd5b60006132c085828601612fe9565b925050602083013567ffffffffffffffff8111156132dd57600080fd5b6132e985828601613028565b9150509250929050565b60006020828403121561330557600080fd5b600061331384828501612ffe565b91505092915050565b60006020828403121561332e57600080fd5b600061333c84828501613013565b91505092915050565b60006020828403121561335757600080fd5b600082013567ffffffffffffffff81111561337157600080fd5b61337d84828501613052565b91505092915050565b60006020828403121561339857600080fd5b60006133a68482850161307c565b91505092915050565b600080604083850312156133c257600080fd5b60006133d08582860161307c565b925050602083013567ffffffffffffffff8111156133ed57600080fd5b6133f985828601613052565b9150509250929050565b600080600080600060a0868803121561341b57600080fd5b60006134298882890161307c565b955050602086013567ffffffffffffffff81111561344657600080fd5b61345288828901613052565b945050604086013567ffffffffffffffff81111561346f57600080fd5b61347b88828901613052565b935050606061348c88828901612fe9565b925050608086013567ffffffffffffffff8111156134a957600080fd5b6134b588828901613028565b9150509295509295909350565b6134cb81614078565b82525050565b6134e26134dd82614078565b6141f1565b82525050565b6134f18161408a565b82525050565b61350081614096565b82525050565b61351761351282614096565b614203565b82525050565b600061352882613f7a565b6135328185613f90565b9350613542818560208601614112565b61354b81614316565b840191505092915050565b600061356182613f85565b61356b8185613fa1565b935061357b818560208601614112565b61358481614316565b840191505092915050565b600061359a82613f85565b6135a48185613fb2565b93506135b4818560208601614112565b80840191505092915050565b60006135cd601883613fa1565b91506135d882614334565b602082019050919050565b60006135f0601f83613fa1565b91506135fb8261435d565b602082019050919050565b6000613613601c83613fb2565b915061361e82614386565b601c82019050919050565b6000613636602b83613fa1565b9150613641826143af565b604082019050919050565b6000613659603283613fa1565b9150613664826143fe565b604082019050919050565b600061367c600b83613fa1565b91506136878261444d565b602082019050919050565b600061369f602683613fa1565b91506136aa82614476565b604082019050919050565b60006136c2602583613fa1565b91506136cd826144c5565b604082019050919050565b60006136e5601c83613fa1565b91506136f082614514565b602082019050919050565b6000613708602483613fa1565b91506137138261453d565b604082019050919050565b600061372b601983613fa1565b91506137368261458c565b602082019050919050565b600061374e602283613fa1565b9150613759826145b5565b604082019050919050565b6000613771602c83613fa1565b915061377c82614604565b604082019050919050565b6000613794603883613fa1565b915061379f82614653565b604082019050919050565b60006137b7602a83613fa1565b91506137c2826146a2565b604082019050919050565b60006137da602983613fa1565b91506137e5826146f1565b604082019050919050565b60006137fd602e83613fa1565b915061380882614740565b604082019050919050565b6000613820601883613fa1565b915061382b8261478f565b602082019050919050565b6000613843602283613fa1565b915061384e826147b8565b604082019050919050565b6000613866602083613fa1565b915061387182614807565b602082019050919050565b6000613889603183613fa1565b915061389482614830565b604082019050919050565b60006138ac602c83613fa1565b91506138b78261487f565b604082019050919050565b60006138cf602083613fa1565b91506138da826148ce565b602082019050919050565b60006138f2602f83613fa1565b91506138fd826148f7565b604082019050919050565b6000613915602183613fa1565b915061392082614946565b604082019050919050565b6000613938600b83613fa1565b915061394382614995565b602082019050919050565b600061395b603183613fa1565b9150613966826149be565b604082019050919050565b600061397e602c83613fa1565b915061398982614a0d565b604082019050919050565b61399d816140ec565b82525050565b6139b46139af826140ec565b61421f565b82525050565b6139c3816140f6565b82525050565b60006139d582876134d1565b6014820191506139e582866139a3565b6020820191506139f5828561358f565b9150613a0182846134d1565b60148201915081905095945050505050565b6000613a1f828461358f565b915081905092915050565b6000613a36828561358f565b9150613a42828461358f565b91508190509392505050565b6000613a5982613606565b9150613a658284613506565b60208201915081905092915050565b6000602082019050613a8960008301846134c2565b92915050565b6000608082019050613aa460008301876134c2565b613ab160208301866134c2565b613abe6040830185613994565b8181036060830152613ad0818461351d565b905095945050505050565b6000602082019050613af060008301846134e8565b92915050565b6000602082019050613b0b60008301846134f7565b92915050565b6000608082019050613b2660008301876134f7565b613b3360208301866139ba565b613b4060408301856134f7565b613b4d60608301846134f7565b95945050505050565b60006020820190508181036000830152613b708184613556565b905092915050565b60006020820190508181036000830152613b91816135c0565b9050919050565b60006020820190508181036000830152613bb1816135e3565b9050919050565b60006020820190508181036000830152613bd181613629565b9050919050565b60006020820190508181036000830152613bf18161364c565b9050919050565b60006020820190508181036000830152613c118161366f565b9050919050565b60006020820190508181036000830152613c3181613692565b9050919050565b60006020820190508181036000830152613c51816136b5565b9050919050565b60006020820190508181036000830152613c71816136d8565b9050919050565b60006020820190508181036000830152613c91816136fb565b9050919050565b60006020820190508181036000830152613cb18161371e565b9050919050565b60006020820190508181036000830152613cd181613741565b9050919050565b60006020820190508181036000830152613cf181613764565b9050919050565b60006020820190508181036000830152613d1181613787565b9050919050565b60006020820190508181036000830152613d31816137aa565b9050919050565b60006020820190508181036000830152613d51816137cd565b9050919050565b60006020820190508181036000830152613d71816137f0565b9050919050565b60006020820190508181036000830152613d9181613813565b9050919050565b60006020820190508181036000830152613db181613836565b9050919050565b60006020820190508181036000830152613dd181613859565b9050919050565b60006020820190508181036000830152613df18161387c565b9050919050565b60006020820190508181036000830152613e118161389f565b9050919050565b60006020820190508181036000830152613e31816138c2565b9050919050565b60006020820190508181036000830152613e51816138e5565b9050919050565b60006020820190508181036000830152613e7181613908565b9050919050565b60006020820190508181036000830152613e918161392b565b9050919050565b60006020820190508181036000830152613eb18161394e565b9050919050565b60006020820190508181036000830152613ed181613971565b9050919050565b6000602082019050613eed6000830184613994565b92915050565b6000613efd613f0e565b9050613f098282614177565b919050565b6000604051905090565b600067ffffffffffffffff821115613f3357613f326142e7565b5b613f3c82614316565b9050602081019050919050565b600067ffffffffffffffff821115613f6457613f636142e7565b5b613f6d82614316565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613fc8826140ec565b9150613fd3836140ec565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140085761400761425a565b5b828201905092915050565b600061401e826140ec565b9150614029836140ec565b92508261403957614038614289565b5b828204905092915050565b600061404f826140ec565b915061405a836140ec565b92508282101561406d5761406c61425a565b5b828203905092915050565b6000614083826140cc565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614130578082015181840152602081019050614115565b8381111561413f576000848401525b50505050565b6000600282049050600182168061415d57607f821691505b60208210811415614171576141706142b8565b5b50919050565b61418082614316565b810181811067ffffffffffffffff8211171561419f5761419e6142e7565b5b80604052505050565b60006141b3826140ec565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141e6576141e561425a565b5b600182019050919050565b60006141fc8261420d565b9050919050565b6000819050919050565b600061421882614327565b9050919050565b6000819050919050565b6000614234826140ec565b915061423f836140ec565b92508261424f5761424e614289565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4861736820726575736564000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f506c7a206d696e74207468726f75676820776562736974650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f48617368206661696c6564000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b614a6581614078565b8114614a7057600080fd5b50565b614a7c8161408a565b8114614a8757600080fd5b50565b614a9381614096565b8114614a9e57600080fd5b50565b614aaa816140a0565b8114614ab557600080fd5b50565b614ac1816140ec565b8114614acc57600080fd5b5056fea2646970667358221220b896b0010184b8becf611873465b2c2314c2c27b73e7443bf2d46f7148852a5164736f6c63430008040033

Deployed Bytecode

0x60806040526004361061019c5760003560e01c806367717e2a116100ec578063b0c95cc31161008a578063dd8d74d811610064578063dd8d74d814610603578063e91a67e814610640578063e985e9c514610657578063f2fde38b146106945761019c565b8063b0c95cc314610581578063b88d4fde1461059d578063c87b56dd146105c65761019c565b80638da5cb5b116100c65780638da5cb5b146104c557806395d89b41146104f0578063a22cb4651461051b578063a6ba55c7146105445761019c565b806367717e2a1461043457806370a0823114610471578063715018a6146104ae5761019c565b806318e97fd11161015957806342842e0e1161013357806342842e0e146103545780634f6ccce71461037d57806360f3747c146103ba5780636352211e146103f75761019c565b806318e97fd1146102c557806323b872dd146102ee5780632f745c59146103175761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b31461024657806318160ddd1461026f578063189107951461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c391906132f3565b6106bd565b6040516101d59190613adb565b60405180910390f35b3480156101ea57600080fd5b506101f36106cf565b6040516102009190613b56565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190613386565b610761565b60405161023d9190613a74565b60405180910390f35b34801561025257600080fd5b5061026d600480360381019061026891906131fc565b6107e6565b005b34801561027b57600080fd5b506102846108fe565b6040516102919190613ed8565b60405180910390f35b3480156102a657600080fd5b506102af61090b565b6040516102bc9190613a74565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e791906133af565b610935565b005b3480156102fa57600080fd5b50610315600480360381019061031091906130f6565b6109bf565b005b34801561032357600080fd5b5061033e600480360381019061033991906131fc565b610a1f565b60405161034b9190613ed8565b60405180910390f35b34801561036057600080fd5b5061037b600480360381019061037691906130f6565b610ac4565b005b34801561038957600080fd5b506103a4600480360381019061039f9190613386565b610ae4565b6040516103b19190613ed8565b60405180910390f35b3480156103c657600080fd5b506103e160048036038101906103dc919061329f565b610b7b565b6040516103ee9190613a74565b60405180910390f35b34801561040357600080fd5b5061041e60048036038101906104199190613386565b610ba0565b60405161042b9190613a74565b60405180910390f35b34801561044057600080fd5b5061045b60048036038101906104569190613238565b610c52565b6040516104689190613af6565b60405180910390f35b34801561047d57600080fd5b5061049860048036038101906104939190613091565b610c8f565b6040516104a59190613ed8565b60405180910390f35b3480156104ba57600080fd5b506104c3610d47565b005b3480156104d157600080fd5b506104da610dcf565b6040516104e79190613a74565b60405180910390f35b3480156104fc57600080fd5b50610505610df9565b6040516105129190613b56565b60405180910390f35b34801561052757600080fd5b50610542600480360381019061053d91906131c0565b610e8b565b005b34801561055057600080fd5b5061056b60048036038101906105669190613345565b610ea1565b6040516105789190613adb565b60405180910390f35b61059b60048036038101906105969190613403565b610ed7565b005b3480156105a957600080fd5b506105c460048036038101906105bf9190613145565b61102a565b005b3480156105d257600080fd5b506105ed60048036038101906105e89190613386565b61108c565b6040516105fa9190613b56565b60405180910390f35b34801561060f57600080fd5b5061062a6004803603810190610625919061329f565b61109e565b6040516106379190613adb565b60405180910390f35b34801561064c57600080fd5b50610655611113565b005b34801561066357600080fd5b5061067e600480360381019061067991906130ba565b6111d2565b60405161068b9190613adb565b60405180910390f35b3480156106a057600080fd5b506106bb60048036038101906106b69190613091565b611266565b005b60006106c88261135e565b9050919050565b6060600080546106de90614145565b80601f016020809104026020016040519081016040528092919081815260200182805461070a90614145565b80156107575780601f1061072c57610100808354040283529160200191610757565b820191906000526020600020905b81548152906001019060200180831161073a57829003601f168201915b5050505050905090565b600061076c826113d8565b6107ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a290613df8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107f182610ba0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085990613e58565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610881611444565b73ffffffffffffffffffffffffffffffffffffffff1614806108b057506108af816108aa611444565b6111d2565b5b6108ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e690613cf8565b60405180910390fd5b6108f9838361144c565b505050565b6000600880549050905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61093d611444565b73ffffffffffffffffffffffffffffffffffffffff1661095b610dcf565b73ffffffffffffffffffffffffffffffffffffffff16146109b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a890613e18565b60405180910390fd5b6109bb8282611505565b5050565b6109d06109ca611444565b82611579565b610a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0690613e98565b60405180910390fd5b610a1a838383611657565b505050565b6000610a2a83610c8f565b8210610a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6290613bb8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610adf8383836040518060200160405280600081525061102a565b505050565b6000610aee6108fe565b8210610b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2690613eb8565b60405180910390fd5b60088281548110610b69577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000610b9882610b8a856118be565b6118ee90919063ffffffff16565b905092915050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4090613d38565b60405180910390fd5b80915050919050565b60008084848430604051602001610c6c94939291906139c9565b604051602081830303815290604052805190602001209050809150509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf790613d18565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d4f611444565b73ffffffffffffffffffffffffffffffffffffffff16610d6d610dcf565b73ffffffffffffffffffffffffffffffffffffffff1614610dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba90613e18565b60405180910390fd5b610dcd6000611915565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e0890614145565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3490614145565b8015610e815780601f10610e5657610100808354040283529160200191610e81565b820191906000526020600020905b815481529060010190602001808311610e6457829003601f168201915b5050505050905090565b610e9d610e96611444565b83836119db565b5050565b600d818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b610ee1828261109e565b610f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1790613d78565b60405180910390fd5b600d83604051610f309190613a13565b908152602001604051809103902060009054906101000a900460ff1615610f8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8390613bf8565b60405180910390fd5b81610f98338786610c52565b14610fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcf90613e78565b60405180910390fd5b6001600d84604051610fea9190613a13565b908152602001604051809103902060006101000a81548160ff0219169083151502179055506110193386611b48565b6110238585611505565b5050505050565b61103b611035611444565b83611579565b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190613e98565b60405180910390fd5b61108684848484611b66565b50505050565b606061109782611bc2565b9050919050565b60006110bb826110ad856118be565b6118ee90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b61111b611444565b73ffffffffffffffffffffffffffffffffffffffff16611139610dcf565b73ffffffffffffffffffffffffffffffffffffffff161461118f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118690613e18565b60405180910390fd5b33600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61126e611444565b73ffffffffffffffffffffffffffffffffffffffff1661128c610dcf565b73ffffffffffffffffffffffffffffffffffffffff16146112e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d990613e18565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611352576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134990613c18565b60405180910390fd5b61135b81611915565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806113d157506113d082611d14565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166114bf83610ba0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61150e826113d8565b61154d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154490613d58565b60405180910390fd5b80600a60008481526020019081526020016000209080519060200190611574929190612ea0565b505050565b6000611584826113d8565b6115c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ba90613cd8565b60405180910390fd5b60006115ce83610ba0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611610575061160f81856111d2565b5b8061164e57508373ffffffffffffffffffffffffffffffffffffffff1661163684610761565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661167782610ba0565b73ffffffffffffffffffffffffffffffffffffffff16146116cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c490613c38565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561173d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173490613c78565b60405180910390fd5b611748838383611df6565b61175360008261144c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117a39190614044565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117fa9190613fbd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118b9838383611e06565b505050565b6000816040516020016118d19190613a4e565b604051602081830303815290604052805190602001209050919050565b60008060006118fd8585611e0b565b9150915061190a81611e8e565b819250505092915050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4190613c98565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b3b9190613adb565b60405180910390a3505050565b611b628282604051806020016040528060008152506121df565b5050565b611b71848484611657565b611b7d8484848461223a565b611bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb390613bd8565b60405180910390fd5b50505050565b6060611bcd826113d8565b611c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0390613dd8565b60405180910390fd5b6000600a60008481526020019081526020016000208054611c2c90614145565b80601f0160208091040260200160405190810160405280929190818152602001828054611c5890614145565b8015611ca55780601f10611c7a57610100808354040283529160200191611ca5565b820191906000526020600020905b815481529060010190602001808311611c8857829003601f168201915b505050505090506000611cb66123d1565b9050600081511415611ccc578192505050611d0f565b600082511115611d01578082604051602001611ce9929190613a2a565b60405160208183030381529060405292505050611d0f565b611d0a846123e8565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ddf57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611def5750611dee8261248f565b5b9050919050565b611e018383836124f9565b505050565b505050565b600080604183511415611e4d5760008060006020860151925060408601519150606086015160001a9050611e418782858561260d565b94509450505050611e87565b604083511415611e7e576000806020850151915060408501519050611e7386838361271a565b935093505050611e87565b60006002915091505b9250929050565b60006004811115611ec8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611f01577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611f0c576121dc565b60016004811115611f46577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611f7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb790613b78565b60405180910390fd5b60026004811115611ffa577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612033577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206b90613b98565b60405180910390fd5b600360048111156120ae577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156120e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f90613cb8565b60405180910390fd5b600480811115612161577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561219a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156121db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d290613d98565b60405180910390fd5b5b50565b6121e98383612779565b6121f6600084848461223a565b612235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222c90613bd8565b60405180910390fd5b505050565b600061225b8473ffffffffffffffffffffffffffffffffffffffff16612953565b156123c4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612284611444565b8786866040518563ffffffff1660e01b81526004016122a69493929190613a8f565b602060405180830381600087803b1580156122c057600080fd5b505af19250505080156122f157506040513d601f19601f820116820180604052508101906122ee919061331c565b60015b612374573d8060008114612321576040519150601f19603f3d011682016040523d82523d6000602084013e612326565b606091505b5060008151141561236c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236390613bd8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506123c9565b600190505b949350505050565b606060405180602001604052806000815250905090565b60606123f3826113d8565b612432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242990613e38565b60405180910390fd5b600061243c6123d1565b9050600081511161245c5760405180602001604052806000815250612487565b8061246684612976565b604051602001612477929190613a2a565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612504838383612b23565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125475761254281612b28565b612586565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612585576125848382612b71565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125c9576125c481612cde565b612608565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612607576126068282612e21565b5b5b505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612648576000600391509150612711565b601b8560ff16141580156126605750601c8560ff1614155b15612672576000600491509150612711565b6000600187878787604051600081526020016040526040516126979493929190613b11565b6020604051602081039080840390855afa1580156126b9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561270857600060019250925050612711565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c61275d9190613fbd565b905061276b8782888561260d565b935093505050935093915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e090613db8565b60405180910390fd5b6127f2816113d8565b15612832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282990613c58565b60405180910390fd5b61283e60008383611df6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461288e9190613fbd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461294f60008383611e06565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060008214156129be576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b1e565b600082905060005b600082146129f05780806129d9906141a8565b915050600a826129e99190614013565b91506129c6565b60008167ffffffffffffffff811115612a32577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a645781602001600182028036833780820191505090505b5090505b60008514612b1757600182612a7d9190614044565b9150600a85612a8c9190614229565b6030612a989190613fbd565b60f81b818381518110612ad4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b109190614013565b9450612a68565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612b7e84610c8f565b612b889190614044565b9050600060076000848152602001908152602001600020549050818114612c6d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612cf29190614044565b9050600060096000848152602001908152602001600020549050600060088381548110612d48577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612d90577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e05577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612e2c83610c8f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612eac90614145565b90600052602060002090601f016020900481019282612ece5760008555612f15565b82601f10612ee757805160ff1916838001178555612f15565b82800160010185558215612f15579182015b82811115612f14578251825591602001919060010190612ef9565b5b509050612f229190612f26565b5090565b5b80821115612f3f576000816000905550600101612f27565b5090565b6000612f56612f5184613f18565b613ef3565b905082815260208101848484011115612f6e57600080fd5b612f79848285614103565b509392505050565b6000612f94612f8f84613f49565b613ef3565b905082815260208101848484011115612fac57600080fd5b612fb7848285614103565b509392505050565b600081359050612fce81614a5c565b92915050565b600081359050612fe381614a73565b92915050565b600081359050612ff881614a8a565b92915050565b60008135905061300d81614aa1565b92915050565b60008151905061302281614aa1565b92915050565b600082601f83011261303957600080fd5b8135613049848260208601612f43565b91505092915050565b600082601f83011261306357600080fd5b8135613073848260208601612f81565b91505092915050565b60008135905061308b81614ab8565b92915050565b6000602082840312156130a357600080fd5b60006130b184828501612fbf565b91505092915050565b600080604083850312156130cd57600080fd5b60006130db85828601612fbf565b92505060206130ec85828601612fbf565b9150509250929050565b60008060006060848603121561310b57600080fd5b600061311986828701612fbf565b935050602061312a86828701612fbf565b925050604061313b8682870161307c565b9150509250925092565b6000806000806080858703121561315b57600080fd5b600061316987828801612fbf565b945050602061317a87828801612fbf565b935050604061318b8782880161307c565b925050606085013567ffffffffffffffff8111156131a857600080fd5b6131b487828801613028565b91505092959194509250565b600080604083850312156131d357600080fd5b60006131e185828601612fbf565b92505060206131f285828601612fd4565b9150509250929050565b6000806040838503121561320f57600080fd5b600061321d85828601612fbf565b925050602061322e8582860161307c565b9150509250929050565b60008060006060848603121561324d57600080fd5b600061325b86828701612fbf565b935050602061326c8682870161307c565b925050604084013567ffffffffffffffff81111561328957600080fd5b61329586828701613052565b9150509250925092565b600080604083850312156132b257600080fd5b60006132c085828601612fe9565b925050602083013567ffffffffffffffff8111156132dd57600080fd5b6132e985828601613028565b9150509250929050565b60006020828403121561330557600080fd5b600061331384828501612ffe565b91505092915050565b60006020828403121561332e57600080fd5b600061333c84828501613013565b91505092915050565b60006020828403121561335757600080fd5b600082013567ffffffffffffffff81111561337157600080fd5b61337d84828501613052565b91505092915050565b60006020828403121561339857600080fd5b60006133a68482850161307c565b91505092915050565b600080604083850312156133c257600080fd5b60006133d08582860161307c565b925050602083013567ffffffffffffffff8111156133ed57600080fd5b6133f985828601613052565b9150509250929050565b600080600080600060a0868803121561341b57600080fd5b60006134298882890161307c565b955050602086013567ffffffffffffffff81111561344657600080fd5b61345288828901613052565b945050604086013567ffffffffffffffff81111561346f57600080fd5b61347b88828901613052565b935050606061348c88828901612fe9565b925050608086013567ffffffffffffffff8111156134a957600080fd5b6134b588828901613028565b9150509295509295909350565b6134cb81614078565b82525050565b6134e26134dd82614078565b6141f1565b82525050565b6134f18161408a565b82525050565b61350081614096565b82525050565b61351761351282614096565b614203565b82525050565b600061352882613f7a565b6135328185613f90565b9350613542818560208601614112565b61354b81614316565b840191505092915050565b600061356182613f85565b61356b8185613fa1565b935061357b818560208601614112565b61358481614316565b840191505092915050565b600061359a82613f85565b6135a48185613fb2565b93506135b4818560208601614112565b80840191505092915050565b60006135cd601883613fa1565b91506135d882614334565b602082019050919050565b60006135f0601f83613fa1565b91506135fb8261435d565b602082019050919050565b6000613613601c83613fb2565b915061361e82614386565b601c82019050919050565b6000613636602b83613fa1565b9150613641826143af565b604082019050919050565b6000613659603283613fa1565b9150613664826143fe565b604082019050919050565b600061367c600b83613fa1565b91506136878261444d565b602082019050919050565b600061369f602683613fa1565b91506136aa82614476565b604082019050919050565b60006136c2602583613fa1565b91506136cd826144c5565b604082019050919050565b60006136e5601c83613fa1565b91506136f082614514565b602082019050919050565b6000613708602483613fa1565b91506137138261453d565b604082019050919050565b600061372b601983613fa1565b91506137368261458c565b602082019050919050565b600061374e602283613fa1565b9150613759826145b5565b604082019050919050565b6000613771602c83613fa1565b915061377c82614604565b604082019050919050565b6000613794603883613fa1565b915061379f82614653565b604082019050919050565b60006137b7602a83613fa1565b91506137c2826146a2565b604082019050919050565b60006137da602983613fa1565b91506137e5826146f1565b604082019050919050565b60006137fd602e83613fa1565b915061380882614740565b604082019050919050565b6000613820601883613fa1565b915061382b8261478f565b602082019050919050565b6000613843602283613fa1565b915061384e826147b8565b604082019050919050565b6000613866602083613fa1565b915061387182614807565b602082019050919050565b6000613889603183613fa1565b915061389482614830565b604082019050919050565b60006138ac602c83613fa1565b91506138b78261487f565b604082019050919050565b60006138cf602083613fa1565b91506138da826148ce565b602082019050919050565b60006138f2602f83613fa1565b91506138fd826148f7565b604082019050919050565b6000613915602183613fa1565b915061392082614946565b604082019050919050565b6000613938600b83613fa1565b915061394382614995565b602082019050919050565b600061395b603183613fa1565b9150613966826149be565b604082019050919050565b600061397e602c83613fa1565b915061398982614a0d565b604082019050919050565b61399d816140ec565b82525050565b6139b46139af826140ec565b61421f565b82525050565b6139c3816140f6565b82525050565b60006139d582876134d1565b6014820191506139e582866139a3565b6020820191506139f5828561358f565b9150613a0182846134d1565b60148201915081905095945050505050565b6000613a1f828461358f565b915081905092915050565b6000613a36828561358f565b9150613a42828461358f565b91508190509392505050565b6000613a5982613606565b9150613a658284613506565b60208201915081905092915050565b6000602082019050613a8960008301846134c2565b92915050565b6000608082019050613aa460008301876134c2565b613ab160208301866134c2565b613abe6040830185613994565b8181036060830152613ad0818461351d565b905095945050505050565b6000602082019050613af060008301846134e8565b92915050565b6000602082019050613b0b60008301846134f7565b92915050565b6000608082019050613b2660008301876134f7565b613b3360208301866139ba565b613b4060408301856134f7565b613b4d60608301846134f7565b95945050505050565b60006020820190508181036000830152613b708184613556565b905092915050565b60006020820190508181036000830152613b91816135c0565b9050919050565b60006020820190508181036000830152613bb1816135e3565b9050919050565b60006020820190508181036000830152613bd181613629565b9050919050565b60006020820190508181036000830152613bf18161364c565b9050919050565b60006020820190508181036000830152613c118161366f565b9050919050565b60006020820190508181036000830152613c3181613692565b9050919050565b60006020820190508181036000830152613c51816136b5565b9050919050565b60006020820190508181036000830152613c71816136d8565b9050919050565b60006020820190508181036000830152613c91816136fb565b9050919050565b60006020820190508181036000830152613cb18161371e565b9050919050565b60006020820190508181036000830152613cd181613741565b9050919050565b60006020820190508181036000830152613cf181613764565b9050919050565b60006020820190508181036000830152613d1181613787565b9050919050565b60006020820190508181036000830152613d31816137aa565b9050919050565b60006020820190508181036000830152613d51816137cd565b9050919050565b60006020820190508181036000830152613d71816137f0565b9050919050565b60006020820190508181036000830152613d9181613813565b9050919050565b60006020820190508181036000830152613db181613836565b9050919050565b60006020820190508181036000830152613dd181613859565b9050919050565b60006020820190508181036000830152613df18161387c565b9050919050565b60006020820190508181036000830152613e118161389f565b9050919050565b60006020820190508181036000830152613e31816138c2565b9050919050565b60006020820190508181036000830152613e51816138e5565b9050919050565b60006020820190508181036000830152613e7181613908565b9050919050565b60006020820190508181036000830152613e918161392b565b9050919050565b60006020820190508181036000830152613eb18161394e565b9050919050565b60006020820190508181036000830152613ed181613971565b9050919050565b6000602082019050613eed6000830184613994565b92915050565b6000613efd613f0e565b9050613f098282614177565b919050565b6000604051905090565b600067ffffffffffffffff821115613f3357613f326142e7565b5b613f3c82614316565b9050602081019050919050565b600067ffffffffffffffff821115613f6457613f636142e7565b5b613f6d82614316565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613fc8826140ec565b9150613fd3836140ec565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140085761400761425a565b5b828201905092915050565b600061401e826140ec565b9150614029836140ec565b92508261403957614038614289565b5b828204905092915050565b600061404f826140ec565b915061405a836140ec565b92508282101561406d5761406c61425a565b5b828203905092915050565b6000614083826140cc565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614130578082015181840152602081019050614115565b8381111561413f576000848401525b50505050565b6000600282049050600182168061415d57607f821691505b60208210811415614171576141706142b8565b5b50919050565b61418082614316565b810181811067ffffffffffffffff8211171561419f5761419e6142e7565b5b80604052505050565b60006141b3826140ec565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141e6576141e561425a565b5b600182019050919050565b60006141fc8261420d565b9050919050565b6000819050919050565b600061421882614327565b9050919050565b6000819050919050565b6000614234826140ec565b915061423f836140ec565b92508261424f5761424e614289565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4861736820726575736564000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f506c7a206d696e74207468726f75676820776562736974650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f48617368206661696c6564000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b614a6581614078565b8114614a7057600080fd5b50565b614a7c8161408a565b8114614a8757600080fd5b50565b614a9381614096565b8114614a9e57600080fd5b50565b614aaa816140a0565b8114614ab557600080fd5b50565b614ac1816140ec565b8114614acc57600080fd5b5056fea2646970667358221220b896b0010184b8becf611873465b2c2314c2c27b73e7443bf2d46f7148852a5164736f6c63430008040033

Deployed Bytecode Sourcemap

57111:2525:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59462:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35706:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37266:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36789:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51532:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58109:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58787:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38016:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51200:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38426:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51722:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58215:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35400:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58391:289;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35130:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14264:103;;;;;;;;;;;;;:::i;:::-;;13613:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35875:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37559:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57261:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57372:543;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38682:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59299:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57923:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58688:91;;;;;;;;;;;;;:::i;:::-;;37785:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14522:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59462:171;59565:4;59589:36;59613:11;59589:23;:36::i;:::-;59582:43;;59462:171;;;:::o;35706:100::-;35760:13;35793:5;35786:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35706:100;:::o;37266:221::-;37342:7;37370:16;37378:7;37370;:16::i;:::-;37362:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37455:15;:24;37471:7;37455:24;;;;;;;;;;;;;;;;;;;;;37448:31;;37266:221;;;:::o;36789:411::-;36870:13;36886:23;36901:7;36886:14;:23::i;:::-;36870:39;;36934:5;36928:11;;:2;:11;;;;36920:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;37028:5;37012:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;37037:37;37054:5;37061:12;:10;:12::i;:::-;37037:16;:37::i;:::-;37012:62;36990:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;37171:21;37180:2;37184:7;37171:8;:21::i;:::-;36789:411;;;:::o;51532:113::-;51593:7;51620:10;:17;;;;51613:24;;51532:113;:::o;58109:98::-;58158:7;58185:14;;;;;;;;;;;58178:21;;58109:98;:::o;58787:122::-;13844:12;:10;:12::i;:::-;13833:23;;:7;:5;:7::i;:::-;:23;;;13825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58875:26:::1;58888:7;58897:3;58875:12;:26::i;:::-;58787:122:::0;;:::o;38016:339::-;38211:41;38230:12;:10;:12::i;:::-;38244:7;38211:18;:41::i;:::-;38203:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;38319:28;38329:4;38335:2;38339:7;38319:9;:28::i;:::-;38016:339;;;:::o;51200:256::-;51297:7;51333:23;51350:5;51333:16;:23::i;:::-;51325:5;:31;51317:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;51422:12;:19;51435:5;51422:19;;;;;;;;;;;;;;;:26;51442:5;51422:26;;;;;;;;;;;;51415:33;;51200:256;;;;:::o;38426:185::-;38564:39;38581:4;38587:2;38591:7;38564:39;;;;;;;;;;;;:16;:39::i;:::-;38426:185;;;:::o;51722:233::-;51797:7;51833:30;:28;:30::i;:::-;51825:5;:38;51817:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;51930:10;51941:5;51930:17;;;;;;;;;;;;;;;;;;;;;;;;51923:24;;51722:233;;;:::o;58215:168::-;58300:7;58327:48;58365:9;58327:29;:4;:27;:29::i;:::-;:37;;:48;;;;:::i;:::-;58320:55;;58215:168;;;;:::o;35400:239::-;35472:7;35492:13;35508:7;:16;35516:7;35508:16;;;;;;;;;;;;;;;;;;;;;35492:32;;35560:1;35543:19;;:5;:19;;;;35535:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35626:5;35619:12;;;35400:239;;;:::o;58391:289::-;58525:7;58545:12;58601:6;58609:7;58618:5;58633:4;58584:55;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58560:90;;;;;;58545:105;;58668:4;58661:11;;;58391:289;;;;;:::o;35130:208::-;35202:7;35247:1;35230:19;;:5;:19;;;;35222:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;35314:9;:16;35324:5;35314:16;;;;;;;;;;;;;;;;35307:23;;35130:208;;;:::o;14264:103::-;13844:12;:10;:12::i;:::-;13833:23;;:7;:5;:7::i;:::-;:23;;;13825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14329:30:::1;14356:1;14329:18;:30::i;:::-;14264:103::o:0;13613:87::-;13659:7;13686:6;;;;;;;;;;;13679:13;;13613:87;:::o;35875:104::-;35931:13;35964:7;35957:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35875:104;:::o;37559:155::-;37654:52;37673:12;:10;:12::i;:::-;37687:8;37697;37654:18;:52::i;:::-;37559:155;;:::o;57261:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57372:543::-;57549:28;57561:4;57567:9;57549:11;:28::i;:::-;57541:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;57626:11;57638:5;57626:18;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;57625:19;57617:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;57740:4;57693:43;57709:10;57721:7;57730:5;57693:15;:43::i;:::-;:51;57671:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;57815:4;57794:11;57806:5;57794:18;;;;;;:::i;:::-;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;57840:30;57850:10;57862:7;57840:9;:30::i;:::-;57881:26;57894:7;57903:3;57881:12;:26::i;:::-;57372:543;;;;;:::o;38682:328::-;38857:41;38876:12;:10;:12::i;:::-;38890:7;38857:18;:41::i;:::-;38849:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;38963:39;38977:4;38983:2;38987:7;38996:5;38963:13;:39::i;:::-;38682:328;;;;:::o;59299:155::-;59390:13;59423:23;59438:7;59423:14;:23::i;:::-;59416:30;;59299:155;;;:::o;57923:178::-;58003:4;58045:48;58083:9;58045:29;:4;:27;:29::i;:::-;:37;;:48;;;;:::i;:::-;58027:66;;:14;;;;;;;;;;;:66;;;58020:73;;57923:178;;;;:::o;58688:91::-;13844:12;:10;:12::i;:::-;13833:23;;:7;:5;:7::i;:::-;:23;;;13825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58761:10:::1;58744:14;;:27;;;;;;;;;;;;;;;;;;58688:91::o:0;37785:164::-;37882:4;37906:18;:25;37925:5;37906:25;;;;;;;;;;;;;;;:35;37932:8;37906:35;;;;;;;;;;;;;;;;;;;;;;;;;37899:42;;37785:164;;;;:::o;14522:201::-;13844:12;:10;:12::i;:::-;13833:23;;:7;:5;:7::i;:::-;:23;;;13825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14631:1:::1;14611:22;;:8;:22;;;;14603:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14687:28;14706:8;14687:18;:28::i;:::-;14522:201:::0;:::o;50892:224::-;50994:4;51033:35;51018:50;;;:11;:50;;;;:90;;;;51072:36;51096:11;51072:23;:36::i;:::-;51018:90;51011:97;;50892:224;;;:::o;40520:127::-;40585:4;40637:1;40609:30;;:7;:16;40617:7;40609:16;;;;;;;;;;;;;;;;;;;;;:30;;;;40602:37;;40520:127;;;:::o;12337:98::-;12390:7;12417:10;12410:17;;12337:98;:::o;44666:174::-;44768:2;44741:15;:24;44757:7;44741:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44824:7;44820:2;44786:46;;44795:23;44810:7;44795:14;:23::i;:::-;44786:46;;;;;;;;;;;;44666:174;;:::o;49222:217::-;49322:16;49330:7;49322;:16::i;:::-;49314:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;49422:9;49400:10;:19;49411:7;49400:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;49222:217;;:::o;40814:348::-;40907:4;40932:16;40940:7;40932;:16::i;:::-;40924:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41008:13;41024:23;41039:7;41024:14;:23::i;:::-;41008:39;;41077:5;41066:16;;:7;:16;;;:52;;;;41086:32;41103:5;41110:7;41086:16;:32::i;:::-;41066:52;:87;;;;41146:7;41122:31;;:20;41134:7;41122:11;:20::i;:::-;:31;;;41066:87;41058:96;;;40814:348;;;;:::o;43923:625::-;44082:4;44055:31;;:23;44070:7;44055:14;:23::i;:::-;:31;;;44047:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;44161:1;44147:16;;:2;:16;;;;44139:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;44217:39;44238:4;44244:2;44248:7;44217:20;:39::i;:::-;44321:29;44338:1;44342:7;44321:8;:29::i;:::-;44382:1;44363:9;:15;44373:4;44363:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;44411:1;44394:9;:13;44404:2;44394:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;44442:2;44423:7;:16;44431:7;44423:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;44481:7;44477:2;44462:27;;44471:4;44462:27;;;;;;;;;;;;44502:38;44522:4;44528:2;44532:7;44502:19;:38::i;:::-;43923:625;;;:::o;10343:269::-;10412:7;10598:4;10545:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;10535:69;;;;;;10528:76;;10343:269;;;:::o;6541:231::-;6619:7;6640:17;6659:18;6681:27;6692:4;6698:9;6681:10;:27::i;:::-;6639:69;;;;6719:18;6731:5;6719:11;:18::i;:::-;6755:9;6748:16;;;;6541:231;;;;:::o;14883:191::-;14957:16;14976:6;;;;;;;;;;;14957:25;;15002:8;14993:6;;:17;;;;;;;;;;;;;;;;;;15057:8;15026:40;;15047:8;15026:40;;;;;;;;;;;;14883:191;;:::o;44982:315::-;45137:8;45128:17;;:5;:17;;;;45120:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;45224:8;45186:18;:25;45205:5;45186:25;;;;;;;;;;;;;;;:35;45212:8;45186:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;45270:8;45248:41;;45263:5;45248:41;;;45280:8;45248:41;;;;;;:::i;:::-;;;;;;;;44982:315;;;:::o;41504:110::-;41580:26;41590:2;41594:7;41580:26;;;;;;;;;;;;:9;:26::i;:::-;41504:110;;:::o;39892:315::-;40049:28;40059:4;40065:2;40069:7;40049:9;:28::i;:::-;40096:48;40119:4;40125:2;40129:7;40138:5;40096:22;:48::i;:::-;40088:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;39892:315;;;;:::o;48387:679::-;48460:13;48494:16;48502:7;48494;:16::i;:::-;48486:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;48577:23;48603:10;:19;48614:7;48603:19;;;;;;;;;;;48577:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48633:18;48654:10;:8;:10::i;:::-;48633:31;;48762:1;48746:4;48740:18;:23;48736:72;;;48787:9;48780:16;;;;;;48736:72;48938:1;48918:9;48912:23;:27;48908:108;;;48987:4;48993:9;48970:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48956:48;;;;;;48908:108;49035:23;49050:7;49035:14;:23::i;:::-;49028:30;;;;48387:679;;;;:::o;34761:305::-;34863:4;34915:25;34900:40;;;:11;:40;;;;:105;;;;34972:33;34957:48;;;:11;:48;;;;34900:105;:158;;;;35022:36;35046:11;35022:23;:36::i;:::-;34900:158;34880:178;;34761:305;;;:::o;58987:181::-;59115:45;59142:4;59148:2;59152:7;59115:26;:45::i;:::-;58987:181;;;:::o;47744:125::-;;;;:::o;4431:1308::-;4512:7;4521:12;4766:2;4746:9;:16;:22;4742:990;;;4785:9;4809;4833:7;5042:4;5031:9;5027:20;5021:27;5016:32;;5092:4;5081:9;5077:20;5071:27;5066:32;;5150:4;5139:9;5135:20;5129:27;5126:1;5121:36;5116:41;;5193:25;5204:4;5210:1;5213;5216;5193:10;:25::i;:::-;5186:32;;;;;;;;;4742:990;5260:2;5240:9;:16;:22;5236:496;;;5279:9;5303:10;5515:4;5504:9;5500:20;5494:27;5489:32;;5566:4;5555:9;5551:20;5545:27;5539:33;;5608:23;5619:4;5625:1;5628:2;5608:10;:23::i;:::-;5601:30;;;;;;;;5236:496;5680:1;5684:35;5664:56;;;;4431:1308;;;;;;:::o;2702:643::-;2780:20;2771:29;;;;;;;;;;;;;;;;:5;:29;;;;;;;;;;;;;;;;;2767:571;;;2817:7;;2767:571;2878:29;2869:38;;;;;;;;;;;;;;;;:5;:38;;;;;;;;;;;;;;;;;2865:473;;;2924:34;;;;;;;;;;:::i;:::-;;;;;;;;2865:473;2989:35;2980:44;;;;;;;;;;;;;;;;:5;:44;;;;;;;;;;;;;;;;;2976:362;;;3041:41;;;;;;;;;;:::i;:::-;;;;;;;;2976:362;3113:30;3104:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;3100:238;;;3160:44;;;;;;;;;;:::i;:::-;;;;;;;;3100:238;3235:30;3226:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;3222:116;;;3282:44;;;;;;;;;;:::i;:::-;;;;;;;;3222:116;2702:643;;:::o;41841:321::-;41971:18;41977:2;41981:7;41971:5;:18::i;:::-;42022:54;42053:1;42057:2;42061:7;42070:5;42022:22;:54::i;:::-;42000:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;41841:321;;;:::o;45862:799::-;46017:4;46038:15;:2;:13;;;:15::i;:::-;46034:620;;;46090:2;46074:36;;;46111:12;:10;:12::i;:::-;46125:4;46131:7;46140:5;46074:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46070:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46333:1;46316:6;:13;:18;46312:272;;;46359:60;;;;;;;;;;:::i;:::-;;;;;;;;46312:272;46534:6;46528:13;46519:6;46515:2;46511:15;46504:38;46070:529;46207:41;;;46197:51;;;:6;:51;;;;46190:58;;;;;46034:620;46638:4;46631:11;;45862:799;;;;;;;:::o;36633:94::-;36684:13;36710:9;;;;;;;;;;;;;;36633:94;:::o;36050:334::-;36123:13;36157:16;36165:7;36157;:16::i;:::-;36149:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;36238:21;36262:10;:8;:10::i;:::-;36238:34;;36314:1;36296:7;36290:21;:25;:86;;;;;;;;;;;;;;;;;36342:7;36351:18;:7;:16;:18::i;:::-;36325:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36290:86;36283:93;;;36050:334;;;:::o;26420:157::-;26505:4;26544:25;26529:40;;;:11;:40;;;;26522:47;;26420:157;;;:::o;52568:589::-;52712:45;52739:4;52745:2;52749:7;52712:26;:45::i;:::-;52790:1;52774:18;;:4;:18;;;52770:187;;;52809:40;52841:7;52809:31;:40::i;:::-;52770:187;;;52879:2;52871:10;;:4;:10;;;52867:90;;52898:47;52931:4;52937:7;52898:32;:47::i;:::-;52867:90;52770:187;52985:1;52971:16;;:2;:16;;;52967:183;;;53004:45;53041:7;53004:36;:45::i;:::-;52967:183;;;53077:4;53071:10;;:2;:10;;;53067:83;;53098:40;53126:2;53130:7;53098:27;:40::i;:::-;53067:83;52967:183;52568:589;;;:::o;7993:1632::-;8124:7;8133:12;9058:66;9053:1;9045:10;;:79;9041:163;;;9157:1;9161:30;9141:51;;;;;;9041:163;9223:2;9218:1;:7;;;;:18;;;;;9234:2;9229:1;:7;;;;9218:18;9214:102;;;9269:1;9273:30;9253:51;;;;;;9214:102;9413:14;9430:24;9440:4;9446:1;9449;9452;9430:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9413:41;;9487:1;9469:20;;:6;:20;;;9465:103;;;9522:1;9526:29;9506:50;;;;;;;9465:103;9588:6;9596:20;9580:37;;;;;7993:1632;;;;;;;;:::o;7035:344::-;7149:7;7158:12;7183:9;7208:66;7200:75;;7195:2;:80;7183:92;;7286:7;7325:2;7318:3;7311:2;7303:11;;:18;;7302:25;;;;:::i;:::-;7286:42;;7346:25;7357:4;7363:1;7366;7369;7346:10;:25::i;:::-;7339:32;;;;;;7035:344;;;;;;:::o;42498:439::-;42592:1;42578:16;;:2;:16;;;;42570:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;42651:16;42659:7;42651;:16::i;:::-;42650:17;42642:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42713:45;42742:1;42746:2;42750:7;42713:20;:45::i;:::-;42788:1;42771:9;:13;42781:2;42771:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42819:2;42800:7;:16;42808:7;42800:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42864:7;42860:2;42839:33;;42856:1;42839:33;;;;;;;;;;;;42885:44;42913:1;42917:2;42921:7;42885:19;:44::i;:::-;42498:439;;:::o;16314:326::-;16374:4;16631:1;16609:7;:19;;;:23;16602:30;;16314:326;;;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;47233:126::-;;;;:::o;53880:164::-;53984:10;:17;;;;53957:15;:24;53973:7;53957:24;;;;;;;;;;;:44;;;;54012:10;54028:7;54012:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53880:164;:::o;54671:988::-;54937:22;54987:1;54962:22;54979:4;54962:16;:22::i;:::-;:26;;;;:::i;:::-;54937:51;;54999:18;55020:17;:26;55038:7;55020:26;;;;;;;;;;;;54999:47;;55167:14;55153:10;:28;55149:328;;55198:19;55220:12;:18;55233:4;55220:18;;;;;;;;;;;;;;;:34;55239:14;55220:34;;;;;;;;;;;;55198:56;;55304:11;55271:12;:18;55284:4;55271:18;;;;;;;;;;;;;;;:30;55290:10;55271:30;;;;;;;;;;;:44;;;;55421:10;55388:17;:30;55406:11;55388:30;;;;;;;;;;;:43;;;;55149:328;;55573:17;:26;55591:7;55573:26;;;;;;;;;;;55566:33;;;55617:12;:18;55630:4;55617:18;;;;;;;;;;;;;;;:34;55636:14;55617:34;;;;;;;;;;;55610:41;;;54671:988;;;;:::o;55954:1079::-;56207:22;56252:1;56232:10;:17;;;;:21;;;;:::i;:::-;56207:46;;56264:18;56285:15;:24;56301:7;56285:24;;;;;;;;;;;;56264:45;;56636:19;56658:10;56669:14;56658:26;;;;;;;;;;;;;;;;;;;;;;;;56636:48;;56722:11;56697:10;56708;56697:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;56833:10;56802:15;:28;56818:11;56802:28;;;;;;;;;;;:41;;;;56974:15;:24;56990:7;56974:24;;;;;;;;;;;56967:31;;;57009:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55954:1079;;;;:::o;53458:221::-;53543:14;53560:20;53577:2;53560:16;:20::i;:::-;53543:37;;53618:7;53591:12;:16;53604:2;53591:16;;;;;;;;;;;;;;;:24;53608:6;53591:24;;;;;;;;;;;:34;;;;53665:6;53636:17;:26;53654:7;53636:26;;;;;;;;;;;:35;;;;53458:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:139::-;1037:5;1075:6;1062:20;1053:29;;1091:33;1118:5;1091:33;:::i;:::-;1043:87;;;;:::o;1136:137::-;1181:5;1219:6;1206:20;1197:29;;1235:32;1261:5;1235:32;:::i;:::-;1187:86;;;;:::o;1279:141::-;1335:5;1366:6;1360:13;1351:22;;1382:32;1408:5;1382:32;:::i;:::-;1341:79;;;;:::o;1439:271::-;1494:5;1543:3;1536:4;1528:6;1524:17;1520:27;1510:2;;1561:1;1558;1551:12;1510:2;1601:6;1588:20;1626:78;1700:3;1692:6;1685:4;1677:6;1673:17;1626:78;:::i;:::-;1617:87;;1500:210;;;;;:::o;1730:273::-;1786:5;1835:3;1828:4;1820:6;1816:17;1812:27;1802:2;;1853:1;1850;1843:12;1802:2;1893:6;1880:20;1918:79;1993:3;1985:6;1978:4;1970:6;1966:17;1918:79;:::i;:::-;1909:88;;1792:211;;;;;:::o;2009:139::-;2055:5;2093:6;2080:20;2071:29;;2109:33;2136:5;2109:33;:::i;:::-;2061:87;;;;:::o;2154:262::-;2213:6;2262:2;2250:9;2241:7;2237:23;2233:32;2230:2;;;2278:1;2275;2268:12;2230:2;2321:1;2346:53;2391:7;2382:6;2371:9;2367:22;2346:53;:::i;:::-;2336:63;;2292:117;2220:196;;;;:::o;2422:407::-;2490:6;2498;2547:2;2535:9;2526:7;2522:23;2518:32;2515:2;;;2563:1;2560;2553:12;2515:2;2606:1;2631:53;2676:7;2667:6;2656:9;2652:22;2631:53;:::i;:::-;2621:63;;2577:117;2733:2;2759:53;2804:7;2795:6;2784:9;2780:22;2759:53;:::i;:::-;2749:63;;2704:118;2505:324;;;;;:::o;2835:552::-;2912:6;2920;2928;2977:2;2965:9;2956:7;2952:23;2948:32;2945:2;;;2993:1;2990;2983:12;2945:2;3036:1;3061:53;3106:7;3097:6;3086:9;3082:22;3061:53;:::i;:::-;3051:63;;3007:117;3163:2;3189:53;3234:7;3225:6;3214:9;3210:22;3189:53;:::i;:::-;3179:63;;3134:118;3291:2;3317:53;3362:7;3353:6;3342:9;3338:22;3317:53;:::i;:::-;3307:63;;3262:118;2935:452;;;;;:::o;3393:809::-;3488:6;3496;3504;3512;3561:3;3549:9;3540:7;3536:23;3532:33;3529:2;;;3578:1;3575;3568:12;3529:2;3621:1;3646:53;3691:7;3682:6;3671:9;3667:22;3646:53;:::i;:::-;3636:63;;3592:117;3748:2;3774:53;3819:7;3810:6;3799:9;3795:22;3774:53;:::i;:::-;3764:63;;3719:118;3876:2;3902:53;3947:7;3938:6;3927:9;3923:22;3902:53;:::i;:::-;3892:63;;3847:118;4032:2;4021:9;4017:18;4004:32;4063:18;4055:6;4052:30;4049:2;;;4095:1;4092;4085:12;4049:2;4123:62;4177:7;4168:6;4157:9;4153:22;4123:62;:::i;:::-;4113:72;;3975:220;3519:683;;;;;;;:::o;4208:401::-;4273:6;4281;4330:2;4318:9;4309:7;4305:23;4301:32;4298:2;;;4346:1;4343;4336:12;4298:2;4389:1;4414:53;4459:7;4450:6;4439:9;4435:22;4414:53;:::i;:::-;4404:63;;4360:117;4516:2;4542:50;4584:7;4575:6;4564:9;4560:22;4542:50;:::i;:::-;4532:60;;4487:115;4288:321;;;;;:::o;4615:407::-;4683:6;4691;4740:2;4728:9;4719:7;4715:23;4711:32;4708:2;;;4756:1;4753;4746:12;4708:2;4799:1;4824:53;4869:7;4860:6;4849:9;4845:22;4824:53;:::i;:::-;4814:63;;4770:117;4926:2;4952:53;4997:7;4988:6;4977:9;4973:22;4952:53;:::i;:::-;4942:63;;4897:118;4698:324;;;;;:::o;5028:665::-;5115:6;5123;5131;5180:2;5168:9;5159:7;5155:23;5151:32;5148:2;;;5196:1;5193;5186:12;5148:2;5239:1;5264:53;5309:7;5300:6;5289:9;5285:22;5264:53;:::i;:::-;5254:63;;5210:117;5366:2;5392:53;5437:7;5428:6;5417:9;5413:22;5392:53;:::i;:::-;5382:63;;5337:118;5522:2;5511:9;5507:18;5494:32;5553:18;5545:6;5542:30;5539:2;;;5585:1;5582;5575:12;5539:2;5613:63;5668:7;5659:6;5648:9;5644:22;5613:63;:::i;:::-;5603:73;;5465:221;5138:555;;;;;:::o;5699:518::-;5776:6;5784;5833:2;5821:9;5812:7;5808:23;5804:32;5801:2;;;5849:1;5846;5839:12;5801:2;5892:1;5917:53;5962:7;5953:6;5942:9;5938:22;5917:53;:::i;:::-;5907:63;;5863:117;6047:2;6036:9;6032:18;6019:32;6078:18;6070:6;6067:30;6064:2;;;6110:1;6107;6100:12;6064:2;6138:62;6192:7;6183:6;6172:9;6168:22;6138:62;:::i;:::-;6128:72;;5990:220;5791:426;;;;;:::o;6223:260::-;6281:6;6330:2;6318:9;6309:7;6305:23;6301:32;6298:2;;;6346:1;6343;6336:12;6298:2;6389:1;6414:52;6458:7;6449:6;6438:9;6434:22;6414:52;:::i;:::-;6404:62;;6360:116;6288:195;;;;:::o;6489:282::-;6558:6;6607:2;6595:9;6586:7;6582:23;6578:32;6575:2;;;6623:1;6620;6613:12;6575:2;6666:1;6691:63;6746:7;6737:6;6726:9;6722:22;6691:63;:::i;:::-;6681:73;;6637:127;6565:206;;;;:::o;6777:375::-;6846:6;6895:2;6883:9;6874:7;6870:23;6866:32;6863:2;;;6911:1;6908;6901:12;6863:2;6982:1;6971:9;6967:17;6954:31;7012:18;7004:6;7001:30;6998:2;;;7044:1;7041;7034:12;6998:2;7072:63;7127:7;7118:6;7107:9;7103:22;7072:63;:::i;:::-;7062:73;;6925:220;6853:299;;;;:::o;7158:262::-;7217:6;7266:2;7254:9;7245:7;7241:23;7237:32;7234:2;;;7282:1;7279;7272:12;7234:2;7325:1;7350:53;7395:7;7386:6;7375:9;7371:22;7350:53;:::i;:::-;7340:63;;7296:117;7224:196;;;;:::o;7426:520::-;7504:6;7512;7561:2;7549:9;7540:7;7536:23;7532:32;7529:2;;;7577:1;7574;7567:12;7529:2;7620:1;7645:53;7690:7;7681:6;7670:9;7666:22;7645:53;:::i;:::-;7635:63;;7591:117;7775:2;7764:9;7760:18;7747:32;7806:18;7798:6;7795:30;7792:2;;;7838:1;7835;7828:12;7792:2;7866:63;7921:7;7912:6;7901:9;7897:22;7866:63;:::i;:::-;7856:73;;7718:221;7519:427;;;;;:::o;7952:1181::-;8076:6;8084;8092;8100;8108;8157:3;8145:9;8136:7;8132:23;8128:33;8125:2;;;8174:1;8171;8164:12;8125:2;8217:1;8242:53;8287:7;8278:6;8267:9;8263:22;8242:53;:::i;:::-;8232:63;;8188:117;8372:2;8361:9;8357:18;8344:32;8403:18;8395:6;8392:30;8389:2;;;8435:1;8432;8425:12;8389:2;8463:63;8518:7;8509:6;8498:9;8494:22;8463:63;:::i;:::-;8453:73;;8315:221;8603:2;8592:9;8588:18;8575:32;8634:18;8626:6;8623:30;8620:2;;;8666:1;8663;8656:12;8620:2;8694:63;8749:7;8740:6;8729:9;8725:22;8694:63;:::i;:::-;8684:73;;8546:221;8806:2;8832:53;8877:7;8868:6;8857:9;8853:22;8832:53;:::i;:::-;8822:63;;8777:118;8962:3;8951:9;8947:19;8934:33;8994:18;8986:6;8983:30;8980:2;;;9026:1;9023;9016:12;8980:2;9054:62;9108:7;9099:6;9088:9;9084:22;9054:62;:::i;:::-;9044:72;;8905:221;8115:1018;;;;;;;;:::o;9139:118::-;9226:24;9244:5;9226:24;:::i;:::-;9221:3;9214:37;9204:53;;:::o;9263:157::-;9368:45;9388:24;9406:5;9388:24;:::i;:::-;9368:45;:::i;:::-;9363:3;9356:58;9346:74;;:::o;9426:109::-;9507:21;9522:5;9507:21;:::i;:::-;9502:3;9495:34;9485:50;;:::o;9541:118::-;9628:24;9646:5;9628:24;:::i;:::-;9623:3;9616:37;9606:53;;:::o;9665:157::-;9770:45;9790:24;9808:5;9790:24;:::i;:::-;9770:45;:::i;:::-;9765:3;9758:58;9748:74;;:::o;9828:360::-;9914:3;9942:38;9974:5;9942:38;:::i;:::-;9996:70;10059:6;10054:3;9996:70;:::i;:::-;9989:77;;10075:52;10120:6;10115:3;10108:4;10101:5;10097:16;10075:52;:::i;:::-;10152:29;10174:6;10152:29;:::i;:::-;10147:3;10143:39;10136:46;;9918:270;;;;;:::o;10194:364::-;10282:3;10310:39;10343:5;10310:39;:::i;:::-;10365:71;10429:6;10424:3;10365:71;:::i;:::-;10358:78;;10445:52;10490:6;10485:3;10478:4;10471:5;10467:16;10445:52;:::i;:::-;10522:29;10544:6;10522:29;:::i;:::-;10517:3;10513:39;10506:46;;10286:272;;;;;:::o;10564:377::-;10670:3;10698:39;10731:5;10698:39;:::i;:::-;10753:89;10835:6;10830:3;10753:89;:::i;:::-;10746:96;;10851:52;10896:6;10891:3;10884:4;10877:5;10873:16;10851:52;:::i;:::-;10928:6;10923:3;10919:16;10912:23;;10674:267;;;;;:::o;10947:366::-;11089:3;11110:67;11174:2;11169:3;11110:67;:::i;:::-;11103:74;;11186:93;11275:3;11186:93;:::i;:::-;11304:2;11299:3;11295:12;11288:19;;11093:220;;;:::o;11319:366::-;11461:3;11482:67;11546:2;11541:3;11482:67;:::i;:::-;11475:74;;11558:93;11647:3;11558:93;:::i;:::-;11676:2;11671:3;11667:12;11660:19;;11465:220;;;:::o;11691:402::-;11851:3;11872:85;11954:2;11949:3;11872:85;:::i;:::-;11865:92;;11966:93;12055:3;11966:93;:::i;:::-;12084:2;12079:3;12075:12;12068:19;;11855:238;;;:::o;12099:366::-;12241:3;12262:67;12326:2;12321:3;12262:67;:::i;:::-;12255:74;;12338:93;12427:3;12338:93;:::i;:::-;12456:2;12451:3;12447:12;12440:19;;12245:220;;;:::o;12471:366::-;12613:3;12634:67;12698:2;12693:3;12634:67;:::i;:::-;12627:74;;12710:93;12799:3;12710:93;:::i;:::-;12828:2;12823:3;12819:12;12812:19;;12617:220;;;:::o;12843:366::-;12985:3;13006:67;13070:2;13065:3;13006:67;:::i;:::-;12999:74;;13082:93;13171:3;13082:93;:::i;:::-;13200:2;13195:3;13191:12;13184:19;;12989:220;;;:::o;13215:366::-;13357:3;13378:67;13442:2;13437:3;13378:67;:::i;:::-;13371:74;;13454:93;13543:3;13454:93;:::i;:::-;13572:2;13567:3;13563:12;13556:19;;13361:220;;;:::o;13587:366::-;13729:3;13750:67;13814:2;13809:3;13750:67;:::i;:::-;13743:74;;13826:93;13915:3;13826:93;:::i;:::-;13944:2;13939:3;13935:12;13928:19;;13733:220;;;:::o;13959:366::-;14101:3;14122:67;14186:2;14181:3;14122:67;:::i;:::-;14115:74;;14198:93;14287:3;14198:93;:::i;:::-;14316:2;14311:3;14307:12;14300:19;;14105:220;;;:::o;14331:366::-;14473:3;14494:67;14558:2;14553:3;14494:67;:::i;:::-;14487:74;;14570:93;14659:3;14570:93;:::i;:::-;14688:2;14683:3;14679:12;14672:19;;14477:220;;;:::o;14703:366::-;14845:3;14866:67;14930:2;14925:3;14866:67;:::i;:::-;14859:74;;14942:93;15031:3;14942:93;:::i;:::-;15060:2;15055:3;15051:12;15044:19;;14849:220;;;:::o;15075:366::-;15217:3;15238:67;15302:2;15297:3;15238:67;:::i;:::-;15231:74;;15314:93;15403:3;15314:93;:::i;:::-;15432:2;15427:3;15423:12;15416:19;;15221:220;;;:::o;15447:366::-;15589:3;15610:67;15674:2;15669:3;15610:67;:::i;:::-;15603:74;;15686:93;15775:3;15686:93;:::i;:::-;15804:2;15799:3;15795:12;15788:19;;15593:220;;;:::o;15819:366::-;15961:3;15982:67;16046:2;16041:3;15982:67;:::i;:::-;15975:74;;16058:93;16147:3;16058:93;:::i;:::-;16176:2;16171:3;16167:12;16160:19;;15965:220;;;:::o;16191:366::-;16333:3;16354:67;16418:2;16413:3;16354:67;:::i;:::-;16347:74;;16430:93;16519:3;16430:93;:::i;:::-;16548:2;16543:3;16539:12;16532:19;;16337:220;;;:::o;16563:366::-;16705:3;16726:67;16790:2;16785:3;16726:67;:::i;:::-;16719:74;;16802:93;16891:3;16802:93;:::i;:::-;16920:2;16915:3;16911:12;16904:19;;16709:220;;;:::o;16935:366::-;17077:3;17098:67;17162:2;17157:3;17098:67;:::i;:::-;17091:74;;17174:93;17263:3;17174:93;:::i;:::-;17292:2;17287:3;17283:12;17276:19;;17081:220;;;:::o;17307:366::-;17449:3;17470:67;17534:2;17529:3;17470:67;:::i;:::-;17463:74;;17546:93;17635:3;17546:93;:::i;:::-;17664:2;17659:3;17655:12;17648:19;;17453:220;;;:::o;17679:366::-;17821:3;17842:67;17906:2;17901:3;17842:67;:::i;:::-;17835:74;;17918:93;18007:3;17918:93;:::i;:::-;18036:2;18031:3;18027:12;18020:19;;17825:220;;;:::o;18051:366::-;18193:3;18214:67;18278:2;18273:3;18214:67;:::i;:::-;18207:74;;18290:93;18379:3;18290:93;:::i;:::-;18408:2;18403:3;18399:12;18392:19;;18197:220;;;:::o;18423:366::-;18565:3;18586:67;18650:2;18645:3;18586:67;:::i;:::-;18579:74;;18662:93;18751:3;18662:93;:::i;:::-;18780:2;18775:3;18771:12;18764:19;;18569:220;;;:::o;18795:366::-;18937:3;18958:67;19022:2;19017:3;18958:67;:::i;:::-;18951:74;;19034:93;19123:3;19034:93;:::i;:::-;19152:2;19147:3;19143:12;19136:19;;18941:220;;;:::o;19167:366::-;19309:3;19330:67;19394:2;19389:3;19330:67;:::i;:::-;19323:74;;19406:93;19495:3;19406:93;:::i;:::-;19524:2;19519:3;19515:12;19508:19;;19313:220;;;:::o;19539:366::-;19681:3;19702:67;19766:2;19761:3;19702:67;:::i;:::-;19695:74;;19778:93;19867:3;19778:93;:::i;:::-;19896:2;19891:3;19887:12;19880:19;;19685:220;;;:::o;19911:366::-;20053:3;20074:67;20138:2;20133:3;20074:67;:::i;:::-;20067:74;;20150:93;20239:3;20150:93;:::i;:::-;20268:2;20263:3;20259:12;20252:19;;20057:220;;;:::o;20283:366::-;20425:3;20446:67;20510:2;20505:3;20446:67;:::i;:::-;20439:74;;20522:93;20611:3;20522:93;:::i;:::-;20640:2;20635:3;20631:12;20624:19;;20429:220;;;:::o;20655:366::-;20797:3;20818:67;20882:2;20877:3;20818:67;:::i;:::-;20811:74;;20894:93;20983:3;20894:93;:::i;:::-;21012:2;21007:3;21003:12;20996:19;;20801:220;;;:::o;21027:366::-;21169:3;21190:67;21254:2;21249:3;21190:67;:::i;:::-;21183:74;;21266:93;21355:3;21266:93;:::i;:::-;21384:2;21379:3;21375:12;21368:19;;21173:220;;;:::o;21399:118::-;21486:24;21504:5;21486:24;:::i;:::-;21481:3;21474:37;21464:53;;:::o;21523:157::-;21628:45;21648:24;21666:5;21648:24;:::i;:::-;21628:45;:::i;:::-;21623:3;21616:58;21606:74;;:::o;21686:112::-;21769:22;21785:5;21769:22;:::i;:::-;21764:3;21757:35;21747:51;;:::o;21804:698::-;22020:3;22035:75;22106:3;22097:6;22035:75;:::i;:::-;22135:2;22130:3;22126:12;22119:19;;22148:75;22219:3;22210:6;22148:75;:::i;:::-;22248:2;22243:3;22239:12;22232:19;;22268:95;22359:3;22350:6;22268:95;:::i;:::-;22261:102;;22373:75;22444:3;22435:6;22373:75;:::i;:::-;22473:2;22468:3;22464:12;22457:19;;22493:3;22486:10;;22024:478;;;;;;;:::o;22508:275::-;22640:3;22662:95;22753:3;22744:6;22662:95;:::i;:::-;22655:102;;22774:3;22767:10;;22644:139;;;;:::o;22789:435::-;22969:3;22991:95;23082:3;23073:6;22991:95;:::i;:::-;22984:102;;23103:95;23194:3;23185:6;23103:95;:::i;:::-;23096:102;;23215:3;23208:10;;22973:251;;;;;:::o;23230:522::-;23443:3;23465:148;23609:3;23465:148;:::i;:::-;23458:155;;23623:75;23694:3;23685:6;23623:75;:::i;:::-;23723:2;23718:3;23714:12;23707:19;;23743:3;23736:10;;23447:305;;;;:::o;23758:222::-;23851:4;23889:2;23878:9;23874:18;23866:26;;23902:71;23970:1;23959:9;23955:17;23946:6;23902:71;:::i;:::-;23856:124;;;;:::o;23986:640::-;24181:4;24219:3;24208:9;24204:19;24196:27;;24233:71;24301:1;24290:9;24286:17;24277:6;24233:71;:::i;:::-;24314:72;24382:2;24371:9;24367:18;24358:6;24314:72;:::i;:::-;24396;24464:2;24453:9;24449:18;24440:6;24396:72;:::i;:::-;24515:9;24509:4;24505:20;24500:2;24489:9;24485:18;24478:48;24543:76;24614:4;24605:6;24543:76;:::i;:::-;24535:84;;24186:440;;;;;;;:::o;24632:210::-;24719:4;24757:2;24746:9;24742:18;24734:26;;24770:65;24832:1;24821:9;24817:17;24808:6;24770:65;:::i;:::-;24724:118;;;;:::o;24848:222::-;24941:4;24979:2;24968:9;24964:18;24956:26;;24992:71;25060:1;25049:9;25045:17;25036:6;24992:71;:::i;:::-;24946:124;;;;:::o;25076:545::-;25249:4;25287:3;25276:9;25272:19;25264:27;;25301:71;25369:1;25358:9;25354:17;25345:6;25301:71;:::i;:::-;25382:68;25446:2;25435:9;25431:18;25422:6;25382:68;:::i;:::-;25460:72;25528:2;25517:9;25513:18;25504:6;25460:72;:::i;:::-;25542;25610:2;25599:9;25595:18;25586:6;25542:72;:::i;:::-;25254:367;;;;;;;:::o;25627:313::-;25740:4;25778:2;25767:9;25763:18;25755:26;;25827:9;25821:4;25817:20;25813:1;25802:9;25798:17;25791:47;25855:78;25928:4;25919:6;25855:78;:::i;:::-;25847:86;;25745:195;;;;:::o;25946:419::-;26112:4;26150:2;26139:9;26135:18;26127:26;;26199:9;26193:4;26189:20;26185:1;26174:9;26170:17;26163:47;26227:131;26353:4;26227:131;:::i;:::-;26219:139;;26117:248;;;:::o;26371:419::-;26537:4;26575:2;26564:9;26560:18;26552:26;;26624:9;26618:4;26614:20;26610:1;26599:9;26595:17;26588:47;26652:131;26778:4;26652:131;:::i;:::-;26644:139;;26542:248;;;:::o;26796:419::-;26962:4;27000:2;26989:9;26985:18;26977:26;;27049:9;27043:4;27039:20;27035:1;27024:9;27020:17;27013:47;27077:131;27203:4;27077:131;:::i;:::-;27069:139;;26967:248;;;:::o;27221:419::-;27387:4;27425:2;27414:9;27410:18;27402:26;;27474:9;27468:4;27464:20;27460:1;27449:9;27445:17;27438:47;27502:131;27628:4;27502:131;:::i;:::-;27494:139;;27392:248;;;:::o;27646:419::-;27812:4;27850:2;27839:9;27835:18;27827:26;;27899:9;27893:4;27889:20;27885:1;27874:9;27870:17;27863:47;27927:131;28053:4;27927:131;:::i;:::-;27919:139;;27817:248;;;:::o;28071:419::-;28237:4;28275:2;28264:9;28260:18;28252:26;;28324:9;28318:4;28314:20;28310:1;28299:9;28295:17;28288:47;28352:131;28478:4;28352:131;:::i;:::-;28344:139;;28242:248;;;:::o;28496:419::-;28662:4;28700:2;28689:9;28685:18;28677:26;;28749:9;28743:4;28739:20;28735:1;28724:9;28720:17;28713:47;28777:131;28903:4;28777:131;:::i;:::-;28769:139;;28667:248;;;:::o;28921:419::-;29087:4;29125:2;29114:9;29110:18;29102:26;;29174:9;29168:4;29164:20;29160:1;29149:9;29145:17;29138:47;29202:131;29328:4;29202:131;:::i;:::-;29194:139;;29092:248;;;:::o;29346:419::-;29512:4;29550:2;29539:9;29535:18;29527:26;;29599:9;29593:4;29589:20;29585:1;29574:9;29570:17;29563:47;29627:131;29753:4;29627:131;:::i;:::-;29619:139;;29517:248;;;:::o;29771:419::-;29937:4;29975:2;29964:9;29960:18;29952:26;;30024:9;30018:4;30014:20;30010:1;29999:9;29995:17;29988:47;30052:131;30178:4;30052:131;:::i;:::-;30044:139;;29942:248;;;:::o;30196:419::-;30362:4;30400:2;30389:9;30385:18;30377:26;;30449:9;30443:4;30439:20;30435:1;30424:9;30420:17;30413:47;30477:131;30603:4;30477:131;:::i;:::-;30469:139;;30367:248;;;:::o;30621:419::-;30787:4;30825:2;30814:9;30810:18;30802:26;;30874:9;30868:4;30864:20;30860:1;30849:9;30845:17;30838:47;30902:131;31028:4;30902:131;:::i;:::-;30894:139;;30792:248;;;:::o;31046:419::-;31212:4;31250:2;31239:9;31235:18;31227:26;;31299:9;31293:4;31289:20;31285:1;31274:9;31270:17;31263:47;31327:131;31453:4;31327:131;:::i;:::-;31319:139;;31217:248;;;:::o;31471:419::-;31637:4;31675:2;31664:9;31660:18;31652:26;;31724:9;31718:4;31714:20;31710:1;31699:9;31695:17;31688:47;31752:131;31878:4;31752:131;:::i;:::-;31744:139;;31642:248;;;:::o;31896:419::-;32062:4;32100:2;32089:9;32085:18;32077:26;;32149:9;32143:4;32139:20;32135:1;32124:9;32120:17;32113:47;32177:131;32303:4;32177:131;:::i;:::-;32169:139;;32067:248;;;:::o;32321:419::-;32487:4;32525:2;32514:9;32510:18;32502:26;;32574:9;32568:4;32564:20;32560:1;32549:9;32545:17;32538:47;32602:131;32728:4;32602:131;:::i;:::-;32594:139;;32492:248;;;:::o;32746:419::-;32912:4;32950:2;32939:9;32935:18;32927:26;;32999:9;32993:4;32989:20;32985:1;32974:9;32970:17;32963:47;33027:131;33153:4;33027:131;:::i;:::-;33019:139;;32917:248;;;:::o;33171:419::-;33337:4;33375:2;33364:9;33360:18;33352:26;;33424:9;33418:4;33414:20;33410:1;33399:9;33395:17;33388:47;33452:131;33578:4;33452:131;:::i;:::-;33444:139;;33342:248;;;:::o;33596:419::-;33762:4;33800:2;33789:9;33785:18;33777:26;;33849:9;33843:4;33839:20;33835:1;33824:9;33820:17;33813:47;33877:131;34003:4;33877:131;:::i;:::-;33869:139;;33767:248;;;:::o;34021:419::-;34187:4;34225:2;34214:9;34210:18;34202:26;;34274:9;34268:4;34264:20;34260:1;34249:9;34245:17;34238:47;34302:131;34428:4;34302:131;:::i;:::-;34294:139;;34192:248;;;:::o;34446:419::-;34612:4;34650:2;34639:9;34635:18;34627:26;;34699:9;34693:4;34689:20;34685:1;34674:9;34670:17;34663:47;34727:131;34853:4;34727:131;:::i;:::-;34719:139;;34617:248;;;:::o;34871:419::-;35037:4;35075:2;35064:9;35060:18;35052:26;;35124:9;35118:4;35114:20;35110:1;35099:9;35095:17;35088:47;35152:131;35278:4;35152:131;:::i;:::-;35144:139;;35042:248;;;:::o;35296:419::-;35462:4;35500:2;35489:9;35485:18;35477:26;;35549:9;35543:4;35539:20;35535:1;35524:9;35520:17;35513:47;35577:131;35703:4;35577:131;:::i;:::-;35569:139;;35467:248;;;:::o;35721:419::-;35887:4;35925:2;35914:9;35910:18;35902:26;;35974:9;35968:4;35964:20;35960:1;35949:9;35945:17;35938:47;36002:131;36128:4;36002:131;:::i;:::-;35994:139;;35892:248;;;:::o;36146:419::-;36312:4;36350:2;36339:9;36335:18;36327:26;;36399:9;36393:4;36389:20;36385:1;36374:9;36370:17;36363:47;36427:131;36553:4;36427:131;:::i;:::-;36419:139;;36317:248;;;:::o;36571:419::-;36737:4;36775:2;36764:9;36760:18;36752:26;;36824:9;36818:4;36814:20;36810:1;36799:9;36795:17;36788:47;36852:131;36978:4;36852:131;:::i;:::-;36844:139;;36742:248;;;:::o;36996:419::-;37162:4;37200:2;37189:9;37185:18;37177:26;;37249:9;37243:4;37239:20;37235:1;37224:9;37220:17;37213:47;37277:131;37403:4;37277:131;:::i;:::-;37269:139;;37167:248;;;:::o;37421:222::-;37514:4;37552:2;37541:9;37537:18;37529:26;;37565:71;37633:1;37622:9;37618:17;37609:6;37565:71;:::i;:::-;37519:124;;;;:::o;37649:129::-;37683:6;37710:20;;:::i;:::-;37700:30;;37739:33;37767:4;37759:6;37739:33;:::i;:::-;37690:88;;;:::o;37784:75::-;37817:6;37850:2;37844:9;37834:19;;37824:35;:::o;37865:307::-;37926:4;38016:18;38008:6;38005:30;38002:2;;;38038:18;;:::i;:::-;38002:2;38076:29;38098:6;38076:29;:::i;:::-;38068:37;;38160:4;38154;38150:15;38142:23;;37931:241;;;:::o;38178:308::-;38240:4;38330:18;38322:6;38319:30;38316:2;;;38352:18;;:::i;:::-;38316:2;38390:29;38412:6;38390:29;:::i;:::-;38382:37;;38474:4;38468;38464:15;38456:23;;38245:241;;;:::o;38492:98::-;38543:6;38577:5;38571:12;38561:22;;38550:40;;;:::o;38596:99::-;38648:6;38682:5;38676:12;38666:22;;38655:40;;;:::o;38701:168::-;38784:11;38818:6;38813:3;38806:19;38858:4;38853:3;38849:14;38834:29;;38796:73;;;;:::o;38875:169::-;38959:11;38993:6;38988:3;38981:19;39033:4;39028:3;39024:14;39009:29;;38971:73;;;;:::o;39050:148::-;39152:11;39189:3;39174:18;;39164:34;;;;:::o;39204:305::-;39244:3;39263:20;39281:1;39263:20;:::i;:::-;39258:25;;39297:20;39315:1;39297:20;:::i;:::-;39292:25;;39451:1;39383:66;39379:74;39376:1;39373:81;39370:2;;;39457:18;;:::i;:::-;39370:2;39501:1;39498;39494:9;39487:16;;39248:261;;;;:::o;39515:185::-;39555:1;39572:20;39590:1;39572:20;:::i;:::-;39567:25;;39606:20;39624:1;39606:20;:::i;:::-;39601:25;;39645:1;39635:2;;39650:18;;:::i;:::-;39635:2;39692:1;39689;39685:9;39680:14;;39557:143;;;;:::o;39706:191::-;39746:4;39766:20;39784:1;39766:20;:::i;:::-;39761:25;;39800:20;39818:1;39800:20;:::i;:::-;39795:25;;39839:1;39836;39833:8;39830:2;;;39844:18;;:::i;:::-;39830:2;39889:1;39886;39882:9;39874:17;;39751:146;;;;:::o;39903:96::-;39940:7;39969:24;39987:5;39969:24;:::i;:::-;39958:35;;39948:51;;;:::o;40005:90::-;40039:7;40082:5;40075:13;40068:21;40057:32;;40047:48;;;:::o;40101:77::-;40138:7;40167:5;40156:16;;40146:32;;;:::o;40184:149::-;40220:7;40260:66;40253:5;40249:78;40238:89;;40228:105;;;:::o;40339:126::-;40376:7;40416:42;40409:5;40405:54;40394:65;;40384:81;;;:::o;40471:77::-;40508:7;40537:5;40526:16;;40516:32;;;:::o;40554:86::-;40589:7;40629:4;40622:5;40618:16;40607:27;;40597:43;;;:::o;40646:154::-;40730:6;40725:3;40720;40707:30;40792:1;40783:6;40778:3;40774:16;40767:27;40697:103;;;:::o;40806:307::-;40874:1;40884:113;40898:6;40895:1;40892:13;40884:113;;;40983:1;40978:3;40974:11;40968:18;40964:1;40959:3;40955:11;40948:39;40920:2;40917:1;40913:10;40908:15;;40884:113;;;41015:6;41012:1;41009:13;41006:2;;;41095:1;41086:6;41081:3;41077:16;41070:27;41006:2;40855:258;;;;:::o;41119:320::-;41163:6;41200:1;41194:4;41190:12;41180:22;;41247:1;41241:4;41237:12;41268:18;41258:2;;41324:4;41316:6;41312:17;41302:27;;41258:2;41386;41378:6;41375:14;41355:18;41352:38;41349:2;;;41405:18;;:::i;:::-;41349:2;41170:269;;;;:::o;41445:281::-;41528:27;41550:4;41528:27;:::i;:::-;41520:6;41516:40;41658:6;41646:10;41643:22;41622:18;41610:10;41607:34;41604:62;41601:2;;;41669:18;;:::i;:::-;41601:2;41709:10;41705:2;41698:22;41488:238;;;:::o;41732:233::-;41771:3;41794:24;41812:5;41794:24;:::i;:::-;41785:33;;41840:66;41833:5;41830:77;41827:2;;;41910:18;;:::i;:::-;41827:2;41957:1;41950:5;41946:13;41939:20;;41775:190;;;:::o;41971:100::-;42010:7;42039:26;42059:5;42039:26;:::i;:::-;42028:37;;42018:53;;;:::o;42077:79::-;42116:7;42145:5;42134:16;;42124:32;;;:::o;42162:94::-;42201:7;42230:20;42244:5;42230:20;:::i;:::-;42219:31;;42209:47;;;:::o;42262:79::-;42301:7;42330:5;42319:16;;42309:32;;;:::o;42347:176::-;42379:1;42396:20;42414:1;42396:20;:::i;:::-;42391:25;;42430:20;42448:1;42430:20;:::i;:::-;42425:25;;42469:1;42459:2;;42474:18;;:::i;:::-;42459:2;42515:1;42512;42508:9;42503:14;;42381:142;;;;:::o;42529:180::-;42577:77;42574:1;42567:88;42674:4;42671:1;42664:15;42698:4;42695:1;42688:15;42715:180;42763:77;42760:1;42753:88;42860:4;42857:1;42850:15;42884:4;42881:1;42874:15;42901:180;42949:77;42946:1;42939:88;43046:4;43043:1;43036:15;43070:4;43067:1;43060:15;43087:180;43135:77;43132:1;43125:88;43232:4;43229:1;43222:15;43256:4;43253:1;43246:15;43273:102;43314:6;43365:2;43361:7;43356:2;43349:5;43345:14;43341:28;43331:38;;43321:54;;;:::o;43381:94::-;43414:8;43462:5;43458:2;43454:14;43433:35;;43423:52;;;:::o;43481:174::-;43621:26;43617:1;43609:6;43605:14;43598:50;43587:68;:::o;43661:181::-;43801:33;43797:1;43789:6;43785:14;43778:57;43767:75;:::o;43848:214::-;43988:66;43984:1;43976:6;43972:14;43965:90;43954:108;:::o;44068:230::-;44208:34;44204:1;44196:6;44192:14;44185:58;44277:13;44272:2;44264:6;44260:15;44253:38;44174:124;:::o;44304:237::-;44444:34;44440:1;44432:6;44428:14;44421:58;44513:20;44508:2;44500:6;44496:15;44489:45;44410:131;:::o;44547:161::-;44687:13;44683:1;44675:6;44671:14;44664:37;44653:55;:::o;44714:225::-;44854:34;44850:1;44842:6;44838:14;44831:58;44923:8;44918:2;44910:6;44906:15;44899:33;44820:119;:::o;44945:224::-;45085:34;45081:1;45073:6;45069:14;45062:58;45154:7;45149:2;45141:6;45137:15;45130:32;45051:118;:::o;45175:178::-;45315:30;45311:1;45303:6;45299:14;45292:54;45281:72;:::o;45359:223::-;45499:34;45495:1;45487:6;45483:14;45476:58;45568:6;45563:2;45555:6;45551:15;45544:31;45465:117;:::o;45588:175::-;45728:27;45724:1;45716:6;45712:14;45705:51;45694:69;:::o;45769:221::-;45909:34;45905:1;45897:6;45893:14;45886:58;45978:4;45973:2;45965:6;45961:15;45954:29;45875:115;:::o;45996:231::-;46136:34;46132:1;46124:6;46120:14;46113:58;46205:14;46200:2;46192:6;46188:15;46181:39;46102:125;:::o;46233:243::-;46373:34;46369:1;46361:6;46357:14;46350:58;46442:26;46437:2;46429:6;46425:15;46418:51;46339:137;:::o;46482:229::-;46622:34;46618:1;46610:6;46606:14;46599:58;46691:12;46686:2;46678:6;46674:15;46667:37;46588:123;:::o;46717:228::-;46857:34;46853:1;46845:6;46841:14;46834:58;46926:11;46921:2;46913:6;46909:15;46902:36;46823:122;:::o;46951:233::-;47091:34;47087:1;47079:6;47075:14;47068:58;47160:16;47155:2;47147:6;47143:15;47136:41;47057:127;:::o;47190:174::-;47330:26;47326:1;47318:6;47314:14;47307:50;47296:68;:::o;47370:221::-;47510:34;47506:1;47498:6;47494:14;47487:58;47579:4;47574:2;47566:6;47562:15;47555:29;47476:115;:::o;47597:182::-;47737:34;47733:1;47725:6;47721:14;47714:58;47703:76;:::o;47785:236::-;47925:34;47921:1;47913:6;47909:14;47902:58;47994:19;47989:2;47981:6;47977:15;47970:44;47891:130;:::o;48027:231::-;48167:34;48163:1;48155:6;48151:14;48144:58;48236:14;48231:2;48223:6;48219:15;48212:39;48133:125;:::o;48264:182::-;48404:34;48400:1;48392:6;48388:14;48381:58;48370:76;:::o;48452:234::-;48592:34;48588:1;48580:6;48576:14;48569:58;48661:17;48656:2;48648:6;48644:15;48637:42;48558:128;:::o;48692:220::-;48832:34;48828:1;48820:6;48816:14;48809:58;48901:3;48896:2;48888:6;48884:15;48877:28;48798:114;:::o;48918:161::-;49058:13;49054:1;49046:6;49042:14;49035:37;49024:55;:::o;49085:236::-;49225:34;49221:1;49213:6;49209:14;49202:58;49294:19;49289:2;49281:6;49277:15;49270:44;49191:130;:::o;49327:231::-;49467:34;49463:1;49455:6;49451:14;49444:58;49536:14;49531:2;49523:6;49519:15;49512:39;49433:125;:::o;49564:122::-;49637:24;49655:5;49637:24;:::i;:::-;49630:5;49627:35;49617:2;;49676:1;49673;49666:12;49617:2;49607:79;:::o;49692:116::-;49762:21;49777:5;49762:21;:::i;:::-;49755:5;49752:32;49742:2;;49798:1;49795;49788:12;49742:2;49732:76;:::o;49814:122::-;49887:24;49905:5;49887:24;:::i;:::-;49880:5;49877:35;49867:2;;49926:1;49923;49916:12;49867:2;49857:79;:::o;49942:120::-;50014:23;50031:5;50014:23;:::i;:::-;50007:5;50004:34;49994:2;;50052:1;50049;50042:12;49994:2;49984:78;:::o;50068:122::-;50141:24;50159:5;50141:24;:::i;:::-;50134:5;50131:35;50121:2;;50180:1;50177;50170:12;50121:2;50111:79;:::o

Swarm Source

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