ETH Price: $3,473.89 (+5.93%)
Gas: 8 Gwei

Token

 

Overview

Max Total Supply

999

Holders

160

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
ranbuta.eth
0x31a6d0ea27db941257024189a3718472d40ef663
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:
DerpNationGames

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

// 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/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: contracts/derpnationgames_flat.sol


pragma solidity ^0.8.0;

//import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";








interface IDerpNation {
    function ownerOf(uint256 tokenId) external view returns (address);
}

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

    // Mapping from account to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC1155-isApprovedForAll}.
     */
    function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[account][operator];
    }

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - Mints specific 'id' with an 'amount unsafely to 'to' without a safeTransfer check
     */
    function _mintUnsafe(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @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, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

contract DerpNationGames is Ownable, ERC1155, ReentrancyGuard {
    event SaveGame(uint256 indexed gameId, uint16 version, uint256 indexed saveId);
    event UploadGame(uint256 indexed gameId, uint16 version);

    struct Game {
      uint256 price;
      uint256 startBlock;
      bytes32 dataHash;
      uint256 currentSupply;
      uint256 maxSupply;
      address creator;
      uint16 version;
      mapping(uint256 => bool) claimed;
    }

    mapping(uint256 => Game) public _games;
    uint256 public _gameId = 0;
    uint256 public _saveId = 0;
    address public _pixelPawnAddress = address(0); // mainnet pixelpawn address
    address public _derpNationAddress = address(0);
    uint256 public _whitelistBlocks = 3456; // 13ish hours

    receive() external payable {}
    fallback() external payable {}

    function deposit() public payable {
    }

    constructor() ERC1155("https://www.derpnation.xyz/dng_api/{id}.json") {
    }

    function updateURI(string memory newuri) public onlyOwner{
        _setURI(newuri);
    }

    function updatePixelPawnAddress(address pp) public onlyOwner{
      require(_pixelPawnAddress == address(0),"n4u");
      _pixelPawnAddress = pp;
    }

    function updateWhitelistAddress(address wl) public onlyOwner{
      require(_derpNationAddress == address(0),"n4u");
      _derpNationAddress = wl;
    }

    function createGame(uint256 price, uint256 startBlock, bytes32 dataHash, uint256 maxSupply, address creator) public onlyOwner returns(uint256){
      //allow creation of a game, ensure start block is greater than current block
      require(startBlock > block.number, "SB");
      _gameId++;
      _games[_gameId].price = price;
      _games[_gameId].startBlock = startBlock;
      _games[_gameId].dataHash = dataHash;
      _games[_gameId].maxSupply = maxSupply;
      _games[_gameId].creator = creator;
      // mint 5 tokens to the owner of the contract, 150 to pixelPawn and 50 to the game creator
      _games[_gameId].currentSupply = 255;
      _mint(owner(),_gameId,5,"");
      _mintUnsafe(_pixelPawnAddress,_gameId, 200, "");
      _mint(creator, _gameId, 50,"");
      return(_gameId);
    }

    function updateGame(uint256 currentGameId, uint256 startBlock, bytes32 dataHash, address creator) public onlyOwner{
      //allows games to be updated with new versions and for the start block to be changed to
      // effectively start a mint or halt minting

      _games[currentGameId].startBlock = startBlock;
      _games[currentGameId].dataHash = dataHash;
      _games[_gameId].creator = creator;
    }

    function checkClaim(uint256 currentGameId, uint256 derpNationId) public view returns (bool){
      return _games[currentGameId].claimed[derpNationId];
    }

    function mint(uint256 currentGameId, uint256[] calldata derpNationIds, bool presale) public nonReentrant payable {
      // check that the sender is not a contract, that the value is correct and that the game isnt sold out
      require(msg.sender == tx.origin,"Nope");
      require(msg.value == _games[currentGameId].price*derpNationIds.length, "Wrong Price");
      require(_games[currentGameId].currentSupply+derpNationIds.length <= _games[currentGameId].maxSupply, "Sold out");
      require(derpNationIds.length > 0, "min 1");
      require(derpNationIds.length < 6, "max 5");
      if(!presale) // if not presale, wait until whitelist period is over
        require(block.number >_games[currentGameId].startBlock + _whitelistBlocks, "PUB-Too soon");
      else{ // check presale has begun
        require(block.number > _games[currentGameId].startBlock, "PRE-Too soon");
        uint i = 0;
        //go over every ID they sent
        for(i=0;i<derpNationIds.length;i++){
            // check that the sender owns the derp ID they say that they own, mark it as claimed
            require(IDerpNation(_derpNationAddress).ownerOf(derpNationIds[i]) == msg.sender, "Not yours");
            require(_games[currentGameId].claimed[derpNationIds[i]] == false, "Already Claimed");
            _games[currentGameId].claimed[derpNationIds[i]] = true;
          }
      }
      // current supply incremented, token minted to user and payment send to creator and derpNation
      _games[currentGameId].currentSupply+=derpNationIds.length;
      _mint(msg.sender,currentGameId,derpNationIds.length,"");
      if(msg.value > 0){
        bool sent;
        bytes memory data;
        (sent, data) = payable(_derpNationAddress).call{value: (address(this).balance/10)}("");
        require(sent, "Fts");
        (sent, data) = payable(_games[currentGameId].creator).call{value: (address(this).balance)}("");
        require(sent, "Fts");
      }
    }

    function totalSupply(uint256 currentGameId) public view returns(uint256){
      return _games[currentGameId].currentSupply;
    }

    function maxSupply(uint256 currentGameId) public view returns(uint256){
      return _games[currentGameId].maxSupply;
    }

    function saveGame(uint256 currentGameId, uint16 version, string calldata note, bytes calldata data1,bytes calldata data2,bytes calldata data3,bytes calldata data4) external {
      _saveId++;
      emit SaveGame(currentGameId, version, _saveId);
    }

    function uploadGame(uint256 currentGameId, string calldata name, string calldata desc, bytes calldata data) external onlyOwner{
      _games[currentGameId].version++;
      emit UploadGame(currentGameId, _games[currentGameId].version);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"version","type":"uint16"},{"indexed":true,"internalType":"uint256","name":"saveId","type":"uint256"}],"name":"SaveGame","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"version","type":"uint16"}],"name":"UploadGame","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"_derpNationAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_gameId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_games","outputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"bytes32","name":"dataHash","type":"bytes32"},{"internalType":"uint256","name":"currentSupply","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint16","name":"version","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_pixelPawnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_saveId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_whitelistBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"currentGameId","type":"uint256"},{"internalType":"uint256","name":"derpNationId","type":"uint256"}],"name":"checkClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"bytes32","name":"dataHash","type":"bytes32"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"address","name":"creator","type":"address"}],"name":"createGame","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"currentGameId","type":"uint256"}],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"currentGameId","type":"uint256"},{"internalType":"uint256[]","name":"derpNationIds","type":"uint256[]"},{"internalType":"bool","name":"presale","type":"bool"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"currentGameId","type":"uint256"},{"internalType":"uint16","name":"version","type":"uint16"},{"internalType":"string","name":"note","type":"string"},{"internalType":"bytes","name":"data1","type":"bytes"},{"internalType":"bytes","name":"data2","type":"bytes"},{"internalType":"bytes","name":"data3","type":"bytes"},{"internalType":"bytes","name":"data4","type":"bytes"}],"name":"saveGame","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"currentGameId","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"currentGameId","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"bytes32","name":"dataHash","type":"bytes32"},{"internalType":"address","name":"creator","type":"address"}],"name":"updateGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pp","type":"address"}],"name":"updatePixelPawnAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"updateURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wl","type":"address"}],"name":"updateWhitelistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"currentGameId","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"desc","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"uploadGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260006006819055600755600880546001600160a01b0319908116909155600980549091169055610d80600a553480156200003d57600080fd5b506040518060600160405280602c815260200162002ce6602c913962000063336200007a565b6200006e81620000ca565b506001600455620001c6565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8051620000df906003906020840190620000e3565b5050565b828054620000f19062000189565b90600052602060002090601f01602090048101928262000115576000855562000160565b82601f106200013057805160ff191683800117855562000160565b8280016001018555821562000160579182015b828111156200016057825182559160200191906001019062000143565b506200016e92915062000172565b5090565b5b808211156200016e576000815560010162000173565b600181811c908216806200019e57607f821691505b60208210811415620001c057634e487b7160e01b600052602260045260246000fd5b50919050565b612b1080620001d66000396000f3fe6080604052600436106101ac5760003560e01c8063869f7594116100eb578063c245ef341161008f578063d21389d811610061578063d21389d814610576578063e985e9c5146105b5578063f242432a146105fe578063f2fde38b1461061e57005b8063c245ef3414610516578063c30f4a5a14610536578063caf4616814610556578063d0e30db0146101b357005b8063a0952b64116100c8578063a0952b6414610490578063a22cb465146104a6578063a9abac1a146104c6578063bd85b039146104e657005b8063869f75941461040e5780638da5cb5b1461043e578063a041c88c1461047057005b80634a0f61151161015257806355ad60341161012f57806355ad6034146103a357806362417655146103c3578063715018a6146103e35780638242937f146103f857005b80634a0f6115146103405780634a14ad71146103605780634e1273f41461037657005b80630e89341c1161018b5780630e89341c1461022b5780632eb2c2d6146102585780633772f6a71461027857806341eb8b8b1461029857005b80620c6b98146101b5578062fdd58e146101c857806301ffc9a7146101fb57005b366101b357005b005b6101b36101c33660046122d2565b61063e565b3480156101d457600080fd5b506101e86101e3366004612131565b610c03565b6040519081526020015b60405180910390f35b34801561020757600080fd5b5061021b61021636600461222f565b610c97565b60405190151581526020016101f2565b34801561023757600080fd5b5061024b6102463660046122b9565b610ce9565b6040516101f29190612748565b34801561026457600080fd5b506101b3610273366004611fe7565b610d7d565b34801561028457600080fd5b506101b3610293366004612404565b610e14565b3480156102a457600080fd5b506102fe6102b33660046122b9565b60056020819052600091825260409091208054600182015460028301546003840154600485015494909501549294919390926001600160a01b03811690600160a01b900461ffff1687565b60408051978852602088019690965294860193909352606085019190915260808401526001600160a01b031660a083015261ffff1660c082015260e0016101f2565b34801561034c57600080fd5b506101b361035b366004611f74565b610e73565b34801561036c57600080fd5b506101e860065481565b34801561038257600080fd5b5061039661039136600461215d565b610efe565b6040516101f29190612707565b3480156103af57600080fd5b506101e86103be36600461258f565b611027565b3480156103cf57600080fd5b506101b36103de366004612361565b611192565b3480156103ef57600080fd5b506101b361125e565b34801561040457600080fd5b506101e860075481565b34801561041a57600080fd5b506101e86104293660046122b9565b60009081526005602052604090206004015490565b34801561044a57600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016101f2565b34801561047c57600080fd5b50600854610458906001600160a01b031681565b34801561049c57600080fd5b506101e8600a5481565b3480156104b257600080fd5b506101b36104c13660046120fc565b611294565b3480156104d257600080fd5b506101b36104e1366004611f74565b6112a3565b3480156104f257600080fd5b506101e86105013660046122b9565b60009081526005602052604090206003015490565b34801561052257600080fd5b506101b361053136600461254e565b61132e565b34801561054257600080fd5b506101b3610551366004612269565b6113a5565b34801561056257600080fd5b50600954610458906001600160a01b031681565b34801561058257600080fd5b5061021b61059136600461252c565b60009182526005602090815260408084209284526006909201905290205460ff1690565b3480156105c157600080fd5b5061021b6105d0366004611fae565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b34801561060a57600080fd5b506101b3610619366004612094565b6113db565b34801561062a57600080fd5b506101b3610639366004611f74565b611462565b600260045414156106965760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026004553332146106d35760405162461bcd60e51b815260040161068d906020808252600490820152634e6f706560e01b604082015260600190565b6000848152600560205260409020546106ed908390612905565b34146107295760405162461bcd60e51b815260206004820152600b60248201526a57726f6e6720507269636560a81b604482015260640161068d565b6000848152600560205260409020600481015460039091015461074d9084906128cb565b11156107865760405162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b604482015260640161068d565b816107bb5760405162461bcd60e51b81526020600482015260056024820152646d696e203160d81b604482015260640161068d565b600682106107f35760405162461bcd60e51b81526020600482015260056024820152646d6178203560d81b604482015260640161068d565b8061085957600a5460008581526005602052604090206001015461081791906128cb565b43116108545760405162461bcd60e51b815260206004820152600c60248201526b282aa116aa37b79039b7b7b760a11b604482015260640161068d565b610a79565b60008481526005602052604090206001015443116108a85760405162461bcd60e51b815260206004820152600c60248201526b28292296aa37b79039b7b7b760a11b604482015260640161068d565b60005b82811015610a775760095433906001600160a01b0316636352211e8686858181106108d8576108d86129de565b905060200201356040518263ffffffff1660e01b81526004016108fd91815260200190565b60206040518083038186803b15801561091557600080fd5b505afa158015610929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094d9190611f91565b6001600160a01b03161461098f5760405162461bcd60e51b81526020600482015260096024820152684e6f7420796f75727360b81b604482015260640161068d565b6000858152600560205260408120600601908585848181106109b3576109b36129de565b602090810292909201358352508101919091526040016000205460ff1615610a0f5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4810db185a5b5959608a1b604482015260640161068d565b6000858152600560205260408120600191600690910190868685818110610a3857610a386129de565b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610a6f906129ad565b9150506108ab565b505b60008481526005602052604081206003018054849290610a9a9084906128cb565b9091555050604080516020810190915260008152610abd903390869085906114fa565b3415610bf8576009546000906060906001600160a01b0316610ae0600a476128e3565b604051600081818185875af1925050503d8060008114610b1c576040519150601f19603f3d011682016040523d82523d6000602084013e610b21565b606091505b50909250905081610b5a5760405162461bcd60e51b815260206004820152600360248201526246747360e81b604482015260640161068d565b60008681526005602081905260408083209091015490516001600160a01b039091169147919081818185875af1925050503d8060008114610bb7576040519150601f19603f3d011682016040523d82523d6000602084013e610bbc565b606091505b50909250905081610bf55760405162461bcd60e51b815260206004820152600360248201526246747360e81b604482015260640161068d565b50505b505060016004555050565b60006001600160a01b038316610c6f5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b606482015260840161068d565b5060009081526001602090815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b1480610cc857506001600160e01b031982166303a24d0760e21b145b80610ce357506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060038054610cf890612924565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2490612924565b8015610d715780601f10610d4657610100808354040283529160200191610d71565b820191906000526020600020905b815481529060010190602001808311610d5457829003601f168201915b50505050509050919050565b6001600160a01b038516331480610d995750610d9985336105d0565b610e005760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161068d565b610e0d85858585856115d6565b5050505050565b60078054906000610e24836129ad565b909155505060075460405161ffff8d1681528d907fcde2aa6a1acec8f6b377f0ae600a563d5d75189f9d03a8cc614c5afca48979619060200160405180910390a3505050505050505050505050565b6000546001600160a01b03163314610e9d5760405162461bcd60e51b815260040161068d90612832565b6008546001600160a01b031615610edc5760405162461bcd60e51b81526020600482015260036024820152626e347560e81b604482015260640161068d565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60608151835114610f635760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161068d565b600083516001600160401b03811115610f7e57610f7e6129f4565b604051908082528060200260200182016040528015610fa7578160200160208202803683370190505b50905060005b845181101561101f57610ff2858281518110610fcb57610fcb6129de565b6020026020010151858381518110610fe557610fe56129de565b6020026020010151610c03565b828281518110611004576110046129de565b6020908102919091010152611018816129ad565b9050610fad565b509392505050565b600080546001600160a01b031633146110525760405162461bcd60e51b815260040161068d90612832565b4385116110865760405162461bcd60e51b815260206004820152600260248201526129a160f11b604482015260640161068d565b60068054906000611096836129ad565b90915550506006805460009081526005602081905260408083208a90558354835280832060010189905583548352808320600201889055835483528083206004018790558354835280832090910180546001600160a01b0387166001600160a01b0319909116179055915481522060ff60039091015561113b6111216000546001600160a01b031690565b6006546005604051806020016040528060008152506114fa565b600854600654604080516020810190915260008152611167926001600160a01b0316919060c8906117b6565b611185826006546032604051806020016040528060008152506114fa565b5060065495945050505050565b6000546001600160a01b031633146111bc5760405162461bcd60e51b815260040161068d90612832565b6000878152600560208190526040909120018054600160a01b900461ffff169060146111e78361298b565b82546101009290920a61ffff818102199093169183160217909155600089815260056020818152604092839020909101549151600160a01b90920490921681528992507f010ed8ac67acee2bb73ef589060729391f836665f767c4bb3fd1e3bf04abd74c910160405180910390a250505050505050565b6000546001600160a01b031633146112885760405162461bcd60e51b815260040161068d90612832565b611292600061187f565b565b61129f3383836118cf565b5050565b6000546001600160a01b031633146112cd5760405162461bcd60e51b815260040161068d90612832565b6009546001600160a01b03161561130c5760405162461bcd60e51b81526020600482015260036024820152626e347560e81b604482015260640161068d565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146113585760405162461bcd60e51b815260040161068d90612832565b6000938452600560208190526040808620600181019590955560029094019290925560065484529190922090910180546001600160a01b0319166001600160a01b03909216919091179055565b6000546001600160a01b031633146113cf5760405162461bcd60e51b815260040161068d90612832565b6113d8816119b0565b50565b6001600160a01b0385163314806113f757506113f785336105d0565b6114555760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b606482015260840161068d565b610e0d85858585856119c3565b6000546001600160a01b0316331461148c5760405162461bcd60e51b815260040161068d90612832565b6001600160a01b0381166114f15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161068d565b6113d88161187f565b6001600160a01b0384166115205760405162461bcd60e51b815260040161068d90612867565b33600061152c85611af1565b9050600061153985611af1565b905060008681526001602090815260408083206001600160a01b038b1684529091528120805487929061156d9084906128cb565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46115cd83600089898989611b3c565b50505050505050565b81518351146116385760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b606482015260840161068d565b6001600160a01b03841661165e5760405162461bcd60e51b815260040161068d906127a3565b3360005b845181101561174857600085828151811061167f5761167f6129de565b60200260200101519050600085838151811061169d5761169d6129de565b60209081029190910181015160008481526001835260408082206001600160a01b038e1683529093529190912054909150818110156116ee5760405162461bcd60e51b815260040161068d906127e8565b60008381526001602090815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061172d9084906128cb565b9250508190555050505080611741906129ad565b9050611662565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161179892919061271a565b60405180910390a46117ae818787878787611ca7565b505050505050565b6001600160a01b0384166117dc5760405162461bcd60e51b815260040161068d90612867565b3360006117e885611af1565b905060006117f585611af1565b905060008681526001602090815260408083206001600160a01b038b168452909152812080548792906118299084906128cb565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46115cd565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156119435760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161068d565b6001600160a01b03838116600081815260026020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b805161129f906003906020840190611d71565b6001600160a01b0384166119e95760405162461bcd60e51b815260040161068d906127a3565b3360006119f585611af1565b90506000611a0285611af1565b905060008681526001602090815260408083206001600160a01b038c16845290915290205485811015611a475760405162461bcd60e51b815260040161068d906127e8565b60008781526001602090815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611a869084906128cb565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611ae6848a8a8a8a8a611b3c565b505050505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611b2b57611b2b6129de565b602090810291909101015292915050565b6001600160a01b0384163b156117ae5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611b8090899089908890889088906004016126c2565b602060405180830381600087803b158015611b9a57600080fd5b505af1925050508015611bca575060408051601f3d908101601f19168201909252611bc79181019061224c565b60015b611c7757611bd6612a0a565b806308c379a01415611c105750611beb612a26565b80611bf65750611c12565b8060405162461bcd60e51b815260040161068d9190612748565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161068d565b6001600160e01b0319811663f23a6e6160e01b146115cd5760405162461bcd60e51b815260040161068d9061275b565b6001600160a01b0384163b156117ae5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611ceb9089908990889088908890600401612664565b602060405180830381600087803b158015611d0557600080fd5b505af1925050508015611d35575060408051601f3d908101601f19168201909252611d329181019061224c565b60015b611d4157611bd6612a0a565b6001600160e01b0319811663bc197c8160e01b146115cd5760405162461bcd60e51b815260040161068d9061275b565b828054611d7d90612924565b90600052602060002090601f016020900481019282611d9f5760008555611de5565b82601f10611db857805160ff1916838001178555611de5565b82800160010185558215611de5579182015b82811115611de5578251825591602001919060010190611dca565b50611df1929150611df5565b5090565b5b80821115611df15760008155600101611df6565b60006001600160401b03831115611e2357611e236129f4565b604051611e3a601f8501601f19166020018261295f565b809150838152848484011115611e4f57600080fd5b83836020830137600060208583010152509392505050565b600082601f830112611e7857600080fd5b81356020611e85826128a8565b604051611e92828261295f565b8381528281019150858301600585901b87018401881015611eb257600080fd5b60005b85811015611ed157813584529284019290840190600101611eb5565b5090979650505050505050565b80358015158114611eee57600080fd5b919050565b60008083601f840112611f0557600080fd5b5081356001600160401b03811115611f1c57600080fd5b602083019150836020828501011115611f3457600080fd5b9250929050565b600082601f830112611f4c57600080fd5b611f5b83833560208501611e0a565b9392505050565b803561ffff81168114611eee57600080fd5b600060208284031215611f8657600080fd5b8135611f5b81612aaf565b600060208284031215611fa357600080fd5b8151611f5b81612aaf565b60008060408385031215611fc157600080fd5b8235611fcc81612aaf565b91506020830135611fdc81612aaf565b809150509250929050565b600080600080600060a08688031215611fff57600080fd5b853561200a81612aaf565b9450602086013561201a81612aaf565b935060408601356001600160401b038082111561203657600080fd5b61204289838a01611e67565b9450606088013591508082111561205857600080fd5b61206489838a01611e67565b9350608088013591508082111561207a57600080fd5b5061208788828901611f3b565b9150509295509295909350565b600080600080600060a086880312156120ac57600080fd5b85356120b781612aaf565b945060208601356120c781612aaf565b9350604086013592506060860135915060808601356001600160401b038111156120f057600080fd5b61208788828901611f3b565b6000806040838503121561210f57600080fd5b823561211a81612aaf565b915061212860208401611ede565b90509250929050565b6000806040838503121561214457600080fd5b823561214f81612aaf565b946020939093013593505050565b6000806040838503121561217057600080fd5b82356001600160401b038082111561218757600080fd5b818501915085601f83011261219b57600080fd5b813560206121a8826128a8565b6040516121b5828261295f565b8381528281019150858301600585901b870184018b10156121d557600080fd5b600096505b848710156122015780356121ed81612aaf565b8352600196909601959183019183016121da565b509650508601359250508082111561221857600080fd5b5061222585828601611e67565b9150509250929050565b60006020828403121561224157600080fd5b8135611f5b81612ac4565b60006020828403121561225e57600080fd5b8151611f5b81612ac4565b60006020828403121561227b57600080fd5b81356001600160401b0381111561229157600080fd5b8201601f810184136122a257600080fd5b6122b184823560208401611e0a565b949350505050565b6000602082840312156122cb57600080fd5b5035919050565b600080600080606085870312156122e857600080fd5b8435935060208501356001600160401b038082111561230657600080fd5b818701915087601f83011261231a57600080fd5b81358181111561232957600080fd5b8860208260051b850101111561233e57600080fd5b60208301955080945050505061235660408601611ede565b905092959194509250565b60008060008060008060006080888a03121561237c57600080fd5b8735965060208801356001600160401b038082111561239a57600080fd5b6123a68b838c01611ef3565b909850965060408a01359150808211156123bf57600080fd5b6123cb8b838c01611ef3565b909650945060608a01359150808211156123e457600080fd5b506123f18a828b01611ef3565b989b979a50959850939692959293505050565b60008060008060008060008060008060008060e08d8f03121561242657600080fd5b8c359b5061243660208e01611f62565b9a506001600160401b0360408e0135111561245057600080fd5b6124608e60408f01358f01611ef3565b909a5098506001600160401b0360608e0135111561247d57600080fd5b61248d8e60608f01358f01611ef3565b90985096506001600160401b0360808e013511156124aa57600080fd5b6124ba8e60808f01358f01611ef3565b90965094506001600160401b0360a08e013511156124d757600080fd5b6124e78e60a08f01358f01611ef3565b90945092506001600160401b0360c08e0135111561250457600080fd5b6125148e60c08f01358f01611ef3565b81935080925050509295989b509295989b509295989b565b6000806040838503121561253f57600080fd5b50508035926020909101359150565b6000806000806080858703121561256457600080fd5b843593506020850135925060408501359150606085013561258481612aaf565b939692955090935050565b600080600080600060a086880312156125a757600080fd5b8535945060208601359350604086013592506060860135915060808601356125ce81612aaf565b809150509295509295909350565b600081518084526020808501945080840160005b8381101561260c578151875295820195908201906001016125f0565b509495945050505050565b6000815180845260005b8181101561263d57602081850181015186830182015201612621565b8181111561264f576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0386811682528516602082015260a060408201819052600090612690908301866125dc565b82810360608401526126a281866125dc565b905082810360808401526126b68185612617565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906126fc90830184612617565b979650505050505050565b602081526000611f5b60208301846125dc565b60408152600061272d60408301856125dc565b828103602084015261273f81856125dc565b95945050505050565b602081526000611f5b6020830184612617565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60006001600160401b038211156128c1576128c16129f4565b5060051b60200190565b600082198211156128de576128de6129c8565b500190565b60008261290057634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561291f5761291f6129c8565b500290565b600181811c9082168061293857607f821691505b6020821081141561295957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b0381118282101715612984576129846129f4565b6040525050565b600061ffff808316818114156129a3576129a36129c8565b6001019392505050565b60006000198214156129c1576129c16129c8565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115612a235760046000803e5060005160e01c5b90565b600060443d1015612a345790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715612a6357505050505090565b8285019150815181811115612a7b5750505050505090565b843d8701016020828501011115612a955750505050505090565b612aa46020828601018761295f565b509095945050505050565b6001600160a01b03811681146113d857600080fd5b6001600160e01b0319811681146113d857600080fdfea2646970667358221220b924a1def829fc8ada63fc052a4a626dc364e41ba911dea5d347f91e3e8e800164736f6c6343000807003368747470733a2f2f7777772e646572706e6174696f6e2e78797a2f646e675f6170692f7b69647d2e6a736f6e

Deployed Bytecode

0x6080604052600436106101ac5760003560e01c8063869f7594116100eb578063c245ef341161008f578063d21389d811610061578063d21389d814610576578063e985e9c5146105b5578063f242432a146105fe578063f2fde38b1461061e57005b8063c245ef3414610516578063c30f4a5a14610536578063caf4616814610556578063d0e30db0146101b357005b8063a0952b64116100c8578063a0952b6414610490578063a22cb465146104a6578063a9abac1a146104c6578063bd85b039146104e657005b8063869f75941461040e5780638da5cb5b1461043e578063a041c88c1461047057005b80634a0f61151161015257806355ad60341161012f57806355ad6034146103a357806362417655146103c3578063715018a6146103e35780638242937f146103f857005b80634a0f6115146103405780634a14ad71146103605780634e1273f41461037657005b80630e89341c1161018b5780630e89341c1461022b5780632eb2c2d6146102585780633772f6a71461027857806341eb8b8b1461029857005b80620c6b98146101b5578062fdd58e146101c857806301ffc9a7146101fb57005b366101b357005b005b6101b36101c33660046122d2565b61063e565b3480156101d457600080fd5b506101e86101e3366004612131565b610c03565b6040519081526020015b60405180910390f35b34801561020757600080fd5b5061021b61021636600461222f565b610c97565b60405190151581526020016101f2565b34801561023757600080fd5b5061024b6102463660046122b9565b610ce9565b6040516101f29190612748565b34801561026457600080fd5b506101b3610273366004611fe7565b610d7d565b34801561028457600080fd5b506101b3610293366004612404565b610e14565b3480156102a457600080fd5b506102fe6102b33660046122b9565b60056020819052600091825260409091208054600182015460028301546003840154600485015494909501549294919390926001600160a01b03811690600160a01b900461ffff1687565b60408051978852602088019690965294860193909352606085019190915260808401526001600160a01b031660a083015261ffff1660c082015260e0016101f2565b34801561034c57600080fd5b506101b361035b366004611f74565b610e73565b34801561036c57600080fd5b506101e860065481565b34801561038257600080fd5b5061039661039136600461215d565b610efe565b6040516101f29190612707565b3480156103af57600080fd5b506101e86103be36600461258f565b611027565b3480156103cf57600080fd5b506101b36103de366004612361565b611192565b3480156103ef57600080fd5b506101b361125e565b34801561040457600080fd5b506101e860075481565b34801561041a57600080fd5b506101e86104293660046122b9565b60009081526005602052604090206004015490565b34801561044a57600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016101f2565b34801561047c57600080fd5b50600854610458906001600160a01b031681565b34801561049c57600080fd5b506101e8600a5481565b3480156104b257600080fd5b506101b36104c13660046120fc565b611294565b3480156104d257600080fd5b506101b36104e1366004611f74565b6112a3565b3480156104f257600080fd5b506101e86105013660046122b9565b60009081526005602052604090206003015490565b34801561052257600080fd5b506101b361053136600461254e565b61132e565b34801561054257600080fd5b506101b3610551366004612269565b6113a5565b34801561056257600080fd5b50600954610458906001600160a01b031681565b34801561058257600080fd5b5061021b61059136600461252c565b60009182526005602090815260408084209284526006909201905290205460ff1690565b3480156105c157600080fd5b5061021b6105d0366004611fae565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b34801561060a57600080fd5b506101b3610619366004612094565b6113db565b34801561062a57600080fd5b506101b3610639366004611f74565b611462565b600260045414156106965760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026004553332146106d35760405162461bcd60e51b815260040161068d906020808252600490820152634e6f706560e01b604082015260600190565b6000848152600560205260409020546106ed908390612905565b34146107295760405162461bcd60e51b815260206004820152600b60248201526a57726f6e6720507269636560a81b604482015260640161068d565b6000848152600560205260409020600481015460039091015461074d9084906128cb565b11156107865760405162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b604482015260640161068d565b816107bb5760405162461bcd60e51b81526020600482015260056024820152646d696e203160d81b604482015260640161068d565b600682106107f35760405162461bcd60e51b81526020600482015260056024820152646d6178203560d81b604482015260640161068d565b8061085957600a5460008581526005602052604090206001015461081791906128cb565b43116108545760405162461bcd60e51b815260206004820152600c60248201526b282aa116aa37b79039b7b7b760a11b604482015260640161068d565b610a79565b60008481526005602052604090206001015443116108a85760405162461bcd60e51b815260206004820152600c60248201526b28292296aa37b79039b7b7b760a11b604482015260640161068d565b60005b82811015610a775760095433906001600160a01b0316636352211e8686858181106108d8576108d86129de565b905060200201356040518263ffffffff1660e01b81526004016108fd91815260200190565b60206040518083038186803b15801561091557600080fd5b505afa158015610929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094d9190611f91565b6001600160a01b03161461098f5760405162461bcd60e51b81526020600482015260096024820152684e6f7420796f75727360b81b604482015260640161068d565b6000858152600560205260408120600601908585848181106109b3576109b36129de565b602090810292909201358352508101919091526040016000205460ff1615610a0f5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4810db185a5b5959608a1b604482015260640161068d565b6000858152600560205260408120600191600690910190868685818110610a3857610a386129de565b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610a6f906129ad565b9150506108ab565b505b60008481526005602052604081206003018054849290610a9a9084906128cb565b9091555050604080516020810190915260008152610abd903390869085906114fa565b3415610bf8576009546000906060906001600160a01b0316610ae0600a476128e3565b604051600081818185875af1925050503d8060008114610b1c576040519150601f19603f3d011682016040523d82523d6000602084013e610b21565b606091505b50909250905081610b5a5760405162461bcd60e51b815260206004820152600360248201526246747360e81b604482015260640161068d565b60008681526005602081905260408083209091015490516001600160a01b039091169147919081818185875af1925050503d8060008114610bb7576040519150601f19603f3d011682016040523d82523d6000602084013e610bbc565b606091505b50909250905081610bf55760405162461bcd60e51b815260206004820152600360248201526246747360e81b604482015260640161068d565b50505b505060016004555050565b60006001600160a01b038316610c6f5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b606482015260840161068d565b5060009081526001602090815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b1480610cc857506001600160e01b031982166303a24d0760e21b145b80610ce357506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060038054610cf890612924565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2490612924565b8015610d715780601f10610d4657610100808354040283529160200191610d71565b820191906000526020600020905b815481529060010190602001808311610d5457829003601f168201915b50505050509050919050565b6001600160a01b038516331480610d995750610d9985336105d0565b610e005760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161068d565b610e0d85858585856115d6565b5050505050565b60078054906000610e24836129ad565b909155505060075460405161ffff8d1681528d907fcde2aa6a1acec8f6b377f0ae600a563d5d75189f9d03a8cc614c5afca48979619060200160405180910390a3505050505050505050505050565b6000546001600160a01b03163314610e9d5760405162461bcd60e51b815260040161068d90612832565b6008546001600160a01b031615610edc5760405162461bcd60e51b81526020600482015260036024820152626e347560e81b604482015260640161068d565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60608151835114610f635760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161068d565b600083516001600160401b03811115610f7e57610f7e6129f4565b604051908082528060200260200182016040528015610fa7578160200160208202803683370190505b50905060005b845181101561101f57610ff2858281518110610fcb57610fcb6129de565b6020026020010151858381518110610fe557610fe56129de565b6020026020010151610c03565b828281518110611004576110046129de565b6020908102919091010152611018816129ad565b9050610fad565b509392505050565b600080546001600160a01b031633146110525760405162461bcd60e51b815260040161068d90612832565b4385116110865760405162461bcd60e51b815260206004820152600260248201526129a160f11b604482015260640161068d565b60068054906000611096836129ad565b90915550506006805460009081526005602081905260408083208a90558354835280832060010189905583548352808320600201889055835483528083206004018790558354835280832090910180546001600160a01b0387166001600160a01b0319909116179055915481522060ff60039091015561113b6111216000546001600160a01b031690565b6006546005604051806020016040528060008152506114fa565b600854600654604080516020810190915260008152611167926001600160a01b0316919060c8906117b6565b611185826006546032604051806020016040528060008152506114fa565b5060065495945050505050565b6000546001600160a01b031633146111bc5760405162461bcd60e51b815260040161068d90612832565b6000878152600560208190526040909120018054600160a01b900461ffff169060146111e78361298b565b82546101009290920a61ffff818102199093169183160217909155600089815260056020818152604092839020909101549151600160a01b90920490921681528992507f010ed8ac67acee2bb73ef589060729391f836665f767c4bb3fd1e3bf04abd74c910160405180910390a250505050505050565b6000546001600160a01b031633146112885760405162461bcd60e51b815260040161068d90612832565b611292600061187f565b565b61129f3383836118cf565b5050565b6000546001600160a01b031633146112cd5760405162461bcd60e51b815260040161068d90612832565b6009546001600160a01b03161561130c5760405162461bcd60e51b81526020600482015260036024820152626e347560e81b604482015260640161068d565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146113585760405162461bcd60e51b815260040161068d90612832565b6000938452600560208190526040808620600181019590955560029094019290925560065484529190922090910180546001600160a01b0319166001600160a01b03909216919091179055565b6000546001600160a01b031633146113cf5760405162461bcd60e51b815260040161068d90612832565b6113d8816119b0565b50565b6001600160a01b0385163314806113f757506113f785336105d0565b6114555760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b606482015260840161068d565b610e0d85858585856119c3565b6000546001600160a01b0316331461148c5760405162461bcd60e51b815260040161068d90612832565b6001600160a01b0381166114f15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161068d565b6113d88161187f565b6001600160a01b0384166115205760405162461bcd60e51b815260040161068d90612867565b33600061152c85611af1565b9050600061153985611af1565b905060008681526001602090815260408083206001600160a01b038b1684529091528120805487929061156d9084906128cb565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46115cd83600089898989611b3c565b50505050505050565b81518351146116385760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b606482015260840161068d565b6001600160a01b03841661165e5760405162461bcd60e51b815260040161068d906127a3565b3360005b845181101561174857600085828151811061167f5761167f6129de565b60200260200101519050600085838151811061169d5761169d6129de565b60209081029190910181015160008481526001835260408082206001600160a01b038e1683529093529190912054909150818110156116ee5760405162461bcd60e51b815260040161068d906127e8565b60008381526001602090815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061172d9084906128cb565b9250508190555050505080611741906129ad565b9050611662565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161179892919061271a565b60405180910390a46117ae818787878787611ca7565b505050505050565b6001600160a01b0384166117dc5760405162461bcd60e51b815260040161068d90612867565b3360006117e885611af1565b905060006117f585611af1565b905060008681526001602090815260408083206001600160a01b038b168452909152812080548792906118299084906128cb565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46115cd565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156119435760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161068d565b6001600160a01b03838116600081815260026020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b805161129f906003906020840190611d71565b6001600160a01b0384166119e95760405162461bcd60e51b815260040161068d906127a3565b3360006119f585611af1565b90506000611a0285611af1565b905060008681526001602090815260408083206001600160a01b038c16845290915290205485811015611a475760405162461bcd60e51b815260040161068d906127e8565b60008781526001602090815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611a869084906128cb565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611ae6848a8a8a8a8a611b3c565b505050505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611b2b57611b2b6129de565b602090810291909101015292915050565b6001600160a01b0384163b156117ae5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611b8090899089908890889088906004016126c2565b602060405180830381600087803b158015611b9a57600080fd5b505af1925050508015611bca575060408051601f3d908101601f19168201909252611bc79181019061224c565b60015b611c7757611bd6612a0a565b806308c379a01415611c105750611beb612a26565b80611bf65750611c12565b8060405162461bcd60e51b815260040161068d9190612748565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161068d565b6001600160e01b0319811663f23a6e6160e01b146115cd5760405162461bcd60e51b815260040161068d9061275b565b6001600160a01b0384163b156117ae5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611ceb9089908990889088908890600401612664565b602060405180830381600087803b158015611d0557600080fd5b505af1925050508015611d35575060408051601f3d908101601f19168201909252611d329181019061224c565b60015b611d4157611bd6612a0a565b6001600160e01b0319811663bc197c8160e01b146115cd5760405162461bcd60e51b815260040161068d9061275b565b828054611d7d90612924565b90600052602060002090601f016020900481019282611d9f5760008555611de5565b82601f10611db857805160ff1916838001178555611de5565b82800160010185558215611de5579182015b82811115611de5578251825591602001919060010190611dca565b50611df1929150611df5565b5090565b5b80821115611df15760008155600101611df6565b60006001600160401b03831115611e2357611e236129f4565b604051611e3a601f8501601f19166020018261295f565b809150838152848484011115611e4f57600080fd5b83836020830137600060208583010152509392505050565b600082601f830112611e7857600080fd5b81356020611e85826128a8565b604051611e92828261295f565b8381528281019150858301600585901b87018401881015611eb257600080fd5b60005b85811015611ed157813584529284019290840190600101611eb5565b5090979650505050505050565b80358015158114611eee57600080fd5b919050565b60008083601f840112611f0557600080fd5b5081356001600160401b03811115611f1c57600080fd5b602083019150836020828501011115611f3457600080fd5b9250929050565b600082601f830112611f4c57600080fd5b611f5b83833560208501611e0a565b9392505050565b803561ffff81168114611eee57600080fd5b600060208284031215611f8657600080fd5b8135611f5b81612aaf565b600060208284031215611fa357600080fd5b8151611f5b81612aaf565b60008060408385031215611fc157600080fd5b8235611fcc81612aaf565b91506020830135611fdc81612aaf565b809150509250929050565b600080600080600060a08688031215611fff57600080fd5b853561200a81612aaf565b9450602086013561201a81612aaf565b935060408601356001600160401b038082111561203657600080fd5b61204289838a01611e67565b9450606088013591508082111561205857600080fd5b61206489838a01611e67565b9350608088013591508082111561207a57600080fd5b5061208788828901611f3b565b9150509295509295909350565b600080600080600060a086880312156120ac57600080fd5b85356120b781612aaf565b945060208601356120c781612aaf565b9350604086013592506060860135915060808601356001600160401b038111156120f057600080fd5b61208788828901611f3b565b6000806040838503121561210f57600080fd5b823561211a81612aaf565b915061212860208401611ede565b90509250929050565b6000806040838503121561214457600080fd5b823561214f81612aaf565b946020939093013593505050565b6000806040838503121561217057600080fd5b82356001600160401b038082111561218757600080fd5b818501915085601f83011261219b57600080fd5b813560206121a8826128a8565b6040516121b5828261295f565b8381528281019150858301600585901b870184018b10156121d557600080fd5b600096505b848710156122015780356121ed81612aaf565b8352600196909601959183019183016121da565b509650508601359250508082111561221857600080fd5b5061222585828601611e67565b9150509250929050565b60006020828403121561224157600080fd5b8135611f5b81612ac4565b60006020828403121561225e57600080fd5b8151611f5b81612ac4565b60006020828403121561227b57600080fd5b81356001600160401b0381111561229157600080fd5b8201601f810184136122a257600080fd5b6122b184823560208401611e0a565b949350505050565b6000602082840312156122cb57600080fd5b5035919050565b600080600080606085870312156122e857600080fd5b8435935060208501356001600160401b038082111561230657600080fd5b818701915087601f83011261231a57600080fd5b81358181111561232957600080fd5b8860208260051b850101111561233e57600080fd5b60208301955080945050505061235660408601611ede565b905092959194509250565b60008060008060008060006080888a03121561237c57600080fd5b8735965060208801356001600160401b038082111561239a57600080fd5b6123a68b838c01611ef3565b909850965060408a01359150808211156123bf57600080fd5b6123cb8b838c01611ef3565b909650945060608a01359150808211156123e457600080fd5b506123f18a828b01611ef3565b989b979a50959850939692959293505050565b60008060008060008060008060008060008060e08d8f03121561242657600080fd5b8c359b5061243660208e01611f62565b9a506001600160401b0360408e0135111561245057600080fd5b6124608e60408f01358f01611ef3565b909a5098506001600160401b0360608e0135111561247d57600080fd5b61248d8e60608f01358f01611ef3565b90985096506001600160401b0360808e013511156124aa57600080fd5b6124ba8e60808f01358f01611ef3565b90965094506001600160401b0360a08e013511156124d757600080fd5b6124e78e60a08f01358f01611ef3565b90945092506001600160401b0360c08e0135111561250457600080fd5b6125148e60c08f01358f01611ef3565b81935080925050509295989b509295989b509295989b565b6000806040838503121561253f57600080fd5b50508035926020909101359150565b6000806000806080858703121561256457600080fd5b843593506020850135925060408501359150606085013561258481612aaf565b939692955090935050565b600080600080600060a086880312156125a757600080fd5b8535945060208601359350604086013592506060860135915060808601356125ce81612aaf565b809150509295509295909350565b600081518084526020808501945080840160005b8381101561260c578151875295820195908201906001016125f0565b509495945050505050565b6000815180845260005b8181101561263d57602081850181015186830182015201612621565b8181111561264f576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0386811682528516602082015260a060408201819052600090612690908301866125dc565b82810360608401526126a281866125dc565b905082810360808401526126b68185612617565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906126fc90830184612617565b979650505050505050565b602081526000611f5b60208301846125dc565b60408152600061272d60408301856125dc565b828103602084015261273f81856125dc565b95945050505050565b602081526000611f5b6020830184612617565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60006001600160401b038211156128c1576128c16129f4565b5060051b60200190565b600082198211156128de576128de6129c8565b500190565b60008261290057634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561291f5761291f6129c8565b500290565b600181811c9082168061293857607f821691505b6020821081141561295957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b0381118282101715612984576129846129f4565b6040525050565b600061ffff808316818114156129a3576129a36129c8565b6001019392505050565b60006000198214156129c1576129c16129c8565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115612a235760046000803e5060005160e01c5b90565b600060443d1015612a345790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715612a6357505050505090565b8285019150815181811115612a7b5750505050505090565b843d8701016020828501011115612a955750505050505090565b612aa46020828601018761295f565b509095945050505050565b6001600160a01b03811681146113d857600080fd5b6001600160e01b0319811681146113d857600080fdfea2646970667358221220b924a1def829fc8ada63fc052a4a626dc364e41ba911dea5d347f91e3e8e800164736f6c63430008070033

Deployed Bytecode Sourcemap

42584:5583:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45404:1974;;;;;;:::i;:::-;;:::i;26226:231::-;;;;;;;;;;-1:-1:-1;26226:231:0;;;;;:::i;:::-;;:::i;:::-;;;26638:25:1;;;26626:2;26611:18;26226:231:0;;;;;;;;25249:310;;;;;;;;;;-1:-1:-1;25249:310:0;;;;;:::i;:::-;;:::i;:::-;;;16372:14:1;;16365:22;16347:41;;16335:2;16320:18;25249:310:0;16207:187:1;25970:105:0;;;;;;;;;;-1:-1:-1;25970:105:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;28165:442::-;;;;;;;;;;-1:-1:-1;28165:442:0;;;;;:::i;:::-;;:::i;47658:254::-;;;;;;;;;;-1:-1:-1;47658:254:0;;;;;:::i;:::-;;:::i;43049:38::-;;;;;;;;;;-1:-1:-1;43049:38:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43049:38:0;;;-1:-1:-1;;;43049:38:0;;;;;;;;;;27240:25:1;;;27296:2;27281:18;;27274:34;;;;27324:18;;;27317:34;;;;27382:2;27367:18;;27360:34;;;;27425:3;27410:19;;27403:35;-1:-1:-1;;;;;27475:32:1;27495:3;27454:19;;27447:61;27557:6;27545:19;27539:3;27524:19;;27517:48;27227:3;27212:19;43049:38:0;26927:644:1;43664:154:0;;;;;;;;;;-1:-1:-1;43664:154:0;;;;;:::i;:::-;;:::i;43094:26::-;;;;;;;;;;;;;;;;26623:524;;;;;;;;;;-1:-1:-1;26623:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;43990:816::-;;;;;;;;;;-1:-1:-1;43990:816:0;;;;;:::i;:::-;;:::i;47920:244::-;;;;;;;;;;-1:-1:-1;47920:244:0;;;;;:::i;:::-;;:::i;20506:103::-;;;;;;;;;;;;;:::i;43127:26::-;;;;;;;;;;;;;;;;47525:125;;;;;;;;;;-1:-1:-1;47525:125:0;;;;;:::i;:::-;47587:7;47611:21;;;:6;:21;;;;;:31;;;;47525:125;19855:87;;;;;;;;;;-1:-1:-1;19901:7:0;19928:6;-1:-1:-1;;;;;19928:6:0;19855:87;;;-1:-1:-1;;;;;14031:32:1;;;14013:51;;14001:2;13986:18;19855:87:0;13867:203:1;43160:45:0;;;;;;;;;;-1:-1:-1;43160:45:0;;;;-1:-1:-1;;;;;43160:45:0;;;43294:38;;;;;;;;;;;;;;;;27220:155;;;;;;;;;;-1:-1:-1;27220:155:0;;;;;:::i;:::-;;:::i;43826:156::-;;;;;;;;;;-1:-1:-1;43826:156:0;;;;;:::i;:::-;;:::i;47386:131::-;;;;;;;;;;-1:-1:-1;47386:131:0;;;;;:::i;:::-;47450:7;47474:21;;;:6;:21;;;;;:35;;;;47386:131;44814:416;;;;;;;;;;-1:-1:-1;44814:416:0;;;;;:::i;:::-;;:::i;43565:91::-;;;;;;;;;;-1:-1:-1;43565:91:0;;;;;:::i;:::-;;:::i;43241:46::-;;;;;;;;;;-1:-1:-1;43241:46:0;;;;-1:-1:-1;;;;;43241:46:0;;;45238:158;;;;;;;;;;-1:-1:-1;45238:158:0;;;;;:::i;:::-;45324:4;45345:21;;;:6;:21;;;;;;;;:43;;;:29;;;;:43;;;;;;;;45238:158;27447:168;;;;;;;;;;-1:-1:-1;27447:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;27570:27:0;;;27546:4;27570:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;27447:168;27687:401;;;;;;;;;;-1:-1:-1;27687:401:0;;;;;:::i;:::-;;:::i;20764:201::-;;;;;;;;;;-1:-1:-1;20764:201:0;;;;;:::i;:::-;;:::i;45404:1974::-;23135:1;23733:7;;:19;;23725:63;;;;-1:-1:-1;;;23725:63:0;;26141:2:1;23725:63:0;;;26123:21:1;26180:2;26160:18;;;26153:30;26219:33;26199:18;;;26192:61;26270:18;;23725:63:0;;;;;;;;;23135:1;23866:7;:18;45643:10:::1;45657:9;45643:23;45635:39;;;;-1:-1:-1::0;;;45635:39:0::1;;;;;;18474:2:1::0;18456:21;;;18513:1;18493:18;;;18486:29;-1:-1:-1;;;18546:2:1;18531:18;;18524:34;18590:2;18575:18;;18272:327;45635:39:0::1;45704:21;::::0;;;:6:::1;:21;::::0;;;;:27;:48:::1;::::0;45732:13;;45704:48:::1;:::i;:::-;45691:9;:61;45683:85;;;::::0;-1:-1:-1;;;45683:85:0;;19557:2:1;45683:85:0::1;::::0;::::1;19539:21:1::0;19596:2;19576:18;;;19569:30;-1:-1:-1;;;19615:18:1;;;19608:41;19666:18;;45683:85:0::1;19355:335:1::0;45683:85:0::1;45845:21;::::0;;;:6:::1;:21;::::0;;;;:31:::1;::::0;::::1;::::0;45785:35:::1;::::0;;::::1;::::0;:56:::1;::::0;45821:13;;45785:56:::1;:::i;:::-;:91;;45777:112;;;::::0;-1:-1:-1;;;45777:112:0;;23497:2:1;45777:112:0::1;::::0;::::1;23479:21:1::0;23536:1;23516:18;;;23509:29;-1:-1:-1;;;23554:18:1;;;23547:38;23602:18;;45777:112:0::1;23295:331:1::0;45777:112:0::1;45906:24:::0;45898:42:::1;;;::::0;-1:-1:-1;;;45898:42:0;;22136:2:1;45898:42:0::1;::::0;::::1;22118:21:1::0;22175:1;22155:18;;;22148:29;-1:-1:-1;;;22193:18:1;;;22186:35;22238:18;;45898:42:0::1;21934:328:1::0;45898:42:0::1;45980:1;45957:24:::0;::::1;45949:42;;;::::0;-1:-1:-1;;;45949:42:0;;24587:2:1;45949:42:0::1;::::0;::::1;24569:21:1::0;24626:1;24606:18;;;24599:29;-1:-1:-1;;;24644:18:1;;;24637:35;24689:18;;45949:42:0::1;24385:328:1::0;45949:42:0::1;46004:7;46000:792;;46134:16;::::0;46099:21:::1;::::0;;;:6:::1;:21;::::0;;;;:32:::1;;::::0;:51:::1;::::0;46134:16;46099:51:::1;:::i;:::-;46085:12;:65;46077:90;;;::::0;-1:-1:-1;;;46077:90:0;;18806:2:1;46077:90:0::1;::::0;::::1;18788:21:1::0;18845:2;18825:18;;;18818:30;-1:-1:-1;;;18864:18:1;;;18857:42;18916:18;;46077:90:0::1;18604:336:1::0;46077:90:0::1;46000:792;;;46241:21;::::0;;;:6:::1;:21;::::0;;;;:32:::1;;::::0;46226:12:::1;:47;46218:72;;;::::0;-1:-1:-1;;;46218:72:0;;20559:2:1;46218:72:0::1;::::0;::::1;20541:21:1::0;20598:2;20578:18;;;20571:30;-1:-1:-1;;;20617:18:1;;;20610:42;20669:18;;46218:72:0::1;20357:336:1::0;46218:72:0::1;46301:6;46360:423;46368:22:::0;;::::1;46360:423;;;46528:18;::::0;46577:10:::1;::::0;-1:-1:-1;;;;;46528:18:0::1;46516:39;46556:13:::0;;46570:1;46556:16;;::::1;;;;;:::i;:::-;;;;;;;46516:57;;;;;;;;;;;;;26638:25:1::0;;26626:2;26611:18;;26492:177;46516:57:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46516:71:0::1;;46508:93;;;::::0;-1:-1:-1;;;46508:93:0;;22469:2:1;46508:93:0::1;::::0;::::1;22451:21:1::0;22508:1;22488:18;;;22481:29;-1:-1:-1;;;22526:18:1;;;22519:39;22575:18;;46508:93:0::1;22267:332:1::0;46508:93:0::1;46624:21;::::0;;;:6:::1;:21;::::0;;;;:29:::1;;::::0;46654:13;;46668:1;46654:16;;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;46624:47:::0;;-1:-1:-1;46624:47:0;::::1;::::0;;;;;;-1:-1:-1;46624:47:0;;::::1;;:56;46616:84;;;::::0;-1:-1:-1;;;46616:84:0;;23833:2:1;46616:84:0::1;::::0;::::1;23815:21:1::0;23872:2;23852:18;;;23845:30;-1:-1:-1;;;23891:18:1;;;23884:45;23946:18;;46616:84:0::1;23631:339:1::0;46616:84:0::1;46715:21;::::0;;;:6:::1;:21;::::0;;;;46765:4:::1;::::0;46715:29:::1;::::0;;::::1;::::0;46745:13;;46759:1;46745:16;;::::1;;;;;:::i;:::-;;;;;;;46715:47;;;;;;;;;;;;:54;;;;;;;;;;;;;;;;;;46391:3;;;;;:::i;:::-;;;;46360:423;;;46180:612;46000:792;46902:21;::::0;;;:6:::1;:21;::::0;;;;:35:::1;;:57:::0;;46939:13;;46902:21;:57:::1;::::0;46939:13;;46902:57:::1;:::i;:::-;::::0;;;-1:-1:-1;;46968:55:0::1;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;46968:55:0;;::::1;::::0;46974:10:::1;::::0;46985:13;;46999;;46968:5:::1;:55::i;:::-;47035:9;:13:::0;47032:339:::1;;47131:18;::::0;47060:9:::1;::::0;47080:17:::1;::::0;-1:-1:-1;;;;;47131:18:0::1;47164:24;47186:2;47164:21;:24;:::i;:::-;47123:71;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;47108:86:0;;-1:-1:-1;47108:86:0;-1:-1:-1;47108:86:0;47205:20:::1;;;::::0;-1:-1:-1;;;47205:20:0;;19897:2:1;47205:20:0::1;::::0;::::1;19879:21:1::0;19936:1;19916:18;;;19909:29;-1:-1:-1;;;19954:18:1;;;19947:33;19997:18;;47205:20:0::1;19695:326:1::0;47205:20:0::1;47259:21;::::0;;;:6:::1;:21;::::0;;;;;;;:29;;::::1;::::0;47251:79;;-1:-1:-1;;;;;47259:29:0;;::::1;::::0;47303:21:::1;::::0;47251:79;;47259:21;47251:79;47303:21;47259:29;47251:79:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;47236:94:0;;-1:-1:-1;47236:94:0;-1:-1:-1;47236:94:0;47341:20:::1;;;::::0;-1:-1:-1;;;47341:20:0;;19897:2:1;47341:20:0::1;::::0;::::1;19879:21:1::0;19936:1;19916:18;;;19909:29;-1:-1:-1;;;19954:18:1;;;19947:33;19997:18;;47341:20:0::1;19695:326:1::0;47341:20:0::1;47049:322;;47032:339;-1:-1:-1::0;;23091:1:0;24045:7;:22;-1:-1:-1;;45404:1974:0:o;26226:231::-;26312:7;-1:-1:-1;;;;;26340:21:0;;26332:77;;;;-1:-1:-1;;;26332:77:0;;17655:2:1;26332:77:0;;;17637:21:1;17694:2;17674:18;;;17667:30;17733:34;17713:18;;;17706:62;-1:-1:-1;;;17784:18:1;;;17777:41;17835:19;;26332:77:0;17453:407:1;26332:77:0;-1:-1:-1;26427:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;26427:22:0;;;;;;;;;;;;26226:231::o;25249:310::-;25351:4;-1:-1:-1;;;;;;25388:41:0;;-1:-1:-1;;;25388:41:0;;:110;;-1:-1:-1;;;;;;;25446:52:0;;-1:-1:-1;;;25446:52:0;25388:110;:163;;;-1:-1:-1;;;;;;;;;;10394:40:0;;;25515:36;25368:183;25249:310;-1:-1:-1;;25249:310:0:o;25970:105::-;26030:13;26063:4;26056:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25970:105;;;:::o;28165:442::-;-1:-1:-1;;;;;28398:20:0;;18659:10;28398:20;;:60;;-1:-1:-1;28422:36:0;28439:4;18659:10;27447:168;:::i;28422:36::-;28376:160;;;;-1:-1:-1;;;28376:160:0;;21306:2:1;28376:160:0;;;21288:21:1;21345:2;21325:18;;;21318:30;21384:34;21364:18;;;21357:62;-1:-1:-1;;;21435:18:1;;;21428:48;21493:19;;28376:160:0;21104:414:1;28376:160:0;28547:52;28570:4;28576:2;28580:3;28585:7;28594:4;28547:22;:52::i;:::-;28165:442;;;;;:::o;47658:254::-;47840:7;:9;;;:7;:9;;;:::i;:::-;;;;-1:-1:-1;;47896:7:0;;47863:41;;26473:6:1;26461:19;;26443:38;;47872:13:0;;47863:41;;26431:2:1;26416:18;47863:41:0;;;;;;;47658:254;;;;;;;;;;;;:::o;43664:154::-;19901:7;19928:6;-1:-1:-1;;;;;19928:6:0;18659:10;20075:23;20067:68;;;;-1:-1:-1;;;20067:68:0;;;;;;;:::i;:::-;43741:17:::1;::::0;-1:-1:-1;;;;;43741:17:0::1;:31:::0;43733:46:::1;;;::::0;-1:-1:-1;;;43733:46:0;;20228:2:1;43733:46:0::1;::::0;::::1;20210:21:1::0;20267:1;20247:18;;;20240:29;-1:-1:-1;;;20285:18:1;;;20278:33;20328:18;;43733:46:0::1;20026:326:1::0;43733:46:0::1;43788:17;:22:::0;;-1:-1:-1;;;;;;43788:22:0::1;-1:-1:-1::0;;;;;43788:22:0;;;::::1;::::0;;;::::1;::::0;;43664:154::o;26623:524::-;26779:16;26840:3;:10;26821:8;:15;:29;26813:83;;;;-1:-1:-1;;;26813:83:0;;24920:2:1;26813:83:0;;;24902:21:1;24959:2;24939:18;;;24932:30;24998:34;24978:18;;;24971:62;-1:-1:-1;;;25049:18:1;;;25042:39;25098:19;;26813:83:0;24718:405:1;26813:83:0;26909:30;26956:8;:15;-1:-1:-1;;;;;26942:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26942:30:0;;26909:63;;26990:9;26985:122;27009:8;:15;27005:1;:19;26985:122;;;27065:30;27075:8;27084:1;27075:11;;;;;;;;:::i;:::-;;;;;;;27088:3;27092:1;27088:6;;;;;;;;:::i;:::-;;;;;;;27065:9;:30::i;:::-;27046:13;27060:1;27046:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;27026:3;;;:::i;:::-;;;26985:122;;;-1:-1:-1;27126:13:0;26623:524;-1:-1:-1;;;26623:524:0:o;43990:816::-;44124:7;19928:6;;-1:-1:-1;;;;;19928:6:0;18659:10;20075:23;20067:68;;;;-1:-1:-1;;;20067:68:0;;;;;;;:::i;:::-;44246:12:::1;44233:10;:25;44225:40;;;::::0;-1:-1:-1;;;44225:40:0;;23167:2:1;44225:40:0::1;::::0;::::1;23149:21:1::0;23206:1;23186:18;;;23179:29;-1:-1:-1;;;23224:18:1;;;23217:32;23266:18;;44225:40:0::1;22965:325:1::0;44225:40:0::1;44274:7;:9:::0;;;:7:::1;:9;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;44299:7:0::1;::::0;;44292:15:::1;::::0;;;:6:::1;:15;::::0;;;;;;;:29;;;44337:7;;44330:15;;;;;:26:::1;;:39:::0;;;44385:7;;44378:15;;;;;:24:::1;;:35:::0;;;44429:7;;44422:15;;;;;:25:::1;;:37:::0;;;44475:7;;44468:15;;;;;:23;;::::1;:33:::0;;-1:-1:-1;;;;;44468:33:0;::::1;-1:-1:-1::0;;;;;;44468:33:0;;::::1;;::::0;;44615:7;;44608:15;;;44640:3:::1;44608:29;::::0;;::::1;:35:::0;44652:27:::1;44658:7;19901::::0;19928:6;-1:-1:-1;;;;;19928:6:0;;19855:87;44658:7:::1;44666;;44674:1;44652:27;;;;;;;;;;;::::0;:5:::1;:27::i;:::-;44700:17;::::0;44718:7:::1;::::0;44688:47:::1;::::0;;::::1;::::0;::::1;::::0;;;44700:17:::1;44688:47:::0;;::::1;::::0;-1:-1:-1;;;;;44700:17:0::1;::::0;44718:7;44727:3:::1;::::0;44688:11:::1;:47::i;:::-;44744:30;44750:7;44759;;44768:2;44744:30;;;;;;;;;;;::::0;:5:::1;:30::i;:::-;-1:-1:-1::0;44790:7:0::1;::::0;43990:816;;;;;;;:::o;47920:244::-;19901:7;19928:6;-1:-1:-1;;;;;19928:6:0;18659:10;20075:23;20067:68;;;;-1:-1:-1;;;20067:68:0;;;;;;;:::i;:::-;48055:21:::1;::::0;;;:6:::1;:21;::::0;;;;;;;:29:::1;:31:::0;;-1:-1:-1;;;48055:31:0;::::1;;;::::0;:29:::1;:31;::::0;::::1;:::i;:::-;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;;;::::0;;;-1:-1:-1;48126:21:0;;;:6:::1;:21;::::0;;;;;;;;:29;;::::1;::::0;48100:56;;-1:-1:-1;;;48126:29:0;;::::1;::::0;;::::1;26443:38:1::0;;48126:21:0;;-1:-1:-1;48100:56:0::1;::::0;26416:18:1;48100:56:0::1;;;;;;;47920:244:::0;;;;;;;:::o;20506:103::-;19901:7;19928:6;-1:-1:-1;;;;;19928:6:0;18659:10;20075:23;20067:68;;;;-1:-1:-1;;;20067:68:0;;;;;;;:::i;:::-;20571:30:::1;20598:1;20571:18;:30::i;:::-;20506:103::o:0;27220:155::-;27315:52;18659:10;27348:8;27358;27315:18;:52::i;:::-;27220:155;;:::o;43826:156::-;19901:7;19928:6;-1:-1:-1;;;;;19928:6:0;18659:10;20075:23;20067:68;;;;-1:-1:-1;;;20067:68:0;;;;;;;:::i;:::-;43903:18:::1;::::0;-1:-1:-1;;;;;43903:18:0::1;:32:::0;43895:47:::1;;;::::0;-1:-1:-1;;;43895:47:0;;20228:2:1;43895:47:0::1;::::0;::::1;20210:21:1::0;20267:1;20247:18;;;20240:29;-1:-1:-1;;;20285:18:1;;;20278:33;20328:18;;43895:47:0::1;20026:326:1::0;43895:47:0::1;43951:18;:23:::0;;-1:-1:-1;;;;;;43951:23:0::1;-1:-1:-1::0;;;;;43951:23:0;;;::::1;::::0;;;::::1;::::0;;43826:156::o;44814:416::-;19901:7;19928:6;-1:-1:-1;;;;;19928:6:0;18659:10;20075:23;20067:68;;;;-1:-1:-1;;;20067:68:0;;;;;;;:::i;:::-;45085:21:::1;::::0;;;:6:::1;:21;::::0;;;;;;;:32:::1;::::0;::::1;:45:::0;;;;45139:30:::1;::::0;;::::1;:41:::0;;;;45196:7:::1;::::0;45189:15;;;;;;:23;;::::1;:33:::0;;-1:-1:-1;;;;;;45189:33:0::1;-1:-1:-1::0;;;;;45189:33:0;;::::1;::::0;;;::::1;::::0;;44814:416::o;43565:91::-;19901:7;19928:6;-1:-1:-1;;;;;19928:6:0;18659:10;20075:23;20067:68;;;;-1:-1:-1;;;20067:68:0;;;;;;;:::i;:::-;43633:15:::1;43641:6;43633:7;:15::i;:::-;43565:91:::0;:::o;27687:401::-;-1:-1:-1;;;;;27895:20:0;;18659:10;27895:20;;:60;;-1:-1:-1;27919:36:0;27936:4;18659:10;27447:168;:::i;27919:36::-;27873:151;;;;-1:-1:-1;;;27873:151:0;;19147:2:1;27873:151:0;;;19129:21:1;19186:2;19166:18;;;19159:30;19225:34;19205:18;;;19198:62;-1:-1:-1;;;19276:18:1;;;19269:39;19325:19;;27873:151:0;18945:405:1;27873:151:0;28035:45;28053:4;28059:2;28063;28067:6;28075:4;28035:17;:45::i;20764:201::-;19901:7;19928:6;-1:-1:-1;;;;;19928:6:0;18659:10;20075:23;20067:68;;;;-1:-1:-1;;;20067:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20853:22:0;::::1;20845:73;;;::::0;-1:-1:-1;;;20845:73:0;;18067:2:1;20845:73:0::1;::::0;::::1;18049:21:1::0;18106:2;18086:18;;;18079:30;18145:34;18125:18;;;18118:62;-1:-1:-1;;;18196:18:1;;;18189:36;18242:19;;20845:73:0::1;17865:402:1::0;20845:73:0::1;20929:28;20948:8;20929:18;:28::i;33845:729::-:0;-1:-1:-1;;;;;33998:16:0;;33990:62;;;;-1:-1:-1;;;33990:62:0;;;;;;;:::i;:::-;18659:10;34065:16;34130:21;34148:2;34130:17;:21::i;:::-;34107:44;;34162:24;34189:25;34207:6;34189:17;:25::i;:::-;34162:52;;34306:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;34306:17:0;;;;;;;;;:27;;34327:6;;34306:13;:27;;34327:6;;34306:27;:::i;:::-;;;;-1:-1:-1;;34349:52:0;;;26848:25:1;;;26904:2;26889:18;;26882:34;;;-1:-1:-1;;;;;34349:52:0;;;;34382:1;;34349:52;;;;;;26821:18:1;34349:52:0;;;;;;;34492:74;34523:8;34541:1;34545:2;34549;34553:6;34561:4;34492:30;:74::i;:::-;33979:595;;;33845:729;;;;:::o;30403:1146::-;30630:7;:14;30616:3;:10;:28;30608:81;;;;-1:-1:-1;;;30608:81:0;;25330:2:1;30608:81:0;;;25312:21:1;25369:2;25349:18;;;25342:30;25408:34;25388:18;;;25381:62;-1:-1:-1;;;25459:18:1;;;25452:38;25507:19;;30608:81:0;25128:404:1;30608:81:0;-1:-1:-1;;;;;30708:16:0;;30700:66;;;;-1:-1:-1;;;30700:66:0;;;;;;;:::i;:::-;18659:10;30779:16;30896:421;30920:3;:10;30916:1;:14;30896:421;;;30952:10;30965:3;30969:1;30965:6;;;;;;;;:::i;:::-;;;;;;;30952:19;;30986:14;31003:7;31011:1;31003:10;;;;;;;;:::i;:::-;;;;;;;;;;;;31030:19;31052:13;;;:9;:13;;;;;;-1:-1:-1;;;;;31052:19:0;;;;;;;;;;;;31003:10;;-1:-1:-1;31094:21:0;;;;31086:76;;;;-1:-1:-1;;;31086:76:0;;;;;;;:::i;:::-;31206:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;31206:19:0;;;;;;;;;;31228:20;;;31206:42;;31278:17;;;;;;;:27;;31228:20;;31206:13;31278:27;;31228:20;;31278:27;:::i;:::-;;;;;;;;30937:380;;;30932:3;;;;:::i;:::-;;;30896:421;;;;31364:2;-1:-1:-1;;;;;31334:47:0;31358:4;-1:-1:-1;;;;;31334:47:0;31348:8;-1:-1:-1;;;;;31334:47:0;;31368:3;31373:7;31334:47;;;;;;;:::i;:::-;;;;;;;;31466:75;31502:8;31512:4;31518:2;31522:3;31527:7;31536:4;31466:35;:75::i;:::-;30597:952;30403:1146;;;;;:::o;32811:648::-;-1:-1:-1;;;;;32970:16:0;;32962:62;;;;-1:-1:-1;;;32962:62:0;;;;;;;:::i;:::-;18659:10;33037:16;33102:21;33120:2;33102:17;:21::i;:::-;33079:44;;33134:24;33161:25;33179:6;33161:17;:25::i;:::-;33134:52;;33278:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;33278:17:0;;;;;;;;;:27;;33299:6;;33278:13;:27;;33299:6;;33278:27;:::i;:::-;;;;-1:-1:-1;;33321:52:0;;;26848:25:1;;;26904:2;26889:18;;26882:34;;;-1:-1:-1;;;;;33321:52:0;;;;33354:1;;33321:52;;;;;;26821:18:1;33321:52:0;;;;;;;33386:65;30403:1146;21125:191;21199:16;21218:6;;-1:-1:-1;;;;;21235:17:0;;;-1:-1:-1;;;;;;21235:17:0;;;;;;21268:40;;21218:6;;;;;;;21268:40;;21199:16;21268:40;21188:128;21125:191;:::o;38115:331::-;38270:8;-1:-1:-1;;;;;38261:17:0;:5;-1:-1:-1;;;;;38261:17:0;;;38253:71;;;;-1:-1:-1;;;38253:71:0;;24177:2:1;38253:71:0;;;24159:21:1;24216:2;24196:18;;;24189:30;24255:34;24235:18;;;24228:62;-1:-1:-1;;;24306:18:1;;;24299:39;24355:19;;38253:71:0;23975:405:1;38253:71:0;-1:-1:-1;;;;;38335:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;38335:46:0;;;;;;;;;;38397:41;;16347::1;;;38397::0;;16320:18:1;38397:41:0;;;;;;;38115:331;;;:::o;32393:88::-;32460:13;;;;:4;;:13;;;;;:::i;29071:974::-;-1:-1:-1;;;;;29259:16:0;;29251:66;;;;-1:-1:-1;;;29251:66:0;;;;;;;:::i;:::-;18659:10;29330:16;29395:21;29413:2;29395:17;:21::i;:::-;29372:44;;29427:24;29454:25;29472:6;29454:17;:25::i;:::-;29427:52;;29565:19;29587:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;29587:19:0;;;;;;;;;;29625:21;;;;29617:76;;;;-1:-1:-1;;;29617:76:0;;;;;;;:::i;:::-;29729:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;29729:19:0;;;;;;;;;;29751:20;;;29729:42;;29793:17;;;;;;;:27;;29751:20;;29729:13;29793:27;;29751:20;;29793:27;:::i;:::-;;;;-1:-1:-1;;29838:46:0;;;26848:25:1;;;26904:2;26889:18;;26882:34;;;-1:-1:-1;;;;;29838:46:0;;;;;;;;;;;;;;26821:18:1;29838:46:0;;;;;;;29969:68;30000:8;30010:4;30016:2;30020;30024:6;30032:4;29969:30;:68::i;:::-;29240:805;;;;29071:974;;;;;:::o;42379:198::-;42499:16;;;42513:1;42499:16;;;;;;;;;42445;;42474:22;;42499:16;;;;;;;;;;;;-1:-1:-1;42499:16:0;42474:41;;42537:7;42526:5;42532:1;42526:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;42564:5;42379:198;-1:-1:-1;;42379:198:0:o;40806:744::-;-1:-1:-1;;;;;41021:13:0;;1528:19;:23;41017:526;;41057:72;;-1:-1:-1;;;41057:72:0;;-1:-1:-1;;;;;41057:38:0;;;;;:72;;41096:8;;41106:4;;41112:2;;41116:6;;41124:4;;41057:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41057:72:0;;;;;;;;-1:-1:-1;;41057:72:0;;;;;;;;;;;;:::i;:::-;;;41053:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;41405:6;41398:14;;-1:-1:-1;;;41398:14:0;;;;;;;;:::i;41053:479::-;;;41454:62;;-1:-1:-1;;;41454:62:0;;16825:2:1;41454:62:0;;;16807:21:1;16864:2;16844:18;;;16837:30;16903:34;16883:18;;;16876:62;-1:-1:-1;;;16954:18:1;;;16947:50;17014:19;;41454:62:0;16623:416:1;41053:479:0;-1:-1:-1;;;;;;41179:55:0;;-1:-1:-1;;;41179:55:0;41175:154;;41259:50;;-1:-1:-1;;;41259:50:0;;;;;;;:::i;41558:813::-;-1:-1:-1;;;;;41798:13:0;;1528:19;:23;41794:570;;41834:79;;-1:-1:-1;;;41834:79:0;;-1:-1:-1;;;;;41834:43:0;;;;;:79;;41878:8;;41888:4;;41894:3;;41899:7;;41908:4;;41834:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41834:79:0;;;;;;;;-1:-1:-1;;41834:79:0;;;;;;;;;;;;:::i;:::-;;;41830:523;;;;:::i;:::-;-1:-1:-1;;;;;;41995:60:0;;-1:-1:-1;;;41995:60:0;41991:159;;42080:50;;-1:-1:-1;;;42080:50:0;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:468:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;134:18;;:::i;:::-;183:2;177:9;195:69;252:2;231:15;;-1:-1:-1;;227:29:1;258:4;223:40;177:9;195:69;:::i;:::-;282:6;273:15;;312:6;304;297:22;352:3;343:6;338:3;334:16;331:25;328:45;;;369:1;366;359:12;328:45;419:6;414:3;407:4;399:6;395:17;382:44;474:1;467:4;458:6;450;446:19;442:30;435:41;;14:468;;;;;:::o;487:735::-;541:5;594:3;587:4;579:6;575:17;571:27;561:55;;612:1;609;602:12;561:55;648:6;635:20;674:4;697:43;737:2;697:43;:::i;:::-;769:2;763:9;781:31;809:2;801:6;781:31;:::i;:::-;847:18;;;881:15;;;;-1:-1:-1;916:15:1;;;966:1;962:10;;;950:23;;946:32;;943:41;-1:-1:-1;940:61:1;;;997:1;994;987:12;940:61;1019:1;1029:163;1043:2;1040:1;1037:9;1029:163;;;1100:17;;1088:30;;1138:12;;;;1170;;;;1061:1;1054:9;1029:163;;;-1:-1:-1;1210:6:1;;487:735;-1:-1:-1;;;;;;;487:735:1:o;1227:160::-;1292:20;;1348:13;;1341:21;1331:32;;1321:60;;1377:1;1374;1367:12;1321:60;1227:160;;;:::o;1392:347::-;1443:8;1453:6;1507:3;1500:4;1492:6;1488:17;1484:27;1474:55;;1525:1;1522;1515:12;1474:55;-1:-1:-1;1548:20:1;;-1:-1:-1;;;;;1580:30:1;;1577:50;;;1623:1;1620;1613:12;1577:50;1660:4;1652:6;1648:17;1636:29;;1712:3;1705:4;1696:6;1688;1684:19;1680:30;1677:39;1674:59;;;1729:1;1726;1719:12;1674:59;1392:347;;;;;:::o;1744:220::-;1786:5;1839:3;1832:4;1824:6;1820:17;1816:27;1806:55;;1857:1;1854;1847:12;1806:55;1879:79;1954:3;1945:6;1932:20;1925:4;1917:6;1913:17;1879:79;:::i;:::-;1870:88;1744:220;-1:-1:-1;;;1744:220:1:o;1969:159::-;2036:20;;2096:6;2085:18;;2075:29;;2065:57;;2118:1;2115;2108:12;2133:247;2192:6;2245:2;2233:9;2224:7;2220:23;2216:32;2213:52;;;2261:1;2258;2251:12;2213:52;2300:9;2287:23;2319:31;2344:5;2319:31;:::i;2385:251::-;2455:6;2508:2;2496:9;2487:7;2483:23;2479:32;2476:52;;;2524:1;2521;2514:12;2476:52;2556:9;2550:16;2575:31;2600:5;2575:31;:::i;2641:388::-;2709:6;2717;2770:2;2758:9;2749:7;2745:23;2741:32;2738:52;;;2786:1;2783;2776:12;2738:52;2825:9;2812:23;2844:31;2869:5;2844:31;:::i;:::-;2894:5;-1:-1:-1;2951:2:1;2936:18;;2923:32;2964:33;2923:32;2964:33;:::i;:::-;3016:7;3006:17;;;2641:388;;;;;:::o;3034:1071::-;3188:6;3196;3204;3212;3220;3273:3;3261:9;3252:7;3248:23;3244:33;3241:53;;;3290:1;3287;3280:12;3241:53;3329:9;3316:23;3348:31;3373:5;3348:31;:::i;:::-;3398:5;-1:-1:-1;3455:2:1;3440:18;;3427:32;3468:33;3427:32;3468:33;:::i;:::-;3520:7;-1:-1:-1;3578:2:1;3563:18;;3550:32;-1:-1:-1;;;;;3631:14:1;;;3628:34;;;3658:1;3655;3648:12;3628:34;3681:61;3734:7;3725:6;3714:9;3710:22;3681:61;:::i;:::-;3671:71;;3795:2;3784:9;3780:18;3767:32;3751:48;;3824:2;3814:8;3811:16;3808:36;;;3840:1;3837;3830:12;3808:36;3863:63;3918:7;3907:8;3896:9;3892:24;3863:63;:::i;:::-;3853:73;;3979:3;3968:9;3964:19;3951:33;3935:49;;4009:2;3999:8;3996:16;3993:36;;;4025:1;4022;4015:12;3993:36;;4048:51;4091:7;4080:8;4069:9;4065:24;4048:51;:::i;:::-;4038:61;;;3034:1071;;;;;;;;:::o;4110:734::-;4214:6;4222;4230;4238;4246;4299:3;4287:9;4278:7;4274:23;4270:33;4267:53;;;4316:1;4313;4306:12;4267:53;4355:9;4342:23;4374:31;4399:5;4374:31;:::i;:::-;4424:5;-1:-1:-1;4481:2:1;4466:18;;4453:32;4494:33;4453:32;4494:33;:::i;:::-;4546:7;-1:-1:-1;4600:2:1;4585:18;;4572:32;;-1:-1:-1;4651:2:1;4636:18;;4623:32;;-1:-1:-1;4706:3:1;4691:19;;4678:33;-1:-1:-1;;;;;4723:30:1;;4720:50;;;4766:1;4763;4756:12;4720:50;4789:49;4830:7;4821:6;4810:9;4806:22;4789:49;:::i;4849:315::-;4914:6;4922;4975:2;4963:9;4954:7;4950:23;4946:32;4943:52;;;4991:1;4988;4981:12;4943:52;5030:9;5017:23;5049:31;5074:5;5049:31;:::i;:::-;5099:5;-1:-1:-1;5123:35:1;5154:2;5139:18;;5123:35;:::i;:::-;5113:45;;4849:315;;;;;:::o;5169:::-;5237:6;5245;5298:2;5286:9;5277:7;5273:23;5269:32;5266:52;;;5314:1;5311;5304:12;5266:52;5353:9;5340:23;5372:31;5397:5;5372:31;:::i;:::-;5422:5;5474:2;5459:18;;;;5446:32;;-1:-1:-1;;;5169:315:1:o;5489:1288::-;5607:6;5615;5668:2;5656:9;5647:7;5643:23;5639:32;5636:52;;;5684:1;5681;5674:12;5636:52;5724:9;5711:23;-1:-1:-1;;;;;5794:2:1;5786:6;5783:14;5780:34;;;5810:1;5807;5800:12;5780:34;5848:6;5837:9;5833:22;5823:32;;5893:7;5886:4;5882:2;5878:13;5874:27;5864:55;;5915:1;5912;5905:12;5864:55;5951:2;5938:16;5973:4;5996:43;6036:2;5996:43;:::i;:::-;6068:2;6062:9;6080:31;6108:2;6100:6;6080:31;:::i;:::-;6146:18;;;6180:15;;;;-1:-1:-1;6215:11:1;;;6257:1;6253:10;;;6245:19;;6241:28;;6238:41;-1:-1:-1;6235:61:1;;;6292:1;6289;6282:12;6235:61;6314:1;6305:10;;6324:238;6338:2;6335:1;6332:9;6324:238;;;6409:3;6396:17;6426:31;6451:5;6426:31;:::i;:::-;6470:18;;6356:1;6349:9;;;;;6508:12;;;;6540;;6324:238;;;-1:-1:-1;6581:6:1;-1:-1:-1;;6625:18:1;;6612:32;;-1:-1:-1;;6656:16:1;;;6653:36;;;6685:1;6682;6675:12;6653:36;;6708:63;6763:7;6752:8;6741:9;6737:24;6708:63;:::i;:::-;6698:73;;;5489:1288;;;;;:::o;6782:245::-;6840:6;6893:2;6881:9;6872:7;6868:23;6864:32;6861:52;;;6909:1;6906;6899:12;6861:52;6948:9;6935:23;6967:30;6991:5;6967:30;:::i;7032:249::-;7101:6;7154:2;7142:9;7133:7;7129:23;7125:32;7122:52;;;7170:1;7167;7160:12;7122:52;7202:9;7196:16;7221:30;7245:5;7221:30;:::i;7286:450::-;7355:6;7408:2;7396:9;7387:7;7383:23;7379:32;7376:52;;;7424:1;7421;7414:12;7376:52;7464:9;7451:23;-1:-1:-1;;;;;7489:6:1;7486:30;7483:50;;;7529:1;7526;7519:12;7483:50;7552:22;;7605:4;7597:13;;7593:27;-1:-1:-1;7583:55:1;;7634:1;7631;7624:12;7583:55;7657:73;7722:7;7717:2;7704:16;7699:2;7695;7691:11;7657:73;:::i;:::-;7647:83;7286:450;-1:-1:-1;;;;7286:450:1:o;7741:180::-;7800:6;7853:2;7841:9;7832:7;7828:23;7824:32;7821:52;;;7869:1;7866;7859:12;7821:52;-1:-1:-1;7892:23:1;;7741:180;-1:-1:-1;7741:180:1:o;7926:751::-;8027:6;8035;8043;8051;8104:2;8092:9;8083:7;8079:23;8075:32;8072:52;;;8120:1;8117;8110:12;8072:52;8156:9;8143:23;8133:33;;8217:2;8206:9;8202:18;8189:32;-1:-1:-1;;;;;8281:2:1;8273:6;8270:14;8267:34;;;8297:1;8294;8287:12;8267:34;8335:6;8324:9;8320:22;8310:32;;8380:7;8373:4;8369:2;8365:13;8361:27;8351:55;;8402:1;8399;8392:12;8351:55;8442:2;8429:16;8468:2;8460:6;8457:14;8454:34;;;8484:1;8481;8474:12;8454:34;8537:7;8532:2;8522:6;8519:1;8515:14;8511:2;8507:23;8503:32;8500:45;8497:65;;;8558:1;8555;8548:12;8497:65;8589:2;8585;8581:11;8571:21;;8611:6;8601:16;;;;;8636:35;8667:2;8656:9;8652:18;8636:35;:::i;:::-;8626:45;;7926:751;;;;;;;:::o;8682:1075::-;8803:6;8811;8819;8827;8835;8843;8851;8904:3;8892:9;8883:7;8879:23;8875:33;8872:53;;;8921:1;8918;8911:12;8872:53;8957:9;8944:23;8934:33;;9018:2;9007:9;9003:18;8990:32;-1:-1:-1;;;;;9082:2:1;9074:6;9071:14;9068:34;;;9098:1;9095;9088:12;9068:34;9137:58;9187:7;9178:6;9167:9;9163:22;9137:58;:::i;:::-;9214:8;;-1:-1:-1;9111:84:1;-1:-1:-1;9302:2:1;9287:18;;9274:32;;-1:-1:-1;9318:16:1;;;9315:36;;;9347:1;9344;9337:12;9315:36;9386:60;9438:7;9427:8;9416:9;9412:24;9386:60;:::i;:::-;9465:8;;-1:-1:-1;9360:86:1;-1:-1:-1;9553:2:1;9538:18;;9525:32;;-1:-1:-1;9569:16:1;;;9566:36;;;9598:1;9595;9588:12;9566:36;;9637:60;9689:7;9678:8;9667:9;9663:24;9637:60;:::i;:::-;8682:1075;;;;-1:-1:-1;8682:1075:1;;-1:-1:-1;8682:1075:1;;;;9611:86;;-1:-1:-1;;;8682:1075:1:o;9762:1738::-;9930:6;9938;9946;9954;9962;9970;9978;9986;9994;10002;10010:7;10019;10073:3;10061:9;10052:7;10048:23;10044:33;10041:53;;;10090:1;10087;10080:12;10041:53;10126:9;10113:23;10103:33;;10155:37;10188:2;10177:9;10173:18;10155:37;:::i;:::-;10145:47;;-1:-1:-1;;;;;10235:2:1;10224:9;10220:18;10207:32;10204:56;10201:76;;;10273:1;10270;10263:12;10201:76;10312:84;10388:7;10381:2;10370:9;10366:18;10353:32;10342:9;10338:48;10312:84;:::i;:::-;10415:8;;-1:-1:-1;10442:8:1;-1:-1:-1;;;;;;10493:2:1;10478:18;;10465:32;10462:56;10459:76;;;10531:1;10528;10521:12;10459:76;10570:84;10646:7;10639:2;10628:9;10624:18;10611:32;10600:9;10596:48;10570:84;:::i;:::-;10673:8;;-1:-1:-1;10700:8:1;-1:-1:-1;;;;;;10751:3:1;10736:19;;10723:33;10720:57;10717:77;;;10790:1;10787;10780:12;10717:77;10829:85;10906:7;10898:3;10887:9;10883:19;10870:33;10859:9;10855:49;10829:85;:::i;:::-;10933:8;;-1:-1:-1;10960:8:1;-1:-1:-1;;;;;;11011:3:1;10996:19;;10983:33;10980:57;10977:77;;;11050:1;11047;11040:12;10977:77;11089:85;11166:7;11158:3;11147:9;11143:19;11130:33;11119:9;11115:49;11089:85;:::i;:::-;11193:8;;-1:-1:-1;11220:8:1;-1:-1:-1;;;;;;11271:3:1;11256:19;;11243:33;11240:57;11237:77;;;11310:1;11307;11300:12;11237:77;11351:85;11428:7;11420:3;11409:9;11405:19;11392:33;11381:9;11377:49;11351:85;:::i;:::-;11456:9;11445:20;;11485:9;11474:20;;;;9762:1738;;;;;;;;;;;;;;:::o;11505:248::-;11573:6;11581;11634:2;11622:9;11613:7;11609:23;11605:32;11602:52;;;11650:1;11647;11640:12;11602:52;-1:-1:-1;;11673:23:1;;;11743:2;11728:18;;;11715:32;;-1:-1:-1;11505:248:1:o;11758:452::-;11844:6;11852;11860;11868;11921:3;11909:9;11900:7;11896:23;11892:33;11889:53;;;11938:1;11935;11928:12;11889:53;11974:9;11961:23;11951:33;;12031:2;12020:9;12016:18;12003:32;11993:42;;12082:2;12071:9;12067:18;12054:32;12044:42;;12136:2;12125:9;12121:18;12108:32;12149:31;12174:5;12149:31;:::i;:::-;11758:452;;;;-1:-1:-1;11758:452:1;;-1:-1:-1;;11758:452:1:o;12215:521::-;12310:6;12318;12326;12334;12342;12395:3;12383:9;12374:7;12370:23;12366:33;12363:53;;;12412:1;12409;12402:12;12363:53;12448:9;12435:23;12425:33;;12505:2;12494:9;12490:18;12477:32;12467:42;;12556:2;12545:9;12541:18;12528:32;12518:42;;12607:2;12596:9;12592:18;12579:32;12569:42;;12661:3;12650:9;12646:19;12633:33;12675:31;12700:5;12675:31;:::i;:::-;12725:5;12715:15;;;12215:521;;;;;;;;:::o;12741:435::-;12794:3;12832:5;12826:12;12859:6;12854:3;12847:19;12885:4;12914:2;12909:3;12905:12;12898:19;;12951:2;12944:5;12940:14;12972:1;12982:169;12996:6;12993:1;12990:13;12982:169;;;13057:13;;13045:26;;13091:12;;;;13126:15;;;;13018:1;13011:9;12982:169;;;-1:-1:-1;13167:3:1;;12741:435;-1:-1:-1;;;;;12741:435:1:o;13181:471::-;13222:3;13260:5;13254:12;13287:6;13282:3;13275:19;13312:1;13322:162;13336:6;13333:1;13330:13;13322:162;;;13398:4;13454:13;;;13450:22;;13444:29;13426:11;;;13422:20;;13415:59;13351:12;13322:162;;;13502:6;13499:1;13496:13;13493:87;;;13568:1;13561:4;13552:6;13547:3;13543:16;13539:27;13532:38;13493:87;-1:-1:-1;13634:2:1;13613:15;-1:-1:-1;;13609:29:1;13600:39;;;;13641:4;13596:50;;13181:471;-1:-1:-1;;13181:471:1:o;14075:826::-;-1:-1:-1;;;;;14472:15:1;;;14454:34;;14524:15;;14519:2;14504:18;;14497:43;14434:3;14571:2;14556:18;;14549:31;;;14397:4;;14603:57;;14640:19;;14632:6;14603:57;:::i;:::-;14708:9;14700:6;14696:22;14691:2;14680:9;14676:18;14669:50;14742:44;14779:6;14771;14742:44;:::i;:::-;14728:58;;14835:9;14827:6;14823:22;14817:3;14806:9;14802:19;14795:51;14863:32;14888:6;14880;14863:32;:::i;:::-;14855:40;14075:826;-1:-1:-1;;;;;;;;14075:826:1:o;14906:560::-;-1:-1:-1;;;;;15203:15:1;;;15185:34;;15255:15;;15250:2;15235:18;;15228:43;15302:2;15287:18;;15280:34;;;15345:2;15330:18;;15323:34;;;15165:3;15388;15373:19;;15366:32;;;15128:4;;15415:45;;15440:19;;15432:6;15415:45;:::i;:::-;15407:53;14906:560;-1:-1:-1;;;;;;;14906:560:1:o;15471:261::-;15650:2;15639:9;15632:21;15613:4;15670:56;15722:2;15711:9;15707:18;15699:6;15670:56;:::i;15737:465::-;15994:2;15983:9;15976:21;15957:4;16020:56;16072:2;16061:9;16057:18;16049:6;16020:56;:::i;:::-;16124:9;16116:6;16112:22;16107:2;16096:9;16092:18;16085:50;16152:44;16189:6;16181;16152:44;:::i;:::-;16144:52;15737:465;-1:-1:-1;;;;;15737:465:1:o;16399:219::-;16548:2;16537:9;16530:21;16511:4;16568:44;16608:2;16597:9;16593:18;16585:6;16568:44;:::i;17044:404::-;17246:2;17228:21;;;17285:2;17265:18;;;17258:30;17324:34;17319:2;17304:18;;17297:62;-1:-1:-1;;;17390:2:1;17375:18;;17368:38;17438:3;17423:19;;17044:404::o;20698:401::-;20900:2;20882:21;;;20939:2;20919:18;;;20912:30;20978:34;20973:2;20958:18;;20951:62;-1:-1:-1;;;21044:2:1;21029:18;;21022:35;21089:3;21074:19;;20698:401::o;21523:406::-;21725:2;21707:21;;;21764:2;21744:18;;;21737:30;21803:34;21798:2;21783:18;;21776:62;-1:-1:-1;;;21869:2:1;21854:18;;21847:40;21919:3;21904:19;;21523:406::o;22604:356::-;22806:2;22788:21;;;22825:18;;;22818:30;22884:34;22879:2;22864:18;;22857:62;22951:2;22936:18;;22604:356::o;25537:397::-;25739:2;25721:21;;;25778:2;25758:18;;;25751:30;25817:34;25812:2;25797:18;;25790:62;-1:-1:-1;;;25883:2:1;25868:18;;25861:31;25924:3;25909:19;;25537:397::o;27576:183::-;27636:4;-1:-1:-1;;;;;27661:6:1;27658:30;27655:56;;;27691:18;;:::i;:::-;-1:-1:-1;27736:1:1;27732:14;27748:4;27728:25;;27576:183::o;27764:128::-;27804:3;27835:1;27831:6;27828:1;27825:13;27822:39;;;27841:18;;:::i;:::-;-1:-1:-1;27877:9:1;;27764:128::o;27897:217::-;27937:1;27963;27953:132;;28007:10;28002:3;27998:20;27995:1;27988:31;28042:4;28039:1;28032:15;28070:4;28067:1;28060:15;27953:132;-1:-1:-1;28099:9:1;;27897:217::o;28119:168::-;28159:7;28225:1;28221;28217:6;28213:14;28210:1;28207:21;28202:1;28195:9;28188:17;28184:45;28181:71;;;28232:18;;:::i;:::-;-1:-1:-1;28272:9:1;;28119:168::o;28292:380::-;28371:1;28367:12;;;;28414;;;28435:61;;28489:4;28481:6;28477:17;28467:27;;28435:61;28542:2;28534:6;28531:14;28511:18;28508:38;28505:161;;;28588:10;28583:3;28579:20;28576:1;28569:31;28623:4;28620:1;28613:15;28651:4;28648:1;28641:15;28505:161;;28292:380;;;:::o;28677:249::-;28787:2;28768:13;;-1:-1:-1;;28764:27:1;28752:40;;-1:-1:-1;;;;;28807:34:1;;28843:22;;;28804:62;28801:88;;;28869:18;;:::i;:::-;28905:2;28898:22;-1:-1:-1;;28677:249:1:o;28931:197::-;28969:3;28997:6;29038:2;29031:5;29027:14;29065:2;29056:7;29053:15;29050:41;;;29071:18;;:::i;:::-;29120:1;29107:15;;28931:197;-1:-1:-1;;;28931:197:1:o;29133:135::-;29172:3;-1:-1:-1;;29193:17:1;;29190:43;;;29213:18;;:::i;:::-;-1:-1:-1;29260:1:1;29249:13;;29133:135::o;29273:127::-;29334:10;29329:3;29325:20;29322:1;29315:31;29365:4;29362:1;29355:15;29389:4;29386:1;29379:15;29405:127;29466:10;29461:3;29457:20;29454:1;29447:31;29497:4;29494:1;29487:15;29521:4;29518:1;29511:15;29537:127;29598:10;29593:3;29589:20;29586:1;29579:31;29629:4;29626:1;29619:15;29653:4;29650:1;29643:15;29669:179;29704:3;29746:1;29728:16;29725:23;29722:120;;;29792:1;29789;29786;29771:23;-1:-1:-1;29829:1:1;29823:8;29818:3;29814:18;29722:120;29669:179;:::o;29853:671::-;29892:3;29934:4;29916:16;29913:26;29910:39;;;29853:671;:::o;29910:39::-;29976:2;29970:9;-1:-1:-1;;30041:16:1;30037:25;;30034:1;29970:9;30013:50;30092:4;30086:11;30116:16;-1:-1:-1;;;;;30222:2:1;30215:4;30207:6;30203:17;30200:25;30195:2;30187:6;30184:14;30181:45;30178:58;;;30229:5;;;;;29853:671;:::o;30178:58::-;30266:6;30260:4;30256:17;30245:28;;30302:3;30296:10;30329:2;30321:6;30318:14;30315:27;;;30335:5;;;;;;29853:671;:::o;30315:27::-;30419:2;30400:16;30394:4;30390:27;30386:36;30379:4;30370:6;30365:3;30361:16;30357:27;30354:69;30351:82;;;30426:5;;;;;;29853:671;:::o;30351:82::-;30442:57;30493:4;30484:6;30476;30472:19;30468:30;30462:4;30442:57;:::i;:::-;-1:-1:-1;30515:3:1;;29853:671;-1:-1:-1;;;;;29853:671:1:o;30529:131::-;-1:-1:-1;;;;;30604:31:1;;30594:42;;30584:70;;30650:1;30647;30640:12;30665:131;-1:-1:-1;;;;;;30739:32:1;;30729:43;;30719:71;;30786:1;30783;30776:12

Swarm Source

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