ETH Price: $3,323.27 (-4.16%)
Gas: 8.04 Gwei

Voiceverse Origins (VVO)
 

Overview

TokenID

2961

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Voice for the Metaverse. 2nd Gen Voice NFTs each containing an animated Voician with a unique voice. 8,888 Origins enter the Voiceverse to give you unique AI-generated voice models. The AI voice model will be available for use across the metaverse for TTS.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Voiceverse

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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 v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// 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 v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (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 tokenId);

    /**
     * @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 v4.4.1 (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 overriden 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 || getApproved(tokenId) == spender || isApprovedForAll(owner, 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);
    }

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

    /**
     * @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 of token that is not own");
        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);
    }

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

// 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: voiceverse.sol


pragma solidity ^0.8.0;






contract Voiceverse is ERC721, ERC721Enumerable, Ownable {
    using Strings for uint256;
    
    mapping(string => bool) private saleStatus;
    
    constructor() ERC721("Voiceverse Origins", "VVO"){
        saleStatus["OGGEN"] = false;
        saleStatus["LTBOOST"] = false;
        saleStatus["WL"] = false;
        saleStatus["PUBLIC"] = false;
    }

    string public PROVENANCE = "46bfde45a6ee0b16d3e67789ce70f8dd2ceb399fe62c706ddce559aeb76859e4";

    uint256 public constant TOTAL_SUPPLY = 8888;
    uint256 public constant PUBLIC_MINT_PRICE = 0.10 ether;
    uint256 public constant OG_MINT_PRICE = 0.07 ether;
    uint256 public constant GENLT_MINT_PRICE = 0.08 ether;
    uint256 public constant WLBOOST_MINT_PRICE = 0.09 ether;
    uint8 public RESERVE_MINT = 200;
    uint8 public constant MAX_MINT = 3;

    string private baseURI;
    string private blindURI;
    string private pinataContractURI;
    bool public reveal = false;

    mapping(address => uint8) private _MINTCOUNTLIST;
    mapping(address => uint8) private _FREELIST;

    mapping(string => bytes32) private _MERKLEROOT;

    function setMerkleRoot(string memory role, bytes32 root) external onlyOwner {
        _MERKLEROOT[role]=root;
    }

    function getMerkleRoot(string memory role) external view returns (bytes32) {
        return _MERKLEROOT[role];
    }

    function revealNow() external onlyOwner {
        reveal = true;
    }

    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        PROVENANCE = provenanceHash;
    }

    function getProvenanceHash() external view returns (string memory){
        return PROVENANCE;
    }

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

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

    function contractURI() public view returns (string memory) {
        return pinataContractURI;
    }

    function setContractURI(string memory URI) external onlyOwner{
        pinataContractURI=URI;
    }
    
    function setBlindURI(string memory _blindURI) external onlyOwner {
        blindURI = _blindURI;
    }

    function getBlindURI() external view returns (string memory) {
        return blindURI;
    }

    function setBaseURI(string memory _URI) external onlyOwner {
        baseURI = _URI;
    }

    function getBaseURI() external view returns (string memory) {
        return baseURI;
    }

    function publicMintTo(uint8 _mintAmount) public payable {
        require(saleStatus["Public"], "Public sale is not active.");
        uint256 ts = totalSupply();
        require(ts+_mintAmount <= TOTAL_SUPPLY, "Max supply reached");
        require(_mintAmount <= MAX_MINT, "Max number of mint per attempt reached");
        require(msg.value == _mintAmount * PUBLIC_MINT_PRICE, "Transaction value did not equal the mint price");

        _MINTCOUNTLIST[msg.sender] += _mintAmount;

        for (uint256 i = 0; i < _mintAmount; i++) {
            _safeMint(msg.sender, ts + i);
        }
        
    }

    function presaleWLMintTo(uint8 _mintAmount, bytes32[] calldata _merkleProof) public payable {
        require(saleStatus["WL"], "WL Presale is not active.");
        uint256 ts = totalSupply();
        require(ts + _mintAmount <= TOTAL_SUPPLY, "Max supply reached");

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(_merkleProof, _MERKLEROOT['WL'], leaf), "Invalid Proof");

        require(_MINTCOUNTLIST[msg.sender]+_mintAmount <= 3, "Max mint per wallet reached");
        require(msg.value == _mintAmount * WLBOOST_MINT_PRICE, "Transaction value did not equal the mint price");

        _MINTCOUNTLIST[msg.sender] += _mintAmount;

        for (uint256 i = 0; i < _mintAmount; i++) {
            _safeMint(msg.sender, ts + i);
        }
    }

    function presaleLTBoostMintTo(uint8 _mintAmount, bytes32[] calldata _merkleProof) public payable {
        require(saleStatus["LTBOOST"], "LT Booster Presale is not active.");
        uint256 ts = totalSupply();
        require(ts + _mintAmount <= TOTAL_SUPPLY, "Max supply reached");
        require(_MINTCOUNTLIST[msg.sender]+_mintAmount <= 3, "Max mint per wallet reached");
        
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        if (MerkleProof.verify(_merkleProof, _MERKLEROOT['LT'], leaf)){
            require(msg.value == _mintAmount * GENLT_MINT_PRICE, "Transaction value did not equal the GENLT mint price");
        } else if (MerkleProof.verify(_merkleProof, _MERKLEROOT['BOOST'], leaf)){
            require(msg.value == _mintAmount * WLBOOST_MINT_PRICE, "Transaction value did not equal the WLBOOST mint price");
        } else {
            require(MerkleProof.verify(_merkleProof, _MERKLEROOT['LT'], leaf), "Invalid Proof");
        }

        _MINTCOUNTLIST[msg.sender] += _mintAmount;

        for (uint256 i = 0; i < _mintAmount; i++) {
            _safeMint(msg.sender, ts + i);
        }
    }

    function presaleOGGenMintTo(uint8 _mintAmount, bytes32[] calldata _merkleProof) public payable {
        require(saleStatus["OGGEN"], "OG Gen presale is not active.");
        uint256 ts = totalSupply();
        require(ts + _mintAmount <= TOTAL_SUPPLY, "Max supply reached");
        require(_MINTCOUNTLIST[msg.sender]+_mintAmount <= 3, "Max mint per wallet reached");
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

        if (MerkleProof.verify(_merkleProof, _MERKLEROOT['OG'], leaf)){
            require(msg.value == _mintAmount * OG_MINT_PRICE, "Transaction value did not equal the OG mint price");
        } else if (MerkleProof.verify(_merkleProof, _MERKLEROOT['GEN'], leaf)){
            require(msg.value == _mintAmount * GENLT_MINT_PRICE, "Transaction value did not equal the GENLT mint price");
        } else {
            require(MerkleProof.verify(_merkleProof, _MERKLEROOT['OG'], leaf), "Invalid Proof");
        }
        
        _MINTCOUNTLIST[msg.sender] += _mintAmount;
        
        for (uint256 i = 0; i < _mintAmount; i++) {
            _safeMint(msg.sender, ts + i);    
        }
    }

    function freeMintTo(uint8 _mintAmount, bytes32[] calldata _merkleProof) public payable {
        require(saleStatus["OGGEN"], "OG Gen presale is not active.");
        uint256 ts = totalSupply();
        require(ts + _mintAmount <= TOTAL_SUPPLY, "Max supply reached");

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(_merkleProof, _MERKLEROOT['FREE'], leaf), "Invalid Proof");

        require(_FREELIST[msg.sender]+_mintAmount <= 1, "Max mint per wallet reached");
        
        _FREELIST[msg.sender] += _mintAmount;

        for (uint256 i = 0; i < _mintAmount; i++) {
            _safeMint(msg.sender, ts + i);
        }
    }

    function getFreeCount(address candidate) external view returns (uint8){
        return _FREELIST[candidate];
    }

    function reserveMintTo(uint8 _mintAmount) public payable onlyOwner{
        uint256 ts = totalSupply();
        require(ts + _mintAmount <= TOTAL_SUPPLY, "Max supply reached");
        require(RESERVE_MINT>0, "Reserve is gone");
        require(RESERVE_MINT-_mintAmount>=0, "Not enough reserves left");
        require(msg.value == _mintAmount * PUBLIC_MINT_PRICE, "Transaction value did not equal the mint price");
        
        RESERVE_MINT-=_mintAmount;
        for (uint256 i = 0; i < _mintAmount; i++) {
            _safeMint(msg.sender, ts + i);
        }
    }

    function getReserveCount() external view returns (uint8){
        return RESERVE_MINT;
    }

    function checkRoleType(bytes32[] calldata _merkleProof) external view returns (string memory){
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        if (MerkleProof.verify(_merkleProof, _MERKLEROOT['OG'], leaf)){
            return "OG";
        } else if (MerkleProof.verify(_merkleProof, _MERKLEROOT['GEN'], leaf)){
            return "GEN";
        } else if (MerkleProof.verify(_merkleProof, _MERKLEROOT['LT'], leaf)){
            return "LT";
        } else if (MerkleProof.verify(_merkleProof, _MERKLEROOT['BOOST'], leaf)){
            return "BOOST";
        } else if (MerkleProof.verify(_merkleProof, _MERKLEROOT['WL'], leaf)){
            return "WL";
        } else {
            return "NOROLE";
        }
    }

    //setting sale status
    function setStatus(string memory status, bool onoff) external onlyOwner {
        saleStatus[status]=onoff;
    }

    function getStatus(string memory status) external view returns (bool){
        return saleStatus[status];
    }

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

    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
        if (!reveal) {
            return string(abi.encodePacked(blindURI));
        } else {
            return string(abi.encodePacked(baseURI, _tokenId.toString()));
        }
    }

    function withdraw() external onlyOwner {
        uint balance = getBalance();
        payable(msg.sender).transfer(balance);
    }

    function withdrawAmount(uint amount) external payable onlyOwner {
        require(amount <= getBalance());
        payable(msg.sender).transfer(amount);
    }

    function getBalance() public view returns (uint) {
        return address(this).balance;
    }

    function getMintCount(address candidate) public view returns (uint8) {
        return _MINTCOUNTLIST[candidate];
    }

    }

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":[],"name":"GENLT_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OG_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVE_MINT","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WLBOOST_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"checkRoleType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"freeMintTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBlindURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"candidate","type":"address"}],"name":"getFreeCount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"role","type":"string"}],"name":"getMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"candidate","type":"address"}],"name":"getMintCount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProvenanceHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserveCount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"status","type":"string"}],"name":"getStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"presaleLTBoostMintTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"presaleOGGenMintTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"presaleWLMintTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"}],"name":"publicMintTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"}],"name":"reserveMintTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealNow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_blindURI","type":"string"}],"name":"setBlindURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"role","type":"string"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"status","type":"string"},{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setStatus","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawAmount","outputs":[],"stateMutability":"payable","type":"function"}]

60e0604090815260808181529062003fed60a03980516200002991600c91602090910190620001fd565b50600d805460ff1990811660c8179091556011805490911690553480156200005057600080fd5b506040805180820182526012815271566f6963657665727365204f726967696e7360701b60208083019182528351808501909452600384526256564f60e81b908401528151919291620000a691600091620001fd565b508051620000bc906001906020840190620001fd565b505050620000d9620000d3620001a760201b60201c565b620001ab565b6000600b604051620000eb90620002c3565b908152604051908190036020018120805492151560ff1990931692909217909155600090600b906200011d90620002d4565b908152604051908190036020018120805492151560ff1990931692909217909155600090600b906200014f90620002b5565b908152604051908190036020018120805492151560ff1990931692909217909155600090600b906200018190620002a3565b908152604051908190036020019020805491151560ff1990921691909117905562000324565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200020b90620002e7565b90600052602060002090601f0160209004810192826200022f57600085556200027a565b82601f106200024a57805160ff19168380011785556200027a565b828001600101855582156200027a579182015b828111156200027a5782518255916020019190600101906200025d565b50620002889291506200028c565b5090565b5b808211156200028857600081556001016200028d565b655055424c494360d01b815260060190565b6115d360f21b815260020190565b6427a3a3a2a760d91b815260050190565b6613151093d3d4d560ca1b815260070190565b600281046001821680620002fc57607f821691505b602082108114156200031e57634e487b7160e01b600052602260045260246000fd5b50919050565b613cb980620003346000396000f3fe6080604052600436106103355760003560e01c8063715018a6116101ab578063b88d4fde116100f7578063df281d4711610095578063ea3af4f51161006f578063ea3af4f51461089c578063f0292a03146108af578063f2fde38b146108c4578063f48c7673146108e457610335565b8063df281d4714610847578063e8a3d48514610867578063e985e9c51461087c57610335565b8063c27c959d116100d1578063c27c959d146107df578063c87b56dd146107f4578063cba676d714610814578063d8dea22c1461083457610335565b8063b88d4fde1461077f578063ba0a06431461079f578063c1363518146107bf57610335565b80639980654611610164578063a475b5dd1161013e578063a475b5dd14610720578063a5c1c8a714610735578063af4157371461074a578063b7aafa871461075f57610335565b806399806546146106be578063a22cb465146106e0578063a2801f571461070057610335565b8063715018a6146106355780638da5cb5b1461064a578063902d55a51461065f578063938e3d7b1461067457806394b3fbc21461069457806395d89b41146106a957610335565b806339d81c2c1161028557806355f804b3116102235780636373a6b1116101fd5780636373a6b1146105d65780636bde2627146105eb57806370a0823114610600578063714c53981461062057610335565b806355f804b3146105815780635f0f45b2146105a15780636352211e146105b657610335565b806343f029891161025f57806343f029891461051b57806344a9d4eb1461053b578063498c71f21461054e5780634f6ccce71461056157610335565b806339d81c2c146104d15780633ccfd60b146104e657806342842e0e146104fb57610335565b806312065fe0116102f257806322b05ed2116102cc57806322b05ed21461045e57806323b872dd1461047e57806327569f3c1461049e5780632f745c59146104b157610335565b806312065fe0146104145780631225cffd1461043657806318160ddd1461044957610335565b806301ffc9a71461033a5780630562b9f71461037057806306fdde0314610385578063081812fc146103a7578063095ea7b3146103d457806310969523146103f4575b600080fd5b34801561034657600080fd5b5061035a610355366004612ee5565b6108f9565b6040516103679190613276565b60405180910390f35b61038361037e366004612fd6565b61090c565b005b34801561039157600080fd5b5061039a610999565b604051610367919061328a565b3480156103b357600080fd5b506103c76103c2366004612fd6565b610a2b565b6040516103679190613225565b3480156103e057600080fd5b506103836103ef366004612e7c565b610a6e565b34801561040057600080fd5b5061038361040f366004612f1d565b610b06565b34801561042057600080fd5b50610429610b58565b6040516103679190613281565b610383610444366004612fee565b610b5c565b34801561045557600080fd5b50610429610c97565b34801561046a57600080fd5b5061035a610479366004612f1d565b610c9d565b34801561048a57600080fd5b50610383610499366004612d9f565b610cc9565b6103836104ac366004613008565b610d01565b3480156104bd57600080fd5b506104296104cc366004612e7c565b610ecb565b3480156104dd57600080fd5b50610429610f20565b3480156104f257600080fd5b50610383610f2c565b34801561050757600080fd5b50610383610516366004612d9f565b610fa5565b34801561052757600080fd5b50610429610536366004612f1d565b610fc0565b610383610549366004613008565b610fe8565b61038361055c366004612fee565b611294565b34801561056d57600080fd5b5061042961057c366004612fd6565b6113f5565b34801561058d57600080fd5b5061038361059c366004612f1d565b611450565b3480156105ad57600080fd5b506103836114a2565b3480156105c257600080fd5b506103c76105d1366004612fd6565b6114f0565b3480156105e257600080fd5b5061039a611525565b3480156105f757600080fd5b506104296115b3565b34801561060c57600080fd5b5061042961061b366004612d53565b6115bf565b34801561062c57600080fd5b5061039a611603565b34801561064157600080fd5b50610383611612565b34801561065657600080fd5b506103c761165d565b34801561066b57600080fd5b5061042961166c565b34801561068057600080fd5b5061038361068f366004612f1d565b611672565b3480156106a057600080fd5b5061039a6116c4565b3480156106b557600080fd5b5061039a6116d3565b3480156106ca57600080fd5b506106d36116e2565b6040516103679190613ab1565b3480156106ec57600080fd5b506103836106fb366004612e53565b6116eb565b34801561070c57600080fd5b506106d361071b366004612d53565b6116fd565b34801561072c57600080fd5b5061035a61171b565b34801561074157600080fd5b5061039a611724565b34801561075657600080fd5b506106d3611733565b34801561076b57600080fd5b5061038361077a366004612f93565b61173c565b34801561078b57600080fd5b5061038361079a366004612dda565b6117a0565b3480156107ab57600080fd5b506103836107ba366004612f1d565b6117df565b3480156107cb57600080fd5b506106d36107da366004612d53565b611831565b3480156107eb57600080fd5b5061042961184f565b34801561080057600080fd5b5061039a61080f366004612fd6565b61185b565b34801561082057600080fd5b5061038361082f366004612f50565b6118d0565b610383610842366004613008565b611944565b34801561085357600080fd5b5061039a610862366004612ea5565b611b24565b34801561087357600080fd5b5061039a611d8b565b34801561088857600080fd5b5061035a610897366004612d6d565b611d9a565b6103836108aa366004613008565b611dc8565b3480156108bb57600080fd5b506106d3612073565b3480156108d057600080fd5b506103836108df366004612d53565b612078565b3480156108f057600080fd5b506104296120e9565b6000610904826120f4565b90505b919050565b610914612119565b6001600160a01b031661092561165d565b6001600160a01b0316146109545760405162461bcd60e51b815260040161094b906137b3565b60405180910390fd5b61095c610b58565b81111561096857600080fd5b604051339082156108fc029083906000818181858888f19350505050158015610995573d6000803e3d6000fd5b5050565b6060600080546109a890613ba1565b80601f01602080910402602001604051908101604052809291908181526020018280546109d490613ba1565b8015610a215780601f106109f657610100808354040283529160200191610a21565b820191906000526020600020905b815481529060010190602001808311610a0457829003601f168201915b5050505050905090565b6000610a368261211d565b610a525760405162461bcd60e51b815260040161094b90613767565b506000908152600460205260409020546001600160a01b031690565b6000610a79826114f0565b9050806001600160a01b0316836001600160a01b03161415610aad5760405162461bcd60e51b815260040161094b906138bf565b806001600160a01b0316610abf612119565b6001600160a01b03161480610adb5750610adb81610897612119565b610af75760405162461bcd60e51b815260040161094b90613601565b610b01838361213a565b505050565b610b0e612119565b6001600160a01b0316610b1f61165d565b6001600160a01b031614610b455760405162461bcd60e51b815260040161094b906137b3565b805161099590600c906020840190612ba3565b4790565b600b604051610b6a90613205565b9081526040519081900360200190205460ff16610b995760405162461bcd60e51b815260040161094b90613490565b6000610ba3610c97565b90506122b8610bb560ff841683613acb565b1115610bd35760405162461bcd60e51b815260040161094b90613995565b600360ff83161115610bf75760405162461bcd60e51b815260040161094b90613a6b565b610c0c67016345785d8a000060ff8416613b1c565b3414610c2a5760405162461bcd60e51b815260040161094b90613542565b3360009081526012602052604081208054849290610c4c90849060ff16613ae3565b92506101000a81548160ff021916908360ff16021790555060005b8260ff16811015610b0157610c8533610c808385613acb565b6121a8565b80610c8f81613bdc565b915050610c67565b60085490565b6000600b82604051610caf9190613148565b9081526040519081900360200190205460ff169050919050565b610cda610cd4612119565b826121c2565b610cf65760405162461bcd60e51b815260040161094b90613944565b610b01838383612247565b600b604051610d0f906131e1565b9081526040519081900360200190205460ff16610d3e5760405162461bcd60e51b815260040161094b9061329d565b6000610d48610c97565b90506122b8610d5a60ff861683613acb565b1115610d785760405162461bcd60e51b815260040161094b90613995565b600033604051602001610d8b919061311d565b604051602081830303815290604052805190602001209050610dfd8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de89150613195565b90815260200160405180910390205483612374565b610e195760405162461bcd60e51b815260040161094b90613a0d565b33600090815260136020526040902054600190610e3a90879060ff16613ae3565b60ff161115610e5b5760405162461bcd60e51b815260040161094b906135ca565b3360009081526013602052604081208054879290610e7d90849060ff16613ae3565b92506101000a81548160ff021916908360ff16021790555060005b8560ff16811015610ec357610eb133610c808386613acb565b80610ebb81613bdc565b915050610e98565b505050505050565b6000610ed6836115bf565b8210610ef45760405162461bcd60e51b815260040161094b9061333f565b506001600160a01b03821660009081526006602090815260408083208484529091529020545b92915050565b67011c37937e08000081565b610f34612119565b6001600160a01b0316610f4561165d565b6001600160a01b031614610f6b5760405162461bcd60e51b815260040161094b906137b3565b6000610f75610b58565b604051909150339082156108fc029083906000818181858888f19350505050158015610995573d6000803e3d6000fd5b610b01838383604051806020016040528060008152506117a0565b6000601482604051610fd29190613148565b9081526020016040518091039020549050919050565b600b604051610ff6906131f2565b9081526040519081900360200190205460ff166110255760405162461bcd60e51b815260040161094b906136f1565b600061102f610c97565b90506122b861104160ff861683613acb565b111561105f5760405162461bcd60e51b815260040161094b90613995565b3360009081526012602052604090205460039061108090869060ff16613ae3565b60ff1611156110a15760405162461bcd60e51b815260040161094b906135ca565b6000336040516020016110b4919061311d565b6040516020818303038152906040528051906020012090506111118484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de891506131b4565b1561114e5761112b67011c37937e08000060ff8716613b1c565b34146111495760405162461bcd60e51b815260040161094b906132d4565b61122c565b6111938484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de891506131c2565b156111cb576111ad67013fbe85edc9000060ff8716613b1c565b34146111495760405162461bcd60e51b815260040161094b90613900565b6112108484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de891506131b4565b61122c5760405162461bcd60e51b815260040161094b90613a0d565b336000908152601260205260408120805487929061124e90849060ff16613ae3565b92506101000a81548160ff021916908360ff16021790555060005b8560ff16811015610ec35761128233610c808386613acb565b8061128c81613bdc565b915050611269565b61129c612119565b6001600160a01b03166112ad61165d565b6001600160a01b0316146112d35760405162461bcd60e51b815260040161094b906137b3565b60006112dd610c97565b90506122b86112ef60ff841683613acb565b111561130d5760405162461bcd60e51b815260040161094b90613995565b600d5460ff1661132f5760405162461bcd60e51b815260040161094b90613316565b600d5460009061134390849060ff16613b52565b60ff1610156113645760405162461bcd60e51b815260040161094b90613a34565b61137967016345785d8a000060ff8416613b1c565b34146113975760405162461bcd60e51b815260040161094b90613542565b600d80548391906000906113af90849060ff16613b52565b92506101000a81548160ff021916908360ff16021790555060005b8260ff16811015610b01576113e333610c808385613acb565b806113ed81613bdc565b9150506113ca565b60006113ff610c97565b821061141d5760405162461bcd60e51b815260040161094b906139c1565b6008828154811061143e57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b611458612119565b6001600160a01b031661146961165d565b6001600160a01b03161461148f5760405162461bcd60e51b815260040161094b906137b3565b805161099590600e906020840190612ba3565b6114aa612119565b6001600160a01b03166114bb61165d565b6001600160a01b0316146114e15760405162461bcd60e51b815260040161094b906137b3565b6011805460ff19166001179055565b6000818152600260205260408120546001600160a01b0316806109045760405162461bcd60e51b815260040161094b906136a8565b600c805461153290613ba1565b80601f016020809104026020016040519081016040528092919081815260200182805461155e90613ba1565b80156115ab5780601f10611580576101008083540402835291602001916115ab565b820191906000526020600020905b81548152906001019060200180831161158e57829003601f168201915b505050505081565b67016345785d8a000081565b60006001600160a01b0382166115e75760405162461bcd60e51b815260040161094b9061365e565b506001600160a01b031660009081526003602052604090205490565b6060600e80546109a890613ba1565b61161a612119565b6001600160a01b031661162b61165d565b6001600160a01b0316146116515760405162461bcd60e51b815260040161094b906137b3565b61165b600061238a565b565b600a546001600160a01b031690565b6122b881565b61167a612119565b6001600160a01b031661168b61165d565b6001600160a01b0316146116b15760405162461bcd60e51b815260040161094b906137b3565b8051610995906010906020840190612ba3565b6060600c80546109a890613ba1565b6060600180546109a890613ba1565b600d5460ff1690565b6109956116f6612119565b83836123dc565b6001600160a01b031660009081526012602052604090205460ff1690565b60115460ff1681565b6060600f80546109a890613ba1565b600d5460ff1681565b611744612119565b6001600160a01b031661175561165d565b6001600160a01b03161461177b5760405162461bcd60e51b815260040161094b906137b3565b8060148360405161178c9190613148565b908152604051908190036020019020555050565b6117b16117ab612119565b836121c2565b6117cd5760405162461bcd60e51b815260040161094b90613944565b6117d98484848461247f565b50505050565b6117e7612119565b6001600160a01b03166117f861165d565b6001600160a01b03161461181e5760405162461bcd60e51b815260040161094b906137b3565b805161099590600f906020840190612ba3565b6001600160a01b031660009081526013602052604090205460ff1690565b67013fbe85edc9000081565b60606118668261211d565b6118825760405162461bcd60e51b815260040161094b90613831565b60115460ff166118b457600f60405160200161189e9190613164565b6040516020818303038152906040529050610907565b600e6118bf836124b2565b60405160200161189e929190613170565b6118d8612119565b6001600160a01b03166118e961165d565b6001600160a01b03161461190f5760405162461bcd60e51b815260040161094b906137b3565b80600b836040516119209190613148565b908152604051908190036020019020805491151560ff199092169190911790555050565b600b604051611952906131d3565b9081526040519081900360200190205460ff166119815760405162461bcd60e51b815260040161094b90613422565b600061198b610c97565b90506122b861199d60ff861683613acb565b11156119bb5760405162461bcd60e51b815260040161094b90613995565b6000336040516020016119ce919061311d565b604051602081830303815290604052805190602001209050611a2b8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de891506131d3565b611a475760405162461bcd60e51b815260040161094b90613a0d565b33600090815260126020526040902054600390611a6890879060ff16613ae3565b60ff161115611a895760405162461bcd60e51b815260040161094b906135ca565b611a9e67013fbe85edc9000060ff8716613b1c565b3414611abc5760405162461bcd60e51b815260040161094b90613542565b3360009081526012602052604081208054879290611ade90849060ff16613ae3565b92506101000a81548160ff021916908360ff16021790555060005b8560ff16811015610ec357611b1233610c808386613acb565b80611b1c81613bdc565b915050611af9565b6060600033604051602001611b39919061311d565b604051602081830303815290604052805190602001209050611b968484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de89150613217565b15611bbb5750506040805180820190915260028152614f4760f01b6020820152610f1a565b611c008484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de891506131a5565b15611c2657505060408051808201909152600381526223a2a760e91b6020820152610f1a565b611c6b8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de891506131b4565b15611c90575050604080518082019091526002815261131560f21b6020820152610f1a565b611cd58484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de891506131c2565b15611cfd5750506040805180820190915260058152641093d3d4d560da1b6020820152610f1a565b611d428484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de891506131d3565b15611d6757505060408051808201909152600281526115d360f21b6020820152610f1a565b50506040805180820190915260068152654e4f524f4c4560d01b6020820152610f1a565b6060601080546109a890613ba1565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600b604051611dd6906131e1565b9081526040519081900360200190205460ff16611e055760405162461bcd60e51b815260040161094b9061329d565b6000611e0f610c97565b90506122b8611e2160ff861683613acb565b1115611e3f5760405162461bcd60e51b815260040161094b90613995565b33600090815260126020526040902054600390611e6090869060ff16613ae3565b60ff161115611e815760405162461bcd60e51b815260040161094b906135ca565b600033604051602001611e94919061311d565b604051602081830303815290604052805190602001209050611ef18484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de89150613217565b15611f2d57611f0a66f8b0a10e47000060ff8716613b1c565b3414611f285760405162461bcd60e51b815260040161094b90613880565b61200b565b611f728484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de891506131a5565b15611faa57611f8c67011c37937e08000060ff8716613b1c565b3414611f285760405162461bcd60e51b815260040161094b906132d4565b611fef8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de89150613217565b61200b5760405162461bcd60e51b815260040161094b90613a0d565b336000908152601260205260408120805487929061202d90849060ff16613ae3565b92506101000a81548160ff021916908360ff16021790555060005b8560ff16811015610ec35761206133610c808386613acb565b8061206b81613bdc565b915050612048565b600381565b612080612119565b6001600160a01b031661209161165d565b6001600160a01b0316146120b75760405162461bcd60e51b815260040161094b906137b3565b6001600160a01b0381166120dd5760405162461bcd60e51b815260040161094b906133dc565b6120e68161238a565b50565b66f8b0a10e47000081565b60006001600160e01b0319821663780e9d6360e01b14806109045750610904826125cd565b3390565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061216f826114f0565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61099582826040518060200160405280600081525061260d565b60006121cd8261211d565b6121e95760405162461bcd60e51b815260040161094b9061357e565b60006121f4836114f0565b9050806001600160a01b0316846001600160a01b0316148061222f5750836001600160a01b031661222484610a2b565b6001600160a01b0316145b8061223f575061223f8185611d9a565b949350505050565b826001600160a01b031661225a826114f0565b6001600160a01b0316146122805760405162461bcd60e51b815260040161094b906137e8565b6001600160a01b0382166122a65760405162461bcd60e51b815260040161094b906134c7565b6122b1838383612640565b6122bc60008261213a565b6001600160a01b03831660009081526003602052604081208054600192906122e5908490613b3b565b90915550506001600160a01b0382166000908152600360205260408120805460019290612313908490613acb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600082612381858461264b565b14949350505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561240e5760405162461bcd60e51b815260040161094b9061350b565b6001600160a01b0383811660008181526005602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190612472908590613276565b60405180910390a3505050565b61248a848484612247565b61249684848484612703565b6117d95760405162461bcd60e51b815260040161094b9061338a565b6060816124d757506040805180820190915260018152600360fc1b6020820152610907565b8160005b811561250157806124eb81613bdc565b91506124fa9050600a83613b08565b91506124db565b60008167ffffffffffffffff81111561252a57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612554576020820181803683370190505b5090505b841561223f57612569600183613b3b565b9150612576600a86613bf7565b612581906030613acb565b60f81b8183815181106125a457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506125c6600a86613b08565b9450612558565b60006001600160e01b031982166380ac58cd60e01b14806125fe57506001600160e01b03198216635b5e139f60e01b145b8061090457506109048261281e565b6126178383612837565b6126246000848484612703565b610b015760405162461bcd60e51b815260040161094b9061338a565b610b01838383612916565b600081815b84518110156126fb57600085828151811061267b57634e487b7160e01b600052603260045260246000fd5b602002602001015190508083116126bc57828160405160200161269f92919061313a565b6040516020818303038152906040528051906020012092506126e8565b80836040516020016126cf92919061313a565b6040516020818303038152906040528051906020012092505b50806126f381613bdc565b915050612650565b509392505050565b6000612717846001600160a01b031661299f565b1561281357836001600160a01b031663150b7a02612733612119565b8786866040518563ffffffff1660e01b81526004016127559493929190613239565b602060405180830381600087803b15801561276f57600080fd5b505af192505050801561279f575060408051601f3d908101601f1916820190925261279c91810190612f01565b60015b6127f9573d8080156127cd576040519150601f19603f3d011682016040523d82523d6000602084013e6127d2565b606091505b5080516127f15760405162461bcd60e51b815260040161094b9061338a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061223f565b506001949350505050565b6001600160e01b031981166301ffc9a760e01b14919050565b6001600160a01b03821661285d5760405162461bcd60e51b815260040161094b90613732565b6128668161211d565b156128835760405162461bcd60e51b815260040161094b90613459565b61288f60008383612640565b6001600160a01b03821660009081526003602052604081208054600192906128b8908490613acb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b612921838383610b01565b6001600160a01b03831661293d57612938816129a5565b612960565b816001600160a01b0316836001600160a01b0316146129605761296083826129e9565b6001600160a01b03821661297c5761297781612a86565b610b01565b826001600160a01b0316826001600160a01b031614610b0157610b018282612b5f565b3b151590565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b600060016129f6846115bf565b612a009190613b3b565b600083815260076020526040902054909150808214612a53576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612a9890600190613b3b565b60008381526009602052604081205460088054939450909284908110612ace57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110612afd57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612b4357634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612b6a836115bf565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612baf90613ba1565b90600052602060002090601f016020900481019282612bd15760008555612c17565b82601f10612bea57805160ff1916838001178555612c17565b82800160010185558215612c17579182015b82811115612c17578251825591602001919060010190612bfc565b50612c23929150612c27565b5090565b5b80821115612c235760008155600101612c28565b600067ffffffffffffffff80841115612c5757612c57613c37565b604051601f8501601f191681016020018281118282101715612c7b57612c7b613c37565b604052848152915081838501861015612c9357600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b038116811461090757600080fd5b60008083601f840112612cd4578081fd5b50813567ffffffffffffffff811115612ceb578182fd5b6020830191508360208083028501011115612d0557600080fd5b9250929050565b8035801515811461090757600080fd5b600082601f830112612d2c578081fd5b612d3b83833560208501612c3c565b9392505050565b803560ff8116811461090757600080fd5b600060208284031215612d64578081fd5b612d3b82612cac565b60008060408385031215612d7f578081fd5b612d8883612cac565b9150612d9660208401612cac565b90509250929050565b600080600060608486031215612db3578081fd5b612dbc84612cac565b9250612dca60208501612cac565b9150604084013590509250925092565b60008060008060808587031215612def578081fd5b612df885612cac565b9350612e0660208601612cac565b925060408501359150606085013567ffffffffffffffff811115612e28578182fd5b8501601f81018713612e38578182fd5b612e4787823560208401612c3c565b91505092959194509250565b60008060408385031215612e65578182fd5b612e6e83612cac565b9150612d9660208401612d0c565b60008060408385031215612e8e578182fd5b612e9783612cac565b946020939093013593505050565b60008060208385031215612eb7578182fd5b823567ffffffffffffffff811115612ecd578283fd5b612ed985828601612cc3565b90969095509350505050565b600060208284031215612ef6578081fd5b8135612d3b81613c4d565b600060208284031215612f12578081fd5b8151612d3b81613c4d565b600060208284031215612f2e578081fd5b813567ffffffffffffffff811115612f44578182fd5b61223f84828501612d1c565b60008060408385031215612f62578182fd5b823567ffffffffffffffff811115612f78578283fd5b612f8485828601612d1c565b925050612d9660208401612d0c565b60008060408385031215612fa5578182fd5b823567ffffffffffffffff811115612fbb578283fd5b612fc785828601612d1c565b95602094909401359450505050565b600060208284031215612fe7578081fd5b5035919050565b600060208284031215612fff578081fd5b612d3b82612d42565b60008060006040848603121561301c578081fd5b61302584612d42565b9250602084013567ffffffffffffffff811115613040578182fd5b61304c86828701612cc3565b9497909650939450505050565b60008151808452613071816020860160208601613b75565b601f01601f19169290920160200192915050565b80546000906002810460018083168061309f57607f831692505b60208084108214156130bf57634e487b7160e01b86526022600452602486fd5b8180156130d357600181146130e457613111565b60ff19861689528489019650613111565b6130ed88613abf565b60005b868110156131095781548b8201529085019083016130f0565b505084890196505b50505050505092915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b918252602082015260400190565b6000825161315a818460208701613b75565b9190910192915050565b6000612d3b8284613085565b600061317c8285613085565b835161318c818360208801613b75565b01949350505050565b634652454560e01b815260040190565b6223a2a760e91b815260030190565b61131560f21b815260020190565b641093d3d4d560da1b815260050190565b6115d360f21b815260020190565b6427a3a3a2a760d91b815260050190565b6613151093d3d4d560ca1b815260070190565b655075626c696360d01b815260060190565b614f4760f01b815260020190565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061326c90830184613059565b9695505050505050565b901515815260200190565b90815260200190565b600060208252612d3b6020830184613059565b6020808252601d908201527f4f472047656e2070726573616c65206973206e6f74206163746976652e000000604082015260600190565b6020808252603490820152600080516020613c648339815191526040820152737468652047454e4c54206d696e7420707269636560601b606082015260800190565b6020808252600f908201526e5265736572766520697320676f6e6560881b604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526019908201527f574c2050726573616c65206973206e6f74206163746976652e00000000000000604082015260600190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601a908201527f5075626c69632073616c65206973206e6f74206163746976652e000000000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602e90820152600080516020613c6483398151915260408201526d746865206d696e7420707269636560901b606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252601b908201527f4d6178206d696e74207065722077616c6c657420726561636865640000000000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526021908201527f4c5420426f6f737465722050726573616c65206973206e6f74206163746976656040820152601760f91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b6020808252603190820152600080516020613c64833981519152604082015270746865204f47206d696e7420707269636560781b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252603690820152600080516020613c6483398151915260408201527574686520574c424f4f5354206d696e7420707269636560501b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526012908201527113585e081cdd5c1c1b1e481c995858da195960721b604082015260600190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252600d908201526c24b73b30b634b210283937b7b360991b604082015260600190565b60208082526018908201527f4e6f7420656e6f756768207265736572766573206c6566740000000000000000604082015260600190565b60208082526026908201527f4d6178206e756d626572206f66206d696e742070657220617474656d70742072604082015265195858da195960d21b606082015260800190565b60ff91909116815260200190565b60009081526020902090565b60008219821115613ade57613ade613c0b565b500190565b600060ff821660ff84168060ff03821115613b0057613b00613c0b565b019392505050565b600082613b1757613b17613c21565b500490565b6000816000190483118215151615613b3657613b36613c0b565b500290565b600082821015613b4d57613b4d613c0b565b500390565b600060ff821660ff841680821015613b6c57613b6c613c0b565b90039392505050565b60005b83811015613b90578181015183820152602001613b78565b838111156117d95750506000910152565b600281046001821680613bb557607f821691505b60208210811415613bd657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613bf057613bf0613c0b565b5060010190565b600082613c0657613c06613c21565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146120e657600080fdfe5472616e73616374696f6e2076616c756520646964206e6f7420657175616c20a2646970667358221220574532968345ddeb42af4b3380736389e0835aba8575b9815e764208acca9d3a64736f6c6343000800003334366266646534356136656530623136643365363737383963653730663864643263656233393966653632633730366464636535353961656237363835396534

Deployed Bytecode

0x6080604052600436106103355760003560e01c8063715018a6116101ab578063b88d4fde116100f7578063df281d4711610095578063ea3af4f51161006f578063ea3af4f51461089c578063f0292a03146108af578063f2fde38b146108c4578063f48c7673146108e457610335565b8063df281d4714610847578063e8a3d48514610867578063e985e9c51461087c57610335565b8063c27c959d116100d1578063c27c959d146107df578063c87b56dd146107f4578063cba676d714610814578063d8dea22c1461083457610335565b8063b88d4fde1461077f578063ba0a06431461079f578063c1363518146107bf57610335565b80639980654611610164578063a475b5dd1161013e578063a475b5dd14610720578063a5c1c8a714610735578063af4157371461074a578063b7aafa871461075f57610335565b806399806546146106be578063a22cb465146106e0578063a2801f571461070057610335565b8063715018a6146106355780638da5cb5b1461064a578063902d55a51461065f578063938e3d7b1461067457806394b3fbc21461069457806395d89b41146106a957610335565b806339d81c2c1161028557806355f804b3116102235780636373a6b1116101fd5780636373a6b1146105d65780636bde2627146105eb57806370a0823114610600578063714c53981461062057610335565b806355f804b3146105815780635f0f45b2146105a15780636352211e146105b657610335565b806343f029891161025f57806343f029891461051b57806344a9d4eb1461053b578063498c71f21461054e5780634f6ccce71461056157610335565b806339d81c2c146104d15780633ccfd60b146104e657806342842e0e146104fb57610335565b806312065fe0116102f257806322b05ed2116102cc57806322b05ed21461045e57806323b872dd1461047e57806327569f3c1461049e5780632f745c59146104b157610335565b806312065fe0146104145780631225cffd1461043657806318160ddd1461044957610335565b806301ffc9a71461033a5780630562b9f71461037057806306fdde0314610385578063081812fc146103a7578063095ea7b3146103d457806310969523146103f4575b600080fd5b34801561034657600080fd5b5061035a610355366004612ee5565b6108f9565b6040516103679190613276565b60405180910390f35b61038361037e366004612fd6565b61090c565b005b34801561039157600080fd5b5061039a610999565b604051610367919061328a565b3480156103b357600080fd5b506103c76103c2366004612fd6565b610a2b565b6040516103679190613225565b3480156103e057600080fd5b506103836103ef366004612e7c565b610a6e565b34801561040057600080fd5b5061038361040f366004612f1d565b610b06565b34801561042057600080fd5b50610429610b58565b6040516103679190613281565b610383610444366004612fee565b610b5c565b34801561045557600080fd5b50610429610c97565b34801561046a57600080fd5b5061035a610479366004612f1d565b610c9d565b34801561048a57600080fd5b50610383610499366004612d9f565b610cc9565b6103836104ac366004613008565b610d01565b3480156104bd57600080fd5b506104296104cc366004612e7c565b610ecb565b3480156104dd57600080fd5b50610429610f20565b3480156104f257600080fd5b50610383610f2c565b34801561050757600080fd5b50610383610516366004612d9f565b610fa5565b34801561052757600080fd5b50610429610536366004612f1d565b610fc0565b610383610549366004613008565b610fe8565b61038361055c366004612fee565b611294565b34801561056d57600080fd5b5061042961057c366004612fd6565b6113f5565b34801561058d57600080fd5b5061038361059c366004612f1d565b611450565b3480156105ad57600080fd5b506103836114a2565b3480156105c257600080fd5b506103c76105d1366004612fd6565b6114f0565b3480156105e257600080fd5b5061039a611525565b3480156105f757600080fd5b506104296115b3565b34801561060c57600080fd5b5061042961061b366004612d53565b6115bf565b34801561062c57600080fd5b5061039a611603565b34801561064157600080fd5b50610383611612565b34801561065657600080fd5b506103c761165d565b34801561066b57600080fd5b5061042961166c565b34801561068057600080fd5b5061038361068f366004612f1d565b611672565b3480156106a057600080fd5b5061039a6116c4565b3480156106b557600080fd5b5061039a6116d3565b3480156106ca57600080fd5b506106d36116e2565b6040516103679190613ab1565b3480156106ec57600080fd5b506103836106fb366004612e53565b6116eb565b34801561070c57600080fd5b506106d361071b366004612d53565b6116fd565b34801561072c57600080fd5b5061035a61171b565b34801561074157600080fd5b5061039a611724565b34801561075657600080fd5b506106d3611733565b34801561076b57600080fd5b5061038361077a366004612f93565b61173c565b34801561078b57600080fd5b5061038361079a366004612dda565b6117a0565b3480156107ab57600080fd5b506103836107ba366004612f1d565b6117df565b3480156107cb57600080fd5b506106d36107da366004612d53565b611831565b3480156107eb57600080fd5b5061042961184f565b34801561080057600080fd5b5061039a61080f366004612fd6565b61185b565b34801561082057600080fd5b5061038361082f366004612f50565b6118d0565b610383610842366004613008565b611944565b34801561085357600080fd5b5061039a610862366004612ea5565b611b24565b34801561087357600080fd5b5061039a611d8b565b34801561088857600080fd5b5061035a610897366004612d6d565b611d9a565b6103836108aa366004613008565b611dc8565b3480156108bb57600080fd5b506106d3612073565b3480156108d057600080fd5b506103836108df366004612d53565b612078565b3480156108f057600080fd5b506104296120e9565b6000610904826120f4565b90505b919050565b610914612119565b6001600160a01b031661092561165d565b6001600160a01b0316146109545760405162461bcd60e51b815260040161094b906137b3565b60405180910390fd5b61095c610b58565b81111561096857600080fd5b604051339082156108fc029083906000818181858888f19350505050158015610995573d6000803e3d6000fd5b5050565b6060600080546109a890613ba1565b80601f01602080910402602001604051908101604052809291908181526020018280546109d490613ba1565b8015610a215780601f106109f657610100808354040283529160200191610a21565b820191906000526020600020905b815481529060010190602001808311610a0457829003601f168201915b5050505050905090565b6000610a368261211d565b610a525760405162461bcd60e51b815260040161094b90613767565b506000908152600460205260409020546001600160a01b031690565b6000610a79826114f0565b9050806001600160a01b0316836001600160a01b03161415610aad5760405162461bcd60e51b815260040161094b906138bf565b806001600160a01b0316610abf612119565b6001600160a01b03161480610adb5750610adb81610897612119565b610af75760405162461bcd60e51b815260040161094b90613601565b610b01838361213a565b505050565b610b0e612119565b6001600160a01b0316610b1f61165d565b6001600160a01b031614610b455760405162461bcd60e51b815260040161094b906137b3565b805161099590600c906020840190612ba3565b4790565b600b604051610b6a90613205565b9081526040519081900360200190205460ff16610b995760405162461bcd60e51b815260040161094b90613490565b6000610ba3610c97565b90506122b8610bb560ff841683613acb565b1115610bd35760405162461bcd60e51b815260040161094b90613995565b600360ff83161115610bf75760405162461bcd60e51b815260040161094b90613a6b565b610c0c67016345785d8a000060ff8416613b1c565b3414610c2a5760405162461bcd60e51b815260040161094b90613542565b3360009081526012602052604081208054849290610c4c90849060ff16613ae3565b92506101000a81548160ff021916908360ff16021790555060005b8260ff16811015610b0157610c8533610c808385613acb565b6121a8565b80610c8f81613bdc565b915050610c67565b60085490565b6000600b82604051610caf9190613148565b9081526040519081900360200190205460ff169050919050565b610cda610cd4612119565b826121c2565b610cf65760405162461bcd60e51b815260040161094b90613944565b610b01838383612247565b600b604051610d0f906131e1565b9081526040519081900360200190205460ff16610d3e5760405162461bcd60e51b815260040161094b9061329d565b6000610d48610c97565b90506122b8610d5a60ff861683613acb565b1115610d785760405162461bcd60e51b815260040161094b90613995565b600033604051602001610d8b919061311d565b604051602081830303815290604052805190602001209050610dfd8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de89150613195565b90815260200160405180910390205483612374565b610e195760405162461bcd60e51b815260040161094b90613a0d565b33600090815260136020526040902054600190610e3a90879060ff16613ae3565b60ff161115610e5b5760405162461bcd60e51b815260040161094b906135ca565b3360009081526013602052604081208054879290610e7d90849060ff16613ae3565b92506101000a81548160ff021916908360ff16021790555060005b8560ff16811015610ec357610eb133610c808386613acb565b80610ebb81613bdc565b915050610e98565b505050505050565b6000610ed6836115bf565b8210610ef45760405162461bcd60e51b815260040161094b9061333f565b506001600160a01b03821660009081526006602090815260408083208484529091529020545b92915050565b67011c37937e08000081565b610f34612119565b6001600160a01b0316610f4561165d565b6001600160a01b031614610f6b5760405162461bcd60e51b815260040161094b906137b3565b6000610f75610b58565b604051909150339082156108fc029083906000818181858888f19350505050158015610995573d6000803e3d6000fd5b610b01838383604051806020016040528060008152506117a0565b6000601482604051610fd29190613148565b9081526020016040518091039020549050919050565b600b604051610ff6906131f2565b9081526040519081900360200190205460ff166110255760405162461bcd60e51b815260040161094b906136f1565b600061102f610c97565b90506122b861104160ff861683613acb565b111561105f5760405162461bcd60e51b815260040161094b90613995565b3360009081526012602052604090205460039061108090869060ff16613ae3565b60ff1611156110a15760405162461bcd60e51b815260040161094b906135ca565b6000336040516020016110b4919061311d565b6040516020818303038152906040528051906020012090506111118484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de891506131b4565b1561114e5761112b67011c37937e08000060ff8716613b1c565b34146111495760405162461bcd60e51b815260040161094b906132d4565b61122c565b6111938484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de891506131c2565b156111cb576111ad67013fbe85edc9000060ff8716613b1c565b34146111495760405162461bcd60e51b815260040161094b90613900565b6112108484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de891506131b4565b61122c5760405162461bcd60e51b815260040161094b90613a0d565b336000908152601260205260408120805487929061124e90849060ff16613ae3565b92506101000a81548160ff021916908360ff16021790555060005b8560ff16811015610ec35761128233610c808386613acb565b8061128c81613bdc565b915050611269565b61129c612119565b6001600160a01b03166112ad61165d565b6001600160a01b0316146112d35760405162461bcd60e51b815260040161094b906137b3565b60006112dd610c97565b90506122b86112ef60ff841683613acb565b111561130d5760405162461bcd60e51b815260040161094b90613995565b600d5460ff1661132f5760405162461bcd60e51b815260040161094b90613316565b600d5460009061134390849060ff16613b52565b60ff1610156113645760405162461bcd60e51b815260040161094b90613a34565b61137967016345785d8a000060ff8416613b1c565b34146113975760405162461bcd60e51b815260040161094b90613542565b600d80548391906000906113af90849060ff16613b52565b92506101000a81548160ff021916908360ff16021790555060005b8260ff16811015610b01576113e333610c808385613acb565b806113ed81613bdc565b9150506113ca565b60006113ff610c97565b821061141d5760405162461bcd60e51b815260040161094b906139c1565b6008828154811061143e57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b611458612119565b6001600160a01b031661146961165d565b6001600160a01b03161461148f5760405162461bcd60e51b815260040161094b906137b3565b805161099590600e906020840190612ba3565b6114aa612119565b6001600160a01b03166114bb61165d565b6001600160a01b0316146114e15760405162461bcd60e51b815260040161094b906137b3565b6011805460ff19166001179055565b6000818152600260205260408120546001600160a01b0316806109045760405162461bcd60e51b815260040161094b906136a8565b600c805461153290613ba1565b80601f016020809104026020016040519081016040528092919081815260200182805461155e90613ba1565b80156115ab5780601f10611580576101008083540402835291602001916115ab565b820191906000526020600020905b81548152906001019060200180831161158e57829003601f168201915b505050505081565b67016345785d8a000081565b60006001600160a01b0382166115e75760405162461bcd60e51b815260040161094b9061365e565b506001600160a01b031660009081526003602052604090205490565b6060600e80546109a890613ba1565b61161a612119565b6001600160a01b031661162b61165d565b6001600160a01b0316146116515760405162461bcd60e51b815260040161094b906137b3565b61165b600061238a565b565b600a546001600160a01b031690565b6122b881565b61167a612119565b6001600160a01b031661168b61165d565b6001600160a01b0316146116b15760405162461bcd60e51b815260040161094b906137b3565b8051610995906010906020840190612ba3565b6060600c80546109a890613ba1565b6060600180546109a890613ba1565b600d5460ff1690565b6109956116f6612119565b83836123dc565b6001600160a01b031660009081526012602052604090205460ff1690565b60115460ff1681565b6060600f80546109a890613ba1565b600d5460ff1681565b611744612119565b6001600160a01b031661175561165d565b6001600160a01b03161461177b5760405162461bcd60e51b815260040161094b906137b3565b8060148360405161178c9190613148565b908152604051908190036020019020555050565b6117b16117ab612119565b836121c2565b6117cd5760405162461bcd60e51b815260040161094b90613944565b6117d98484848461247f565b50505050565b6117e7612119565b6001600160a01b03166117f861165d565b6001600160a01b03161461181e5760405162461bcd60e51b815260040161094b906137b3565b805161099590600f906020840190612ba3565b6001600160a01b031660009081526013602052604090205460ff1690565b67013fbe85edc9000081565b60606118668261211d565b6118825760405162461bcd60e51b815260040161094b90613831565b60115460ff166118b457600f60405160200161189e9190613164565b6040516020818303038152906040529050610907565b600e6118bf836124b2565b60405160200161189e929190613170565b6118d8612119565b6001600160a01b03166118e961165d565b6001600160a01b03161461190f5760405162461bcd60e51b815260040161094b906137b3565b80600b836040516119209190613148565b908152604051908190036020019020805491151560ff199092169190911790555050565b600b604051611952906131d3565b9081526040519081900360200190205460ff166119815760405162461bcd60e51b815260040161094b90613422565b600061198b610c97565b90506122b861199d60ff861683613acb565b11156119bb5760405162461bcd60e51b815260040161094b90613995565b6000336040516020016119ce919061311d565b604051602081830303815290604052805190602001209050611a2b8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de891506131d3565b611a475760405162461bcd60e51b815260040161094b90613a0d565b33600090815260126020526040902054600390611a6890879060ff16613ae3565b60ff161115611a895760405162461bcd60e51b815260040161094b906135ca565b611a9e67013fbe85edc9000060ff8716613b1c565b3414611abc5760405162461bcd60e51b815260040161094b90613542565b3360009081526012602052604081208054879290611ade90849060ff16613ae3565b92506101000a81548160ff021916908360ff16021790555060005b8560ff16811015610ec357611b1233610c808386613acb565b80611b1c81613bdc565b915050611af9565b6060600033604051602001611b39919061311d565b604051602081830303815290604052805190602001209050611b968484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de89150613217565b15611bbb5750506040805180820190915260028152614f4760f01b6020820152610f1a565b611c008484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de891506131a5565b15611c2657505060408051808201909152600381526223a2a760e91b6020820152610f1a565b611c6b8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de891506131b4565b15611c90575050604080518082019091526002815261131560f21b6020820152610f1a565b611cd58484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de891506131c2565b15611cfd5750506040805180820190915260058152641093d3d4d560da1b6020820152610f1a565b611d428484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de891506131d3565b15611d6757505060408051808201909152600281526115d360f21b6020820152610f1a565b50506040805180820190915260068152654e4f524f4c4560d01b6020820152610f1a565b6060601080546109a890613ba1565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600b604051611dd6906131e1565b9081526040519081900360200190205460ff16611e055760405162461bcd60e51b815260040161094b9061329d565b6000611e0f610c97565b90506122b8611e2160ff861683613acb565b1115611e3f5760405162461bcd60e51b815260040161094b90613995565b33600090815260126020526040902054600390611e6090869060ff16613ae3565b60ff161115611e815760405162461bcd60e51b815260040161094b906135ca565b600033604051602001611e94919061311d565b604051602081830303815290604052805190602001209050611ef18484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de89150613217565b15611f2d57611f0a66f8b0a10e47000060ff8716613b1c565b3414611f285760405162461bcd60e51b815260040161094b90613880565b61200b565b611f728484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de891506131a5565b15611faa57611f8c67011c37937e08000060ff8716613b1c565b3414611f285760405162461bcd60e51b815260040161094b906132d4565b611fef8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060405160149250610de89150613217565b61200b5760405162461bcd60e51b815260040161094b90613a0d565b336000908152601260205260408120805487929061202d90849060ff16613ae3565b92506101000a81548160ff021916908360ff16021790555060005b8560ff16811015610ec35761206133610c808386613acb565b8061206b81613bdc565b915050612048565b600381565b612080612119565b6001600160a01b031661209161165d565b6001600160a01b0316146120b75760405162461bcd60e51b815260040161094b906137b3565b6001600160a01b0381166120dd5760405162461bcd60e51b815260040161094b906133dc565b6120e68161238a565b50565b66f8b0a10e47000081565b60006001600160e01b0319821663780e9d6360e01b14806109045750610904826125cd565b3390565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061216f826114f0565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61099582826040518060200160405280600081525061260d565b60006121cd8261211d565b6121e95760405162461bcd60e51b815260040161094b9061357e565b60006121f4836114f0565b9050806001600160a01b0316846001600160a01b0316148061222f5750836001600160a01b031661222484610a2b565b6001600160a01b0316145b8061223f575061223f8185611d9a565b949350505050565b826001600160a01b031661225a826114f0565b6001600160a01b0316146122805760405162461bcd60e51b815260040161094b906137e8565b6001600160a01b0382166122a65760405162461bcd60e51b815260040161094b906134c7565b6122b1838383612640565b6122bc60008261213a565b6001600160a01b03831660009081526003602052604081208054600192906122e5908490613b3b565b90915550506001600160a01b0382166000908152600360205260408120805460019290612313908490613acb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600082612381858461264b565b14949350505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561240e5760405162461bcd60e51b815260040161094b9061350b565b6001600160a01b0383811660008181526005602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190612472908590613276565b60405180910390a3505050565b61248a848484612247565b61249684848484612703565b6117d95760405162461bcd60e51b815260040161094b9061338a565b6060816124d757506040805180820190915260018152600360fc1b6020820152610907565b8160005b811561250157806124eb81613bdc565b91506124fa9050600a83613b08565b91506124db565b60008167ffffffffffffffff81111561252a57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612554576020820181803683370190505b5090505b841561223f57612569600183613b3b565b9150612576600a86613bf7565b612581906030613acb565b60f81b8183815181106125a457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506125c6600a86613b08565b9450612558565b60006001600160e01b031982166380ac58cd60e01b14806125fe57506001600160e01b03198216635b5e139f60e01b145b8061090457506109048261281e565b6126178383612837565b6126246000848484612703565b610b015760405162461bcd60e51b815260040161094b9061338a565b610b01838383612916565b600081815b84518110156126fb57600085828151811061267b57634e487b7160e01b600052603260045260246000fd5b602002602001015190508083116126bc57828160405160200161269f92919061313a565b6040516020818303038152906040528051906020012092506126e8565b80836040516020016126cf92919061313a565b6040516020818303038152906040528051906020012092505b50806126f381613bdc565b915050612650565b509392505050565b6000612717846001600160a01b031661299f565b1561281357836001600160a01b031663150b7a02612733612119565b8786866040518563ffffffff1660e01b81526004016127559493929190613239565b602060405180830381600087803b15801561276f57600080fd5b505af192505050801561279f575060408051601f3d908101601f1916820190925261279c91810190612f01565b60015b6127f9573d8080156127cd576040519150601f19603f3d011682016040523d82523d6000602084013e6127d2565b606091505b5080516127f15760405162461bcd60e51b815260040161094b9061338a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061223f565b506001949350505050565b6001600160e01b031981166301ffc9a760e01b14919050565b6001600160a01b03821661285d5760405162461bcd60e51b815260040161094b90613732565b6128668161211d565b156128835760405162461bcd60e51b815260040161094b90613459565b61288f60008383612640565b6001600160a01b03821660009081526003602052604081208054600192906128b8908490613acb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b612921838383610b01565b6001600160a01b03831661293d57612938816129a5565b612960565b816001600160a01b0316836001600160a01b0316146129605761296083826129e9565b6001600160a01b03821661297c5761297781612a86565b610b01565b826001600160a01b0316826001600160a01b031614610b0157610b018282612b5f565b3b151590565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b600060016129f6846115bf565b612a009190613b3b565b600083815260076020526040902054909150808214612a53576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612a9890600190613b3b565b60008381526009602052604081205460088054939450909284908110612ace57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110612afd57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612b4357634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612b6a836115bf565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612baf90613ba1565b90600052602060002090601f016020900481019282612bd15760008555612c17565b82601f10612bea57805160ff1916838001178555612c17565b82800160010185558215612c17579182015b82811115612c17578251825591602001919060010190612bfc565b50612c23929150612c27565b5090565b5b80821115612c235760008155600101612c28565b600067ffffffffffffffff80841115612c5757612c57613c37565b604051601f8501601f191681016020018281118282101715612c7b57612c7b613c37565b604052848152915081838501861015612c9357600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b038116811461090757600080fd5b60008083601f840112612cd4578081fd5b50813567ffffffffffffffff811115612ceb578182fd5b6020830191508360208083028501011115612d0557600080fd5b9250929050565b8035801515811461090757600080fd5b600082601f830112612d2c578081fd5b612d3b83833560208501612c3c565b9392505050565b803560ff8116811461090757600080fd5b600060208284031215612d64578081fd5b612d3b82612cac565b60008060408385031215612d7f578081fd5b612d8883612cac565b9150612d9660208401612cac565b90509250929050565b600080600060608486031215612db3578081fd5b612dbc84612cac565b9250612dca60208501612cac565b9150604084013590509250925092565b60008060008060808587031215612def578081fd5b612df885612cac565b9350612e0660208601612cac565b925060408501359150606085013567ffffffffffffffff811115612e28578182fd5b8501601f81018713612e38578182fd5b612e4787823560208401612c3c565b91505092959194509250565b60008060408385031215612e65578182fd5b612e6e83612cac565b9150612d9660208401612d0c565b60008060408385031215612e8e578182fd5b612e9783612cac565b946020939093013593505050565b60008060208385031215612eb7578182fd5b823567ffffffffffffffff811115612ecd578283fd5b612ed985828601612cc3565b90969095509350505050565b600060208284031215612ef6578081fd5b8135612d3b81613c4d565b600060208284031215612f12578081fd5b8151612d3b81613c4d565b600060208284031215612f2e578081fd5b813567ffffffffffffffff811115612f44578182fd5b61223f84828501612d1c565b60008060408385031215612f62578182fd5b823567ffffffffffffffff811115612f78578283fd5b612f8485828601612d1c565b925050612d9660208401612d0c565b60008060408385031215612fa5578182fd5b823567ffffffffffffffff811115612fbb578283fd5b612fc785828601612d1c565b95602094909401359450505050565b600060208284031215612fe7578081fd5b5035919050565b600060208284031215612fff578081fd5b612d3b82612d42565b60008060006040848603121561301c578081fd5b61302584612d42565b9250602084013567ffffffffffffffff811115613040578182fd5b61304c86828701612cc3565b9497909650939450505050565b60008151808452613071816020860160208601613b75565b601f01601f19169290920160200192915050565b80546000906002810460018083168061309f57607f831692505b60208084108214156130bf57634e487b7160e01b86526022600452602486fd5b8180156130d357600181146130e457613111565b60ff19861689528489019650613111565b6130ed88613abf565b60005b868110156131095781548b8201529085019083016130f0565b505084890196505b50505050505092915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b918252602082015260400190565b6000825161315a818460208701613b75565b9190910192915050565b6000612d3b8284613085565b600061317c8285613085565b835161318c818360208801613b75565b01949350505050565b634652454560e01b815260040190565b6223a2a760e91b815260030190565b61131560f21b815260020190565b641093d3d4d560da1b815260050190565b6115d360f21b815260020190565b6427a3a3a2a760d91b815260050190565b6613151093d3d4d560ca1b815260070190565b655075626c696360d01b815260060190565b614f4760f01b815260020190565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061326c90830184613059565b9695505050505050565b901515815260200190565b90815260200190565b600060208252612d3b6020830184613059565b6020808252601d908201527f4f472047656e2070726573616c65206973206e6f74206163746976652e000000604082015260600190565b6020808252603490820152600080516020613c648339815191526040820152737468652047454e4c54206d696e7420707269636560601b606082015260800190565b6020808252600f908201526e5265736572766520697320676f6e6560881b604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526019908201527f574c2050726573616c65206973206e6f74206163746976652e00000000000000604082015260600190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601a908201527f5075626c69632073616c65206973206e6f74206163746976652e000000000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602e90820152600080516020613c6483398151915260408201526d746865206d696e7420707269636560901b606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252601b908201527f4d6178206d696e74207065722077616c6c657420726561636865640000000000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526021908201527f4c5420426f6f737465722050726573616c65206973206e6f74206163746976656040820152601760f91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b6020808252603190820152600080516020613c64833981519152604082015270746865204f47206d696e7420707269636560781b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252603690820152600080516020613c6483398151915260408201527574686520574c424f4f5354206d696e7420707269636560501b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526012908201527113585e081cdd5c1c1b1e481c995858da195960721b604082015260600190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252600d908201526c24b73b30b634b210283937b7b360991b604082015260600190565b60208082526018908201527f4e6f7420656e6f756768207265736572766573206c6566740000000000000000604082015260600190565b60208082526026908201527f4d6178206e756d626572206f66206d696e742070657220617474656d70742072604082015265195858da195960d21b606082015260800190565b60ff91909116815260200190565b60009081526020902090565b60008219821115613ade57613ade613c0b565b500190565b600060ff821660ff84168060ff03821115613b0057613b00613c0b565b019392505050565b600082613b1757613b17613c21565b500490565b6000816000190483118215151615613b3657613b36613c0b565b500290565b600082821015613b4d57613b4d613c0b565b500390565b600060ff821660ff841680821015613b6c57613b6c613c0b565b90039392505050565b60005b83811015613b90578181015183820152602001613b78565b838111156117d95750506000910152565b600281046001821680613bb557607f821691505b60208210811415613bd657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613bf057613bf0613c0b565b5060010190565b600082613c0657613c06613c21565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146120e657600080fdfe5472616e73616374696f6e2076616c756520646964206e6f7420657175616c20a2646970667358221220574532968345ddeb42af4b3380736389e0835aba8575b9815e764208acca9d3a64736f6c63430008000033

Deployed Bytecode Sourcemap

46648:10115:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48548:179;;;;;;;;;;-1:-1:-1;48548:179:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56361:161;;;;;;:::i;:::-;;:::i;:::-;;27928:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29487:221::-;;;;;;;;;;-1:-1:-1;29487:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;29010:411::-;;;;;;;;;;-1:-1:-1;29010:411:0;;;;;:::i;:::-;;:::i;48121:120::-;;;;;;;;;;-1:-1:-1;48121:120:0;;;;;:::i;:::-;;:::i;56530:96::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;49374:616::-;;;;;;:::i;:::-;;:::i;41074:113::-;;;;;;;;;;;;;:::i;55582:::-;;;;;;;;;;-1:-1:-1;55582:113:0;;;;;:::i;:::-;;:::i;30237:339::-;;;;;;;;;;-1:-1:-1;30237:339:0;;;;;:::i;:::-;;:::i;53146:699::-;;;;;;:::i;:::-;;:::i;40742:256::-;;;;;;;;;;-1:-1:-1;40742:256:0;;;;;:::i;:::-;;:::i;47292:53::-;;;;;;;;;;;;;:::i;56220:133::-;;;;;;;;;;;;;:::i;30647:185::-;;;;;;;;;;-1:-1:-1;30647:185:0;;;;;:::i;:::-;;:::i;47915:118::-;;;;;;;;;;-1:-1:-1;47915:118:0;;;;;:::i;:::-;;:::i;50818:1160::-;;;;;;:::i;:::-;;:::i;53977:581::-;;;;;;:::i;:::-;;:::i;41264:233::-;;;;;;;;;;-1:-1:-1;41264:233:0;;;;;:::i;:::-;;:::i;49173:92::-;;;;;;;;;;-1:-1:-1;49173:92:0;;;;;:::i;:::-;;:::i;48041:72::-;;;;;;;;;;;;;:::i;27622:239::-;;;;;;;;;;-1:-1:-1;27622:239:0;;;;;:::i;:::-;;:::i;47022:93::-;;;;;;;;;;;;;:::i;47174:54::-;;;;;;;;;;;;;:::i;27352:208::-;;;;;;;;;;-1:-1:-1;27352:208:0;;;;;:::i;:::-;;:::i;49273:93::-;;;;;;;;;;;;;:::i;6898:103::-;;;;;;;;;;;;;:::i;6247:87::-;;;;;;;;;;;;;:::i;47124:43::-;;;;;;;;;;;;;:::i;48845:101::-;;;;;;;;;;-1:-1:-1;48845:101:0;;;;;:::i;:::-;;:::i;48249:102::-;;;;;;;;;;;;;:::i;28097:104::-;;;;;;;;;;;;;:::i;54566:94::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29780:155::-;;;;;;;;;;-1:-1:-1;29780:155:0;;;;;:::i;:::-;;:::i;56634:120::-;;;;;;;;;;-1:-1:-1;56634:120:0;;;;;:::i;:::-;;:::i;47593:26::-;;;;;;;;;;;;;:::i;49070:95::-;;;;;;;;;;;;;:::i;47414:31::-;;;;;;;;;;;;;:::i;47790:117::-;;;;;;;;;;-1:-1:-1;47790:117:0;;;;;:::i;:::-;;:::i;30903:328::-;;;;;;;;;;-1:-1:-1;30903:328:0;;;;;:::i;:::-;;:::i;48958:104::-;;;;;;;;;;-1:-1:-1;48958:104:0;;;;;:::i;:::-;;:::i;53853:116::-;;;;;;;;;;-1:-1:-1;53853:116:0;;;;;:::i;:::-;;:::i;47352:55::-;;;;;;;;;;;;;:::i;55842:370::-;;;;;;;;;;-1:-1:-1;55842:370:0;;;;;:::i;:::-;;:::i;55459:115::-;;;;;;;;;;-1:-1:-1;55459:115:0;;;;;:::i;:::-;;:::i;49998:812::-;;;;;;:::i;:::-;;:::i;54668:756::-;;;;;;;;;;-1:-1:-1;54668:756:0;;;;;:::i;:::-;;:::i;48735:102::-;;;;;;;;;;;;;:::i;30006:164::-;;;;;;;;;;-1:-1:-1;30006:164:0;;;;;:::i;:::-;;:::i;51986:1152::-;;;;;;:::i;:::-;;:::i;47452:34::-;;;;;;;;;;;;;:::i;7156:201::-;;;;;;;;;;-1:-1:-1;7156:201:0;;;;;:::i;:::-;;:::i;47235:50::-;;;;;;;;;;;;;:::i;48548:179::-;48659:4;48683:36;48707:11;48683:23;:36::i;:::-;48676:43;;48548:179;;;;:::o;56361:161::-;6478:12;:10;:12::i;:::-;-1:-1:-1;;;;;6467:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;6467:23:0;;6459:68;;;;-1:-1:-1;;;6459:68:0;;;;;;;:::i;:::-;;;;;;;;;56454:12:::1;:10;:12::i;:::-;56444:6;:22;;56436:31;;;::::0;::::1;;56478:36;::::0;56486:10:::1;::::0;56478:36;::::1;;;::::0;56507:6;;56478:36:::1;::::0;;;56507:6;56486:10;56478:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;56361:161:::0;:::o;27928:100::-;27982:13;28015:5;28008:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27928:100;:::o;29487:221::-;29563:7;29591:16;29599:7;29591;:16::i;:::-;29583:73;;;;-1:-1:-1;;;29583:73:0;;;;;;;:::i;:::-;-1:-1:-1;29676:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29676:24:0;;29487:221::o;29010:411::-;29091:13;29107:23;29122:7;29107:14;:23::i;:::-;29091:39;;29155:5;-1:-1:-1;;;;;29149:11:0;:2;-1:-1:-1;;;;;29149:11:0;;;29141:57;;;;-1:-1:-1;;;29141:57:0;;;;;;;:::i;:::-;29249:5;-1:-1:-1;;;;;29233:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;29233:21:0;;:62;;;;29258:37;29275:5;29282:12;:10;:12::i;29258:37::-;29211:168;;;;-1:-1:-1;;;29211:168:0;;;;;;;:::i;:::-;29392:21;29401:2;29405:7;29392:8;:21::i;:::-;29010:411;;;:::o;48121:120::-;6478:12;:10;:12::i;:::-;-1:-1:-1;;;;;6467:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;6467:23:0;;6459:68;;;;-1:-1:-1;;;6459:68:0;;;;;;;:::i;:::-;48206:27;;::::1;::::0;:10:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;56530:96::-:0;56597:21;56530:96;:::o;49374:616::-;49449:10;:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;49441:59;;;;-1:-1:-1;;;49441:59:0;;;;;;;:::i;:::-;49511:10;49524:13;:11;:13::i;:::-;49511:26;-1:-1:-1;47163:4:0;49556:14;;;;49511:26;49556:14;:::i;:::-;:30;;49548:61;;;;-1:-1:-1;;;49548:61:0;;;;;;;:::i;:::-;47485:1;49628:23;;;;;49620:74;;;;-1:-1:-1;;;49620:74:0;;;;;;;:::i;:::-;49726:31;47218:10;49726:31;;;;:::i;:::-;49713:9;:44;49705:103;;;;-1:-1:-1;;;49705:103:0;;;;;;;:::i;:::-;49836:10;49821:26;;;;:14;:26;;;;;:41;;49851:11;;49821:26;:41;;49851:11;;49821:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;49880:9;49875:98;49899:11;49895:15;;:1;:15;49875:98;;;49932:29;49942:10;49954:6;49959:1;49954:2;:6;:::i;:::-;49932:9;:29::i;:::-;49912:3;;;;:::i;:::-;;;;49875:98;;41074:113;41162:10;:17;41074:113;:::o;55582:::-;55646:4;55669:10;55680:6;55669:18;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;55582:113:0;;;:::o;30237:339::-;30432:41;30451:12;:10;:12::i;:::-;30465:7;30432:18;:41::i;:::-;30424:103;;;;-1:-1:-1;;;30424:103:0;;;;;;;:::i;:::-;30540:28;30550:4;30556:2;30560:7;30540:9;:28::i;53146:699::-;53252:10;:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;53244:61;;;;-1:-1:-1;;;53244:61:0;;;;;;;:::i;:::-;53316:10;53329:13;:11;:13::i;:::-;53316:26;-1:-1:-1;47163:4:0;53361:16;;;;53316:26;53361:16;:::i;:::-;:32;;53353:63;;;;-1:-1:-1;;;53353:63:0;;;;;;;:::i;:::-;53429:12;53471:10;53454:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;53444:39;;;;;;53429:54;;53502:59;53521:12;;53502:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53535:19:0;;:11;;-1:-1:-1;53535:19:0;;-1:-1:-1;53535:19:0;:::i;:::-;;;;;;;;;;;;;;53556:4;53502:18;:59::i;:::-;53494:85;;;;-1:-1:-1;;;53494:85:0;;;;;;;:::i;:::-;53610:10;53600:21;;;;:9;:21;;;;;;53637:1;;53600:33;;53622:11;;53600:21;;:33;:::i;:::-;:38;;;;53592:78;;;;-1:-1:-1;;;53592:78:0;;;;;;;:::i;:::-;53701:10;53691:21;;;;:9;:21;;;;;:36;;53716:11;;53691:21;:36;;53716:11;;53691:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;53745:9;53740:98;53764:11;53760:15;;:1;:15;53740:98;;;53797:29;53807:10;53819:6;53824:1;53819:2;:6;:::i;53797:29::-;53777:3;;;;:::i;:::-;;;;53740:98;;;;53146:699;;;;;:::o;40742:256::-;40839:7;40875:23;40892:5;40875:16;:23::i;:::-;40867:5;:31;40859:87;;;;-1:-1:-1;;;40859:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;40964:19:0;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;40742:256;;;;;:::o;47292:53::-;47335:10;47292:53;:::o;56220:133::-;6478:12;:10;:12::i;:::-;-1:-1:-1;;;;;6467:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;6467:23:0;;6459:68;;;;-1:-1:-1;;;6459:68:0;;;;;;;:::i;:::-;56270:12:::1;56285;:10;:12::i;:::-;56308:37;::::0;56270:27;;-1:-1:-1;56316:10:0::1;::::0;56308:37;::::1;;;::::0;56270:27;;56308:37:::1;::::0;;;56270:27;56316:10;56308:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;30647:185:::0;30785:39;30802:4;30808:2;30812:7;30785:39;;;;;;;;;;;;:16;:39::i;47915:118::-;47981:7;48008:11;48020:4;48008:17;;;;;;:::i;:::-;;;;;;;;;;;;;;48001:24;;47915:118;;;:::o;50818:1160::-;50934:10;:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;50926:67;;;;-1:-1:-1;;;50926:67:0;;;;;;;:::i;:::-;51004:10;51017:13;:11;:13::i;:::-;51004:26;-1:-1:-1;47163:4:0;51049:16;;;;51004:26;51049:16;:::i;:::-;:32;;51041:63;;;;-1:-1:-1;;;51041:63:0;;;;;;;:::i;:::-;51138:10;51123:26;;;;:14;:26;;;;;;51165:1;;51123:38;;51150:11;;51123:26;;:38;:::i;:::-;:43;;;;51115:83;;;;-1:-1:-1;;;51115:83:0;;;;;;;:::i;:::-;51219:12;51261:10;51244:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;51234:39;;;;;;51219:54;;51288:57;51307:12;;51288:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51321:17:0;;:11;;-1:-1:-1;51321:17:0;;-1:-1:-1;51321:17:0;:::i;51288:57::-;51284:523;;;51382:30;47335:10;51382:30;;;;:::i;:::-;51369:9;:43;51361:108;;;;-1:-1:-1;;;51361:108:0;;;;;;;:::i;:::-;51284:523;;;51491:60;51510:12;;51491:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51524:20:0;;:11;;-1:-1:-1;51524:20:0;;-1:-1:-1;51524:20:0;:::i;51491:60::-;51487:320;;;51588:32;47397:10;51588:32;;;;:::i;:::-;51575:9;:45;51567:112;;;;-1:-1:-1;;;51567:112:0;;;;;;;:::i;51487:320::-;51720:57;51739:12;;51720:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51753:17:0;;:11;;-1:-1:-1;51753:17:0;;-1:-1:-1;51753:17:0;:::i;51720:57::-;51712:83;;;;-1:-1:-1;;;51712:83:0;;;;;;;:::i;:::-;51834:10;51819:26;;;;:14;:26;;;;;:41;;51849:11;;51819:26;:41;;51849:11;;51819:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;51878:9;51873:98;51897:11;51893:15;;:1;:15;51873:98;;;51930:29;51940:10;51952:6;51957:1;51952:2;:6;:::i;51930:29::-;51910:3;;;;:::i;:::-;;;;51873:98;;53977:581;6478:12;:10;:12::i;:::-;-1:-1:-1;;;;;6467:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;6467:23:0;;6459:68;;;;-1:-1:-1;;;6459:68:0;;;;;;;:::i;:::-;54054:10:::1;54067:13;:11;:13::i;:::-;54054:26:::0;-1:-1:-1;47163:4:0::1;54099:16;;::::0;::::1;54054:26:::0;54099:16:::1;:::i;:::-;:32;;54091:63;;;;-1:-1:-1::0;;;54091:63:0::1;;;;;;;:::i;:::-;54173:12;::::0;::::1;;54165:42;;;;-1:-1:-1::0;;;54165:42:0::1;;;;;;;:::i;:::-;54226:12;::::0;54252:1:::1;::::0;54226:24:::1;::::0;54239:11;;54226:12:::1;;:24;:::i;:::-;:27;;;;54218:64;;;;-1:-1:-1::0;;;54218:64:0::1;;;;;;;:::i;:::-;54314:31;47218:10;54314:31;::::0;::::1;;:::i;:::-;54301:9;:44;54293:103;;;;-1:-1:-1::0;;;54293:103:0::1;;;;;;;:::i;:::-;54417:12;:25:::0;;54431:11;;54417:12;::::1;::::0;:25:::1;::::0;54431:11;;54417:25:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;54458:9;54453:98;54477:11;54473:15;;:1;:15;54453:98;;;54510:29;54520:10;54532:6;54537:1:::0;54532:2;:6:::1;:::i;54510:29::-;54490:3:::0;::::1;::::0;::::1;:::i;:::-;;;;54453:98;;41264:233:::0;41339:7;41375:30;:28;:30::i;:::-;41367:5;:38;41359:95;;;;-1:-1:-1;;;41359:95:0;;;;;;;:::i;:::-;41472:10;41483:5;41472:17;;;;;;-1:-1:-1;;;41472:17:0;;;;;;;;;;;;;;;;;41465:24;;41264:233;;;:::o;49173:92::-;6478:12;:10;:12::i;:::-;-1:-1:-1;;;;;6467:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;6467:23:0;;6459:68;;;;-1:-1:-1;;;6459:68:0;;;;;;;:::i;:::-;49243:14;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;48041:72::-:0;6478:12;:10;:12::i;:::-;-1:-1:-1;;;;;6467:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;6467:23:0;;6459:68;;;;-1:-1:-1;;;6459:68:0;;;;;;;:::i;:::-;48092:6:::1;:13:::0;;-1:-1:-1;;48092:13:0::1;48101:4;48092:13;::::0;;48041:72::o;27622:239::-;27694:7;27730:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27730:16:0;27765:19;27757:73;;;;-1:-1:-1;;;27757:73:0;;;;;;;:::i;47022:93::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47174:54::-;47218:10;47174:54;:::o;27352:208::-;27424:7;-1:-1:-1;;;;;27452:19:0;;27444:74;;;;-1:-1:-1;;;27444:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;27536:16:0;;;;;:9;:16;;;;;;;27352:208::o;49273:93::-;49318:13;49351:7;49344:14;;;;;:::i;6898:103::-;6478:12;:10;:12::i;:::-;-1:-1:-1;;;;;6467:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;6467:23:0;;6459:68;;;;-1:-1:-1;;;6459:68:0;;;;;;;:::i;:::-;6963:30:::1;6990:1;6963:18;:30::i;:::-;6898:103::o:0;6247:87::-;6320:6;;-1:-1:-1;;;;;6320:6:0;6247:87;:::o;47124:43::-;47163:4;47124:43;:::o;48845:101::-;6478:12;:10;:12::i;:::-;-1:-1:-1;;;;;6467:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;6467:23:0;;6459:68;;;;-1:-1:-1;;;6459:68:0;;;;;;;:::i;:::-;48917:21;;::::1;::::0;:17:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;48249:102::-:0;48301:13;48333:10;48326:17;;;;;:::i;28097:104::-;28153:13;28186:7;28179:14;;;;;:::i;54566:94::-;54640:12;;;;54566:94;:::o;29780:155::-;29875:52;29894:12;:10;:12::i;:::-;29908:8;29918;29875:18;:52::i;56634:120::-;-1:-1:-1;;;;;56721:25:0;56696:5;56721:25;;;:14;:25;;;;;;;;;56634:120::o;47593:26::-;;;;;;:::o;49070:95::-;49116:13;49149:8;49142:15;;;;;:::i;47414:31::-;;;;;;:::o;47790:117::-;6478:12;:10;:12::i;:::-;-1:-1:-1;;;;;6467:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;6467:23:0;;6459:68;;;;-1:-1:-1;;;6459:68:0;;;;;;;:::i;:::-;47895:4:::1;47877:11;47889:4;47877:17;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:22;-1:-1:-1;;47790:117:0:o;30903:328::-;31078:41;31097:12;:10;:12::i;:::-;31111:7;31078:18;:41::i;:::-;31070:103;;;;-1:-1:-1;;;31070:103:0;;;;;;;:::i;:::-;31184:39;31198:4;31204:2;31208:7;31217:5;31184:13;:39::i;:::-;30903:328;;;;:::o;48958:104::-;6478:12;:10;:12::i;:::-;-1:-1:-1;;;;;6467:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;6467:23:0;;6459:68;;;;-1:-1:-1;;;6459:68:0;;;;;;;:::i;:::-;49034:20;;::::1;::::0;:8:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;53853:116::-:0;-1:-1:-1;;;;;53941:20:0;53917:5;53941:20;;;:9;:20;;;;;;;;;53853:116::o;47352:55::-;47397:10;47352:55;:::o;55842:370::-;55916:13;55950:17;55958:8;55950:7;:17::i;:::-;55942:77;;;;-1:-1:-1;;;55942:77:0;;;;;;;:::i;:::-;56035:6;;;;56030:175;;56089:8;56072:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;56058:41;;;;56030:175;56163:7;56172:19;:8;:17;:19::i;:::-;56146:46;;;;;;;;;:::i;55459:115::-;6478:12;:10;:12::i;:::-;-1:-1:-1;;;;;6467:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;6467:23:0;;6459:68;;;;-1:-1:-1;;;6459:68:0;;;;;;;:::i;:::-;55561:5:::1;55542:10;55553:6;55542:18;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:24;;;::::1;;-1:-1:-1::0;;55542:24:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;55459:115:0:o;49998:812::-;50109:10;:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;50101:54;;;;-1:-1:-1;;;50101:54:0;;;;;;;:::i;:::-;50166:10;50179:13;:11;:13::i;:::-;50166:26;-1:-1:-1;47163:4:0;50211:16;;;;50166:26;50211:16;:::i;:::-;:32;;50203:63;;;;-1:-1:-1;;;50203:63:0;;;;;;;:::i;:::-;50279:12;50321:10;50304:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;50294:39;;;;;;50279:54;;50352:57;50371:12;;50352:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50385:17:0;;:11;;-1:-1:-1;50385:17:0;;-1:-1:-1;50385:17:0;:::i;50352:57::-;50344:83;;;;-1:-1:-1;;;50344:83:0;;;;;;;:::i;:::-;50463:10;50448:26;;;;:14;:26;;;;;;50490:1;;50448:38;;50475:11;;50448:26;;:38;:::i;:::-;:43;;;;50440:83;;;;-1:-1:-1;;;50440:83:0;;;;;;;:::i;:::-;50555:32;47397:10;50555:32;;;;:::i;:::-;50542:9;:45;50534:104;;;;-1:-1:-1;;;50534:104:0;;;;;;;:::i;:::-;50666:10;50651:26;;;;:14;:26;;;;;:41;;50681:11;;50651:26;:41;;50681:11;;50651:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;50710:9;50705:98;50729:11;50725:15;;:1;:15;50705:98;;;50762:29;50772:10;50784:6;50789:1;50784:2;:6;:::i;50762:29::-;50742:3;;;;:::i;:::-;;;;50705:98;;54668:756;54747:13;54772:12;54814:10;54797:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;54787:39;;;;;;54772:54;;54841:57;54860:12;;54841:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54874:17:0;;:11;;-1:-1:-1;54874:17:0;;-1:-1:-1;54874:17:0;:::i;54841:57::-;54837:580;;;-1:-1:-1;;54914:11:0;;;;;;;;;;;;-1:-1:-1;;;54914:11:0;;;;;;54837:580;54947:58;54966:12;;54947:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54980:18:0;;:11;;-1:-1:-1;54980:18:0;;-1:-1:-1;54980:18:0;:::i;54947:58::-;54943:474;;;-1:-1:-1;;55021:12:0;;;;;;;;;;;;-1:-1:-1;;;55021:12:0;;;;;;54943:474;55055:57;55074:12;;55055:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55088:17:0;;:11;;-1:-1:-1;55088:17:0;;-1:-1:-1;55088:17:0;:::i;55055:57::-;55051:366;;;-1:-1:-1;;55128:11:0;;;;;;;;;;;;-1:-1:-1;;;55128:11:0;;;;;;55051:366;55161:60;55180:12;;55161:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55194:20:0;;:11;;-1:-1:-1;55194:20:0;;-1:-1:-1;55194:20:0;:::i;55161:60::-;55157:260;;;-1:-1:-1;;55237:14:0;;;;;;;;;;;;-1:-1:-1;;;55237:14:0;;;;;;55157:260;55273:57;55292:12;;55273:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55306:17:0;;:11;;-1:-1:-1;55306:17:0;;-1:-1:-1;55306:17:0;:::i;55273:57::-;55269:148;;;-1:-1:-1;;55346:11:0;;;;;;;;;;;;-1:-1:-1;;;55346:11:0;;;;;;55269:148;-1:-1:-1;;55390:15:0;;;;;;;;;;;;-1:-1:-1;;;55390:15:0;;;;;;48735:102;48779:13;48812:17;48805:24;;;;;:::i;30006:164::-;-1:-1:-1;;;;;30127:25:0;;;30103:4;30127:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30006:164::o;51986:1152::-;52100:10;:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;52092:61;;;;-1:-1:-1;;;52092:61:0;;;;;;;:::i;:::-;52164:10;52177:13;:11;:13::i;:::-;52164:26;-1:-1:-1;47163:4:0;52209:16;;;;52164:26;52209:16;:::i;:::-;:32;;52201:63;;;;-1:-1:-1;;;52201:63:0;;;;;;;:::i;:::-;52298:10;52283:26;;;;:14;:26;;;;;;52325:1;;52283:38;;52310:11;;52283:26;;:38;:::i;:::-;:43;;;;52275:83;;;;-1:-1:-1;;;52275:83:0;;;;;;;:::i;:::-;52369:12;52411:10;52394:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;52384:39;;;;;;52369:54;;52440:57;52459:12;;52440:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52473:17:0;;:11;;-1:-1:-1;52473:17:0;;-1:-1:-1;52473:17:0;:::i;52440:57::-;52436:511;;;52534:27;47275:10;52534:27;;;;:::i;:::-;52521:9;:40;52513:102;;;;-1:-1:-1;;;52513:102:0;;;;;;;:::i;:::-;52436:511;;;52637:58;52656:12;;52637:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52670:18:0;;:11;;-1:-1:-1;52670:18:0;;-1:-1:-1;52670:18:0;:::i;52637:58::-;52633:314;;;52732:30;47335:10;52732:30;;;;:::i;:::-;52719:9;:43;52711:108;;;;-1:-1:-1;;;52711:108:0;;;;;;;:::i;52633:314::-;52860:57;52879:12;;52860:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52893:17:0;;:11;;-1:-1:-1;52893:17:0;;-1:-1:-1;52893:17:0;:::i;52860:57::-;52852:83;;;;-1:-1:-1;;;52852:83:0;;;;;;;:::i;:::-;52982:10;52967:26;;;;:14;:26;;;;;:41;;52997:11;;52967:26;:41;;52997:11;;52967:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;53034:9;53029:102;53053:11;53049:15;;:1;:15;53029:102;;;53086:29;53096:10;53108:6;53113:1;53108:2;:6;:::i;53086:29::-;53066:3;;;;:::i;:::-;;;;53029:102;;47452:34;47485:1;47452:34;:::o;7156:201::-;6478:12;:10;:12::i;:::-;-1:-1:-1;;;;;6467:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;6467:23:0;;6459:68;;;;-1:-1:-1;;;6459:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7245:22:0;::::1;7237:73;;;;-1:-1:-1::0;;;7237:73:0::1;;;;;;;:::i;:::-;7321:28;7340:8;7321:18;:28::i;:::-;7156:201:::0;:::o;47235:50::-;47275:10;47235:50;:::o;40434:224::-;40536:4;-1:-1:-1;;;;;;40560:50:0;;-1:-1:-1;;;40560:50:0;;:90;;;40614:36;40638:11;40614:23;:36::i;4971:98::-;5051:10;4971:98;:::o;32741:127::-;32806:4;32830:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32830:16:0;:30;;;32741:127::o;36723:174::-;36798:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;36798:29:0;-1:-1:-1;;;;;36798:29:0;;;;;;;;:24;;36852:23;36798:24;36852:14;:23::i;:::-;-1:-1:-1;;;;;36843:46:0;;;;;;;;;;;36723:174;;:::o;33725:110::-;33801:26;33811:2;33815:7;33801:26;;;;;;;;;;;;:9;:26::i;33035:348::-;33128:4;33153:16;33161:7;33153;:16::i;:::-;33145:73;;;;-1:-1:-1;;;33145:73:0;;;;;;;:::i;:::-;33229:13;33245:23;33260:7;33245:14;:23::i;:::-;33229:39;;33298:5;-1:-1:-1;;;;;33287:16:0;:7;-1:-1:-1;;;;;33287:16:0;;:51;;;;33331:7;-1:-1:-1;;;;;33307:31:0;:20;33319:7;33307:11;:20::i;:::-;-1:-1:-1;;;;;33307:31:0;;33287:51;:87;;;;33342:32;33359:5;33366:7;33342:16;:32::i;:::-;33279:96;33035:348;-1:-1:-1;;;;33035:348:0:o;36027:578::-;36186:4;-1:-1:-1;;;;;36159:31:0;:23;36174:7;36159:14;:23::i;:::-;-1:-1:-1;;;;;36159:31:0;;36151:85;;;;-1:-1:-1;;;36151:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36255:16:0;;36247:65;;;;-1:-1:-1;;;36247:65:0;;;;;;;:::i;:::-;36325:39;36346:4;36352:2;36356:7;36325:20;:39::i;:::-;36429:29;36446:1;36450:7;36429:8;:29::i;:::-;-1:-1:-1;;;;;36471:15:0;;;;;;:9;:15;;;;;:20;;36490:1;;36471:15;:20;;36490:1;;36471:20;:::i;:::-;;;;-1:-1:-1;;;;;;;36502:13:0;;;;;;:9;:13;;;;;:18;;36519:1;;36502:13;:18;;36519:1;;36502:18;:::i;:::-;;;;-1:-1:-1;;36531:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36531:21:0;-1:-1:-1;;;;;36531:21:0;;;;;;;;;36570:27;;36531:16;;36570:27;;;;;;;36027:578;;;:::o;908:190::-;1033:4;1086;1057:25;1070:5;1077:4;1057:12;:25::i;:::-;:33;;908:190;-1:-1:-1;;;;908:190:0:o;7517:191::-;7610:6;;;-1:-1:-1;;;;;7627:17:0;;;-1:-1:-1;;;;;;7627:17:0;;;;;;;7660:40;;7610:6;;;7627:17;7610:6;;7660:40;;7591:16;;7660:40;7517:191;;:::o;37039:315::-;37194:8;-1:-1:-1;;;;;37185:17:0;:5;-1:-1:-1;;;;;37185:17:0;;;37177:55;;;;-1:-1:-1;;;37177:55:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37243:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;:46;;-1:-1:-1;;37243:46:0;;;;;;;37305:41;;;;;37243:46;;37305:41;:::i;:::-;;;;;;;;37039:315;;;:::o;32113:::-;32270:28;32280:4;32286:2;32290:7;32270:9;:28::i;:::-;32317:48;32340:4;32346:2;32350:7;32359:5;32317:22;:48::i;:::-;32309:111;;;;-1:-1:-1;;;32309:111:0;;;;;;;:::i;2533:723::-;2589:13;2810:10;2806:53;;-1:-1:-1;2837:10:0;;;;;;;;;;;;-1:-1:-1;;;2837:10:0;;;;;;2806:53;2884:5;2869:12;2925:78;2932:9;;2925:78;;2958:8;;;;:::i;:::-;;-1:-1:-1;2981:10:0;;-1:-1:-1;2989:2:0;2981:10;;:::i;:::-;;;2925:78;;;3013:19;3045:6;3035:17;;;;;;-1:-1:-1;;;3035:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3035:17:0;;3013:39;;3063:154;3070:10;;3063:154;;3097:11;3107:1;3097:11;;:::i;:::-;;-1:-1:-1;3166:10:0;3174:2;3166:5;:10;:::i;:::-;3153:24;;:2;:24;:::i;:::-;3140:39;;3123:6;3130;3123:14;;;;;;-1:-1:-1;;;3123:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;3123:56:0;;;;;;;;-1:-1:-1;3194:11:0;3203:2;3194:11;;:::i;:::-;;;3063:154;;26983:305;27085:4;-1:-1:-1;;;;;;27122:40:0;;-1:-1:-1;;;27122:40:0;;:105;;-1:-1:-1;;;;;;;27179:48:0;;-1:-1:-1;;;27179:48:0;27122:105;:158;;;;27244:36;27268:11;27244:23;:36::i;34062:321::-;34192:18;34198:2;34202:7;34192:5;:18::i;:::-;34243:54;34274:1;34278:2;34282:7;34291:5;34243:22;:54::i;:::-;34221:154;;;;-1:-1:-1;;;34221:154:0;;;;;;;:::i;48359:181::-;48487:45;48514:4;48520:2;48524:7;48487:26;:45::i;1460:701::-;1543:7;1586:4;1543:7;1601:523;1625:5;:12;1621:1;:16;1601:523;;;1659:20;1682:5;1688:1;1682:8;;;;;;-1:-1:-1;;;1682:8:0;;;;;;;;;;;;;;;1659:31;;1725:12;1709;:28;1705:408;;1879:12;1893;1862:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1852:55;;;;;;1837:70;;1705:408;;;2069:12;2083;2052:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2042:55;;;;;;2027:70;;1705:408;-1:-1:-1;1639:3:0;;;;:::i;:::-;;;;1601:523;;;-1:-1:-1;2141:12:0;1460:701;-1:-1:-1;;;1460:701:0:o;37919:799::-;38074:4;38095:15;:2;-1:-1:-1;;;;;38095:13:0;;:15::i;:::-;38091:620;;;38147:2;-1:-1:-1;;;;;38131:36:0;;38168:12;:10;:12::i;:::-;38182:4;38188:7;38197:5;38131:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38131:72:0;;;;;;;;-1:-1:-1;;38131:72:0;;;;;;;;;;;;:::i;:::-;;;38127:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38373:13:0;;38369:272;;38416:60;;-1:-1:-1;;;38416:60:0;;;;;;;:::i;38369:272::-;38591:6;38585:13;38576:6;38572:2;38568:15;38561:38;38127:529;-1:-1:-1;;;;;;38254:51:0;-1:-1:-1;;;38254:51:0;;-1:-1:-1;38247:58:0;;38091:620;-1:-1:-1;38695:4:0;37919:799;;;;;;:::o;18679:157::-;-1:-1:-1;;;;;;18788:40:0;;-1:-1:-1;;;18788:40:0;18679:157;;;:::o;34719:382::-;-1:-1:-1;;;;;34799:16:0;;34791:61;;;;-1:-1:-1;;;34791:61:0;;;;;;;:::i;:::-;34872:16;34880:7;34872;:16::i;:::-;34871:17;34863:58;;;;-1:-1:-1;;;34863:58:0;;;;;;;:::i;:::-;34934:45;34963:1;34967:2;34971:7;34934:20;:45::i;:::-;-1:-1:-1;;;;;34992:13:0;;;;;;:9;:13;;;;;:18;;35009:1;;34992:13;:18;;35009:1;;34992:18;:::i;:::-;;;;-1:-1:-1;;35021:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35021:21:0;-1:-1:-1;;;;;35021:21:0;;;;;;;;35060:33;;35021:16;;;35060:33;;35021:16;;35060:33;34719:382;;:::o;42110:589::-;42254:45;42281:4;42287:2;42291:7;42254:26;:45::i;:::-;-1:-1:-1;;;;;42316:18:0;;42312:187;;42351:40;42383:7;42351:31;:40::i;:::-;42312:187;;;42421:2;-1:-1:-1;;;;;42413:10:0;:4;-1:-1:-1;;;;;42413:10:0;;42409:90;;42440:47;42473:4;42479:7;42440:32;:47::i;:::-;-1:-1:-1;;;;;42513:16:0;;42509:183;;42546:45;42583:7;42546:36;:45::i;:::-;42509:183;;;42619:4;-1:-1:-1;;;;;42613:10:0;:2;-1:-1:-1;;;;;42613:10:0;;42609:83;;42640:40;42668:2;42672:7;42640:27;:40::i;8535:387::-;8858:20;8906:8;;;8535:387::o;43422:164::-;43526:10;:17;;43499:24;;;;:15;:24;;;;;:44;;;43554:24;;;;;;;;;;;;43422:164::o;44213:988::-;44479:22;44529:1;44504:22;44521:4;44504:16;:22::i;:::-;:26;;;;:::i;:::-;44541:18;44562:26;;;:17;:26;;;;;;44479:51;;-1:-1:-1;44695:28:0;;;44691:328;;-1:-1:-1;;;;;44762:18:0;;44740:19;44762:18;;;:12;:18;;;;;;;;:34;;;;;;;;;44813:30;;;;;;:44;;;44930:30;;:17;:30;;;;;:43;;;44691:328;-1:-1:-1;45115:26:0;;;;:17;:26;;;;;;;;45108:33;;;-1:-1:-1;;;;;45159:18:0;;;;;:12;:18;;;;;:34;;;;;;;45152:41;44213:988::o;45496:1079::-;45774:10;:17;45749:22;;45774:21;;45794:1;;45774:21;:::i;:::-;45806:18;45827:24;;;:15;:24;;;;;;46200:10;:26;;45749:46;;-1:-1:-1;45827:24:0;;45749:46;;46200:26;;;;-1:-1:-1;;;46200:26:0;;;;;;;;;;;;;;;;;46178:48;;46264:11;46239:10;46250;46239:22;;;;;;-1:-1:-1;;;46239:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;46344:28;;;:15;:28;;;;;;;:41;;;46516:24;;;;;46509:31;46551:10;:16;;;;;-1:-1:-1;;;46551:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;45496:1079;;;;:::o;43000:221::-;43085:14;43102:20;43119:2;43102:16;:20::i;:::-;-1:-1:-1;;;;;43133:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;43178:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;43000:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:607:1;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;206:2;200:9;279:2;256:17;;-1:-1:-1;;252:31:1;240:44;;286:4;236:55;306:18;;;326:22;;;303:46;300:2;;;352:18;;:::i;:::-;388:2;381:22;436;;;421:6;-1:-1:-1;421:6:1;473:16;;;470:25;-1:-1:-1;467:2:1;;;508:1;505;498:12;467:2;558:6;553:3;546:4;538:6;534:17;521:44;613:1;606:4;597:6;589;585:19;581:30;574:41;;;90:531;;;;;:::o;626:175::-;696:20;;-1:-1:-1;;;;;745:31:1;;735:42;;725:2;;791:1;788;781:12;806:400;;;939:3;932:4;924:6;920:17;916:27;906:2;;962:6;954;947:22;906:2;-1:-1:-1;990:20:1;;1033:18;1022:30;;1019:2;;;1072:8;1062;1055:26;1019:2;1116:4;1108:6;1104:17;1092:29;;1179:3;1172:4;1164;1156:6;1152:17;1144:6;1140:30;1136:41;1133:50;1130:2;;;1196:1;1193;1186:12;1130:2;896:310;;;;;:::o;1211:162::-;1278:20;;1334:13;;1327:21;1317:32;;1307:2;;1363:1;1360;1353:12;1378:233;;1476:3;1469:4;1461:6;1457:17;1453:27;1443:2;;1498:5;1491;1484:20;1443:2;1524:81;1601:3;1592:6;1579:20;1572:4;1564:6;1560:17;1524:81;:::i;:::-;1515:90;1433:178;-1:-1:-1;;;1433:178:1:o;1616:158::-;1684:20;;1744:4;1733:16;;1723:27;;1713:2;;1764:1;1761;1754:12;1779:198;;1891:2;1879:9;1870:7;1866:23;1862:32;1859:2;;;1912:6;1904;1897:22;1859:2;1940:31;1961:9;1940:31;:::i;1982:274::-;;;2111:2;2099:9;2090:7;2086:23;2082:32;2079:2;;;2132:6;2124;2117:22;2079:2;2160:31;2181:9;2160:31;:::i;:::-;2150:41;;2210:40;2246:2;2235:9;2231:18;2210:40;:::i;:::-;2200:50;;2069:187;;;;;:::o;2261:342::-;;;;2407:2;2395:9;2386:7;2382:23;2378:32;2375:2;;;2428:6;2420;2413:22;2375:2;2456:31;2477:9;2456:31;:::i;:::-;2446:41;;2506:40;2542:2;2531:9;2527:18;2506:40;:::i;:::-;2496:50;;2593:2;2582:9;2578:18;2565:32;2555:42;;2365:238;;;;;:::o;2608:702::-;;;;;2780:3;2768:9;2759:7;2755:23;2751:33;2748:2;;;2802:6;2794;2787:22;2748:2;2830:31;2851:9;2830:31;:::i;:::-;2820:41;;2880:40;2916:2;2905:9;2901:18;2880:40;:::i;:::-;2870:50;;2967:2;2956:9;2952:18;2939:32;2929:42;;3022:2;3011:9;3007:18;2994:32;3049:18;3041:6;3038:30;3035:2;;;3086:6;3078;3071:22;3035:2;3114:22;;3167:4;3159:13;;3155:27;-1:-1:-1;3145:2:1;;3201:6;3193;3186:22;3145:2;3229:75;3296:7;3291:2;3278:16;3273:2;3269;3265:11;3229:75;:::i;:::-;3219:85;;;2738:572;;;;;;;:::o;3315:268::-;;;3441:2;3429:9;3420:7;3416:23;3412:32;3409:2;;;3462:6;3454;3447:22;3409:2;3490:31;3511:9;3490:31;:::i;:::-;3480:41;;3540:37;3573:2;3562:9;3558:18;3540:37;:::i;3588:266::-;;;3717:2;3705:9;3696:7;3692:23;3688:32;3685:2;;;3738:6;3730;3723:22;3685:2;3766:31;3787:9;3766:31;:::i;:::-;3756:41;3844:2;3829:18;;;;3816:32;;-1:-1:-1;;;3675:179:1:o;3859:463::-;;;4006:2;3994:9;3985:7;3981:23;3977:32;3974:2;;;4027:6;4019;4012:22;3974:2;4072:9;4059:23;4105:18;4097:6;4094:30;4091:2;;;4142:6;4134;4127:22;4091:2;4186:76;4254:7;4245:6;4234:9;4230:22;4186:76;:::i;:::-;4281:8;;4160:102;;-1:-1:-1;3964:358:1;-1:-1:-1;;;;3964:358:1:o;4327:257::-;;4438:2;4426:9;4417:7;4413:23;4409:32;4406:2;;;4459:6;4451;4444:22;4406:2;4503:9;4490:23;4522:32;4548:5;4522:32;:::i;4589:261::-;;4711:2;4699:9;4690:7;4686:23;4682:32;4679:2;;;4732:6;4724;4717:22;4679:2;4769:9;4763:16;4788:32;4814:5;4788:32;:::i;4855:344::-;;4977:2;4965:9;4956:7;4952:23;4948:32;4945:2;;;4998:6;4990;4983:22;4945:2;5043:9;5030:23;5076:18;5068:6;5065:30;5062:2;;;5113:6;5105;5098:22;5062:2;5141:52;5185:7;5176:6;5165:9;5161:22;5141:52;:::i;5204:414::-;;;5340:2;5328:9;5319:7;5315:23;5311:32;5308:2;;;5361:6;5353;5346:22;5308:2;5406:9;5393:23;5439:18;5431:6;5428:30;5425:2;;;5476:6;5468;5461:22;5425:2;5504:52;5548:7;5539:6;5528:9;5524:22;5504:52;:::i;:::-;5494:62;;;5575:37;5608:2;5597:9;5593:18;5575:37;:::i;5623:412::-;;;5762:2;5750:9;5741:7;5737:23;5733:32;5730:2;;;5783:6;5775;5768:22;5730:2;5828:9;5815:23;5861:18;5853:6;5850:30;5847:2;;;5898:6;5890;5883:22;5847:2;5926:52;5970:7;5961:6;5950:9;5946:22;5926:52;:::i;:::-;5916:62;6025:2;6010:18;;;;5997:32;;-1:-1:-1;;;;5720:315:1:o;6040:190::-;;6152:2;6140:9;6131:7;6127:23;6123:32;6120:2;;;6173:6;6165;6158:22;6120:2;-1:-1:-1;6201:23:1;;6110:120;-1:-1:-1;6110:120:1:o;6235:194::-;;6345:2;6333:9;6324:7;6320:23;6316:32;6313:2;;;6366:6;6358;6351:22;6313:2;6394:29;6413:9;6394:29;:::i;6434:535::-;;;;6596:2;6584:9;6575:7;6571:23;6567:32;6564:2;;;6617:6;6609;6602:22;6564:2;6645:29;6664:9;6645:29;:::i;:::-;6635:39;;6725:2;6714:9;6710:18;6697:32;6752:18;6744:6;6741:30;6738:2;;;6789:6;6781;6774:22;6738:2;6833:76;6901:7;6892:6;6881:9;6877:22;6833:76;:::i;:::-;6554:415;;6928:8;;-1:-1:-1;6807:102:1;;-1:-1:-1;;;;6554:415:1:o;6974:259::-;;7055:5;7049:12;7082:6;7077:3;7070:19;7098:63;7154:6;7147:4;7142:3;7138:14;7131:4;7124:5;7120:16;7098:63;:::i;:::-;7215:2;7194:15;-1:-1:-1;;7190:29:1;7181:39;;;;7222:4;7177:50;;7025:208;-1:-1:-1;;7025:208:1:o;7238:982::-;7325:12;;7238:982;;7397:1;7382:17;;7418:1;7454:18;;;;7481:2;;7535:4;7527:6;7523:17;7513:27;;7481:2;7561;7609;7601:6;7598:14;7578:18;7575:38;7572:2;;;-1:-1:-1;;;7636:33:1;;7692:4;7689:1;7682:15;7722:4;7643:3;7710:17;7572:2;7753:18;7780:104;;;;7898:1;7893:321;;;;7746:468;;7780:104;-1:-1:-1;;7813:24:1;;7801:37;;7858:16;;;;-1:-1:-1;7780:104:1;;7893:321;7929:38;7961:5;7929:38;:::i;:::-;7989:1;8003:165;8017:6;8014:1;8011:13;8003:165;;;8095:14;;8082:11;;;8075:35;8138:16;;;;8032:10;;8003:165;;;8007:3;;8197:6;8192:3;8188:16;8181:23;;7746:468;;;;;;;7298:922;;;;:::o;8225:229::-;8374:2;8370:15;;;;-1:-1:-1;;8366:53:1;8354:66;;8445:2;8436:12;;8344:110::o;8459:247::-;8616:19;;;8660:2;8651:12;;8644:28;8697:2;8688:12;;8606:100::o;8711:276::-;;8880:6;8874:13;8896:53;8942:6;8937:3;8930:4;8922:6;8918:17;8896:53;:::i;:::-;8965:16;;;;;8850:137;-1:-1:-1;;8850:137:1:o;8992:199::-;;9145:40;9181:3;9173:6;9145:40;:::i;9196:378::-;;9400:40;9436:3;9428:6;9400:40;:::i;:::-;9469:6;9463:13;9485:52;9530:6;9526:2;9519:4;9511:6;9507:17;9485:52;:::i;:::-;9553:15;;9380:194;-1:-1:-1;;;;9380:194:1:o;9579:254::-;-1:-1:-1;;;9781:19:1;;9825:1;9816:11;;9771:62::o;9838:253::-;-1:-1:-1;;;10040:18:1;;10083:1;10074:11;;10030:61::o;10096:252::-;-1:-1:-1;;;10298:17:1;;10340:1;10331:11;;10288:60::o;10353:255::-;-1:-1:-1;;;10555:20:1;;10600:1;10591:11;;10545:63::o;10613:252::-;-1:-1:-1;;;10815:17:1;;10857:1;10848:11;;10805:60::o;10870:255::-;-1:-1:-1;;;11072:20:1;;11117:1;11108:11;;11062:63::o;11130:257::-;-1:-1:-1;;;11332:22:1;;11379:1;11370:11;;11322:65::o;11392:256::-;-1:-1:-1;;;11594:21:1;;11640:1;11631:11;;11584:64::o;11653:252::-;-1:-1:-1;;;11855:17:1;;11897:1;11888:11;;11845:60::o;11910:203::-;-1:-1:-1;;;;;12074:32:1;;;;12056:51;;12044:2;12029:18;;12011:102::o;12118:490::-;-1:-1:-1;;;;;12387:15:1;;;12369:34;;12439:15;;12434:2;12419:18;;12412:43;12486:2;12471:18;;12464:34;;;12534:3;12529:2;12514:18;;12507:31;;;12118:490;;12555:47;;12582:19;;12574:6;12555:47;:::i;:::-;12547:55;12321:287;-1:-1:-1;;;;;;12321:287:1:o;12613:187::-;12778:14;;12771:22;12753:41;;12741:2;12726:18;;12708:92::o;12805:177::-;12951:25;;;12939:2;12924:18;;12906:76::o;12987:221::-;;13136:2;13125:9;13118:21;13156:46;13198:2;13187:9;13183:18;13175:6;13156:46;:::i;13213:353::-;13415:2;13397:21;;;13454:2;13434:18;;;13427:30;13493:31;13488:2;13473:18;;13466:59;13557:2;13542:18;;13387:179::o;13571:416::-;13773:2;13755:21;;;13812:2;13792:18;;;13785:30;-1:-1:-1;;;;;;;;;;;13846:2:1;13831:18;;13824:62;-1:-1:-1;;;13917:2:1;13902:18;;13895:50;13977:3;13962:19;;13745:242::o;13992:339::-;14194:2;14176:21;;;14233:2;14213:18;;;14206:30;-1:-1:-1;;;14267:2:1;14252:18;;14245:45;14322:2;14307:18;;14166:165::o;14336:407::-;14538:2;14520:21;;;14577:2;14557:18;;;14550:30;14616:34;14611:2;14596:18;;14589:62;-1:-1:-1;;;14682:2:1;14667:18;;14660:41;14733:3;14718:19;;14510:233::o;14748:414::-;14950:2;14932:21;;;14989:2;14969:18;;;14962:30;15028:34;15023:2;15008:18;;15001:62;-1:-1:-1;;;15094:2:1;15079:18;;15072:48;15152:3;15137:19;;14922:240::o;15167:402::-;15369:2;15351:21;;;15408:2;15388:18;;;15381:30;15447:34;15442:2;15427:18;;15420:62;-1:-1:-1;;;15513:2:1;15498:18;;15491:36;15559:3;15544:19;;15341:228::o;15574:349::-;15776:2;15758:21;;;15815:2;15795:18;;;15788:30;15854:27;15849:2;15834:18;;15827:55;15914:2;15899:18;;15748:175::o;15928:352::-;16130:2;16112:21;;;16169:2;16149:18;;;16142:30;16208;16203:2;16188:18;;16181:58;16271:2;16256:18;;16102:178::o;16285:350::-;16487:2;16469:21;;;16526:2;16506:18;;;16499:30;16565:28;16560:2;16545:18;;16538:56;16626:2;16611:18;;16459:176::o;16640:400::-;16842:2;16824:21;;;16881:2;16861:18;;;16854:30;16920:34;16915:2;16900:18;;16893:62;-1:-1:-1;;;16986:2:1;16971:18;;16964:34;17030:3;17015:19;;16814:226::o;17045:349::-;17247:2;17229:21;;;17286:2;17266:18;;;17259:30;17325:27;17320:2;17305:18;;17298:55;17385:2;17370:18;;17219:175::o;17399:410::-;17601:2;17583:21;;;17640:2;17620:18;;;17613:30;-1:-1:-1;;;;;;;;;;;17674:2:1;17659:18;;17652:62;-1:-1:-1;;;17745:2:1;17730:18;;17723:44;17799:3;17784:19;;17573:236::o;17814:408::-;18016:2;17998:21;;;18055:2;18035:18;;;18028:30;18094:34;18089:2;18074:18;;18067:62;-1:-1:-1;;;18160:2:1;18145:18;;18138:42;18212:3;18197:19;;17988:234::o;18227:351::-;18429:2;18411:21;;;18468:2;18448:18;;;18441:30;18507:29;18502:2;18487:18;;18480:57;18569:2;18554:18;;18401:177::o;18583:420::-;18785:2;18767:21;;;18824:2;18804:18;;;18797:30;18863:34;18858:2;18843:18;;18836:62;18934:26;18929:2;18914:18;;18907:54;18993:3;18978:19;;18757:246::o;19008:406::-;19210:2;19192:21;;;19249:2;19229:18;;;19222:30;19288:34;19283:2;19268:18;;19261:62;-1:-1:-1;;;19354:2:1;19339:18;;19332:40;19404:3;19389:19;;19182:232::o;19419:405::-;19621:2;19603:21;;;19660:2;19640:18;;;19633:30;19699:34;19694:2;19679:18;;19672:62;-1:-1:-1;;;19765:2:1;19750:18;;19743:39;19814:3;19799:19;;19593:231::o;19829:397::-;20031:2;20013:21;;;20070:2;20050:18;;;20043:30;20109:34;20104:2;20089:18;;20082:62;-1:-1:-1;;;20175:2:1;20160:18;;20153:31;20216:3;20201:19;;20003:223::o;20231:356::-;20433:2;20415:21;;;20452:18;;;20445:30;20511:34;20506:2;20491:18;;20484:62;20578:2;20563:18;;20405:182::o;20592:408::-;20794:2;20776:21;;;20833:2;20813:18;;;20806:30;20872:34;20867:2;20852:18;;20845:62;-1:-1:-1;;;20938:2:1;20923:18;;20916:42;20990:3;20975:19;;20766:234::o;21005:356::-;21207:2;21189:21;;;21226:18;;;21219:30;21285:34;21280:2;21265:18;;21258:62;21352:2;21337:18;;21179:182::o;21366:405::-;21568:2;21550:21;;;21607:2;21587:18;;;21580:30;21646:34;21641:2;21626:18;;21619:62;-1:-1:-1;;;21712:2:1;21697:18;;21690:39;21761:3;21746:19;;21540:231::o;21776:411::-;21978:2;21960:21;;;22017:2;21997:18;;;21990:30;22056:34;22051:2;22036:18;;22029:62;-1:-1:-1;;;22122:2:1;22107:18;;22100:45;22177:3;22162:19;;21950:237::o;22192:413::-;22394:2;22376:21;;;22433:2;22413:18;;;22406:30;-1:-1:-1;;;;;;;;;;;22467:2:1;22452:18;;22445:62;-1:-1:-1;;;22538:2:1;22523:18;;22516:47;22595:3;22580:19;;22366:239::o;22610:397::-;22812:2;22794:21;;;22851:2;22831:18;;;22824:30;22890:34;22885:2;22870:18;;22863:62;-1:-1:-1;;;22956:2:1;22941:18;;22934:31;22997:3;22982:19;;22784:223::o;23012:418::-;23214:2;23196:21;;;23253:2;23233:18;;;23226:30;-1:-1:-1;;;;;;;;;;;23287:2:1;23272:18;;23265:62;-1:-1:-1;;;23358:2:1;23343:18;;23336:52;23420:3;23405:19;;23186:244::o;23435:413::-;23637:2;23619:21;;;23676:2;23656:18;;;23649:30;23715:34;23710:2;23695:18;;23688:62;-1:-1:-1;;;23781:2:1;23766:18;;23759:47;23838:3;23823:19;;23609:239::o;23853:342::-;24055:2;24037:21;;;24094:2;24074:18;;;24067:30;-1:-1:-1;;;24128:2:1;24113:18;;24106:48;24186:2;24171:18;;24027:168::o;24200:408::-;24402:2;24384:21;;;24441:2;24421:18;;;24414:30;24480:34;24475:2;24460:18;;24453:62;-1:-1:-1;;;24546:2:1;24531:18;;24524:42;24598:3;24583:19;;24374:234::o;24613:337::-;24815:2;24797:21;;;24854:2;24834:18;;;24827:30;-1:-1:-1;;;24888:2:1;24873:18;;24866:43;24941:2;24926:18;;24787:163::o;24955:348::-;25157:2;25139:21;;;25196:2;25176:18;;;25169:30;25235:26;25230:2;25215:18;;25208:54;25294:2;25279:18;;25129:174::o;25308:402::-;25510:2;25492:21;;;25549:2;25529:18;;;25522:30;25588:34;25583:2;25568:18;;25561:62;-1:-1:-1;;;25654:2:1;25639:18;;25632:36;25700:3;25685:19;;25482:228::o;25897:184::-;26069:4;26057:17;;;;26039:36;;26027:2;26012:18;;25994:87::o;26086:129::-;;26154:17;;;26204:4;26188:21;;;26144:71::o;26220:128::-;;26291:1;26287:6;26284:1;26281:13;26278:2;;;26297:18;;:::i;:::-;-1:-1:-1;26333:9:1;;26268:80::o;26353:204::-;;26427:4;26424:1;26420:12;26459:4;26456:1;26452:12;26494:3;26488:4;26484:14;26479:3;26476:23;26473:2;;;26502:18;;:::i;:::-;26538:13;;26399:158;-1:-1:-1;;;26399:158:1:o;26562:120::-;;26628:1;26618:2;;26633:18;;:::i;:::-;-1:-1:-1;26667:9:1;;26608:74::o;26687:168::-;;26793:1;26789;26785:6;26781:14;26778:1;26775:21;26770:1;26763:9;26756:17;26752:45;26749:2;;;26800:18;;:::i;:::-;-1:-1:-1;26840:9:1;;26739:116::o;26860:125::-;;26928:1;26925;26922:8;26919:2;;;26933:18;;:::i;:::-;-1:-1:-1;26970:9:1;;26909:76::o;26990:195::-;;27065:4;27062:1;27058:12;27097:4;27094:1;27090:12;27122:3;27117;27114:12;27111:2;;;27129:18;;:::i;:::-;27166:13;;;27037:148;-1:-1:-1;;;27037:148:1:o;27190:258::-;27262:1;27272:113;27286:6;27283:1;27280:13;27272:113;;;27362:11;;;27356:18;27343:11;;;27336:39;27308:2;27301:10;27272:113;;;27403:6;27400:1;27397:13;27394:2;;;-1:-1:-1;;27438:1:1;27420:16;;27413:27;27243:205::o;27453:380::-;27538:1;27528:12;;27585:1;27575:12;;;27596:2;;27650:4;27642:6;27638:17;27628:27;;27596:2;27703;27695:6;27692:14;27672:18;27669:38;27666:2;;;27749:10;27744:3;27740:20;27737:1;27730:31;27784:4;27781:1;27774:15;27812:4;27809:1;27802:15;27666:2;;27508:325;;;:::o;27838:135::-;;-1:-1:-1;;27898:17:1;;27895:2;;;27918:18;;:::i;:::-;-1:-1:-1;27965:1:1;27954:13;;27885:88::o;27978:112::-;;28036:1;28026:2;;28041:18;;:::i;:::-;-1:-1:-1;28075:9:1;;28016:74::o;28095:127::-;28156:10;28151:3;28147:20;28144:1;28137:31;28187:4;28184:1;28177:15;28211:4;28208:1;28201:15;28227:127;28288:10;28283:3;28279:20;28276:1;28269:31;28319:4;28316:1;28309:15;28343:4;28340:1;28333:15;28359:127;28420:10;28415:3;28411:20;28408:1;28401:31;28451:4;28448:1;28441:15;28475:4;28472:1;28465:15;28491:133;-1:-1:-1;;;;;;28567:32:1;;28557:43;;28547:2;;28614:1;28611;28604:12

Swarm Source

ipfs://574532968345ddeb42af4b3380736389e0835aba8575b9815e764208acca9d3a
Loading...
Loading
Loading...
Loading
[ 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.