ETH Price: $3,239.24 (+2.72%)
Gas: 3 Gwei

Token

Koizumi (KOIZUMI)
 

Overview

Max Total Supply

75 KOIZUMI

Holders

75

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 KOIZUMI
0xcbe0f27f3519f3e46908cf8dc5ffeb9ac81d49ec
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:
KoizumiNFT

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-04-11
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

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);
            }
        }
    }
}

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

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

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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);
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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);
}

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

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

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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

interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

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

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

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

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

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

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

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

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

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

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

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

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

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

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

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

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

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

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

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


contract KoizumiNFT is ERC721Enumerable, Ownable {

    uint256 internal supply = 2222;
    uint256 internal pointer = 0;

    /// @dev Base uri of the NFT metadata
    string internal baseUri;

    address internal koiz;

    modifier onlyOperator() {
        require(owner() == _msgSender() || koiz == _msgSender(), "Ownable: caller is not the operator");
        _;
    }

    constructor() ERC721("Koizumi", "KOIZUMI") {}

    receive() external payable {

    }

    function setKoiz(address _koiz) external onlyOwner {
        koiz = _koiz;
    }

    function setSupply(uint256 _supply) external onlyOwner {
        supply = _supply;
    }
   
    function mint(address to) external onlyOperator {
        if (supply == 0) {
            return;
        }
        if (balanceOf(to) > 0) {
            return;
        }
        _safeMint(to, pointer);
        pointer ++;
    }

    function cancel() external onlyOperator {
        supply = supply - 1;
    }

    function sendETH() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function sendToken(address token, address from, address to, uint256 amount) external onlyOwner {
        IERC20(token).transferFrom(from, to, amount);
    }

    function setBaseURI(string memory uri) external onlyOwner {
        baseUri = uri;
    }

    function _baseURI() internal view override returns (string memory) {
        return baseUri;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sendETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sendToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_koiz","type":"address"}],"name":"setKoiz","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"setSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526108ae600b556000600c553480156200001c57600080fd5b50604051806040016040528060078152602001664b6f697a756d6960c81b815250604051806040016040528060078152602001664b4f495a554d4960c81b81525081600090816200006e91906200019b565b5060016200007d82826200019b565b5050506200009a62000094620000a060201b60201c565b620000a4565b62000267565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200012157607f821691505b6020821081036200014257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200019657600081815260208120601f850160051c81016020861015620001715750805b601f850160051c820191505b8181101562000192578281556001016200017d565b5050505b505050565b81516001600160401b03811115620001b757620001b7620000f6565b620001cf81620001c884546200010c565b8462000148565b602080601f831160018114620002075760008415620001ee5750858301515b600019600386901b1c1916600185901b17855562000192565b600085815260208120601f198616915b82811015620002385788860151825594840194600190910190840162000217565b5085821015620002575787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6120a080620002776000396000f3fe6080604052600436106101855760003560e01c80636352211e116100d1578063a22cb4651161008a578063df717bd011610064578063df717bd01461045e578063e985e9c51461047e578063ea8a1af0146104c7578063f2fde38b146104dc57600080fd5b8063a22cb465146103fe578063b88d4fde1461041e578063c87b56dd1461043e57600080fd5b80636352211e146103565780636a6278421461037657806370a0823114610396578063715018a6146103b65780638da5cb5b146103cb57806395d89b41146103e957600080fd5b806323b872dd1161013e5780633c8c6a1e116101185780633c8c6a1e146102d657806342842e0e146102f65780634f6ccce71461031657806355f804b31461033657600080fd5b806323b872dd146102765780632f745c59146102965780633b4c4b25146102b657600080fd5b806301ffc9a71461019157806306fdde03146101c6578063081812fc146101e8578063095ea7b31461022057806318160ddd146102425780631d16d9a01461026157600080fd5b3661018c57005b600080fd5b34801561019d57600080fd5b506101b16101ac36600461192f565b6104fc565b60405190151581526020015b60405180910390f35b3480156101d257600080fd5b506101db610527565b6040516101bd919061199c565b3480156101f457600080fd5b506102086102033660046119af565b6105b9565b6040516001600160a01b0390911681526020016101bd565b34801561022c57600080fd5b5061024061023b3660046119e4565b610653565b005b34801561024e57600080fd5b506008545b6040519081526020016101bd565b34801561026d57600080fd5b50610240610768565b34801561028257600080fd5b50610240610291366004611a0e565b6107c1565b3480156102a257600080fd5b506102536102b13660046119e4565b6107f2565b3480156102c257600080fd5b506102406102d13660046119af565b610888565b3480156102e257600080fd5b506102406102f1366004611a4a565b6108b7565b34801561030257600080fd5b50610240610311366004611a0e565b610963565b34801561032257600080fd5b506102536103313660046119af565b61097e565b34801561034257600080fd5b50610240610351366004611b21565b610a11565b34801561036257600080fd5b506102086103713660046119af565b610a4b565b34801561038257600080fd5b50610240610391366004611b6a565b610ac2565b3480156103a257600080fd5b506102536103b1366004611b6a565b610b3d565b3480156103c257600080fd5b50610240610bc4565b3480156103d757600080fd5b50600a546001600160a01b0316610208565b3480156103f557600080fd5b506101db610bfa565b34801561040a57600080fd5b50610240610419366004611b93565b610c09565b34801561042a57600080fd5b50610240610439366004611bca565b610c14565b34801561044a57600080fd5b506101db6104593660046119af565b610c4c565b34801561046a57600080fd5b50610240610479366004611b6a565b610d44565b34801561048a57600080fd5b506101b1610499366004611c46565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156104d357600080fd5b50610240610d90565b3480156104e857600080fd5b506102406104f7366004611b6a565b610dde565b60006001600160e01b0319821663780e9d6360e01b1480610521575061052182610e76565b92915050565b60606000805461053690611c79565b80601f016020809104026020016040519081016040528092919081815260200182805461056290611c79565b80156105af5780601f10610584576101008083540402835291602001916105af565b820191906000526020600020905b81548152906001019060200180831161059257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166106375760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061065e82610a4b565b9050806001600160a01b0316836001600160a01b0316036106cb5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161062e565b336001600160a01b03821614806106e757506106e78133610499565b6107595760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161062e565b6107638383610ec6565b505050565b600a546001600160a01b031633146107925760405162461bcd60e51b815260040161062e90611cb3565b60405133904780156108fc02916000818181858888f193505050501580156107be573d6000803e3d6000fd5b50565b6107cb3382610f34565b6107e75760405162461bcd60e51b815260040161062e90611ce8565b61076383838361102b565b60006107fd83610b3d565b821061085f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161062e565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b031633146108b25760405162461bcd60e51b815260040161062e90611cb3565b600b55565b600a546001600160a01b031633146108e15760405162461bcd60e51b815260040161062e90611cb3565b6040516323b872dd60e01b81526001600160a01b0384811660048301528381166024830152604482018390528516906323b872dd906064016020604051808303816000875af1158015610938573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095c9190611d39565b5050505050565b61076383838360405180602001604052806000815250610c14565b600061098960085490565b82106109ec5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161062e565b600882815481106109ff576109ff611d56565b90600052602060002001549050919050565b600a546001600160a01b03163314610a3b5760405162461bcd60e51b815260040161062e90611cb3565b600d610a478282611dba565b5050565b6000818152600260205260408120546001600160a01b0316806105215760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161062e565b600a546001600160a01b0316331480610ae55750600e546001600160a01b031633145b610b015760405162461bcd60e51b815260040161062e90611e7a565b600b54156107be576000610b1482610b3d565b116107be57610b2581600c546111d2565b600c8054906000610b3583611ed3565b919050555050565b60006001600160a01b038216610ba85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161062e565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610bee5760405162461bcd60e51b815260040161062e90611cb3565b610bf860006111ec565b565b60606001805461053690611c79565b610a4733838361123e565b610c1e3383610f34565b610c3a5760405162461bcd60e51b815260040161062e90611ce8565b610c468484848461130c565b50505050565b6000818152600260205260409020546060906001600160a01b0316610ccb5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161062e565b6000610cd561133f565b90506000815111610cf55760405180602001604052806000815250610d3d565b80610cff8461134e565b604051602001610d0f9190611eec565b60408051601f1981840301815290829052610d2d9291602001611f15565b6040516020818303038152906040525b9392505050565b600a546001600160a01b03163314610d6e5760405162461bcd60e51b815260040161062e90611cb3565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b0316331480610db35750600e546001600160a01b031633145b610dcf5760405162461bcd60e51b815260040161062e90611e7a565b6001600b546108b29190611f44565b600a546001600160a01b03163314610e085760405162461bcd60e51b815260040161062e90611cb3565b6001600160a01b038116610e6d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161062e565b6107be816111ec565b60006001600160e01b031982166380ac58cd60e01b1480610ea757506001600160e01b03198216635b5e139f60e01b145b8061052157506301ffc9a760e01b6001600160e01b0319831614610521565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610efb82610a4b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316610fad5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161062e565b6000610fb883610a4b565b9050806001600160a01b0316846001600160a01b03161480610ff35750836001600160a01b0316610fe8846105b9565b6001600160a01b0316145b8061102357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661103e82610a4b565b6001600160a01b0316146110a25760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b606482015260840161062e565b6001600160a01b0382166111045760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161062e565b61110f83838361144f565b61111a600082610ec6565b6001600160a01b0383166000908152600360205260408120805460019290611143908490611f44565b90915550506001600160a01b0382166000908152600360205260408120805460019290611171908490611f57565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610a47828260405180602001604052806000815250611507565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03160361129f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161062e565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61131784848461102b565b6113238484848461153a565b610c465760405162461bcd60e51b815260040161062e90611f6a565b6060600d805461053690611c79565b6060816000036113755750506040805180820190915260018152600360fc1b602082015290565b8160005b811561139f578061138981611ed3565b91506113989050600a83611fd2565b9150611379565b60008167ffffffffffffffff8111156113ba576113ba611a95565b6040519080825280601f01601f1916602001820160405280156113e4576020820181803683370190505b5090505b8415611023576113f9600183611f44565b9150611406600a86611fe6565b611411906030611f57565b60f81b81838151811061142657611426611d56565b60200101906001600160f81b031916908160001a905350611448600a86611fd2565b94506113e8565b6001600160a01b0383166114aa576114a581600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6114cd565b816001600160a01b0316836001600160a01b0316146114cd576114cd838261163b565b6001600160a01b0382166114e457610763816116d8565b826001600160a01b0316826001600160a01b031614610763576107638282611787565b61151183836117cb565b61151e600084848461153a565b6107635760405162461bcd60e51b815260040161062e90611f6a565b60006001600160a01b0384163b1561163057604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061157e903390899088908890600401611ffa565b6020604051808303816000875af19250505080156115b9575060408051601f3d908101601f191682019092526115b691810190612037565b60015b611616573d8080156115e7576040519150601f19603f3d011682016040523d82523d6000602084013e6115ec565b606091505b50805160000361160e5760405162461bcd60e51b815260040161062e90611f6a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611023565b506001949350505050565b6000600161164884610b3d565b6116529190611f44565b6000838152600760205260409020549091508082146116a5576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906116ea90600190611f44565b6000838152600960205260408120546008805493945090928490811061171257611712611d56565b90600052602060002001549050806008838154811061173357611733611d56565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061176b5761176b612054565b6001900381819060005260206000200160009055905550505050565b600061179283610b3d565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166118215760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161062e565b6000818152600260205260409020546001600160a01b0316156118865760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161062e565b6118926000838361144f565b6001600160a01b03821660009081526003602052604081208054600192906118bb908490611f57565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b0319811681146107be57600080fd5b60006020828403121561194157600080fd5b8135610d3d81611919565b60005b8381101561196757818101518382015260200161194f565b50506000910152565b6000815180845261198881602086016020860161194c565b601f01601f19169290920160200192915050565b602081526000610d3d6020830184611970565b6000602082840312156119c157600080fd5b5035919050565b80356001600160a01b03811681146119df57600080fd5b919050565b600080604083850312156119f757600080fd5b611a00836119c8565b946020939093013593505050565b600080600060608486031215611a2357600080fd5b611a2c846119c8565b9250611a3a602085016119c8565b9150604084013590509250925092565b60008060008060808587031215611a6057600080fd5b611a69856119c8565b9350611a77602086016119c8565b9250611a85604086016119c8565b9396929550929360600135925050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611ac657611ac6611a95565b604051601f8501601f19908116603f01168101908282118183101715611aee57611aee611a95565b81604052809350858152868686011115611b0757600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611b3357600080fd5b813567ffffffffffffffff811115611b4a57600080fd5b8201601f81018413611b5b57600080fd5b61102384823560208401611aab565b600060208284031215611b7c57600080fd5b610d3d826119c8565b80151581146107be57600080fd5b60008060408385031215611ba657600080fd5b611baf836119c8565b91506020830135611bbf81611b85565b809150509250929050565b60008060008060808587031215611be057600080fd5b611be9856119c8565b9350611bf7602086016119c8565b925060408501359150606085013567ffffffffffffffff811115611c1a57600080fd5b8501601f81018713611c2b57600080fd5b611c3a87823560208401611aab565b91505092959194509250565b60008060408385031215611c5957600080fd5b611c62836119c8565b9150611c70602084016119c8565b90509250929050565b600181811c90821680611c8d57607f821691505b602082108103611cad57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600060208284031215611d4b57600080fd5b8151610d3d81611b85565b634e487b7160e01b600052603260045260246000fd5b601f82111561076357600081815260208120601f850160051c81016020861015611d935750805b601f850160051c820191505b81811015611db257828155600101611d9f565b505050505050565b815167ffffffffffffffff811115611dd457611dd4611a95565b611de881611de28454611c79565b84611d6c565b602080601f831160018114611e1d5760008415611e055750858301515b600019600386901b1c1916600185901b178555611db2565b600085815260208120601f198616915b82811015611e4c57888601518255948401946001909101908401611e2d565b5085821015611e6a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526023908201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f706572616040820152623a37b960e91b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600060018201611ee557611ee5611ebd565b5060010190565b60008251611efe81846020870161194c565b64173539b7b760d91b920191825250600501919050565b60008351611f2781846020880161194c565b835190830190611f3b81836020880161194c565b01949350505050565b8181038181111561052157610521611ebd565b8082018082111561052157610521611ebd565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082611fe157611fe1611fbc565b500490565b600082611ff557611ff5611fbc565b500690565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061202d90830184611970565b9695505050505050565b60006020828403121561204957600080fd5b8151610d3d81611919565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220c093850096177da386a1b1c9681d23a59c528db121f65d3bb6e001d6821c3de664736f6c63430008120033

Deployed Bytecode

0x6080604052600436106101855760003560e01c80636352211e116100d1578063a22cb4651161008a578063df717bd011610064578063df717bd01461045e578063e985e9c51461047e578063ea8a1af0146104c7578063f2fde38b146104dc57600080fd5b8063a22cb465146103fe578063b88d4fde1461041e578063c87b56dd1461043e57600080fd5b80636352211e146103565780636a6278421461037657806370a0823114610396578063715018a6146103b65780638da5cb5b146103cb57806395d89b41146103e957600080fd5b806323b872dd1161013e5780633c8c6a1e116101185780633c8c6a1e146102d657806342842e0e146102f65780634f6ccce71461031657806355f804b31461033657600080fd5b806323b872dd146102765780632f745c59146102965780633b4c4b25146102b657600080fd5b806301ffc9a71461019157806306fdde03146101c6578063081812fc146101e8578063095ea7b31461022057806318160ddd146102425780631d16d9a01461026157600080fd5b3661018c57005b600080fd5b34801561019d57600080fd5b506101b16101ac36600461192f565b6104fc565b60405190151581526020015b60405180910390f35b3480156101d257600080fd5b506101db610527565b6040516101bd919061199c565b3480156101f457600080fd5b506102086102033660046119af565b6105b9565b6040516001600160a01b0390911681526020016101bd565b34801561022c57600080fd5b5061024061023b3660046119e4565b610653565b005b34801561024e57600080fd5b506008545b6040519081526020016101bd565b34801561026d57600080fd5b50610240610768565b34801561028257600080fd5b50610240610291366004611a0e565b6107c1565b3480156102a257600080fd5b506102536102b13660046119e4565b6107f2565b3480156102c257600080fd5b506102406102d13660046119af565b610888565b3480156102e257600080fd5b506102406102f1366004611a4a565b6108b7565b34801561030257600080fd5b50610240610311366004611a0e565b610963565b34801561032257600080fd5b506102536103313660046119af565b61097e565b34801561034257600080fd5b50610240610351366004611b21565b610a11565b34801561036257600080fd5b506102086103713660046119af565b610a4b565b34801561038257600080fd5b50610240610391366004611b6a565b610ac2565b3480156103a257600080fd5b506102536103b1366004611b6a565b610b3d565b3480156103c257600080fd5b50610240610bc4565b3480156103d757600080fd5b50600a546001600160a01b0316610208565b3480156103f557600080fd5b506101db610bfa565b34801561040a57600080fd5b50610240610419366004611b93565b610c09565b34801561042a57600080fd5b50610240610439366004611bca565b610c14565b34801561044a57600080fd5b506101db6104593660046119af565b610c4c565b34801561046a57600080fd5b50610240610479366004611b6a565b610d44565b34801561048a57600080fd5b506101b1610499366004611c46565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156104d357600080fd5b50610240610d90565b3480156104e857600080fd5b506102406104f7366004611b6a565b610dde565b60006001600160e01b0319821663780e9d6360e01b1480610521575061052182610e76565b92915050565b60606000805461053690611c79565b80601f016020809104026020016040519081016040528092919081815260200182805461056290611c79565b80156105af5780601f10610584576101008083540402835291602001916105af565b820191906000526020600020905b81548152906001019060200180831161059257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166106375760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061065e82610a4b565b9050806001600160a01b0316836001600160a01b0316036106cb5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161062e565b336001600160a01b03821614806106e757506106e78133610499565b6107595760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161062e565b6107638383610ec6565b505050565b600a546001600160a01b031633146107925760405162461bcd60e51b815260040161062e90611cb3565b60405133904780156108fc02916000818181858888f193505050501580156107be573d6000803e3d6000fd5b50565b6107cb3382610f34565b6107e75760405162461bcd60e51b815260040161062e90611ce8565b61076383838361102b565b60006107fd83610b3d565b821061085f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161062e565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b031633146108b25760405162461bcd60e51b815260040161062e90611cb3565b600b55565b600a546001600160a01b031633146108e15760405162461bcd60e51b815260040161062e90611cb3565b6040516323b872dd60e01b81526001600160a01b0384811660048301528381166024830152604482018390528516906323b872dd906064016020604051808303816000875af1158015610938573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095c9190611d39565b5050505050565b61076383838360405180602001604052806000815250610c14565b600061098960085490565b82106109ec5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161062e565b600882815481106109ff576109ff611d56565b90600052602060002001549050919050565b600a546001600160a01b03163314610a3b5760405162461bcd60e51b815260040161062e90611cb3565b600d610a478282611dba565b5050565b6000818152600260205260408120546001600160a01b0316806105215760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161062e565b600a546001600160a01b0316331480610ae55750600e546001600160a01b031633145b610b015760405162461bcd60e51b815260040161062e90611e7a565b600b54156107be576000610b1482610b3d565b116107be57610b2581600c546111d2565b600c8054906000610b3583611ed3565b919050555050565b60006001600160a01b038216610ba85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161062e565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610bee5760405162461bcd60e51b815260040161062e90611cb3565b610bf860006111ec565b565b60606001805461053690611c79565b610a4733838361123e565b610c1e3383610f34565b610c3a5760405162461bcd60e51b815260040161062e90611ce8565b610c468484848461130c565b50505050565b6000818152600260205260409020546060906001600160a01b0316610ccb5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161062e565b6000610cd561133f565b90506000815111610cf55760405180602001604052806000815250610d3d565b80610cff8461134e565b604051602001610d0f9190611eec565b60408051601f1981840301815290829052610d2d9291602001611f15565b6040516020818303038152906040525b9392505050565b600a546001600160a01b03163314610d6e5760405162461bcd60e51b815260040161062e90611cb3565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b0316331480610db35750600e546001600160a01b031633145b610dcf5760405162461bcd60e51b815260040161062e90611e7a565b6001600b546108b29190611f44565b600a546001600160a01b03163314610e085760405162461bcd60e51b815260040161062e90611cb3565b6001600160a01b038116610e6d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161062e565b6107be816111ec565b60006001600160e01b031982166380ac58cd60e01b1480610ea757506001600160e01b03198216635b5e139f60e01b145b8061052157506301ffc9a760e01b6001600160e01b0319831614610521565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610efb82610a4b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316610fad5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161062e565b6000610fb883610a4b565b9050806001600160a01b0316846001600160a01b03161480610ff35750836001600160a01b0316610fe8846105b9565b6001600160a01b0316145b8061102357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661103e82610a4b565b6001600160a01b0316146110a25760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b606482015260840161062e565b6001600160a01b0382166111045760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161062e565b61110f83838361144f565b61111a600082610ec6565b6001600160a01b0383166000908152600360205260408120805460019290611143908490611f44565b90915550506001600160a01b0382166000908152600360205260408120805460019290611171908490611f57565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610a47828260405180602001604052806000815250611507565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03160361129f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161062e565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61131784848461102b565b6113238484848461153a565b610c465760405162461bcd60e51b815260040161062e90611f6a565b6060600d805461053690611c79565b6060816000036113755750506040805180820190915260018152600360fc1b602082015290565b8160005b811561139f578061138981611ed3565b91506113989050600a83611fd2565b9150611379565b60008167ffffffffffffffff8111156113ba576113ba611a95565b6040519080825280601f01601f1916602001820160405280156113e4576020820181803683370190505b5090505b8415611023576113f9600183611f44565b9150611406600a86611fe6565b611411906030611f57565b60f81b81838151811061142657611426611d56565b60200101906001600160f81b031916908160001a905350611448600a86611fd2565b94506113e8565b6001600160a01b0383166114aa576114a581600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6114cd565b816001600160a01b0316836001600160a01b0316146114cd576114cd838261163b565b6001600160a01b0382166114e457610763816116d8565b826001600160a01b0316826001600160a01b031614610763576107638282611787565b61151183836117cb565b61151e600084848461153a565b6107635760405162461bcd60e51b815260040161062e90611f6a565b60006001600160a01b0384163b1561163057604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061157e903390899088908890600401611ffa565b6020604051808303816000875af19250505080156115b9575060408051601f3d908101601f191682019092526115b691810190612037565b60015b611616573d8080156115e7576040519150601f19603f3d011682016040523d82523d6000602084013e6115ec565b606091505b50805160000361160e5760405162461bcd60e51b815260040161062e90611f6a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611023565b506001949350505050565b6000600161164884610b3d565b6116529190611f44565b6000838152600760205260409020549091508082146116a5576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906116ea90600190611f44565b6000838152600960205260408120546008805493945090928490811061171257611712611d56565b90600052602060002001549050806008838154811061173357611733611d56565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061176b5761176b612054565b6001900381819060005260206000200160009055905550505050565b600061179283610b3d565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166118215760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161062e565b6000818152600260205260409020546001600160a01b0316156118865760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161062e565b6118926000838361144f565b6001600160a01b03821660009081526003602052604081208054600192906118bb908490611f57565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b0319811681146107be57600080fd5b60006020828403121561194157600080fd5b8135610d3d81611919565b60005b8381101561196757818101518382015260200161194f565b50506000910152565b6000815180845261198881602086016020860161194c565b601f01601f19169290920160200192915050565b602081526000610d3d6020830184611970565b6000602082840312156119c157600080fd5b5035919050565b80356001600160a01b03811681146119df57600080fd5b919050565b600080604083850312156119f757600080fd5b611a00836119c8565b946020939093013593505050565b600080600060608486031215611a2357600080fd5b611a2c846119c8565b9250611a3a602085016119c8565b9150604084013590509250925092565b60008060008060808587031215611a6057600080fd5b611a69856119c8565b9350611a77602086016119c8565b9250611a85604086016119c8565b9396929550929360600135925050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611ac657611ac6611a95565b604051601f8501601f19908116603f01168101908282118183101715611aee57611aee611a95565b81604052809350858152868686011115611b0757600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611b3357600080fd5b813567ffffffffffffffff811115611b4a57600080fd5b8201601f81018413611b5b57600080fd5b61102384823560208401611aab565b600060208284031215611b7c57600080fd5b610d3d826119c8565b80151581146107be57600080fd5b60008060408385031215611ba657600080fd5b611baf836119c8565b91506020830135611bbf81611b85565b809150509250929050565b60008060008060808587031215611be057600080fd5b611be9856119c8565b9350611bf7602086016119c8565b925060408501359150606085013567ffffffffffffffff811115611c1a57600080fd5b8501601f81018713611c2b57600080fd5b611c3a87823560208401611aab565b91505092959194509250565b60008060408385031215611c5957600080fd5b611c62836119c8565b9150611c70602084016119c8565b90509250929050565b600181811c90821680611c8d57607f821691505b602082108103611cad57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600060208284031215611d4b57600080fd5b8151610d3d81611b85565b634e487b7160e01b600052603260045260246000fd5b601f82111561076357600081815260208120601f850160051c81016020861015611d935750805b601f850160051c820191505b81811015611db257828155600101611d9f565b505050505050565b815167ffffffffffffffff811115611dd457611dd4611a95565b611de881611de28454611c79565b84611d6c565b602080601f831160018114611e1d5760008415611e055750858301515b600019600386901b1c1916600185901b178555611db2565b600085815260208120601f198616915b82811015611e4c57888601518255948401946001909101908401611e2d565b5085821015611e6a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526023908201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f706572616040820152623a37b960e91b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600060018201611ee557611ee5611ebd565b5060010190565b60008251611efe81846020870161194c565b64173539b7b760d91b920191825250600501919050565b60008351611f2781846020880161194c565b835190830190611f3b81836020880161194c565b01949350505050565b8181038181111561052157610521611ebd565b8082018082111561052157610521611ebd565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082611fe157611fe1611fbc565b500490565b600082611ff557611ff5611fbc565b500690565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061202d90830184611970565b9695505050505050565b60006020828403121561204957600080fd5b8151610d3d81611919565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220c093850096177da386a1b1c9681d23a59c528db121f65d3bb6e001d6821c3de664736f6c63430008120033

Deployed Bytecode Sourcemap

41242:1497:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35092:224;;;;;;;;;;-1:-1:-1;35092:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;35092:224:0;;;;;;;;21563:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23146:221::-;;;;;;;;;;-1:-1:-1;23146:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;23146:221:0;1533:203:1;22669:411:0;;;;;;;;;;-1:-1:-1;22669:411:0;;;;;:::i;:::-;;:::i;:::-;;35732:113;;;;;;;;;;-1:-1:-1;35820:10:0;:17;35732:113;;;2324:25:1;;;2312:2;2297:18;35732:113:0;2178:177:1;42256:108:0;;;;;;;;;;;;;:::i;23896:339::-;;;;;;;;;;-1:-1:-1;23896:339:0;;;;;:::i;:::-;;:::i;35400:256::-;;;;;;;;;;-1:-1:-1;35400:256:0;;;;;:::i;:::-;;:::i;41825:90::-;;;;;;;;;;-1:-1:-1;41825:90:0;;;;;:::i;:::-;;:::i;42372:158::-;;;;;;;;;;-1:-1:-1;42372:158:0;;;;;:::i;:::-;;:::i;24306:185::-;;;;;;;;;;-1:-1:-1;24306:185:0;;;;;:::i;:::-;;:::i;35922:233::-;;;;;;;;;;-1:-1:-1;35922:233:0;;;;;:::i;:::-;;:::i;42538:90::-;;;;;;;;;;-1:-1:-1;42538:90:0;;;;;:::i;:::-;;:::i;21257:239::-;;;;;;;;;;-1:-1:-1;21257:239:0;;;;;:::i;:::-;;:::i;41926:236::-;;;;;;;;;;-1:-1:-1;41926:236:0;;;;;:::i;:::-;;:::i;20987:208::-;;;;;;;;;;-1:-1:-1;20987:208:0;;;;;:::i;:::-;;:::i;11595:103::-;;;;;;;;;;;;;:::i;10944:87::-;;;;;;;;;;-1:-1:-1;11017:6:0;;-1:-1:-1;;;;;11017:6:0;10944:87;;21732:104;;;;;;;;;;;;;:::i;23439:155::-;;;;;;;;;;-1:-1:-1;23439:155:0;;;;;:::i;:::-;;:::i;24562:328::-;;;;;;;;;;-1:-1:-1;24562:328:0;;;;;:::i;:::-;;:::i;21907:358::-;;;;;;;;;;-1:-1:-1;21907:358:0;;;;;:::i;:::-;;:::i;41735:82::-;;;;;;;;;;-1:-1:-1;41735:82:0;;;;;:::i;:::-;;:::i;23665:164::-;;;;;;;;;;-1:-1:-1;23665:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;23786:25:0;;;23762:4;23786:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23665:164;42170:78;;;;;;;;;;;;;:::i;11853:201::-;;;;;;;;;;-1:-1:-1;11853:201:0;;;;;:::i;:::-;;:::i;35092:224::-;35194:4;-1:-1:-1;;;;;;35218:50:0;;-1:-1:-1;;;35218:50:0;;:90;;;35272:36;35296:11;35272:23;:36::i;:::-;35211:97;35092:224;-1:-1:-1;;35092:224:0:o;21563:100::-;21617:13;21650:5;21643:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21563:100;:::o;23146:221::-;23222:7;26489:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26489:16:0;23242:73;;;;-1:-1:-1;;;23242:73:0;;6484:2:1;23242:73:0;;;6466:21:1;6523:2;6503:18;;;6496:30;6562:34;6542:18;;;6535:62;-1:-1:-1;;;6613:18:1;;;6606:42;6665:19;;23242:73:0;;;;;;;;;-1:-1:-1;23335:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23335:24:0;;23146:221::o;22669:411::-;22750:13;22766:23;22781:7;22766:14;:23::i;:::-;22750:39;;22814:5;-1:-1:-1;;;;;22808:11:0;:2;-1:-1:-1;;;;;22808:11:0;;22800:57;;;;-1:-1:-1;;;22800:57:0;;6897:2:1;22800:57:0;;;6879:21:1;6936:2;6916:18;;;6909:30;6975:34;6955:18;;;6948:62;-1:-1:-1;;;7026:18:1;;;7019:31;7067:19;;22800:57:0;6695:397:1;22800:57:0;10398:10;-1:-1:-1;;;;;22892:21:0;;;;:62;;-1:-1:-1;22917:37:0;22934:5;10398:10;23665:164;:::i;22917:37::-;22870:168;;;;-1:-1:-1;;;22870:168:0;;7299:2:1;22870:168:0;;;7281:21:1;7338:2;7318:18;;;7311:30;7377:34;7357:18;;;7350:62;7448:26;7428:18;;;7421:54;7492:19;;22870:168:0;7097:420:1;22870:168:0;23051:21;23060:2;23064:7;23051:8;:21::i;:::-;22739:341;22669:411;;:::o;42256:108::-;11017:6;;-1:-1:-1;;;;;11017:6:0;10398:10;11164:23;11156:68;;;;-1:-1:-1;;;11156:68:0;;;;;;;:::i;:::-;42305:51:::1;::::0;42313:10:::1;::::0;42334:21:::1;42305:51:::0;::::1;;;::::0;::::1;::::0;;;42334:21;42313:10;42305:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;42256:108::o:0;23896:339::-;24091:41;10398:10;24124:7;24091:18;:41::i;:::-;24083:103;;;;-1:-1:-1;;;24083:103:0;;;;;;;:::i;:::-;24199:28;24209:4;24215:2;24219:7;24199:9;:28::i;35400:256::-;35497:7;35533:23;35550:5;35533:16;:23::i;:::-;35525:5;:31;35517:87;;;;-1:-1:-1;;;35517:87:0;;8503:2:1;35517:87:0;;;8485:21:1;8542:2;8522:18;;;8515:30;8581:34;8561:18;;;8554:62;-1:-1:-1;;;8632:18:1;;;8625:41;8683:19;;35517:87:0;8301:407:1;35517:87:0;-1:-1:-1;;;;;;35622:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;35400:256::o;41825:90::-;11017:6;;-1:-1:-1;;;;;11017:6:0;10398:10;11164:23;11156:68;;;;-1:-1:-1;;;11156:68:0;;;;;;;:::i;:::-;41891:6:::1;:16:::0;41825:90::o;42372:158::-;11017:6;;-1:-1:-1;;;;;11017:6:0;10398:10;11164:23;11156:68;;;;-1:-1:-1;;;11156:68:0;;;;;;;:::i;:::-;42478:44:::1;::::0;-1:-1:-1;;;42478:44:0;;-1:-1:-1;;;;;8971:15:1;;;42478:44:0::1;::::0;::::1;8953:34:1::0;9023:15;;;9003:18;;;8996:43;9055:18;;;9048:34;;;42478:26:0;::::1;::::0;::::1;::::0;8888:18:1;;42478:44:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42372:158:::0;;;;:::o;24306:185::-;24444:39;24461:4;24467:2;24471:7;24444:39;;;;;;;;;;;;:16;:39::i;35922:233::-;35997:7;36033:30;35820:10;:17;;35732:113;36033:30;36025:5;:38;36017:95;;;;-1:-1:-1;;;36017:95:0;;9545:2:1;36017:95:0;;;9527:21:1;9584:2;9564:18;;;9557:30;9623:34;9603:18;;;9596:62;-1:-1:-1;;;9674:18:1;;;9667:42;9726:19;;36017:95:0;9343:408:1;36017:95:0;36130:10;36141:5;36130:17;;;;;;;;:::i;:::-;;;;;;;;;36123:24;;35922:233;;;:::o;42538:90::-;11017:6;;-1:-1:-1;;;;;11017:6:0;10398:10;11164:23;11156:68;;;;-1:-1:-1;;;11156:68:0;;;;;;;:::i;:::-;42607:7:::1;:13;42617:3:::0;42607:7;:13:::1;:::i;:::-;;42538:90:::0;:::o;21257:239::-;21329:7;21365:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21365:16:0;;21392:73;;;;-1:-1:-1;;;21392:73:0;;12294:2:1;21392:73:0;;;12276:21:1;12333:2;12313:18;;;12306:30;12372:34;12352:18;;;12345:62;-1:-1:-1;;;12423:18:1;;;12416:39;12472:19;;21392:73:0;12092:405:1;41926:236:0;11017:6;;-1:-1:-1;;;;;11017:6:0;10398:10;41522:23;;:47;;-1:-1:-1;41549:4:0;;-1:-1:-1;;;;;41549:4:0;10398:10;41549:20;41522:47;41514:95;;;;-1:-1:-1;;;41514:95:0;;;;;;;:::i;:::-;41989:6:::1;::::0;41985:50;42017:7:::1;41985:50;42065:1;42049:13;42059:2;42049:9;:13::i;:::-;:17;42083:7;42045:56;42111:22;42121:2;42125:7;;42111:9;:22::i;:::-;42144:7;:10:::0;;;:7:::1;:10;::::0;::::1;:::i;:::-;;;;;;41926:236:::0;:::o;20987:208::-;21059:7;-1:-1:-1;;;;;21087:19:0;;21079:74;;;;-1:-1:-1;;;21079:74:0;;13380:2:1;21079:74:0;;;13362:21:1;13419:2;13399:18;;;13392:30;13458:34;13438:18;;;13431:62;-1:-1:-1;;;13509:18:1;;;13502:40;13559:19;;21079:74:0;13178:406:1;21079:74:0;-1:-1:-1;;;;;;21171:16:0;;;;;:9;:16;;;;;;;20987:208::o;11595:103::-;11017:6;;-1:-1:-1;;;;;11017:6:0;10398:10;11164:23;11156:68;;;;-1:-1:-1;;;11156:68:0;;;;;;;:::i;:::-;11660:30:::1;11687:1;11660:18;:30::i;:::-;11595:103::o:0;21732:104::-;21788:13;21821:7;21814:14;;;;;:::i;23439:155::-;23534:52;10398:10;23567:8;23577;23534:18;:52::i;24562:328::-;24737:41;10398:10;24770:7;24737:18;:41::i;:::-;24729:103;;;;-1:-1:-1;;;24729:103:0;;;;;;;:::i;:::-;24843:39;24857:4;24863:2;24867:7;24876:5;24843:13;:39::i;:::-;24562:328;;;;:::o;21907:358::-;26465:4;26489:16;;;:7;:16;;;;;;21980:13;;-1:-1:-1;;;;;26489:16:0;22006:76;;;;-1:-1:-1;;;22006:76:0;;13791:2:1;22006:76:0;;;13773:21:1;13830:2;13810:18;;;13803:30;13869:34;13849:18;;;13842:62;-1:-1:-1;;;13920:18:1;;;13913:45;13975:19;;22006:76:0;13589:411:1;22006:76:0;22095:21;22119:10;:8;:10::i;:::-;22095:34;;22171:1;22153:7;22147:21;:25;:110;;;;;;;;;;;;;;;;;22199:7;22222:18;:7;:16;:18::i;:::-;22208:42;;;;;;;;:::i;:::-;;;;-1:-1:-1;;22208:42:0;;;;;;;;;;22182:69;;;22208:42;22182:69;;:::i;:::-;;;;;;;;;;;;;22147:110;22140:117;21907:358;-1:-1:-1;;;21907:358:0:o;41735:82::-;11017:6;;-1:-1:-1;;;;;11017:6:0;10398:10;11164:23;11156:68;;;;-1:-1:-1;;;11156:68:0;;;;;;;:::i;:::-;41797:4:::1;:12:::0;;-1:-1:-1;;;;;;41797:12:0::1;-1:-1:-1::0;;;;;41797:12:0;;;::::1;::::0;;;::::1;::::0;;41735:82::o;42170:78::-;11017:6;;-1:-1:-1;;;;;11017:6:0;10398:10;41522:23;;:47;;-1:-1:-1;41549:4:0;;-1:-1:-1;;;;;41549:4:0;10398:10;41549:20;41522:47;41514:95;;;;-1:-1:-1;;;41514:95:0;;;;;;;:::i;:::-;42239:1:::1;42230:6;;:10;;;;:::i;11853:201::-:0;11017:6;;-1:-1:-1;;;;;11017:6:0;10398:10;11164:23;11156:68;;;;-1:-1:-1;;;11156:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11942:22:0;::::1;11934:73;;;::::0;-1:-1:-1;;;11934:73:0;;15291:2:1;11934:73:0::1;::::0;::::1;15273:21:1::0;15330:2;15310:18;;;15303:30;15369:34;15349:18;;;15342:62;-1:-1:-1;;;15420:18:1;;;15413:36;15466:19;;11934:73:0::1;15089:402:1::0;11934:73:0::1;12018:28;12037:8;12018:18;:28::i;20618:305::-:0;20720:4;-1:-1:-1;;;;;;20757:40:0;;-1:-1:-1;;;20757:40:0;;:105;;-1:-1:-1;;;;;;;20814:48:0;;-1:-1:-1;;;20814:48:0;20757:105;:158;;;-1:-1:-1;;;;;;;;;;13766:40:0;;;20879:36;13657:157;30546:174;30621:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30621:29:0;-1:-1:-1;;;;;30621:29:0;;;;;;;;:24;;30675:23;30621:24;30675:14;:23::i;:::-;-1:-1:-1;;;;;30666:46:0;;;;;;;;;;;30546:174;;:::o;26694:348::-;26787:4;26489:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26489:16:0;26804:73;;;;-1:-1:-1;;;26804:73:0;;15698:2:1;26804:73:0;;;15680:21:1;15737:2;15717:18;;;15710:30;15776:34;15756:18;;;15749:62;-1:-1:-1;;;15827:18:1;;;15820:42;15879:19;;26804:73:0;15496:408:1;26804:73:0;26888:13;26904:23;26919:7;26904:14;:23::i;:::-;26888:39;;26957:5;-1:-1:-1;;;;;26946:16:0;:7;-1:-1:-1;;;;;26946:16:0;;:51;;;;26990:7;-1:-1:-1;;;;;26966:31:0;:20;26978:7;26966:11;:20::i;:::-;-1:-1:-1;;;;;26966:31:0;;26946:51;:87;;;-1:-1:-1;;;;;;23786:25:0;;;23762:4;23786:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27001:32;26938:96;26694:348;-1:-1:-1;;;;26694:348:0:o;29803:625::-;29962:4;-1:-1:-1;;;;;29935:31:0;:23;29950:7;29935:14;:23::i;:::-;-1:-1:-1;;;;;29935:31:0;;29927:81;;;;-1:-1:-1;;;29927:81:0;;16111:2:1;29927:81:0;;;16093:21:1;16150:2;16130:18;;;16123:30;16189:34;16169:18;;;16162:62;-1:-1:-1;;;16240:18:1;;;16233:35;16285:19;;29927:81:0;15909:401:1;29927:81:0;-1:-1:-1;;;;;30027:16:0;;30019:65;;;;-1:-1:-1;;;30019:65:0;;16517:2:1;30019:65:0;;;16499:21:1;16556:2;16536:18;;;16529:30;16595:34;16575:18;;;16568:62;-1:-1:-1;;;16646:18:1;;;16639:34;16690:19;;30019:65:0;16315:400:1;30019:65:0;30097:39;30118:4;30124:2;30128:7;30097:20;:39::i;:::-;30201:29;30218:1;30222:7;30201:8;:29::i;:::-;-1:-1:-1;;;;;30243:15:0;;;;;;:9;:15;;;;;:20;;30262:1;;30243:15;:20;;30262:1;;30243:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30274:13:0;;;;;;:9;:13;;;;;:18;;30291:1;;30274:13;:18;;30291:1;;30274:18;:::i;:::-;;;;-1:-1:-1;;30303:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30303:21:0;-1:-1:-1;;;;;30303:21:0;;;;;;;;;30342:27;;30303:16;;30342:27;;;;;;;22739:341;22669:411;;:::o;27384:110::-;27460:26;27470:2;27474:7;27460:26;;;;;;;;;;;;:9;:26::i;12214:191::-;12307:6;;;-1:-1:-1;;;;;12324:17:0;;;-1:-1:-1;;;;;;12324:17:0;;;;;;;12357:40;;12307:6;;;12324:17;12307:6;;12357:40;;12288:16;;12357:40;12277:128;12214:191;:::o;30862:315::-;31017:8;-1:-1:-1;;;;;31008:17:0;:5;-1:-1:-1;;;;;31008:17:0;;31000:55;;;;-1:-1:-1;;;31000:55:0;;17052:2:1;31000:55:0;;;17034:21:1;17091:2;17071:18;;;17064:30;17130:27;17110:18;;;17103:55;17175:18;;31000:55:0;16850:349:1;31000:55:0;-1:-1:-1;;;;;31066:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;31066:46:0;;;;;;;;;;31128:41;;540::1;;;31128::0;;513:18:1;31128:41:0;;;;;;;30862:315;;;:::o;25772:::-;25929:28;25939:4;25945:2;25949:7;25929:9;:28::i;:::-;25976:48;25999:4;26005:2;26009:7;26018:5;25976:22;:48::i;:::-;25968:111;;;;-1:-1:-1;;;25968:111:0;;;;;;;:::i;42636:100::-;42688:13;42721:7;42714:14;;;;;:::i;8526:723::-;8582:13;8803:5;8812:1;8803:10;8799:53;;-1:-1:-1;;8830:10:0;;;;;;;;;;;;-1:-1:-1;;;8830:10:0;;;;;8526:723::o;8799:53::-;8877:5;8862:12;8918:78;8925:9;;8918:78;;8951:8;;;;:::i;:::-;;-1:-1:-1;8974:10:0;;-1:-1:-1;8982:2:0;8974:10;;:::i;:::-;;;8918:78;;;9006:19;9038:6;9028:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9028:17:0;;9006:39;;9056:154;9063:10;;9056:154;;9090:11;9100:1;9090:11;;:::i;:::-;;-1:-1:-1;9159:10:0;9167:2;9159:5;:10;:::i;:::-;9146:24;;:2;:24;:::i;:::-;9133:39;;9116:6;9123;9116:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;9116:56:0;;;;;;;;-1:-1:-1;9187:11:0;9196:2;9187:11;;:::i;:::-;;;9056:154;;36768:589;-1:-1:-1;;;;;36974:18:0;;36970:187;;37009:40;37041:7;38184:10;:17;;38157:24;;;;:15;:24;;;;;:44;;;38212:24;;;;;;;;;;;;38080:164;37009:40;36970:187;;;37079:2;-1:-1:-1;;;;;37071:10:0;:4;-1:-1:-1;;;;;37071:10:0;;37067:90;;37098:47;37131:4;37137:7;37098:32;:47::i;:::-;-1:-1:-1;;;;;37171:16:0;;37167:183;;37204:45;37241:7;37204:36;:45::i;37167:183::-;37277:4;-1:-1:-1;;;;;37271:10:0;:2;-1:-1:-1;;;;;37271:10:0;;37267:83;;37298:40;37326:2;37330:7;37298:27;:40::i;27721:321::-;27851:18;27857:2;27861:7;27851:5;:18::i;:::-;27902:54;27933:1;27937:2;27941:7;27950:5;27902:22;:54::i;:::-;27880:154;;;;-1:-1:-1;;;27880:154:0;;;;;;;:::i;31742:799::-;31897:4;-1:-1:-1;;;;;31918:13:0;;1363:19;:23;31914:620;;31954:72;;-1:-1:-1;;;31954:72:0;;-1:-1:-1;;;;;31954:36:0;;;;;:72;;10398:10;;32005:4;;32011:7;;32020:5;;31954:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31954:72:0;;;;;;;;-1:-1:-1;;31954:72:0;;;;;;;;;;;;:::i;:::-;;;31950:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32196:6;:13;32213:1;32196:18;32192:272;;32239:60;;-1:-1:-1;;;32239:60:0;;;;;;;:::i;32192:272::-;32414:6;32408:13;32399:6;32395:2;32391:15;32384:38;31950:529;-1:-1:-1;;;;;;32077:51:0;-1:-1:-1;;;32077:51:0;;-1:-1:-1;32070:58:0;;31914:620;-1:-1:-1;32518:4:0;31742:799;;;;;;:::o;38871:988::-;39137:22;39187:1;39162:22;39179:4;39162:16;:22::i;:::-;:26;;;;:::i;:::-;39199:18;39220:26;;;:17;:26;;;;;;39137:51;;-1:-1:-1;39353:28:0;;;39349:328;;-1:-1:-1;;;;;39420:18:0;;39398:19;39420:18;;;:12;:18;;;;;;;;:34;;;;;;;;;39471:30;;;;;;:44;;;39588:30;;:17;:30;;;;;:43;;;39349:328;-1:-1:-1;39773:26:0;;;;:17;:26;;;;;;;;39766:33;;;-1:-1:-1;;;;;39817:18:0;;;;;:12;:18;;;;;:34;;;;;;;39810:41;38871:988::o;40154:1079::-;40432:10;:17;40407:22;;40432:21;;40452:1;;40432:21;:::i;:::-;40464:18;40485:24;;;:15;:24;;;;;;40858:10;:26;;40407:46;;-1:-1:-1;40485:24:0;;40407:46;;40858:26;;;;;;:::i;:::-;;;;;;;;;40836:48;;40922:11;40897:10;40908;40897:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;41002:28;;;:15;:28;;;;;;;:41;;;41174:24;;;;;41167:31;41209:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;40225:1008;;;40154:1079;:::o;37658:221::-;37743:14;37760:20;37777:2;37760:16;:20::i;:::-;-1:-1:-1;;;;;37791:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;37836:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;37658:221:0:o;28378:439::-;-1:-1:-1;;;;;28458:16:0;;28450:61;;;;-1:-1:-1;;;28450:61:0;;19079:2:1;28450:61:0;;;19061:21:1;;;19098:18;;;19091:30;19157:34;19137:18;;;19130:62;19209:18;;28450:61:0;18877:356:1;28450:61:0;26465:4;26489:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26489:16:0;:30;28522:58;;;;-1:-1:-1;;;28522:58:0;;19440:2:1;28522:58:0;;;19422:21:1;19479:2;19459:18;;;19452:30;19518;19498:18;;;19491:58;19566:18;;28522:58:0;19238:352:1;28522:58:0;28593:45;28622:1;28626:2;28630:7;28593:20;:45::i;:::-;-1:-1:-1;;;;;28651:13:0;;;;;;:9;:13;;;;;:18;;28668:1;;28651:13;:18;;28668:1;;28651:18;:::i;:::-;;;;-1:-1:-1;;28680:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28680:21:0;-1:-1:-1;;;;;28680:21:0;;;;;;;;28719:33;;28680:16;;;28719:33;;28680:16;;28719:33;42607:13:::1;42538:90:::0;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2360:328::-;2437:6;2445;2453;2506:2;2494:9;2485:7;2481:23;2477:32;2474:52;;;2522:1;2519;2512:12;2474:52;2545:29;2564:9;2545:29;:::i;:::-;2535:39;;2593:38;2627:2;2616:9;2612:18;2593:38;:::i;:::-;2583:48;;2678:2;2667:9;2663:18;2650:32;2640:42;;2360:328;;;;;:::o;2693:403::-;2779:6;2787;2795;2803;2856:3;2844:9;2835:7;2831:23;2827:33;2824:53;;;2873:1;2870;2863:12;2824:53;2896:29;2915:9;2896:29;:::i;:::-;2886:39;;2944:38;2978:2;2967:9;2963:18;2944:38;:::i;:::-;2934:48;;3001:38;3035:2;3024:9;3020:18;3001:38;:::i;:::-;2693:403;;;;-1:-1:-1;2991:48:1;;3086:2;3071:18;3058:32;;-1:-1:-1;;2693:403:1:o;3101:127::-;3162:10;3157:3;3153:20;3150:1;3143:31;3193:4;3190:1;3183:15;3217:4;3214:1;3207:15;3233:632;3298:5;3328:18;3369:2;3361:6;3358:14;3355:40;;;3375:18;;:::i;:::-;3450:2;3444:9;3418:2;3504:15;;-1:-1:-1;;3500:24:1;;;3526:2;3496:33;3492:42;3480:55;;;3550:18;;;3570:22;;;3547:46;3544:72;;;3596:18;;:::i;:::-;3636:10;3632:2;3625:22;3665:6;3656:15;;3695:6;3687;3680:22;3735:3;3726:6;3721:3;3717:16;3714:25;3711:45;;;3752:1;3749;3742:12;3711:45;3802:6;3797:3;3790:4;3782:6;3778:17;3765:44;3857:1;3850:4;3841:6;3833;3829:19;3825:30;3818:41;;;;3233:632;;;;;:::o;3870:451::-;3939:6;3992:2;3980:9;3971:7;3967:23;3963:32;3960:52;;;4008:1;4005;3998:12;3960:52;4048:9;4035:23;4081:18;4073:6;4070:30;4067:50;;;4113:1;4110;4103:12;4067:50;4136:22;;4189:4;4181:13;;4177:27;-1:-1:-1;4167:55:1;;4218:1;4215;4208:12;4167:55;4241:74;4307:7;4302:2;4289:16;4284:2;4280;4276:11;4241:74;:::i;4326:186::-;4385:6;4438:2;4426:9;4417:7;4413:23;4409:32;4406:52;;;4454:1;4451;4444:12;4406:52;4477:29;4496:9;4477:29;:::i;4517:118::-;4603:5;4596:13;4589:21;4582:5;4579:32;4569:60;;4625:1;4622;4615:12;4640:315;4705:6;4713;4766:2;4754:9;4745:7;4741:23;4737:32;4734:52;;;4782:1;4779;4772:12;4734:52;4805:29;4824:9;4805:29;:::i;:::-;4795:39;;4884:2;4873:9;4869:18;4856:32;4897:28;4919:5;4897:28;:::i;:::-;4944:5;4934:15;;;4640:315;;;;;:::o;4960:667::-;5055:6;5063;5071;5079;5132:3;5120:9;5111:7;5107:23;5103:33;5100:53;;;5149:1;5146;5139:12;5100:53;5172:29;5191:9;5172:29;:::i;:::-;5162:39;;5220:38;5254:2;5243:9;5239:18;5220:38;:::i;:::-;5210:48;;5305:2;5294:9;5290:18;5277:32;5267:42;;5360:2;5349:9;5345:18;5332:32;5387:18;5379:6;5376:30;5373:50;;;5419:1;5416;5409:12;5373:50;5442:22;;5495:4;5487:13;;5483:27;-1:-1:-1;5473:55:1;;5524:1;5521;5514:12;5473:55;5547:74;5613:7;5608:2;5595:16;5590:2;5586;5582:11;5547:74;:::i;:::-;5537:84;;;4960:667;;;;;;;:::o;5632:260::-;5700:6;5708;5761:2;5749:9;5740:7;5736:23;5732:32;5729:52;;;5777:1;5774;5767:12;5729:52;5800:29;5819:9;5800:29;:::i;:::-;5790:39;;5848:38;5882:2;5871:9;5867:18;5848:38;:::i;:::-;5838:48;;5632:260;;;;;:::o;5897:380::-;5976:1;5972:12;;;;6019;;;6040:61;;6094:4;6086:6;6082:17;6072:27;;6040:61;6147:2;6139:6;6136:14;6116:18;6113:38;6110:161;;6193:10;6188:3;6184:20;6181:1;6174:31;6228:4;6225:1;6218:15;6256:4;6253:1;6246:15;6110:161;;5897:380;;;:::o;7522:356::-;7724:2;7706:21;;;7743:18;;;7736:30;7802:34;7797:2;7782:18;;7775:62;7869:2;7854:18;;7522:356::o;7883:413::-;8085:2;8067:21;;;8124:2;8104:18;;;8097:30;8163:34;8158:2;8143:18;;8136:62;-1:-1:-1;;;8229:2:1;8214:18;;8207:47;8286:3;8271:19;;7883:413::o;9093:245::-;9160:6;9213:2;9201:9;9192:7;9188:23;9184:32;9181:52;;;9229:1;9226;9219:12;9181:52;9261:9;9255:16;9280:28;9302:5;9280:28;:::i;9756:127::-;9817:10;9812:3;9808:20;9805:1;9798:31;9848:4;9845:1;9838:15;9872:4;9869:1;9862:15;10014:545;10116:2;10111:3;10108:11;10105:448;;;10152:1;10177:5;10173:2;10166:17;10222:4;10218:2;10208:19;10292:2;10280:10;10276:19;10273:1;10269:27;10263:4;10259:38;10328:4;10316:10;10313:20;10310:47;;;-1:-1:-1;10351:4:1;10310:47;10406:2;10401:3;10397:12;10394:1;10390:20;10384:4;10380:31;10370:41;;10461:82;10479:2;10472:5;10469:13;10461:82;;;10524:17;;;10505:1;10494:13;10461:82;;;10465:3;;;10014:545;;;:::o;10735:1352::-;10861:3;10855:10;10888:18;10880:6;10877:30;10874:56;;;10910:18;;:::i;:::-;10939:97;11029:6;10989:38;11021:4;11015:11;10989:38;:::i;:::-;10983:4;10939:97;:::i;:::-;11091:4;;11155:2;11144:14;;11172:1;11167:663;;;;11874:1;11891:6;11888:89;;;-1:-1:-1;11943:19:1;;;11937:26;11888:89;-1:-1:-1;;10692:1:1;10688:11;;;10684:24;10680:29;10670:40;10716:1;10712:11;;;10667:57;11990:81;;11137:944;;11167:663;9961:1;9954:14;;;9998:4;9985:18;;-1:-1:-1;;11203:20:1;;;11321:236;11335:7;11332:1;11329:14;11321:236;;;11424:19;;;11418:26;11403:42;;11516:27;;;;11484:1;11472:14;;;;11351:19;;11321:236;;;11325:3;11585:6;11576:7;11573:19;11570:201;;;11646:19;;;11640:26;-1:-1:-1;;11729:1:1;11725:14;;;11741:3;11721:24;11717:37;11713:42;11698:58;11683:74;;11570:201;-1:-1:-1;;;;;11817:1:1;11801:14;;;11797:22;11784:36;;-1:-1:-1;10735:1352:1:o;12502:399::-;12704:2;12686:21;;;12743:2;12723:18;;;12716:30;12782:34;12777:2;12762:18;;12755:62;-1:-1:-1;;;12848:2:1;12833:18;;12826:33;12891:3;12876:19;;12502:399::o;12906:127::-;12967:10;12962:3;12958:20;12955:1;12948:31;12998:4;12995:1;12988:15;13022:4;13019:1;13012:15;13038:135;13077:3;13098:17;;;13095:43;;13118:18;;:::i;:::-;-1:-1:-1;13165:1:1;13154:13;;13038:135::o;14005:445::-;14226:3;14264:6;14258:13;14280:66;14339:6;14334:3;14327:4;14319:6;14315:17;14280:66;:::i;:::-;-1:-1:-1;;;14368:16:1;;14393:22;;;-1:-1:-1;14442:1:1;14431:13;;14005:445;-1:-1:-1;14005:445:1:o;14455:496::-;14634:3;14672:6;14666:13;14688:66;14747:6;14742:3;14735:4;14727:6;14723:17;14688:66;:::i;:::-;14817:13;;14776:16;;;;14839:70;14817:13;14776:16;14886:4;14874:17;;14839:70;:::i;:::-;14925:20;;14455:496;-1:-1:-1;;;;14455:496:1:o;14956:128::-;15023:9;;;15044:11;;;15041:37;;;15058:18;;:::i;16720:125::-;16785:9;;;16806:10;;;16803:36;;;16819:18;;:::i;17204:414::-;17406:2;17388:21;;;17445:2;17425:18;;;17418:30;17484:34;17479:2;17464:18;;17457:62;-1:-1:-1;;;17550:2:1;17535:18;;17528:48;17608:3;17593:19;;17204:414::o;17623:127::-;17684:10;17679:3;17675:20;17672:1;17665:31;17715:4;17712:1;17705:15;17739:4;17736:1;17729:15;17755:120;17795:1;17821;17811:35;;17826:18;;:::i;:::-;-1:-1:-1;17860:9:1;;17755:120::o;17880:112::-;17912:1;17938;17928:35;;17943:18;;:::i;:::-;-1:-1:-1;17977:9:1;;17880:112::o;17997:489::-;-1:-1:-1;;;;;18266:15:1;;;18248:34;;18318:15;;18313:2;18298:18;;18291:43;18365:2;18350:18;;18343:34;;;18413:3;18408:2;18393:18;;18386:31;;;18191:4;;18434:46;;18460:19;;18452:6;18434:46;:::i;:::-;18426:54;17997:489;-1:-1:-1;;;;;;17997:489:1:o;18491:249::-;18560:6;18613:2;18601:9;18592:7;18588:23;18584:32;18581:52;;;18629:1;18626;18619:12;18581:52;18661:9;18655:16;18680:30;18704:5;18680:30;:::i;18745:127::-;18806:10;18801:3;18797:20;18794:1;18787:31;18837:4;18834:1;18827:15;18861:4;18858:1;18851:15

Swarm Source

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