ETH Price: $3,860.45 (-1.31%)
Gas: 5.97 Gwei

Token

Monsters & Hunters Game (MHG)
 

Overview

Max Total Supply

0 MHG

Holders

1,165

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 MHG
0xbb7c904e43bcbf98542abe09835478cb6f1e3869
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MonstersHunters

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-27
*/

/**
 *Submitted for verification at Etherscan.io on 2021-12-27
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Counters.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts 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/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/ERC721URIStorage.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

        return super.tokenURI(tokenId);
    }

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

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

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: contracts/nftContract.sol


pragma solidity ^0.8.2;





contract MonstersHunters is ERC721, ERC721URIStorage, Ownable {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;
	string baseURI;
	string prerevealURI;
	string public baseExtension = ".json";
	uint256 MAX_TOKENS=5000;
	uint256 MAX_TOKENS_PRESALE=5000;
    uint256 MaxFreeNFTTotal = 500;
    uint256 public TotalFreeNFTsMinted;
	uint256 MAXNFTperTX = 5;
	uint256 public FEE;
	uint256 public FEEpresales;
	uint256 MAXFREENFTperADDR = 5;
	string BaseURI="https://gateway.pinata.cloud/ipfs/QmTrceQHqyUpV2wZuLu7nLkcvsowNZa7t68fQnGgHjq3Gv/";
	bool public paused = false;
	bool public presale = false;
	bool public publicsale = true;
	bool public reveal = false;
	mapping(address => bool) public whitelisted;
	mapping(address => uint256) NFTperAddress;
	
	//address public constant devAddress = 0xe470282B92A3CAd9EdE288C528ad198765A54871;

    //Mapping to store URI data for delayed reveal
    //mapping(uint256 => string) public tokenIdToURI;

    constructor(string memory mybaseuri,string memory _prereveal) ERC721("Monsters & Hunters Game", "MHG") {
		_tokenIdCounter.increment();
		setBaseURI(mybaseuri);
		FEE=40000000000000000;
		FEEpresales=40000000000000000;
        TotalFreeNFTsMinted=0;
		setprerevealURI(_prereveal);
		
	}
	
	function whitelistUser(address _user) public onlyOwner {
		whitelisted[_user] = true;
	
    }
	function whitelistUserBulk(address[] memory _users) public onlyOwner {
        uint i;
		for(i=0;i<_users.length;i++){
			whitelisted[_users[i]] = true;
			}
	}
	
	function setCost(uint256 _newCost) public onlyOwner {
		FEE = _newCost;
	}
	
	function setPresaleCost(uint256 _newCost) public onlyOwner {
		FEEpresales = _newCost;
	}
 
	function removeWhitelistUser(address _user) public onlyOwner {
		whitelisted[_user] = false;
	}
	
	function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }
	
	// internal
	function _baseURI() internal view virtual override returns (string memory) {
		return baseURI;
	}
	
  
	function setBaseURI(string memory _newBaseURI) public onlyOwner {
		baseURI = _newBaseURI;
	}

	 
	function setprerevealURI(string memory _newprerevealURI) public onlyOwner {
		prerevealURI = _newprerevealURI;
	}

	function setreveal(bool _reveal) public onlyOwner {
		reveal = _reveal;
	}

	function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
		baseExtension = _newBaseExtension;
	}
	
	function pause(bool _state) public onlyOwner {
		paused = _state;
	}
	
	function startpresale(bool _state) public onlyOwner {
		presale = _state;
	}

	function startpublicsale(bool _state) public onlyOwner {
		publicsale = _state;
	}

    
	function safeMint(uint minttimes) public payable {
		
		require(!paused);
		require(MAX_TOKENS > _tokenIdCounter.current() + minttimes, "Not enough tokens left to buy.");
		require(MAXNFTperTX >= minttimes,"Only 5 NFTs per transaction!");
		
			if (msg.sender == owner()){
				for(uint i=0;i<minttimes;i++){
					_safeMint(msg.sender, _tokenIdCounter.current());	
					_tokenIdCounter.increment();
					NFTperAddress[msg.sender]++;
				}
			}
			
			else if (publicsale){
				uint256 FreeNFTforUser = MAXFREENFTperADDR - NFTperAddress[msg.sender];
                uint256 Feetimes;
                uint256 FreeNFTsMinted;
                if(FreeNFTforUser>minttimes){
                    Feetimes = 0;
                    FreeNFTsMinted=minttimes;
                    
                }
                else{
                    Feetimes = minttimes-FreeNFTforUser;
                    FreeNFTsMinted=FreeNFTforUser;
                }
                if (TotalFreeNFTsMinted + FreeNFTsMinted > MaxFreeNFTTotal){
                    FreeNFTsMinted=MaxFreeNFTTotal-TotalFreeNFTsMinted;
                 }
				require(msg.value >= FEE * Feetimes, "Amount of ether sent not correct.");
				//require(NFTperAddress[msg.sender]+minttimes<=MAXNFTperADDR,"Max 5 NFTs per buyer!");
				for(uint i=0;i<minttimes;i++){
					_safeMint(msg.sender, _tokenIdCounter.current());	
					_tokenIdCounter.increment();
					NFTperAddress[msg.sender]++;
				}
                TotalFreeNFTsMinted=TotalFreeNFTsMinted+FreeNFTsMinted;
			}
			/*else if (presale){
				require(whitelisted[msg.sender]);
                require(MAX_TOKENS_PRESALE > _tokenIdCounter.current() + 1);
				require(msg.value >= FEEpresales , "Amount of ether sent not correct.");
				_safeMint(msg.sender, _tokenIdCounter.current());
				_tokenIdCounter.increment();
            }*/
		
	}
	
	function safeMintTo(address _to, uint tokenid) public onlyOwner {
		//require(isSaleActive, "Sale is currently not active");
		//require(MAX_TOKENS > _tokenIdCounter.current() + 1, "Not enough tokens left to buy.");
		
		//require(msg.value >= FEE, "Value below price");

		
			_safeMint(_to, tokenid);
			//_setTokenURI(_tokenIdCounter.current(), tokenURI_);
			//_tokenIdCounter.increment();
			
		
	}

    // The following functions are overrides required by Solidity.

    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override(ERC721, ERC721URIStorage)
    returns (string memory)
	{
		require(
		_exists(tokenId),
		"ERC721Metadata: URI query for nonexistent token"
		);
		if (reveal){
		string memory currentBaseURI = _baseURI();
		return bytes(currentBaseURI).length > 0
			? string(abi.encodePacked(currentBaseURI, uint2str(tokenId), baseExtension))
			: "";}
		else{
				return prerevealURI;
		}
	}
	
	//Return current counter value
	function getCounter()
        public
        view
        returns (uint256)
    {
        return _tokenIdCounter.current();
    }
	
	// Withdraw control
	function withdraw() public payable onlyOwner {
		(bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
		require(success,"Transfer failed.");
	}
	
	/*function _widthdraw(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "Transfer failed.");
    }*/
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"mybaseuri","type":"string"},{"internalType":"string","name":"_prereveal","type":"string"}],"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":"FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEEpresales","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TotalFreeNFTsMinted","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":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicsale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"removeWhitelistUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"minttimes","type":"uint256"}],"name":"safeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"}],"name":"safeMintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setPresaleCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newprerevealURI","type":"string"}],"name":"setprerevealURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_reveal","type":"bool"}],"name":"setreveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"startpresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"startpublicsale","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"whitelistUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUserBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600b908051906020019062000051929190620004c8565b50611388600c55611388600d556101f4600e556005601055600560135560405180608001604052806051815260200162004e8660519139601490805190602001906200009f929190620004c8565b506000601560006101000a81548160ff0219169083151502179055506000601560016101000a81548160ff0219169083151502179055506001601560026101000a81548160ff0219169083151502179055506000601560036101000a81548160ff0219169083151502179055503480156200011957600080fd5b5060405162004ed738038062004ed783398181016040528101906200013f9190620005ea565b6040518060400160405280601781526020017f4d6f6e737465727320262048756e746572732047616d650000000000000000008152506040518060400160405280600381526020017f4d484700000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001c3929190620004c8565b508060019080519060200190620001dc929190620004c8565b505050620001ff620001f36200026460201b60201c565b6200026c60201b60201c565b6200021660086200033260201b620020fe1760201c565b62000227826200034860201b60201c565b668e1bc9bf040000601181905550668e1bc9bf0400006012819055506000600f819055506200025c81620003f360201b60201c565b505062000850565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b620003586200026460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200037e6200049e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003ce9062000684565b60405180910390fd5b8060099080519060200190620003ef929190620004c8565b5050565b620004036200026460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620004296200049e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000482576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004799062000684565b60405180910390fd5b80600a90805190602001906200049a929190620004c8565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620004d6906200074c565b90600052602060002090601f016020900481019282620004fa576000855562000546565b82601f106200051557805160ff191683800117855562000546565b8280016001018555821562000546579182015b828111156200054557825182559160200191906001019062000528565b5b50905062000555919062000559565b5090565b5b80821115620005745760008160009055506001016200055a565b5090565b60006200058f6200058984620006cf565b620006a6565b905082815260208101848484011115620005a857600080fd5b620005b584828562000716565b509392505050565b600082601f830112620005cf57600080fd5b8151620005e184826020860162000578565b91505092915050565b60008060408385031215620005fe57600080fd5b600083015167ffffffffffffffff8111156200061957600080fd5b6200062785828601620005bd565b925050602083015167ffffffffffffffff8111156200064557600080fd5b6200065385828601620005bd565b9150509250929050565b60006200066c60208362000705565b9150620006798262000827565b602082019050919050565b600060208201905081810360008301526200069f816200065d565b9050919050565b6000620006b2620006c5565b9050620006c0828262000782565b919050565b6000604051905090565b600067ffffffffffffffff821115620006ed57620006ec620007e7565b5b620006f88262000816565b9050602081019050919050565b600082825260208201905092915050565b60005b838110156200073657808201518184015260208101905062000719565b8381111562000746576000848401525b50505050565b600060028204905060018216806200076557607f821691505b602082108114156200077c576200077b620007b8565b5b50919050565b6200078d8262000816565b810181811067ffffffffffffffff82111715620007af57620007ae620007e7565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b61462680620008606000396000f3fe6080604052600436106102465760003560e01c806370a0823111610139578063b88d4fde116100b6578063d4f808861161007a578063d4f8088614610822578063d936547e1461084b578063da3ef23f14610888578063e985e9c5146108b1578063f2fde38b146108ee578063fdea8e0b1461091757610246565b8063b88d4fde1461073b578063b94805a214610764578063c57981b51461078f578063c6682862146107ba578063c87b56dd146107e557610246565b80638da5cb5b116100fd5780638da5cb5b146106685780638fdcf9421461069357806395d89b41146106bc578063a22cb465146106e7578063a475b5dd1461071057610246565b806370a082311461059357806370af832e146105d0578063715018a6146105fb57806384760b45146106125780638ada066e1461063d57610246565b806330cc7ae0116101c75780634a4c560d1161018b5780634a4c560d146104b057806355f804b3146104d95780635c975abb146105025780635ccda7331461052d5780636352211e1461055657610246565b806330cc7ae01461040f57806331c864e8146104385780633ccfd60b1461045457806342842e0e1461045e57806344a0d68a1461048757610246565b80631419e77b1161020e5780631419e77b1461034257806318fc28711461036b57806323b872dd146103945780632f5d8cad146103bd5780633078cfc6146103e657610246565b806301ffc9a71461024b57806302329a291461028857806306fdde03146102b1578063081812fc146102dc578063095ea7b314610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613362565b610942565b60405161027f91906138f9565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa9190613339565b610a24565b005b3480156102bd57600080fd5b506102c6610abd565b6040516102d39190613914565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe91906133f5565b610b4f565b6040516103109190613892565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b91906132bc565b610bd4565b005b34801561034e57600080fd5b50610369600480360381019061036491906132bc565b610cec565b005b34801561037757600080fd5b50610392600480360381019061038d9190613339565b610d76565b005b3480156103a057600080fd5b506103bb60048036038101906103b691906131b6565b610e0f565b005b3480156103c957600080fd5b506103e460048036038101906103df9190613339565b610e6f565b005b3480156103f257600080fd5b5061040d600480360381019061040891906133b4565b610f08565b005b34801561041b57600080fd5b5061043660048036038101906104319190613151565b610f9e565b005b610452600480360381019061044d91906133f5565b611075565b005b61045c6113b3565b005b34801561046a57600080fd5b50610485600480360381019061048091906131b6565b6114de565b005b34801561049357600080fd5b506104ae60048036038101906104a991906133f5565b6114fe565b005b3480156104bc57600080fd5b506104d760048036038101906104d29190613151565b611584565b005b3480156104e557600080fd5b5061050060048036038101906104fb91906133b4565b61165b565b005b34801561050e57600080fd5b506105176116f1565b60405161052491906138f9565b60405180910390f35b34801561053957600080fd5b50610554600480360381019061054f9190613339565b611704565b005b34801561056257600080fd5b5061057d600480360381019061057891906133f5565b61179d565b60405161058a9190613892565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b59190613151565b61184f565b6040516105c79190613bb6565b60405180910390f35b3480156105dc57600080fd5b506105e5611907565b6040516105f29190613bb6565b60405180910390f35b34801561060757600080fd5b5061061061190d565b005b34801561061e57600080fd5b50610627611995565b6040516106349190613bb6565b60405180910390f35b34801561064957600080fd5b5061065261199b565b60405161065f9190613bb6565b60405180910390f35b34801561067457600080fd5b5061067d6119ac565b60405161068a9190613892565b60405180910390f35b34801561069f57600080fd5b506106ba60048036038101906106b591906133f5565b6119d6565b005b3480156106c857600080fd5b506106d1611a5c565b6040516106de9190613914565b60405180910390f35b3480156106f357600080fd5b5061070e60048036038101906107099190613280565b611aee565b005b34801561071c57600080fd5b50610725611b04565b60405161073291906138f9565b60405180910390f35b34801561074757600080fd5b50610762600480360381019061075d9190613205565b611b17565b005b34801561077057600080fd5b50610779611b79565b60405161078691906138f9565b60405180910390f35b34801561079b57600080fd5b506107a4611b8c565b6040516107b19190613bb6565b60405180910390f35b3480156107c657600080fd5b506107cf611b92565b6040516107dc9190613914565b60405180910390f35b3480156107f157600080fd5b5061080c600480360381019061080791906133f5565b611c20565b6040516108199190613914565b60405180910390f35b34801561082e57600080fd5b50610849600480360381019061084491906132f8565b611d72565b005b34801561085757600080fd5b50610872600480360381019061086d9190613151565b611ea9565b60405161087f91906138f9565b60405180910390f35b34801561089457600080fd5b506108af60048036038101906108aa91906133b4565b611ec9565b005b3480156108bd57600080fd5b506108d860048036038101906108d3919061317a565b611f5f565b6040516108e591906138f9565b60405180910390f35b3480156108fa57600080fd5b5061091560048036038101906109109190613151565b611ff3565b005b34801561092357600080fd5b5061092c6120eb565b60405161093991906138f9565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a0d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a1d5750610a1c82612114565b5b9050919050565b610a2c61217e565b73ffffffffffffffffffffffffffffffffffffffff16610a4a6119ac565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9790613a96565b60405180910390fd5b80601560006101000a81548160ff02191690831515021790555050565b606060008054610acc90613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054610af890613ef6565b8015610b455780601f10610b1a57610100808354040283529160200191610b45565b820191906000526020600020905b815481529060010190602001808311610b2857829003601f168201915b5050505050905090565b6000610b5a82612186565b610b99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9090613a76565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bdf8261179d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4790613b56565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c6f61217e565b73ffffffffffffffffffffffffffffffffffffffff161480610c9e5750610c9d81610c9861217e565b611f5f565b5b610cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd4906139f6565b60405180910390fd5b610ce783836121f2565b505050565b610cf461217e565b73ffffffffffffffffffffffffffffffffffffffff16610d126119ac565b73ffffffffffffffffffffffffffffffffffffffff1614610d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5f90613a96565b60405180910390fd5b610d7282826122ab565b5050565b610d7e61217e565b73ffffffffffffffffffffffffffffffffffffffff16610d9c6119ac565b73ffffffffffffffffffffffffffffffffffffffff1614610df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de990613a96565b60405180910390fd5b80601560016101000a81548160ff02191690831515021790555050565b610e20610e1a61217e565b826122c9565b610e5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5690613b96565b60405180910390fd5b610e6a8383836123a7565b505050565b610e7761217e565b73ffffffffffffffffffffffffffffffffffffffff16610e956119ac565b73ffffffffffffffffffffffffffffffffffffffff1614610eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee290613a96565b60405180910390fd5b80601560036101000a81548160ff02191690831515021790555050565b610f1061217e565b73ffffffffffffffffffffffffffffffffffffffff16610f2e6119ac565b73ffffffffffffffffffffffffffffffffffffffff1614610f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7b90613a96565b60405180910390fd5b80600a9080519060200190610f9a929190612edf565b5050565b610fa661217e565b73ffffffffffffffffffffffffffffffffffffffff16610fc46119ac565b73ffffffffffffffffffffffffffffffffffffffff161461101a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101190613a96565b60405180910390fd5b6000601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b601560009054906101000a900460ff161561108f57600080fd5b8061109a6008612603565b6110a49190613ce7565b600c54116110e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110de90613ad6565b60405180910390fd5b80601054101561112c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112390613b36565b60405180910390fd5b6111346119ac565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156111fd5760005b818110156111f757611185336111806008612603565b6122ab565b61118f60086120fe565b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906111df90613f59565b919050555080806111ef90613f59565b91505061116a565b506113b0565b601560029054906101000a900460ff16156113af576000601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546013546112619190613dff565b90506000808383111561127a576000915083905061128c565b82846112869190613dff565b91508290505b600e5481600f5461129d9190613ce7565b11156112b657600f54600e546112b39190613dff565b90505b816011546112c49190613da5565b341015611306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fd90613ab6565b60405180910390fd5b60005b84811015611396576113243361131f6008612603565b6122ab565b61132e60086120fe565b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061137e90613f59565b9190505550808061138e90613f59565b915050611309565b5080600f546113a59190613ce7565b600f819055505050505b5b50565b6113bb61217e565b73ffffffffffffffffffffffffffffffffffffffff166113d96119ac565b73ffffffffffffffffffffffffffffffffffffffff161461142f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142690613a96565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16476040516114559061387d565b60006040518083038185875af1925050503d8060008114611492576040519150601f19603f3d011682016040523d82523d6000602084013e611497565b606091505b50509050806114db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d290613b76565b60405180910390fd5b50565b6114f983838360405180602001604052806000815250611b17565b505050565b61150661217e565b73ffffffffffffffffffffffffffffffffffffffff166115246119ac565b73ffffffffffffffffffffffffffffffffffffffff161461157a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157190613a96565b60405180910390fd5b8060118190555050565b61158c61217e565b73ffffffffffffffffffffffffffffffffffffffff166115aa6119ac565b73ffffffffffffffffffffffffffffffffffffffff1614611600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f790613a96565b60405180910390fd5b6001601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61166361217e565b73ffffffffffffffffffffffffffffffffffffffff166116816119ac565b73ffffffffffffffffffffffffffffffffffffffff16146116d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ce90613a96565b60405180910390fd5b80600990805190602001906116ed929190612edf565b5050565b601560009054906101000a900460ff1681565b61170c61217e565b73ffffffffffffffffffffffffffffffffffffffff1661172a6119ac565b73ffffffffffffffffffffffffffffffffffffffff1614611780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177790613a96565b60405180910390fd5b80601560026101000a81548160ff02191690831515021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183d90613a36565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b790613a16565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60125481565b61191561217e565b73ffffffffffffffffffffffffffffffffffffffff166119336119ac565b73ffffffffffffffffffffffffffffffffffffffff1614611989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198090613a96565b60405180910390fd5b6119936000612611565b565b600f5481565b60006119a76008612603565b905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119de61217e565b73ffffffffffffffffffffffffffffffffffffffff166119fc6119ac565b73ffffffffffffffffffffffffffffffffffffffff1614611a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4990613a96565b60405180910390fd5b8060128190555050565b606060018054611a6b90613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9790613ef6565b8015611ae45780601f10611ab957610100808354040283529160200191611ae4565b820191906000526020600020905b815481529060010190602001808311611ac757829003601f168201915b5050505050905090565b611b00611af961217e565b83836126d7565b5050565b601560039054906101000a900460ff1681565b611b28611b2261217e565b836122c9565b611b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5e90613b96565b60405180910390fd5b611b7384848484612844565b50505050565b601560029054906101000a900460ff1681565b60115481565b600b8054611b9f90613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054611bcb90613ef6565b8015611c185780601f10611bed57610100808354040283529160200191611c18565b820191906000526020600020905b815481529060010190602001808311611bfb57829003601f168201915b505050505081565b6060611c2b82612186565b611c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6190613b16565b60405180910390fd5b601560039054906101000a900460ff1615611cdf576000611c896128a0565b90506000815111611ca95760405180602001604052806000815250611cd7565b80611cb384612932565b600b604051602001611cc79392919061384c565b6040516020818303038152906040525b915050611d6d565b600a8054611cec90613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1890613ef6565b8015611d655780601f10611d3a57610100808354040283529160200191611d65565b820191906000526020600020905b815481529060010190602001808311611d4857829003601f168201915b505050505090505b919050565b611d7a61217e565b73ffffffffffffffffffffffffffffffffffffffff16611d986119ac565b73ffffffffffffffffffffffffffffffffffffffff1614611dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de590613a96565b60405180910390fd5b60005b8151811015611ea557600160166000848481518110611e39577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611e9d90613f59565b915050611df1565b5050565b60166020528060005260406000206000915054906101000a900460ff1681565b611ed161217e565b73ffffffffffffffffffffffffffffffffffffffff16611eef6119ac565b73ffffffffffffffffffffffffffffffffffffffff1614611f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3c90613a96565b60405180910390fd5b80600b9080519060200190611f5b929190612edf565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ffb61217e565b73ffffffffffffffffffffffffffffffffffffffff166120196119ac565b73ffffffffffffffffffffffffffffffffffffffff161461206f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206690613a96565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d690613956565b60405180910390fd5b6120e881612611565b50565b601560019054906101000a900460ff1681565b6001816000016000828254019250508190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122658361179d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6122c5828260405180602001604052806000815250612b07565b5050565b60006122d482612186565b612313576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230a906139d6565b60405180910390fd5b600061231e8361179d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061238d57508373ffffffffffffffffffffffffffffffffffffffff1661237584610b4f565b73ffffffffffffffffffffffffffffffffffffffff16145b8061239e575061239d8185611f5f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123c78261179d565b73ffffffffffffffffffffffffffffffffffffffff161461241d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241490613af6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561248d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248490613996565b60405180910390fd5b612498838383612b62565b6124a36000826121f2565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124f39190613dff565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461254a9190613ce7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081600001549050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273d906139b6565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161283791906138f9565b60405180910390a3505050565b61284f8484846123a7565b61285b84848484612b67565b61289a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289190613936565b60405180910390fd5b50505050565b6060600980546128af90613ef6565b80601f01602080910402602001604051908101604052809291908181526020018280546128db90613ef6565b80156129285780601f106128fd57610100808354040283529160200191612928565b820191906000526020600020905b81548152906001019060200180831161290b57829003601f168201915b5050505050905090565b6060600082141561297a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b02565b600082905060005b600082146129ac57808061299590613f59565b915050600a826129a59190613d74565b9150612982565b60008167ffffffffffffffff8111156129ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a205781602001600182028036833780820191505090505b50905060008290505b60008614612afa57600181612a3e9190613dff565b90506000600a8088612a509190613d74565b612a5a9190613da5565b87612a659190613dff565b6030612a719190613d3d565b905060008160f81b905080848481518110612ab5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a88612af19190613d74565b97505050612a29565b819450505050505b919050565b612b118383612cfe565b612b1e6000848484612b67565b612b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5490613936565b60405180910390fd5b505050565b505050565b6000612b888473ffffffffffffffffffffffffffffffffffffffff16612ecc565b15612cf1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612bb161217e565b8786866040518563ffffffff1660e01b8152600401612bd394939291906138ad565b602060405180830381600087803b158015612bed57600080fd5b505af1925050508015612c1e57506040513d601f19601f82011682018060405250810190612c1b919061338b565b60015b612ca1573d8060008114612c4e576040519150601f19603f3d011682016040523d82523d6000602084013e612c53565b606091505b50600081511415612c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9090613936565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612cf6565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6590613a56565b60405180910390fd5b612d7781612186565b15612db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dae90613976565b60405180910390fd5b612dc360008383612b62565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e139190613ce7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612eeb90613ef6565b90600052602060002090601f016020900481019282612f0d5760008555612f54565b82601f10612f2657805160ff1916838001178555612f54565b82800160010185558215612f54579182015b82811115612f53578251825591602001919060010190612f38565b5b509050612f619190612f65565b5090565b5b80821115612f7e576000816000905550600101612f66565b5090565b6000612f95612f9084613bf6565b613bd1565b90508083825260208201905082856020860282011115612fb457600080fd5b60005b85811015612fe45781612fca888261306a565b845260208401935060208301925050600181019050612fb7565b5050509392505050565b6000613001612ffc84613c22565b613bd1565b90508281526020810184848401111561301957600080fd5b613024848285613eb4565b509392505050565b600061303f61303a84613c53565b613bd1565b90508281526020810184848401111561305757600080fd5b613062848285613eb4565b509392505050565b60008135905061307981614594565b92915050565b600082601f83011261309057600080fd5b81356130a0848260208601612f82565b91505092915050565b6000813590506130b8816145ab565b92915050565b6000813590506130cd816145c2565b92915050565b6000815190506130e2816145c2565b92915050565b600082601f8301126130f957600080fd5b8135613109848260208601612fee565b91505092915050565b600082601f83011261312357600080fd5b813561313384826020860161302c565b91505092915050565b60008135905061314b816145d9565b92915050565b60006020828403121561316357600080fd5b60006131718482850161306a565b91505092915050565b6000806040838503121561318d57600080fd5b600061319b8582860161306a565b92505060206131ac8582860161306a565b9150509250929050565b6000806000606084860312156131cb57600080fd5b60006131d98682870161306a565b93505060206131ea8682870161306a565b92505060406131fb8682870161313c565b9150509250925092565b6000806000806080858703121561321b57600080fd5b60006132298782880161306a565b945050602061323a8782880161306a565b935050604061324b8782880161313c565b925050606085013567ffffffffffffffff81111561326857600080fd5b613274878288016130e8565b91505092959194509250565b6000806040838503121561329357600080fd5b60006132a18582860161306a565b92505060206132b2858286016130a9565b9150509250929050565b600080604083850312156132cf57600080fd5b60006132dd8582860161306a565b92505060206132ee8582860161313c565b9150509250929050565b60006020828403121561330a57600080fd5b600082013567ffffffffffffffff81111561332457600080fd5b6133308482850161307f565b91505092915050565b60006020828403121561334b57600080fd5b6000613359848285016130a9565b91505092915050565b60006020828403121561337457600080fd5b6000613382848285016130be565b91505092915050565b60006020828403121561339d57600080fd5b60006133ab848285016130d3565b91505092915050565b6000602082840312156133c657600080fd5b600082013567ffffffffffffffff8111156133e057600080fd5b6133ec84828501613112565b91505092915050565b60006020828403121561340757600080fd5b60006134158482850161313c565b91505092915050565b61342781613e33565b82525050565b61343681613e45565b82525050565b600061344782613c99565b6134518185613caf565b9350613461818560208601613ec3565b61346a8161405e565b840191505092915050565b600061348082613ca4565b61348a8185613ccb565b935061349a818560208601613ec3565b6134a38161405e565b840191505092915050565b60006134b982613ca4565b6134c38185613cdc565b93506134d3818560208601613ec3565b80840191505092915050565b600081546134ec81613ef6565b6134f68186613cdc565b94506001821660008114613511576001811461352257613555565b60ff19831686528186019350613555565b61352b85613c84565b60005b8381101561354d5781548189015260018201915060208101905061352e565b838801955050505b50505092915050565b600061356b603283613ccb565b91506135768261406f565b604082019050919050565b600061358e602683613ccb565b9150613599826140be565b604082019050919050565b60006135b1601c83613ccb565b91506135bc8261410d565b602082019050919050565b60006135d4602483613ccb565b91506135df82614136565b604082019050919050565b60006135f7601983613ccb565b915061360282614185565b602082019050919050565b600061361a602c83613ccb565b9150613625826141ae565b604082019050919050565b600061363d603883613ccb565b9150613648826141fd565b604082019050919050565b6000613660602a83613ccb565b915061366b8261424c565b604082019050919050565b6000613683602983613ccb565b915061368e8261429b565b604082019050919050565b60006136a6602083613ccb565b91506136b1826142ea565b602082019050919050565b60006136c9602c83613ccb565b91506136d482614313565b604082019050919050565b60006136ec602083613ccb565b91506136f782614362565b602082019050919050565b600061370f602183613ccb565b915061371a8261438b565b604082019050919050565b6000613732601e83613ccb565b915061373d826143da565b602082019050919050565b6000613755602983613ccb565b915061376082614403565b604082019050919050565b6000613778602f83613ccb565b915061378382614452565b604082019050919050565b600061379b601c83613ccb565b91506137a6826144a1565b602082019050919050565b60006137be602183613ccb565b91506137c9826144ca565b604082019050919050565b60006137e1600083613cc0565b91506137ec82614519565b600082019050919050565b6000613804601083613ccb565b915061380f8261451c565b602082019050919050565b6000613827603183613ccb565b915061383282614545565b604082019050919050565b61384681613e9d565b82525050565b600061385882866134ae565b915061386482856134ae565b915061387082846134df565b9150819050949350505050565b6000613888826137d4565b9150819050919050565b60006020820190506138a7600083018461341e565b92915050565b60006080820190506138c2600083018761341e565b6138cf602083018661341e565b6138dc604083018561383d565b81810360608301526138ee818461343c565b905095945050505050565b600060208201905061390e600083018461342d565b92915050565b6000602082019050818103600083015261392e8184613475565b905092915050565b6000602082019050818103600083015261394f8161355e565b9050919050565b6000602082019050818103600083015261396f81613581565b9050919050565b6000602082019050818103600083015261398f816135a4565b9050919050565b600060208201905081810360008301526139af816135c7565b9050919050565b600060208201905081810360008301526139cf816135ea565b9050919050565b600060208201905081810360008301526139ef8161360d565b9050919050565b60006020820190508181036000830152613a0f81613630565b9050919050565b60006020820190508181036000830152613a2f81613653565b9050919050565b60006020820190508181036000830152613a4f81613676565b9050919050565b60006020820190508181036000830152613a6f81613699565b9050919050565b60006020820190508181036000830152613a8f816136bc565b9050919050565b60006020820190508181036000830152613aaf816136df565b9050919050565b60006020820190508181036000830152613acf81613702565b9050919050565b60006020820190508181036000830152613aef81613725565b9050919050565b60006020820190508181036000830152613b0f81613748565b9050919050565b60006020820190508181036000830152613b2f8161376b565b9050919050565b60006020820190508181036000830152613b4f8161378e565b9050919050565b60006020820190508181036000830152613b6f816137b1565b9050919050565b60006020820190508181036000830152613b8f816137f7565b9050919050565b60006020820190508181036000830152613baf8161381a565b9050919050565b6000602082019050613bcb600083018461383d565b92915050565b6000613bdb613bec565b9050613be78282613f28565b919050565b6000604051905090565b600067ffffffffffffffff821115613c1157613c1061402f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613c3d57613c3c61402f565b5b613c468261405e565b9050602081019050919050565b600067ffffffffffffffff821115613c6e57613c6d61402f565b5b613c778261405e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613cf282613e9d565b9150613cfd83613e9d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d3257613d31613fa2565b5b828201905092915050565b6000613d4882613ea7565b9150613d5383613ea7565b92508260ff03821115613d6957613d68613fa2565b5b828201905092915050565b6000613d7f82613e9d565b9150613d8a83613e9d565b925082613d9a57613d99613fd1565b5b828204905092915050565b6000613db082613e9d565b9150613dbb83613e9d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613df457613df3613fa2565b5b828202905092915050565b6000613e0a82613e9d565b9150613e1583613e9d565b925082821015613e2857613e27613fa2565b5b828203905092915050565b6000613e3e82613e7d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613ee1578082015181840152602081019050613ec6565b83811115613ef0576000848401525b50505050565b60006002820490506001821680613f0e57607f821691505b60208210811415613f2257613f21614000565b5b50919050565b613f318261405e565b810181811067ffffffffffffffff82111715613f5057613f4f61402f565b5b80604052505050565b6000613f6482613e9d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f9757613f96613fa2565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f416d6f756e74206f662065746865722073656e74206e6f7420636f727265637460008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667420746f206275792e0000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4f6e6c792035204e46547320706572207472616e73616374696f6e2100000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b61459d81613e33565b81146145a857600080fd5b50565b6145b481613e45565b81146145bf57600080fd5b50565b6145cb81613e51565b81146145d657600080fd5b50565b6145e281613e9d565b81146145ed57600080fd5b5056fea26469706673582212201d80d8f131234d17f99761028c4b8991b3fc0cd05f5a10e5ee62ef6f9cf2839664736f6c6343000802003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d547263655148717955705632775a754c75376e4c6b6376736f774e5a613774363866516e4767486a713347762f0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102465760003560e01c806370a0823111610139578063b88d4fde116100b6578063d4f808861161007a578063d4f8088614610822578063d936547e1461084b578063da3ef23f14610888578063e985e9c5146108b1578063f2fde38b146108ee578063fdea8e0b1461091757610246565b8063b88d4fde1461073b578063b94805a214610764578063c57981b51461078f578063c6682862146107ba578063c87b56dd146107e557610246565b80638da5cb5b116100fd5780638da5cb5b146106685780638fdcf9421461069357806395d89b41146106bc578063a22cb465146106e7578063a475b5dd1461071057610246565b806370a082311461059357806370af832e146105d0578063715018a6146105fb57806384760b45146106125780638ada066e1461063d57610246565b806330cc7ae0116101c75780634a4c560d1161018b5780634a4c560d146104b057806355f804b3146104d95780635c975abb146105025780635ccda7331461052d5780636352211e1461055657610246565b806330cc7ae01461040f57806331c864e8146104385780633ccfd60b1461045457806342842e0e1461045e57806344a0d68a1461048757610246565b80631419e77b1161020e5780631419e77b1461034257806318fc28711461036b57806323b872dd146103945780632f5d8cad146103bd5780633078cfc6146103e657610246565b806301ffc9a71461024b57806302329a291461028857806306fdde03146102b1578063081812fc146102dc578063095ea7b314610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613362565b610942565b60405161027f91906138f9565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa9190613339565b610a24565b005b3480156102bd57600080fd5b506102c6610abd565b6040516102d39190613914565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe91906133f5565b610b4f565b6040516103109190613892565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b91906132bc565b610bd4565b005b34801561034e57600080fd5b50610369600480360381019061036491906132bc565b610cec565b005b34801561037757600080fd5b50610392600480360381019061038d9190613339565b610d76565b005b3480156103a057600080fd5b506103bb60048036038101906103b691906131b6565b610e0f565b005b3480156103c957600080fd5b506103e460048036038101906103df9190613339565b610e6f565b005b3480156103f257600080fd5b5061040d600480360381019061040891906133b4565b610f08565b005b34801561041b57600080fd5b5061043660048036038101906104319190613151565b610f9e565b005b610452600480360381019061044d91906133f5565b611075565b005b61045c6113b3565b005b34801561046a57600080fd5b50610485600480360381019061048091906131b6565b6114de565b005b34801561049357600080fd5b506104ae60048036038101906104a991906133f5565b6114fe565b005b3480156104bc57600080fd5b506104d760048036038101906104d29190613151565b611584565b005b3480156104e557600080fd5b5061050060048036038101906104fb91906133b4565b61165b565b005b34801561050e57600080fd5b506105176116f1565b60405161052491906138f9565b60405180910390f35b34801561053957600080fd5b50610554600480360381019061054f9190613339565b611704565b005b34801561056257600080fd5b5061057d600480360381019061057891906133f5565b61179d565b60405161058a9190613892565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b59190613151565b61184f565b6040516105c79190613bb6565b60405180910390f35b3480156105dc57600080fd5b506105e5611907565b6040516105f29190613bb6565b60405180910390f35b34801561060757600080fd5b5061061061190d565b005b34801561061e57600080fd5b50610627611995565b6040516106349190613bb6565b60405180910390f35b34801561064957600080fd5b5061065261199b565b60405161065f9190613bb6565b60405180910390f35b34801561067457600080fd5b5061067d6119ac565b60405161068a9190613892565b60405180910390f35b34801561069f57600080fd5b506106ba60048036038101906106b591906133f5565b6119d6565b005b3480156106c857600080fd5b506106d1611a5c565b6040516106de9190613914565b60405180910390f35b3480156106f357600080fd5b5061070e60048036038101906107099190613280565b611aee565b005b34801561071c57600080fd5b50610725611b04565b60405161073291906138f9565b60405180910390f35b34801561074757600080fd5b50610762600480360381019061075d9190613205565b611b17565b005b34801561077057600080fd5b50610779611b79565b60405161078691906138f9565b60405180910390f35b34801561079b57600080fd5b506107a4611b8c565b6040516107b19190613bb6565b60405180910390f35b3480156107c657600080fd5b506107cf611b92565b6040516107dc9190613914565b60405180910390f35b3480156107f157600080fd5b5061080c600480360381019061080791906133f5565b611c20565b6040516108199190613914565b60405180910390f35b34801561082e57600080fd5b50610849600480360381019061084491906132f8565b611d72565b005b34801561085757600080fd5b50610872600480360381019061086d9190613151565b611ea9565b60405161087f91906138f9565b60405180910390f35b34801561089457600080fd5b506108af60048036038101906108aa91906133b4565b611ec9565b005b3480156108bd57600080fd5b506108d860048036038101906108d3919061317a565b611f5f565b6040516108e591906138f9565b60405180910390f35b3480156108fa57600080fd5b5061091560048036038101906109109190613151565b611ff3565b005b34801561092357600080fd5b5061092c6120eb565b60405161093991906138f9565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a0d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a1d5750610a1c82612114565b5b9050919050565b610a2c61217e565b73ffffffffffffffffffffffffffffffffffffffff16610a4a6119ac565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9790613a96565b60405180910390fd5b80601560006101000a81548160ff02191690831515021790555050565b606060008054610acc90613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054610af890613ef6565b8015610b455780601f10610b1a57610100808354040283529160200191610b45565b820191906000526020600020905b815481529060010190602001808311610b2857829003601f168201915b5050505050905090565b6000610b5a82612186565b610b99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9090613a76565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bdf8261179d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4790613b56565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c6f61217e565b73ffffffffffffffffffffffffffffffffffffffff161480610c9e5750610c9d81610c9861217e565b611f5f565b5b610cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd4906139f6565b60405180910390fd5b610ce783836121f2565b505050565b610cf461217e565b73ffffffffffffffffffffffffffffffffffffffff16610d126119ac565b73ffffffffffffffffffffffffffffffffffffffff1614610d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5f90613a96565b60405180910390fd5b610d7282826122ab565b5050565b610d7e61217e565b73ffffffffffffffffffffffffffffffffffffffff16610d9c6119ac565b73ffffffffffffffffffffffffffffffffffffffff1614610df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de990613a96565b60405180910390fd5b80601560016101000a81548160ff02191690831515021790555050565b610e20610e1a61217e565b826122c9565b610e5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5690613b96565b60405180910390fd5b610e6a8383836123a7565b505050565b610e7761217e565b73ffffffffffffffffffffffffffffffffffffffff16610e956119ac565b73ffffffffffffffffffffffffffffffffffffffff1614610eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee290613a96565b60405180910390fd5b80601560036101000a81548160ff02191690831515021790555050565b610f1061217e565b73ffffffffffffffffffffffffffffffffffffffff16610f2e6119ac565b73ffffffffffffffffffffffffffffffffffffffff1614610f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7b90613a96565b60405180910390fd5b80600a9080519060200190610f9a929190612edf565b5050565b610fa661217e565b73ffffffffffffffffffffffffffffffffffffffff16610fc46119ac565b73ffffffffffffffffffffffffffffffffffffffff161461101a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101190613a96565b60405180910390fd5b6000601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b601560009054906101000a900460ff161561108f57600080fd5b8061109a6008612603565b6110a49190613ce7565b600c54116110e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110de90613ad6565b60405180910390fd5b80601054101561112c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112390613b36565b60405180910390fd5b6111346119ac565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156111fd5760005b818110156111f757611185336111806008612603565b6122ab565b61118f60086120fe565b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906111df90613f59565b919050555080806111ef90613f59565b91505061116a565b506113b0565b601560029054906101000a900460ff16156113af576000601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546013546112619190613dff565b90506000808383111561127a576000915083905061128c565b82846112869190613dff565b91508290505b600e5481600f5461129d9190613ce7565b11156112b657600f54600e546112b39190613dff565b90505b816011546112c49190613da5565b341015611306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fd90613ab6565b60405180910390fd5b60005b84811015611396576113243361131f6008612603565b6122ab565b61132e60086120fe565b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061137e90613f59565b9190505550808061138e90613f59565b915050611309565b5080600f546113a59190613ce7565b600f819055505050505b5b50565b6113bb61217e565b73ffffffffffffffffffffffffffffffffffffffff166113d96119ac565b73ffffffffffffffffffffffffffffffffffffffff161461142f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142690613a96565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16476040516114559061387d565b60006040518083038185875af1925050503d8060008114611492576040519150601f19603f3d011682016040523d82523d6000602084013e611497565b606091505b50509050806114db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d290613b76565b60405180910390fd5b50565b6114f983838360405180602001604052806000815250611b17565b505050565b61150661217e565b73ffffffffffffffffffffffffffffffffffffffff166115246119ac565b73ffffffffffffffffffffffffffffffffffffffff161461157a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157190613a96565b60405180910390fd5b8060118190555050565b61158c61217e565b73ffffffffffffffffffffffffffffffffffffffff166115aa6119ac565b73ffffffffffffffffffffffffffffffffffffffff1614611600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f790613a96565b60405180910390fd5b6001601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61166361217e565b73ffffffffffffffffffffffffffffffffffffffff166116816119ac565b73ffffffffffffffffffffffffffffffffffffffff16146116d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ce90613a96565b60405180910390fd5b80600990805190602001906116ed929190612edf565b5050565b601560009054906101000a900460ff1681565b61170c61217e565b73ffffffffffffffffffffffffffffffffffffffff1661172a6119ac565b73ffffffffffffffffffffffffffffffffffffffff1614611780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177790613a96565b60405180910390fd5b80601560026101000a81548160ff02191690831515021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183d90613a36565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b790613a16565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60125481565b61191561217e565b73ffffffffffffffffffffffffffffffffffffffff166119336119ac565b73ffffffffffffffffffffffffffffffffffffffff1614611989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198090613a96565b60405180910390fd5b6119936000612611565b565b600f5481565b60006119a76008612603565b905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119de61217e565b73ffffffffffffffffffffffffffffffffffffffff166119fc6119ac565b73ffffffffffffffffffffffffffffffffffffffff1614611a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4990613a96565b60405180910390fd5b8060128190555050565b606060018054611a6b90613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9790613ef6565b8015611ae45780601f10611ab957610100808354040283529160200191611ae4565b820191906000526020600020905b815481529060010190602001808311611ac757829003601f168201915b5050505050905090565b611b00611af961217e565b83836126d7565b5050565b601560039054906101000a900460ff1681565b611b28611b2261217e565b836122c9565b611b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5e90613b96565b60405180910390fd5b611b7384848484612844565b50505050565b601560029054906101000a900460ff1681565b60115481565b600b8054611b9f90613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054611bcb90613ef6565b8015611c185780601f10611bed57610100808354040283529160200191611c18565b820191906000526020600020905b815481529060010190602001808311611bfb57829003601f168201915b505050505081565b6060611c2b82612186565b611c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6190613b16565b60405180910390fd5b601560039054906101000a900460ff1615611cdf576000611c896128a0565b90506000815111611ca95760405180602001604052806000815250611cd7565b80611cb384612932565b600b604051602001611cc79392919061384c565b6040516020818303038152906040525b915050611d6d565b600a8054611cec90613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1890613ef6565b8015611d655780601f10611d3a57610100808354040283529160200191611d65565b820191906000526020600020905b815481529060010190602001808311611d4857829003601f168201915b505050505090505b919050565b611d7a61217e565b73ffffffffffffffffffffffffffffffffffffffff16611d986119ac565b73ffffffffffffffffffffffffffffffffffffffff1614611dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de590613a96565b60405180910390fd5b60005b8151811015611ea557600160166000848481518110611e39577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611e9d90613f59565b915050611df1565b5050565b60166020528060005260406000206000915054906101000a900460ff1681565b611ed161217e565b73ffffffffffffffffffffffffffffffffffffffff16611eef6119ac565b73ffffffffffffffffffffffffffffffffffffffff1614611f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3c90613a96565b60405180910390fd5b80600b9080519060200190611f5b929190612edf565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ffb61217e565b73ffffffffffffffffffffffffffffffffffffffff166120196119ac565b73ffffffffffffffffffffffffffffffffffffffff161461206f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206690613a96565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d690613956565b60405180910390fd5b6120e881612611565b50565b601560019054906101000a900460ff1681565b6001816000016000828254019250508190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122658361179d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6122c5828260405180602001604052806000815250612b07565b5050565b60006122d482612186565b612313576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230a906139d6565b60405180910390fd5b600061231e8361179d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061238d57508373ffffffffffffffffffffffffffffffffffffffff1661237584610b4f565b73ffffffffffffffffffffffffffffffffffffffff16145b8061239e575061239d8185611f5f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123c78261179d565b73ffffffffffffffffffffffffffffffffffffffff161461241d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241490613af6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561248d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248490613996565b60405180910390fd5b612498838383612b62565b6124a36000826121f2565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124f39190613dff565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461254a9190613ce7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081600001549050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273d906139b6565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161283791906138f9565b60405180910390a3505050565b61284f8484846123a7565b61285b84848484612b67565b61289a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289190613936565b60405180910390fd5b50505050565b6060600980546128af90613ef6565b80601f01602080910402602001604051908101604052809291908181526020018280546128db90613ef6565b80156129285780601f106128fd57610100808354040283529160200191612928565b820191906000526020600020905b81548152906001019060200180831161290b57829003601f168201915b5050505050905090565b6060600082141561297a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b02565b600082905060005b600082146129ac57808061299590613f59565b915050600a826129a59190613d74565b9150612982565b60008167ffffffffffffffff8111156129ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a205781602001600182028036833780820191505090505b50905060008290505b60008614612afa57600181612a3e9190613dff565b90506000600a8088612a509190613d74565b612a5a9190613da5565b87612a659190613dff565b6030612a719190613d3d565b905060008160f81b905080848481518110612ab5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a88612af19190613d74565b97505050612a29565b819450505050505b919050565b612b118383612cfe565b612b1e6000848484612b67565b612b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5490613936565b60405180910390fd5b505050565b505050565b6000612b888473ffffffffffffffffffffffffffffffffffffffff16612ecc565b15612cf1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612bb161217e565b8786866040518563ffffffff1660e01b8152600401612bd394939291906138ad565b602060405180830381600087803b158015612bed57600080fd5b505af1925050508015612c1e57506040513d601f19601f82011682018060405250810190612c1b919061338b565b60015b612ca1573d8060008114612c4e576040519150601f19603f3d011682016040523d82523d6000602084013e612c53565b606091505b50600081511415612c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9090613936565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612cf6565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6590613a56565b60405180910390fd5b612d7781612186565b15612db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dae90613976565b60405180910390fd5b612dc360008383612b62565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e139190613ce7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612eeb90613ef6565b90600052602060002090601f016020900481019282612f0d5760008555612f54565b82601f10612f2657805160ff1916838001178555612f54565b82800160010185558215612f54579182015b82811115612f53578251825591602001919060010190612f38565b5b509050612f619190612f65565b5090565b5b80821115612f7e576000816000905550600101612f66565b5090565b6000612f95612f9084613bf6565b613bd1565b90508083825260208201905082856020860282011115612fb457600080fd5b60005b85811015612fe45781612fca888261306a565b845260208401935060208301925050600181019050612fb7565b5050509392505050565b6000613001612ffc84613c22565b613bd1565b90508281526020810184848401111561301957600080fd5b613024848285613eb4565b509392505050565b600061303f61303a84613c53565b613bd1565b90508281526020810184848401111561305757600080fd5b613062848285613eb4565b509392505050565b60008135905061307981614594565b92915050565b600082601f83011261309057600080fd5b81356130a0848260208601612f82565b91505092915050565b6000813590506130b8816145ab565b92915050565b6000813590506130cd816145c2565b92915050565b6000815190506130e2816145c2565b92915050565b600082601f8301126130f957600080fd5b8135613109848260208601612fee565b91505092915050565b600082601f83011261312357600080fd5b813561313384826020860161302c565b91505092915050565b60008135905061314b816145d9565b92915050565b60006020828403121561316357600080fd5b60006131718482850161306a565b91505092915050565b6000806040838503121561318d57600080fd5b600061319b8582860161306a565b92505060206131ac8582860161306a565b9150509250929050565b6000806000606084860312156131cb57600080fd5b60006131d98682870161306a565b93505060206131ea8682870161306a565b92505060406131fb8682870161313c565b9150509250925092565b6000806000806080858703121561321b57600080fd5b60006132298782880161306a565b945050602061323a8782880161306a565b935050604061324b8782880161313c565b925050606085013567ffffffffffffffff81111561326857600080fd5b613274878288016130e8565b91505092959194509250565b6000806040838503121561329357600080fd5b60006132a18582860161306a565b92505060206132b2858286016130a9565b9150509250929050565b600080604083850312156132cf57600080fd5b60006132dd8582860161306a565b92505060206132ee8582860161313c565b9150509250929050565b60006020828403121561330a57600080fd5b600082013567ffffffffffffffff81111561332457600080fd5b6133308482850161307f565b91505092915050565b60006020828403121561334b57600080fd5b6000613359848285016130a9565b91505092915050565b60006020828403121561337457600080fd5b6000613382848285016130be565b91505092915050565b60006020828403121561339d57600080fd5b60006133ab848285016130d3565b91505092915050565b6000602082840312156133c657600080fd5b600082013567ffffffffffffffff8111156133e057600080fd5b6133ec84828501613112565b91505092915050565b60006020828403121561340757600080fd5b60006134158482850161313c565b91505092915050565b61342781613e33565b82525050565b61343681613e45565b82525050565b600061344782613c99565b6134518185613caf565b9350613461818560208601613ec3565b61346a8161405e565b840191505092915050565b600061348082613ca4565b61348a8185613ccb565b935061349a818560208601613ec3565b6134a38161405e565b840191505092915050565b60006134b982613ca4565b6134c38185613cdc565b93506134d3818560208601613ec3565b80840191505092915050565b600081546134ec81613ef6565b6134f68186613cdc565b94506001821660008114613511576001811461352257613555565b60ff19831686528186019350613555565b61352b85613c84565b60005b8381101561354d5781548189015260018201915060208101905061352e565b838801955050505b50505092915050565b600061356b603283613ccb565b91506135768261406f565b604082019050919050565b600061358e602683613ccb565b9150613599826140be565b604082019050919050565b60006135b1601c83613ccb565b91506135bc8261410d565b602082019050919050565b60006135d4602483613ccb565b91506135df82614136565b604082019050919050565b60006135f7601983613ccb565b915061360282614185565b602082019050919050565b600061361a602c83613ccb565b9150613625826141ae565b604082019050919050565b600061363d603883613ccb565b9150613648826141fd565b604082019050919050565b6000613660602a83613ccb565b915061366b8261424c565b604082019050919050565b6000613683602983613ccb565b915061368e8261429b565b604082019050919050565b60006136a6602083613ccb565b91506136b1826142ea565b602082019050919050565b60006136c9602c83613ccb565b91506136d482614313565b604082019050919050565b60006136ec602083613ccb565b91506136f782614362565b602082019050919050565b600061370f602183613ccb565b915061371a8261438b565b604082019050919050565b6000613732601e83613ccb565b915061373d826143da565b602082019050919050565b6000613755602983613ccb565b915061376082614403565b604082019050919050565b6000613778602f83613ccb565b915061378382614452565b604082019050919050565b600061379b601c83613ccb565b91506137a6826144a1565b602082019050919050565b60006137be602183613ccb565b91506137c9826144ca565b604082019050919050565b60006137e1600083613cc0565b91506137ec82614519565b600082019050919050565b6000613804601083613ccb565b915061380f8261451c565b602082019050919050565b6000613827603183613ccb565b915061383282614545565b604082019050919050565b61384681613e9d565b82525050565b600061385882866134ae565b915061386482856134ae565b915061387082846134df565b9150819050949350505050565b6000613888826137d4565b9150819050919050565b60006020820190506138a7600083018461341e565b92915050565b60006080820190506138c2600083018761341e565b6138cf602083018661341e565b6138dc604083018561383d565b81810360608301526138ee818461343c565b905095945050505050565b600060208201905061390e600083018461342d565b92915050565b6000602082019050818103600083015261392e8184613475565b905092915050565b6000602082019050818103600083015261394f8161355e565b9050919050565b6000602082019050818103600083015261396f81613581565b9050919050565b6000602082019050818103600083015261398f816135a4565b9050919050565b600060208201905081810360008301526139af816135c7565b9050919050565b600060208201905081810360008301526139cf816135ea565b9050919050565b600060208201905081810360008301526139ef8161360d565b9050919050565b60006020820190508181036000830152613a0f81613630565b9050919050565b60006020820190508181036000830152613a2f81613653565b9050919050565b60006020820190508181036000830152613a4f81613676565b9050919050565b60006020820190508181036000830152613a6f81613699565b9050919050565b60006020820190508181036000830152613a8f816136bc565b9050919050565b60006020820190508181036000830152613aaf816136df565b9050919050565b60006020820190508181036000830152613acf81613702565b9050919050565b60006020820190508181036000830152613aef81613725565b9050919050565b60006020820190508181036000830152613b0f81613748565b9050919050565b60006020820190508181036000830152613b2f8161376b565b9050919050565b60006020820190508181036000830152613b4f8161378e565b9050919050565b60006020820190508181036000830152613b6f816137b1565b9050919050565b60006020820190508181036000830152613b8f816137f7565b9050919050565b60006020820190508181036000830152613baf8161381a565b9050919050565b6000602082019050613bcb600083018461383d565b92915050565b6000613bdb613bec565b9050613be78282613f28565b919050565b6000604051905090565b600067ffffffffffffffff821115613c1157613c1061402f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613c3d57613c3c61402f565b5b613c468261405e565b9050602081019050919050565b600067ffffffffffffffff821115613c6e57613c6d61402f565b5b613c778261405e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613cf282613e9d565b9150613cfd83613e9d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d3257613d31613fa2565b5b828201905092915050565b6000613d4882613ea7565b9150613d5383613ea7565b92508260ff03821115613d6957613d68613fa2565b5b828201905092915050565b6000613d7f82613e9d565b9150613d8a83613e9d565b925082613d9a57613d99613fd1565b5b828204905092915050565b6000613db082613e9d565b9150613dbb83613e9d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613df457613df3613fa2565b5b828202905092915050565b6000613e0a82613e9d565b9150613e1583613e9d565b925082821015613e2857613e27613fa2565b5b828203905092915050565b6000613e3e82613e7d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613ee1578082015181840152602081019050613ec6565b83811115613ef0576000848401525b50505050565b60006002820490506001821680613f0e57607f821691505b60208210811415613f2257613f21614000565b5b50919050565b613f318261405e565b810181811067ffffffffffffffff82111715613f5057613f4f61402f565b5b80604052505050565b6000613f6482613e9d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f9757613f96613fa2565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f416d6f756e74206f662065746865722073656e74206e6f7420636f727265637460008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667420746f206275792e0000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4f6e6c792035204e46547320706572207472616e73616374696f6e2100000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b61459d81613e33565b81146145a857600080fd5b50565b6145b481613e45565b81146145bf57600080fd5b50565b6145cb81613e51565b81146145d657600080fd5b50565b6145e281613e9d565b81146145ed57600080fd5b5056fea26469706673582212201d80d8f131234d17f99761028c4b8991b3fc0cd05f5a10e5ee62ef6f9cf2839664736f6c63430008020033

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

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : mybaseuri (string):
Arg [1] : _prereveal (string):

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

39831:6799:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25311:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42825:70;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26256:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27815:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27338:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44971:415;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42901:78;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28565:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42619:76;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42499:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41590:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43079:1886;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46264:172;;;:::i;:::-;;28975:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41411:76;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41141:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42395:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40423:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42984:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25950:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25680:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40258:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6299:103;;;;;;;;;;;;;:::i;:::-;;40171:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46101:135;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5648:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41493:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26425:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28108:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40517:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29231:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40484:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40236:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40029:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45587:475;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41240:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40547:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42700:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28334:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6557:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40453:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25311:305;25413:4;25465:25;25450:40;;;:11;:40;;;;:105;;;;25522:33;25507:48;;;:11;:48;;;;25450:105;:158;;;;25572:36;25596:11;25572:23;:36::i;:::-;25450:158;25430:178;;25311:305;;;:::o;42825:70::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42884:6:::1;42875;;:15;;;;;;;;;;;;;;;;;;42825:70:::0;:::o;26256:100::-;26310:13;26343:5;26336:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26256:100;:::o;27815:221::-;27891:7;27919:16;27927:7;27919;:16::i;:::-;27911:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28004:15;:24;28020:7;28004:24;;;;;;;;;;;;;;;;;;;;;27997:31;;27815:221;;;:::o;27338:411::-;27419:13;27435:23;27450:7;27435:14;:23::i;:::-;27419:39;;27483:5;27477:11;;:2;:11;;;;27469:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27577:5;27561:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27586:37;27603:5;27610:12;:10;:12::i;:::-;27586:16;:37::i;:::-;27561:62;27539:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27720:21;27729:2;27733:7;27720:8;:21::i;:::-;27338:411;;;:::o;44971:415::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45256:23:::1;45266:3;45271:7;45256:9;:23::i;:::-;44971:415:::0;;:::o;42901:78::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42968:6:::1;42958:7;;:16;;;;;;;;;;;;;;;;;;42901:78:::0;:::o;28565:339::-;28760:41;28779:12;:10;:12::i;:::-;28793:7;28760:18;:41::i;:::-;28752:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28868:28;28878:4;28884:2;28888:7;28868:9;:28::i;:::-;28565:339;;;:::o;42619:76::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42683:7:::1;42674:6;;:16;;;;;;;;;;;;;;;;;;42619:76:::0;:::o;42499:115::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42593:16:::1;42578:12;:31;;;;;;;;;;;;:::i;:::-;;42499:115:::0;:::o;41590:97::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41677:5:::1;41656:11;:18;41668:5;41656:18;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;41590:97:::0;:::o;43079:1886::-;43146:6;;;;;;;;;;;43145:7;43137:16;;;;;;43207:9;43179:25;:15;:23;:25::i;:::-;:37;;;;:::i;:::-;43166:10;;:50;43158:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;43279:9;43264:11;;:24;;43256:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;43348:7;:5;:7::i;:::-;43334:21;;:10;:21;;;43330:1301;;;43367:6;43363:164;43378:9;43376:1;:11;43363:164;;;43400:48;43410:10;43422:25;:15;:23;:25::i;:::-;43400:9;:48::i;:::-;43457:27;:15;:25;:27::i;:::-;43492:13;:25;43506:10;43492:25;;;;;;;;;;;;;;;;:27;;;;;;;;;:::i;:::-;;;;;;43388:3;;;;;:::i;:::-;;;;43363:164;;;;43330:1301;;;43552:10;;;;;;;;;;;43548:1083;;;43570:22;43615:13;:25;43629:10;43615:25;;;;;;;;;;;;;;;;43595:17;;:45;;;;:::i;:::-;43570:70;;43659:16;43694:22;43753:9;43738:14;:24;43735:304;;;43797:1;43786:12;;43836:9;43821:24;;43735:304;;;43953:14;43943:9;:24;;;;:::i;:::-;43932:35;;44005:14;43990:29;;43735:304;44100:15;;44083:14;44061:19;;:36;;;;:::i;:::-;:54;44057:153;;;44170:19;;44154:15;;:35;;;;:::i;:::-;44139:50;;44057:153;44243:8;44237:3;;:14;;;;:::i;:::-;44224:9;:27;;44216:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44392:6;44388:164;44403:9;44401:1;:11;44388:164;;;44425:48;44435:10;44447:25;:15;:23;:25::i;:::-;44425:9;:48::i;:::-;44482:27;:15;:25;:27::i;:::-;44517:13;:25;44531:10;44517:25;;;;;;;;;;;;;;;;:27;;;;;;;;;:::i;:::-;;;;;;44413:3;;;;;:::i;:::-;;;;44388:164;;;;44610:14;44590:19;;:34;;;;:::i;:::-;44570:19;:54;;;;43548:1083;;;;43330:1301;43079:1886;:::o;46264:172::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46315:12:::1;46341:10;46333:24;;46365:21;46333:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46314:77;;;46404:7;46396:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;5939:1;46264:172::o:0;28975:185::-;29113:39;29130:4;29136:2;29140:7;29113:39;;;;;;;;;;;;:16;:39::i;:::-;28975:185;;;:::o;41411:76::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41474:8:::1;41468:3;:14;;;;41411:76:::0;:::o;41141:96::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41222:4:::1;41201:11;:18;41213:5;41201:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;41141:96:::0;:::o;42395:95::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42474:11:::1;42464:7;:21;;;;;;;;;;;;:::i;:::-;;42395:95:::0;:::o;40423:26::-;;;;;;;;;;;;;:::o;42984:84::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43057:6:::1;43044:10;;:19;;;;;;;;;;;;;;;;;;42984:84:::0;:::o;25950:239::-;26022:7;26042:13;26058:7;:16;26066:7;26058:16;;;;;;;;;;;;;;;;;;;;;26042:32;;26110:1;26093:19;;:5;:19;;;;26085:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26176:5;26169:12;;;25950:239;;;:::o;25680:208::-;25752:7;25797:1;25780:19;;:5;:19;;;;25772:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25864:9;:16;25874:5;25864:16;;;;;;;;;;;;;;;;25857:23;;25680:208;;;:::o;40258:26::-;;;;:::o;6299:103::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6364:30:::1;6391:1;6364:18;:30::i;:::-;6299:103::o:0;40171:34::-;;;;:::o;46101:135::-;46171:7;46203:25;:15;:23;:25::i;:::-;46196:32;;46101:135;:::o;5648:87::-;5694:7;5721:6;;;;;;;;;;;5714:13;;5648:87;:::o;41493:91::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41571:8:::1;41557:11;:22;;;;41493:91:::0;:::o;26425:104::-;26481:13;26514:7;26507:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26425:104;:::o;28108:155::-;28203:52;28222:12;:10;:12::i;:::-;28236:8;28246;28203:18;:52::i;:::-;28108:155;;:::o;40517:26::-;;;;;;;;;;;;;:::o;29231:328::-;29406:41;29425:12;:10;:12::i;:::-;29439:7;29406:18;:41::i;:::-;29398:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29512:39;29526:4;29532:2;29536:7;29545:5;29512:13;:39::i;:::-;29231:328;;;;:::o;40484:29::-;;;;;;;;;;;;;:::o;40236:18::-;;;;:::o;40029:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45587:475::-;45711:13;45745:16;45753:7;45745;:16::i;:::-;45733:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;45829:6;;;;;;;;;;;45825:233;;;45841:28;45872:10;:8;:10::i;:::-;45841:41;;45925:1;45900:14;45894:28;:32;:122;;;;;;;;;;;;;;;;;45957:14;45973:17;45982:7;45973:8;:17::i;:::-;45992:13;45940:66;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45894:122;45887:129;;;;;45825:233;46040:12;46033:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45587:475;;;;:::o;41240:165::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41320:6:::1;41331:70;41341:6;:13;41339:1;:15;41331:70;;;41390:4;41365:11;:22;41377:6;41384:1;41377:9;;;;;;;;;;;;;;;;;;;;;;41365:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41355:3;;;;;:::i;:::-;;;;41331:70;;;5939:1;41240:165:::0;:::o;40547:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;42700:119::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42797:17:::1;42781:13;:33;;;;;;;;;;;;:::i;:::-;;42700:119:::0;:::o;28334:164::-;28431:4;28455:18;:25;28474:5;28455:25;;;;;;;;;;;;;;;:35;28481:8;28455:35;;;;;;;;;;;;;;;;;;;;;;;;;28448:42;;28334:164;;;;:::o;6557:201::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6666:1:::1;6646:22;;:8;:22;;;;6638:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6722:28;6741:8;6722:18;:28::i;:::-;6557:201:::0;:::o;40453:27::-;;;;;;;;;;;;;:::o;1098:127::-;1205:1;1187:7;:14;;;:19;;;;;;;;;;;1098:127;:::o;18080:157::-;18165:4;18204:25;18189:40;;;:11;:40;;;;18182:47;;18080:157;;;:::o;4372:98::-;4425:7;4452:10;4445:17;;4372:98;:::o;31069:127::-;31134:4;31186:1;31158:30;;:7;:16;31166:7;31158:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31151:37;;31069:127;;;:::o;35051:174::-;35153:2;35126:15;:24;35142:7;35126:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35209:7;35205:2;35171:46;;35180:23;35195:7;35180:14;:23::i;:::-;35171:46;;;;;;;;;;;;35051:174;;:::o;32053:110::-;32129:26;32139:2;32143:7;32129:26;;;;;;;;;;;;:9;:26::i;:::-;32053:110;;:::o;31363:348::-;31456:4;31481:16;31489:7;31481;:16::i;:::-;31473:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31557:13;31573:23;31588:7;31573:14;:23::i;:::-;31557:39;;31626:5;31615:16;;:7;:16;;;:51;;;;31659:7;31635:31;;:20;31647:7;31635:11;:20::i;:::-;:31;;;31615:51;:87;;;;31670:32;31687:5;31694:7;31670:16;:32::i;:::-;31615:87;31607:96;;;31363:348;;;;:::o;34355:578::-;34514:4;34487:31;;:23;34502:7;34487:14;:23::i;:::-;:31;;;34479:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34597:1;34583:16;;:2;:16;;;;34575:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34653:39;34674:4;34680:2;34684:7;34653:20;:39::i;:::-;34757:29;34774:1;34778:7;34757:8;:29::i;:::-;34818:1;34799:9;:15;34809:4;34799:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34847:1;34830:9;:13;34840:2;34830:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34878:2;34859:7;:16;34867:7;34859:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34917:7;34913:2;34898:27;;34907:4;34898:27;;;;;;;;;;;;34355:578;;;:::o;976:114::-;1041:7;1068;:14;;;1061:21;;976:114;;;:::o;6918:191::-;6992:16;7011:6;;;;;;;;;;;6992:25;;7037:8;7028:6;;:17;;;;;;;;;;;;;;;;;;7092:8;7061:40;;7082:8;7061:40;;;;;;;;;;;;6918:191;;:::o;35367:315::-;35522:8;35513:17;;:5;:17;;;;35505:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;35609:8;35571:18;:25;35590:5;35571:25;;;;;;;;;;;;;;;:35;35597:8;35571:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;35655:8;35633:41;;35648:5;35633:41;;;35665:8;35633:41;;;;;;:::i;:::-;;;;;;;;35367:315;;;:::o;30441:::-;30598:28;30608:4;30614:2;30618:7;30598:9;:28::i;:::-;30645:48;30668:4;30674:2;30678:7;30687:5;30645:22;:48::i;:::-;30637:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30441:315;;;;:::o;42286:99::-;42346:13;42373:7;42366:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42286:99;:::o;41693:573::-;41743:27;41793:1;41787:2;:7;41783:50;;;41811:10;;;;;;;;;;;;;;;;;;;;;41783:50;41843:6;41852:2;41843:11;;41865:8;41884:69;41896:1;41891;:6;41884:69;;41914:5;;;;;:::i;:::-;;;;41939:2;41934:7;;;;;:::i;:::-;;;41884:69;;;41963:17;41993:3;41983:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41963:34;;42008:6;42017:3;42008:12;;42031:198;42044:1;42038:2;:7;42031:198;;42068:1;42066;:3;;;;:::i;:::-;42062:7;;42084:10;42124:2;42119;42114;:7;;;;:::i;:::-;:12;;;;:::i;:::-;42109:2;:17;;;;:::i;:::-;42098:2;:29;;;;:::i;:::-;42084:44;;42143:9;42162:4;42155:12;;42143:24;;42192:2;42182:4;42187:1;42182:7;;;;;;;;;;;;;;;;;;;:12;;;;;;;;;;;42215:2;42209:8;;;;;:::i;:::-;;;42031:198;;;;;42253:4;42239:19;;;;;;41693:573;;;;:::o;32390:321::-;32520:18;32526:2;32530:7;32520:5;:18::i;:::-;32571:54;32602:1;32606:2;32610:7;32619:5;32571:22;:54::i;:::-;32549:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32390:321;;;:::o;37618:126::-;;;;:::o;36247:799::-;36402:4;36423:15;:2;:13;;;:15::i;:::-;36419:620;;;36475:2;36459:36;;;36496:12;:10;:12::i;:::-;36510:4;36516:7;36525:5;36459:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36455:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36718:1;36701:6;:13;:18;36697:272;;;36744:60;;;;;;;;;;:::i;:::-;;;;;;;;36697:272;36919:6;36913:13;36904:6;36900:2;36896:15;36889:38;36455:529;36592:41;;;36582:51;;;:6;:51;;;;36575:58;;;;;36419:620;37023:4;37016:11;;36247:799;;;;;;;:::o;33047:382::-;33141:1;33127:16;;:2;:16;;;;33119:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33200:16;33208:7;33200;:16::i;:::-;33199:17;33191:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33262:45;33291:1;33295:2;33299:7;33262:20;:45::i;:::-;33337:1;33320:9;:13;33330:2;33320:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33368:2;33349:7;:16;33357:7;33349:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33413:7;33409:2;33388:33;;33405:1;33388:33;;;;;;;;;;;;33047:382;;:::o;7936:387::-;7996:4;8204:12;8271:7;8259:20;8251:28;;8314:1;8307:4;:8;8300:15;;;7936:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:623:1:-;;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;274:6;267:5;260:21;300:4;293:5;289:16;282:23;;325:6;375:3;367:4;359:6;355:17;350:3;346:27;343:36;340:2;;;392:1;389;382:12;340:2;420:1;405:236;430:6;427:1;424:13;405:236;;;497:3;525:37;558:3;546:10;525:37;:::i;:::-;520:3;513:50;592:4;587:3;583:14;576:21;;626:4;621:3;617:14;610:21;;465:176;452:1;449;445:9;440:14;;405:236;;;409:14;126:521;;;;;;;:::o;653:343::-;;755:65;771:48;812:6;771:48;:::i;:::-;755:65;:::i;:::-;746:74;;843:6;836:5;829:21;881:4;874:5;870:16;919:3;910:6;905:3;901:16;898:25;895:2;;;936:1;933;926:12;895:2;949:41;983:6;978:3;973;949:41;:::i;:::-;736:260;;;;;;:::o;1002:345::-;;1105:66;1121:49;1163:6;1121:49;:::i;:::-;1105:66;:::i;:::-;1096:75;;1194:6;1187:5;1180:21;1232:4;1225:5;1221:16;1270:3;1261:6;1256:3;1252:16;1249:25;1246:2;;;1287:1;1284;1277:12;1246:2;1300:41;1334:6;1329:3;1324;1300:41;:::i;:::-;1086:261;;;;;;:::o;1353:139::-;;1437:6;1424:20;1415:29;;1453:33;1480:5;1453:33;:::i;:::-;1405:87;;;;:::o;1515:303::-;;1635:3;1628:4;1620:6;1616:17;1612:27;1602:2;;1653:1;1650;1643:12;1602:2;1693:6;1680:20;1718:94;1808:3;1800:6;1793:4;1785:6;1781:17;1718:94;:::i;:::-;1709:103;;1592:226;;;;;:::o;1824:133::-;;1905:6;1892:20;1883:29;;1921:30;1945:5;1921:30;:::i;:::-;1873:84;;;;:::o;1963:137::-;;2046:6;2033:20;2024:29;;2062:32;2088:5;2062:32;:::i;:::-;2014:86;;;;:::o;2106:141::-;;2193:6;2187:13;2178:22;;2209:32;2235:5;2209:32;:::i;:::-;2168:79;;;;:::o;2266:271::-;;2370:3;2363:4;2355:6;2351:17;2347:27;2337:2;;2388:1;2385;2378:12;2337:2;2428:6;2415:20;2453:78;2527:3;2519:6;2512:4;2504:6;2500:17;2453:78;:::i;:::-;2444:87;;2327:210;;;;;:::o;2557:273::-;;2662:3;2655:4;2647:6;2643:17;2639:27;2629:2;;2680:1;2677;2670:12;2629:2;2720:6;2707:20;2745:79;2820:3;2812:6;2805:4;2797:6;2793:17;2745:79;:::i;:::-;2736:88;;2619:211;;;;;:::o;2836:139::-;;2920:6;2907:20;2898:29;;2936:33;2963:5;2936:33;:::i;:::-;2888:87;;;;:::o;2981:262::-;;3089:2;3077:9;3068:7;3064:23;3060:32;3057:2;;;3105:1;3102;3095:12;3057:2;3148:1;3173:53;3218:7;3209:6;3198:9;3194:22;3173:53;:::i;:::-;3163:63;;3119:117;3047:196;;;;:::o;3249:407::-;;;3374:2;3362:9;3353:7;3349:23;3345:32;3342:2;;;3390:1;3387;3380:12;3342:2;3433:1;3458:53;3503:7;3494:6;3483:9;3479:22;3458:53;:::i;:::-;3448:63;;3404:117;3560:2;3586:53;3631:7;3622:6;3611:9;3607:22;3586:53;:::i;:::-;3576:63;;3531:118;3332:324;;;;;:::o;3662:552::-;;;;3804:2;3792:9;3783:7;3779:23;3775:32;3772:2;;;3820:1;3817;3810:12;3772:2;3863:1;3888:53;3933:7;3924:6;3913:9;3909:22;3888:53;:::i;:::-;3878:63;;3834:117;3990:2;4016:53;4061:7;4052:6;4041:9;4037:22;4016:53;:::i;:::-;4006:63;;3961:118;4118:2;4144:53;4189:7;4180:6;4169:9;4165:22;4144:53;:::i;:::-;4134:63;;4089:118;3762:452;;;;;:::o;4220:809::-;;;;;4388:3;4376:9;4367:7;4363:23;4359:33;4356:2;;;4405:1;4402;4395:12;4356:2;4448:1;4473:53;4518:7;4509:6;4498:9;4494:22;4473:53;:::i;:::-;4463:63;;4419:117;4575:2;4601:53;4646:7;4637:6;4626:9;4622:22;4601:53;:::i;:::-;4591:63;;4546:118;4703:2;4729:53;4774:7;4765:6;4754:9;4750:22;4729:53;:::i;:::-;4719:63;;4674:118;4859:2;4848:9;4844:18;4831:32;4890:18;4882:6;4879:30;4876:2;;;4922:1;4919;4912:12;4876:2;4950:62;5004:7;4995:6;4984:9;4980:22;4950:62;:::i;:::-;4940:72;;4802:220;4346:683;;;;;;;:::o;5035:401::-;;;5157:2;5145:9;5136:7;5132:23;5128:32;5125:2;;;5173:1;5170;5163:12;5125:2;5216:1;5241:53;5286:7;5277:6;5266:9;5262:22;5241:53;:::i;:::-;5231:63;;5187:117;5343:2;5369:50;5411:7;5402:6;5391:9;5387:22;5369:50;:::i;:::-;5359:60;;5314:115;5115:321;;;;;:::o;5442:407::-;;;5567:2;5555:9;5546:7;5542:23;5538:32;5535:2;;;5583:1;5580;5573:12;5535:2;5626:1;5651:53;5696:7;5687:6;5676:9;5672:22;5651:53;:::i;:::-;5641:63;;5597:117;5753:2;5779:53;5824:7;5815:6;5804:9;5800:22;5779:53;:::i;:::-;5769:63;;5724:118;5525:324;;;;;:::o;5855:405::-;;5988:2;5976:9;5967:7;5963:23;5959:32;5956:2;;;6004:1;6001;5994:12;5956:2;6075:1;6064:9;6060:17;6047:31;6105:18;6097:6;6094:30;6091:2;;;6137:1;6134;6127:12;6091:2;6165:78;6235:7;6226:6;6215:9;6211:22;6165:78;:::i;:::-;6155:88;;6018:235;5946:314;;;;:::o;6266:256::-;;6371:2;6359:9;6350:7;6346:23;6342:32;6339:2;;;6387:1;6384;6377:12;6339:2;6430:1;6455:50;6497:7;6488:6;6477:9;6473:22;6455:50;:::i;:::-;6445:60;;6401:114;6329:193;;;;:::o;6528:260::-;;6635:2;6623:9;6614:7;6610:23;6606:32;6603:2;;;6651:1;6648;6641:12;6603:2;6694:1;6719:52;6763:7;6754:6;6743:9;6739:22;6719:52;:::i;:::-;6709:62;;6665:116;6593:195;;;;:::o;6794:282::-;;6912:2;6900:9;6891:7;6887:23;6883:32;6880:2;;;6928:1;6925;6918:12;6880:2;6971:1;6996:63;7051:7;7042:6;7031:9;7027:22;6996:63;:::i;:::-;6986:73;;6942:127;6870:206;;;;:::o;7082:375::-;;7200:2;7188:9;7179:7;7175:23;7171:32;7168:2;;;7216:1;7213;7206:12;7168:2;7287:1;7276:9;7272:17;7259:31;7317:18;7309:6;7306:30;7303:2;;;7349:1;7346;7339:12;7303:2;7377:63;7432:7;7423:6;7412:9;7408:22;7377:63;:::i;:::-;7367:73;;7230:220;7158:299;;;;:::o;7463:262::-;;7571:2;7559:9;7550:7;7546:23;7542:32;7539:2;;;7587:1;7584;7577:12;7539:2;7630:1;7655:53;7700:7;7691:6;7680:9;7676:22;7655:53;:::i;:::-;7645:63;;7601:117;7529:196;;;;:::o;7731:118::-;7818:24;7836:5;7818:24;:::i;:::-;7813:3;7806:37;7796:53;;:::o;7855:109::-;7936:21;7951:5;7936:21;:::i;:::-;7931:3;7924:34;7914:50;;:::o;7970:360::-;;8084:38;8116:5;8084:38;:::i;:::-;8138:70;8201:6;8196:3;8138:70;:::i;:::-;8131:77;;8217:52;8262:6;8257:3;8250:4;8243:5;8239:16;8217:52;:::i;:::-;8294:29;8316:6;8294:29;:::i;:::-;8289:3;8285:39;8278:46;;8060:270;;;;;:::o;8336:364::-;;8452:39;8485:5;8452:39;:::i;:::-;8507:71;8571:6;8566:3;8507:71;:::i;:::-;8500:78;;8587:52;8632:6;8627:3;8620:4;8613:5;8609:16;8587:52;:::i;:::-;8664:29;8686:6;8664:29;:::i;:::-;8659:3;8655:39;8648:46;;8428:272;;;;;:::o;8706:377::-;;8840:39;8873:5;8840:39;:::i;:::-;8895:89;8977:6;8972:3;8895:89;:::i;:::-;8888:96;;8993:52;9038:6;9033:3;9026:4;9019:5;9015:16;8993:52;:::i;:::-;9070:6;9065:3;9061:16;9054:23;;8816:267;;;;;:::o;9113:845::-;;9253:5;9247:12;9282:36;9308:9;9282:36;:::i;:::-;9334:89;9416:6;9411:3;9334:89;:::i;:::-;9327:96;;9454:1;9443:9;9439:17;9470:1;9465:137;;;;9616:1;9611:341;;;;9432:520;;9465:137;9549:4;9545:9;9534;9530:25;9525:3;9518:38;9585:6;9580:3;9576:16;9569:23;;9465:137;;9611:341;9678:38;9710:5;9678:38;:::i;:::-;9738:1;9752:154;9766:6;9763:1;9760:13;9752:154;;;9840:7;9834:14;9830:1;9825:3;9821:11;9814:35;9890:1;9881:7;9877:15;9866:26;;9788:4;9785:1;9781:12;9776:17;;9752:154;;;9935:6;9930:3;9926:16;9919:23;;9618:334;;9432:520;;9220:738;;;;;;:::o;9964:366::-;;10127:67;10191:2;10186:3;10127:67;:::i;:::-;10120:74;;10203:93;10292:3;10203:93;:::i;:::-;10321:2;10316:3;10312:12;10305:19;;10110:220;;;:::o;10336:366::-;;10499:67;10563:2;10558:3;10499:67;:::i;:::-;10492:74;;10575:93;10664:3;10575:93;:::i;:::-;10693:2;10688:3;10684:12;10677:19;;10482:220;;;:::o;10708:366::-;;10871:67;10935:2;10930:3;10871:67;:::i;:::-;10864:74;;10947:93;11036:3;10947:93;:::i;:::-;11065:2;11060:3;11056:12;11049:19;;10854:220;;;:::o;11080:366::-;;11243:67;11307:2;11302:3;11243:67;:::i;:::-;11236:74;;11319:93;11408:3;11319:93;:::i;:::-;11437:2;11432:3;11428:12;11421:19;;11226:220;;;:::o;11452:366::-;;11615:67;11679:2;11674:3;11615:67;:::i;:::-;11608:74;;11691:93;11780:3;11691:93;:::i;:::-;11809:2;11804:3;11800:12;11793:19;;11598:220;;;:::o;11824:366::-;;11987:67;12051:2;12046:3;11987:67;:::i;:::-;11980:74;;12063:93;12152:3;12063:93;:::i;:::-;12181:2;12176:3;12172:12;12165:19;;11970:220;;;:::o;12196:366::-;;12359:67;12423:2;12418:3;12359:67;:::i;:::-;12352:74;;12435:93;12524:3;12435:93;:::i;:::-;12553:2;12548:3;12544:12;12537:19;;12342:220;;;:::o;12568:366::-;;12731:67;12795:2;12790:3;12731:67;:::i;:::-;12724:74;;12807:93;12896:3;12807:93;:::i;:::-;12925:2;12920:3;12916:12;12909:19;;12714:220;;;:::o;12940:366::-;;13103:67;13167:2;13162:3;13103:67;:::i;:::-;13096:74;;13179:93;13268:3;13179:93;:::i;:::-;13297:2;13292:3;13288:12;13281:19;;13086:220;;;:::o;13312:366::-;;13475:67;13539:2;13534:3;13475:67;:::i;:::-;13468:74;;13551:93;13640:3;13551:93;:::i;:::-;13669:2;13664:3;13660:12;13653:19;;13458:220;;;:::o;13684:366::-;;13847:67;13911:2;13906:3;13847:67;:::i;:::-;13840:74;;13923:93;14012:3;13923:93;:::i;:::-;14041:2;14036:3;14032:12;14025:19;;13830:220;;;:::o;14056:366::-;;14219:67;14283:2;14278:3;14219:67;:::i;:::-;14212:74;;14295:93;14384:3;14295:93;:::i;:::-;14413:2;14408:3;14404:12;14397:19;;14202:220;;;:::o;14428:366::-;;14591:67;14655:2;14650:3;14591:67;:::i;:::-;14584:74;;14667:93;14756:3;14667:93;:::i;:::-;14785:2;14780:3;14776:12;14769:19;;14574:220;;;:::o;14800:366::-;;14963:67;15027:2;15022:3;14963:67;:::i;:::-;14956:74;;15039:93;15128:3;15039:93;:::i;:::-;15157:2;15152:3;15148:12;15141:19;;14946:220;;;:::o;15172:366::-;;15335:67;15399:2;15394:3;15335:67;:::i;:::-;15328:74;;15411:93;15500:3;15411:93;:::i;:::-;15529:2;15524:3;15520:12;15513:19;;15318:220;;;:::o;15544:366::-;;15707:67;15771:2;15766:3;15707:67;:::i;:::-;15700:74;;15783:93;15872:3;15783:93;:::i;:::-;15901:2;15896:3;15892:12;15885:19;;15690:220;;;:::o;15916:366::-;;16079:67;16143:2;16138:3;16079:67;:::i;:::-;16072:74;;16155:93;16244:3;16155:93;:::i;:::-;16273:2;16268:3;16264:12;16257:19;;16062:220;;;:::o;16288:366::-;;16451:67;16515:2;16510:3;16451:67;:::i;:::-;16444:74;;16527:93;16616:3;16527:93;:::i;:::-;16645:2;16640:3;16636:12;16629:19;;16434:220;;;:::o;16660:398::-;;16840:83;16921:1;16916:3;16840:83;:::i;:::-;16833:90;;16932:93;17021:3;16932:93;:::i;:::-;17050:1;17045:3;17041:11;17034:18;;16823:235;;;:::o;17064:366::-;;17227:67;17291:2;17286:3;17227:67;:::i;:::-;17220:74;;17303:93;17392:3;17303:93;:::i;:::-;17421:2;17416:3;17412:12;17405:19;;17210:220;;;:::o;17436:366::-;;17599:67;17663:2;17658:3;17599:67;:::i;:::-;17592:74;;17675:93;17764:3;17675:93;:::i;:::-;17793:2;17788:3;17784:12;17777:19;;17582:220;;;:::o;17808:118::-;17895:24;17913:5;17895:24;:::i;:::-;17890:3;17883:37;17873:53;;:::o;17932:589::-;;18179:95;18270:3;18261:6;18179:95;:::i;:::-;18172:102;;18291:95;18382:3;18373:6;18291:95;:::i;:::-;18284:102;;18403:92;18491:3;18482:6;18403:92;:::i;:::-;18396:99;;18512:3;18505:10;;18161:360;;;;;;:::o;18527:379::-;;18733:147;18876:3;18733:147;:::i;:::-;18726:154;;18897:3;18890:10;;18715:191;;;:::o;18912:222::-;;19043:2;19032:9;19028:18;19020:26;;19056:71;19124:1;19113:9;19109:17;19100:6;19056:71;:::i;:::-;19010:124;;;;:::o;19140:640::-;;19373:3;19362:9;19358:19;19350:27;;19387:71;19455:1;19444:9;19440:17;19431:6;19387:71;:::i;:::-;19468:72;19536:2;19525:9;19521:18;19512:6;19468:72;:::i;:::-;19550;19618:2;19607:9;19603:18;19594:6;19550:72;:::i;:::-;19669:9;19663:4;19659:20;19654:2;19643:9;19639:18;19632:48;19697:76;19768:4;19759:6;19697:76;:::i;:::-;19689:84;;19340:440;;;;;;;:::o;19786:210::-;;19911:2;19900:9;19896:18;19888:26;;19924:65;19986:1;19975:9;19971:17;19962:6;19924:65;:::i;:::-;19878:118;;;;:::o;20002:313::-;;20153:2;20142:9;20138:18;20130:26;;20202:9;20196:4;20192:20;20188:1;20177:9;20173:17;20166:47;20230:78;20303:4;20294:6;20230:78;:::i;:::-;20222:86;;20120:195;;;;:::o;20321:419::-;;20525:2;20514:9;20510:18;20502:26;;20574:9;20568:4;20564:20;20560:1;20549:9;20545:17;20538:47;20602:131;20728:4;20602:131;:::i;:::-;20594:139;;20492:248;;;:::o;20746:419::-;;20950:2;20939:9;20935:18;20927:26;;20999:9;20993:4;20989:20;20985:1;20974:9;20970:17;20963:47;21027:131;21153:4;21027:131;:::i;:::-;21019:139;;20917:248;;;:::o;21171:419::-;;21375:2;21364:9;21360:18;21352:26;;21424:9;21418:4;21414:20;21410:1;21399:9;21395:17;21388:47;21452:131;21578:4;21452:131;:::i;:::-;21444:139;;21342:248;;;:::o;21596:419::-;;21800:2;21789:9;21785:18;21777:26;;21849:9;21843:4;21839:20;21835:1;21824:9;21820:17;21813:47;21877:131;22003:4;21877:131;:::i;:::-;21869:139;;21767:248;;;:::o;22021:419::-;;22225:2;22214:9;22210:18;22202:26;;22274:9;22268:4;22264:20;22260:1;22249:9;22245:17;22238:47;22302:131;22428:4;22302:131;:::i;:::-;22294:139;;22192:248;;;:::o;22446:419::-;;22650:2;22639:9;22635:18;22627:26;;22699:9;22693:4;22689:20;22685:1;22674:9;22670:17;22663:47;22727:131;22853:4;22727:131;:::i;:::-;22719:139;;22617:248;;;:::o;22871:419::-;;23075:2;23064:9;23060:18;23052:26;;23124:9;23118:4;23114:20;23110:1;23099:9;23095:17;23088:47;23152:131;23278:4;23152:131;:::i;:::-;23144:139;;23042:248;;;:::o;23296:419::-;;23500:2;23489:9;23485:18;23477:26;;23549:9;23543:4;23539:20;23535:1;23524:9;23520:17;23513:47;23577:131;23703:4;23577:131;:::i;:::-;23569:139;;23467:248;;;:::o;23721:419::-;;23925:2;23914:9;23910:18;23902:26;;23974:9;23968:4;23964:20;23960:1;23949:9;23945:17;23938:47;24002:131;24128:4;24002:131;:::i;:::-;23994:139;;23892:248;;;:::o;24146:419::-;;24350:2;24339:9;24335:18;24327:26;;24399:9;24393:4;24389:20;24385:1;24374:9;24370:17;24363:47;24427:131;24553:4;24427:131;:::i;:::-;24419:139;;24317:248;;;:::o;24571:419::-;;24775:2;24764:9;24760:18;24752:26;;24824:9;24818:4;24814:20;24810:1;24799:9;24795:17;24788:47;24852:131;24978:4;24852:131;:::i;:::-;24844:139;;24742:248;;;:::o;24996:419::-;;25200:2;25189:9;25185:18;25177:26;;25249:9;25243:4;25239:20;25235:1;25224:9;25220:17;25213:47;25277:131;25403:4;25277:131;:::i;:::-;25269:139;;25167:248;;;:::o;25421:419::-;;25625:2;25614:9;25610:18;25602:26;;25674:9;25668:4;25664:20;25660:1;25649:9;25645:17;25638:47;25702:131;25828:4;25702:131;:::i;:::-;25694:139;;25592:248;;;:::o;25846:419::-;;26050:2;26039:9;26035:18;26027:26;;26099:9;26093:4;26089:20;26085:1;26074:9;26070:17;26063:47;26127:131;26253:4;26127:131;:::i;:::-;26119:139;;26017:248;;;:::o;26271:419::-;;26475:2;26464:9;26460:18;26452:26;;26524:9;26518:4;26514:20;26510:1;26499:9;26495:17;26488:47;26552:131;26678:4;26552:131;:::i;:::-;26544:139;;26442:248;;;:::o;26696:419::-;;26900:2;26889:9;26885:18;26877:26;;26949:9;26943:4;26939:20;26935:1;26924:9;26920:17;26913:47;26977:131;27103:4;26977:131;:::i;:::-;26969:139;;26867:248;;;:::o;27121:419::-;;27325:2;27314:9;27310:18;27302:26;;27374:9;27368:4;27364:20;27360:1;27349:9;27345:17;27338:47;27402:131;27528:4;27402:131;:::i;:::-;27394:139;;27292:248;;;:::o;27546:419::-;;27750:2;27739:9;27735:18;27727:26;;27799:9;27793:4;27789:20;27785:1;27774:9;27770:17;27763:47;27827:131;27953:4;27827:131;:::i;:::-;27819:139;;27717:248;;;:::o;27971:419::-;;28175:2;28164:9;28160:18;28152:26;;28224:9;28218:4;28214:20;28210:1;28199:9;28195:17;28188:47;28252:131;28378:4;28252:131;:::i;:::-;28244:139;;28142:248;;;:::o;28396:419::-;;28600:2;28589:9;28585:18;28577:26;;28649:9;28643:4;28639:20;28635:1;28624:9;28620:17;28613:47;28677:131;28803:4;28677:131;:::i;:::-;28669:139;;28567:248;;;:::o;28821:222::-;;28952:2;28941:9;28937:18;28929:26;;28965:71;29033:1;29022:9;29018:17;29009:6;28965:71;:::i;:::-;28919:124;;;;:::o;29049:129::-;;29110:20;;:::i;:::-;29100:30;;29139:33;29167:4;29159:6;29139:33;:::i;:::-;29090:88;;;:::o;29184:75::-;;29250:2;29244:9;29234:19;;29224:35;:::o;29265:311::-;;29432:18;29424:6;29421:30;29418:2;;;29454:18;;:::i;:::-;29418:2;29504:4;29496:6;29492:17;29484:25;;29564:4;29558;29554:15;29546:23;;29347:229;;;:::o;29582:307::-;;29733:18;29725:6;29722:30;29719:2;;;29755:18;;:::i;:::-;29719:2;29793:29;29815:6;29793:29;:::i;:::-;29785:37;;29877:4;29871;29867:15;29859:23;;29648:241;;;:::o;29895:308::-;;30047:18;30039:6;30036:30;30033:2;;;30069:18;;:::i;:::-;30033:2;30107:29;30129:6;30107:29;:::i;:::-;30099:37;;30191:4;30185;30181:15;30173:23;;29962:241;;;:::o;30209:141::-;;30281:3;30273:11;;30304:3;30301:1;30294:14;30338:4;30335:1;30325:18;30317:26;;30263:87;;;:::o;30356:98::-;;30441:5;30435:12;30425:22;;30414:40;;;:::o;30460:99::-;;30546:5;30540:12;30530:22;;30519:40;;;:::o;30565:168::-;;30682:6;30677:3;30670:19;30722:4;30717:3;30713:14;30698:29;;30660:73;;;;:::o;30739:147::-;;30877:3;30862:18;;30852:34;;;;:::o;30892:169::-;;31010:6;31005:3;30998:19;31050:4;31045:3;31041:14;31026:29;;30988:73;;;;:::o;31067:148::-;;31206:3;31191:18;;31181:34;;;;:::o;31221:305::-;;31280:20;31298:1;31280:20;:::i;:::-;31275:25;;31314:20;31332:1;31314:20;:::i;:::-;31309:25;;31468:1;31400:66;31396:74;31393:1;31390:81;31387:2;;;31474:18;;:::i;:::-;31387:2;31518:1;31515;31511:9;31504:16;;31265:261;;;;:::o;31532:237::-;;31589:18;31605:1;31589:18;:::i;:::-;31584:23;;31621:18;31637:1;31621:18;:::i;:::-;31616:23;;31711:1;31705:4;31701:12;31698:1;31695:19;31692:2;;;31717:18;;:::i;:::-;31692:2;31761:1;31758;31754:9;31747:16;;31574:195;;;;:::o;31775:185::-;;31832:20;31850:1;31832:20;:::i;:::-;31827:25;;31866:20;31884:1;31866:20;:::i;:::-;31861:25;;31905:1;31895:2;;31910:18;;:::i;:::-;31895:2;31952:1;31949;31945:9;31940:14;;31817:143;;;;:::o;31966:348::-;;32029:20;32047:1;32029:20;:::i;:::-;32024:25;;32063:20;32081:1;32063:20;:::i;:::-;32058:25;;32251:1;32183:66;32179:74;32176:1;32173:81;32168:1;32161:9;32154:17;32150:105;32147:2;;;32258:18;;:::i;:::-;32147:2;32306:1;32303;32299:9;32288:20;;32014:300;;;;:::o;32320:191::-;;32380:20;32398:1;32380:20;:::i;:::-;32375:25;;32414:20;32432:1;32414:20;:::i;:::-;32409:25;;32453:1;32450;32447:8;32444:2;;;32458:18;;:::i;:::-;32444:2;32503:1;32500;32496:9;32488:17;;32365:146;;;;:::o;32517:96::-;;32583:24;32601:5;32583:24;:::i;:::-;32572:35;;32562:51;;;:::o;32619:90::-;;32696:5;32689:13;32682:21;32671:32;;32661:48;;;:::o;32715:149::-;;32791:66;32784:5;32780:78;32769:89;;32759:105;;;:::o;32870:126::-;;32947:42;32940:5;32936:54;32925:65;;32915:81;;;:::o;33002:77::-;;33068:5;33057:16;;33047:32;;;:::o;33085:86::-;;33160:4;33153:5;33149:16;33138:27;;33128:43;;;:::o;33177:154::-;33261:6;33256:3;33251;33238:30;33323:1;33314:6;33309:3;33305:16;33298:27;33228:103;;;:::o;33337:307::-;33405:1;33415:113;33429:6;33426:1;33423:13;33415:113;;;33514:1;33509:3;33505:11;33499:18;33495:1;33490:3;33486:11;33479:39;33451:2;33448:1;33444:10;33439:15;;33415:113;;;33546:6;33543:1;33540:13;33537:2;;;33626:1;33617:6;33612:3;33608:16;33601:27;33537:2;33386:258;;;;:::o;33650:320::-;;33731:1;33725:4;33721:12;33711:22;;33778:1;33772:4;33768:12;33799:18;33789:2;;33855:4;33847:6;33843:17;33833:27;;33789:2;33917;33909:6;33906:14;33886:18;33883:38;33880:2;;;33936:18;;:::i;:::-;33880:2;33701:269;;;;:::o;33976:281::-;34059:27;34081:4;34059:27;:::i;:::-;34051:6;34047:40;34189:6;34177:10;34174:22;34153:18;34141:10;34138:34;34135:62;34132:2;;;34200:18;;:::i;:::-;34132:2;34240:10;34236:2;34229:22;34019:238;;;:::o;34263:233::-;;34325:24;34343:5;34325:24;:::i;:::-;34316:33;;34371:66;34364:5;34361:77;34358:2;;;34441:18;;:::i;:::-;34358:2;34488:1;34481:5;34477:13;34470:20;;34306:190;;;:::o;34502:180::-;34550:77;34547:1;34540:88;34647:4;34644:1;34637:15;34671:4;34668:1;34661:15;34688:180;34736:77;34733:1;34726:88;34833:4;34830:1;34823:15;34857:4;34854:1;34847:15;34874:180;34922:77;34919:1;34912:88;35019:4;35016:1;35009:15;35043:4;35040:1;35033:15;35060:180;35108:77;35105:1;35098:88;35205:4;35202:1;35195:15;35229:4;35226:1;35219:15;35246:102;;35338:2;35334:7;35329:2;35322:5;35318:14;35314:28;35304:38;;35294:54;;;:::o;35354:237::-;35494:34;35490:1;35482:6;35478:14;35471:58;35563:20;35558:2;35550:6;35546:15;35539:45;35460:131;:::o;35597:225::-;35737:34;35733:1;35725:6;35721:14;35714:58;35806:8;35801:2;35793:6;35789:15;35782:33;35703:119;:::o;35828:178::-;35968:30;35964:1;35956:6;35952:14;35945:54;35934:72;:::o;36012:223::-;36152:34;36148:1;36140:6;36136:14;36129:58;36221:6;36216:2;36208:6;36204:15;36197:31;36118:117;:::o;36241:175::-;36381:27;36377:1;36369:6;36365:14;36358:51;36347:69;:::o;36422:231::-;36562:34;36558:1;36550:6;36546:14;36539:58;36631:14;36626:2;36618:6;36614:15;36607:39;36528:125;:::o;36659:243::-;36799:34;36795:1;36787:6;36783:14;36776:58;36868:26;36863:2;36855:6;36851:15;36844:51;36765:137;:::o;36908:229::-;37048:34;37044:1;37036:6;37032:14;37025:58;37117:12;37112:2;37104:6;37100:15;37093:37;37014:123;:::o;37143:228::-;37283:34;37279:1;37271:6;37267:14;37260:58;37352:11;37347:2;37339:6;37335:15;37328:36;37249:122;:::o;37377:182::-;37517:34;37513:1;37505:6;37501:14;37494:58;37483:76;:::o;37565:231::-;37705:34;37701:1;37693:6;37689:14;37682:58;37774:14;37769:2;37761:6;37757:15;37750:39;37671:125;:::o;37802:182::-;37942:34;37938:1;37930:6;37926:14;37919:58;37908:76;:::o;37990:220::-;38130:34;38126:1;38118:6;38114:14;38107:58;38199:3;38194:2;38186:6;38182:15;38175:28;38096:114;:::o;38216:180::-;38356:32;38352:1;38344:6;38340:14;38333:56;38322:74;:::o;38402:228::-;38542:34;38538:1;38530:6;38526:14;38519:58;38611:11;38606:2;38598:6;38594:15;38587:36;38508:122;:::o;38636:234::-;38776:34;38772:1;38764:6;38760:14;38753:58;38845:17;38840:2;38832:6;38828:15;38821:42;38742:128;:::o;38876:178::-;39016:30;39012:1;39004:6;39000:14;38993:54;38982:72;:::o;39060:220::-;39200:34;39196:1;39188:6;39184:14;39177:58;39269:3;39264:2;39256:6;39252:15;39245:28;39166:114;:::o;39286:::-;39392:8;:::o;39406:166::-;39546:18;39542:1;39534:6;39530:14;39523:42;39512:60;:::o;39578:236::-;39718:34;39714:1;39706:6;39702:14;39695:58;39787:19;39782:2;39774:6;39770:15;39763:44;39684:130;:::o;39820:122::-;39893:24;39911:5;39893:24;:::i;:::-;39886:5;39883:35;39873:2;;39932:1;39929;39922:12;39873:2;39863:79;:::o;39948:116::-;40018:21;40033:5;40018:21;:::i;:::-;40011:5;40008:32;39998:2;;40054:1;40051;40044:12;39998:2;39988:76;:::o;40070:120::-;40142:23;40159:5;40142:23;:::i;:::-;40135:5;40132:34;40122:2;;40180:1;40177;40170:12;40122:2;40112:78;:::o;40196:122::-;40269:24;40287:5;40269:24;:::i;:::-;40262:5;40259:35;40249:2;;40308:1;40305;40298:12;40249:2;40239:79;:::o

Swarm Source

ipfs://1d80d8f131234d17f99761028c4b8991b3fc0cd05f5a10e5ee62ef6f9cf28396
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.