ETH Price: $3,641.84 (+1.74%)

Standametti (Standa)
 

Overview

TokenID

1355

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

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

OVERVIEW

Standametti, the second art project by artist Pumpametti, documenting the cryptoniano culture through the artist's unique perspective of contemporary art brut.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Standametti

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-25
*/

/**
 *Submitted for verification at Etherscan.io on 2021-09-25
*/

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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: contracts/WithLimitedSupply.sol


pragma solidity ^0.8.0;


/// @author 1001.digital 
/// @title A token tracker that limits the token supply and increments token IDs on each new mint.
abstract contract WithLimitedSupply {
    using Counters for Counters.Counter;

    // Keeps track of how many we have minted
    Counters.Counter private _tokenCount;

    /// @dev The maximum count of tokens this token tracker will hold.
    uint256 private _maxSupply;

    /// Instanciate the contract
    /// @param totalSupply_ how many tokens this collection should hold
    constructor (uint256 totalSupply_) {
        _maxSupply = totalSupply_;
    }

    /// @dev Get the max Supply
    /// @return the maximum token count
    function maxSupply() public view returns (uint256) {
        return _maxSupply;
    }

    /// @dev Get the current token count
    /// @return the created token count
    function tokenCount() public view returns (uint256) {
        return _tokenCount.current();
    }

    /// @dev Check whether tokens are still available
    /// @return the available token count
    function availableTokenCount() public view returns (uint256) {
        return maxSupply() - tokenCount();
    }

    /// @dev Increment the token count and fetch the latest count
    /// @return the next token id
    function nextToken() internal virtual ensureAvailability returns (uint256) {
        uint256 token = _tokenCount.current();

        _tokenCount.increment();

        return token;
    }

    /// @dev Check whether another token is still available
    modifier ensureAvailability() {
        require(availableTokenCount() > 0, "No more tokens available");
        _;
    }

    /// @param amount Check whether number of tokens are still available
    /// @dev Check whether tokens are still available
    modifier ensureAvailabilityFor(uint256 amount) {
        require(availableTokenCount() >= amount, "Requested number of tokens not available");
        _;
    }
}
// File: contracts/RandomlyAssigned.sol


pragma solidity ^0.8.0;


/// @author 1001.digital
/// @title Randomly assign tokenIDs from a given set of tokens.
abstract contract RandomlyAssigned is WithLimitedSupply {
    // Used for random index assignment
    mapping(uint256 => uint256) private tokenMatrix;

    // The initial token ID
    uint256 private startFrom;

    /// Instanciate the contract
    /// @param _maxSupply how many tokens this collection should hold
    /// @param _startFrom the tokenID with which to start counting
    constructor (uint256 _maxSupply, uint256 _startFrom)
        WithLimitedSupply(_maxSupply)
    {
        startFrom = _startFrom;
    }

    /// Get the next token ID
    /// @dev Randomly gets a new token ID and keeps track of the ones that are still available.
    /// @return the next token ID
    function nextToken() internal override ensureAvailability returns (uint256) {
        uint256 maxIndex = maxSupply() - tokenCount();
        uint256 random = uint256(keccak256(
            abi.encodePacked(
                msg.sender,
                block.coinbase,
                block.difficulty,
                block.gaslimit,
                block.timestamp
            )
        )) % maxIndex;

        uint256 value = 0;
        if (tokenMatrix[random] == 0) {
            // If this matrix position is empty, set the value to the generated random number.
            value = random;
        } else {
            // Otherwise, use the previously stored number from the matrix.
            value = tokenMatrix[random];
        }

        // If the last available tokenID is still unused...
        if (tokenMatrix[maxIndex - 1] == 0) {
            // ...store that ID in the current matrix position.
            tokenMatrix[random] = maxIndex - 1;
        } else {
            // ...otherwise copy over the stored number to the current matrix position.
            tokenMatrix[random] = tokenMatrix[maxIndex - 1];
        }

        // Increment counts
        super.nextToken();

        return value + startFrom;
    }
}

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;

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

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

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

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

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


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



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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



pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/Standametti.sol

//   #####                                                                
//  #     # #####   ##   #    # #####    ##   #    # ###### ##### ##### # 
//  #         #    #  #  ##   # #    #  #  #  ##  ## #        #     #   # 
//   #####    #   #    # # #  # #    # #    # # ## # #####    #     #   # 
//       #   #   ###### #  # # #    # ###### #    # #        #     #   # 
//  #     #   #   #    # #   ## #    # #    # #    # #        #     #   # 
//   #####    #   #    # #    # #####  #    # #    # ######   #     #   # 


// Standametti, the second art project by artist Pumpametti, documenting the cryptoniano culture through the artist's unique perspective of contemporary art brut.
// Inside Standametti there will be very rare Aperioni, Zombioni, Ororioni and Alienori.

// OG 300 Pumpametti holders can mint for free! Go to MettiMint if you have one OG metti or MettiMultiMint if you have more than one OG mettis, 
// simply input your token ID, put 0 at the ether amount and you are good to go! For MettiMultiMint please write your token IDs separated by commas and no spaces,
// for example if you own Metti #1 and Mettti #5, input 1,5 at mettiIds (uint256[]).

// For the public (or OG metti holders if you want to get more Standamettis) it costs 0.02 ETH per Standametti mint, 
// max 10 per transaction, mint directly from Standametti contract on Etherscan by select "publicmint".
// For how to directly mint from contract go watch a video: https://www.youtube.com/watch?v=GZca6HOcPa0

// There'll only be 4500 Standamettis, each a piece of 1/1 art. 

                                                                       

//SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface MettiInterface {
    function ownerOf(uint256 tokenId) external view returns (address owner);
    function balanceOf(address owner) external view returns (uint256 balance);
    function tokenOfOwnerByIndex(address owner, uint256 index)
        external
        view
        returns (uint256 tokenId);
}

contract Standametti is ERC721Enumerable, Ownable, RandomlyAssigned {
  using Strings for uint256;
  
  string public baseExtension = ".json";
  uint256 public cost = 0.02 ether;
  uint256 public maxMettiSupply = 300;
  uint256 public maxPublicSupply = 4200;
  uint256 public maxSTANDASupply = 4500;
  uint256 public maxMintAmount = 10;
  bool public paused = false;
  
  string public baseURI = "https://ipfs.io/ipfs/QmZd2RwnapYAtETyyhVGTS9d8rDBvRPE3nvr573ed1QMcX/";
  
    //Allow OG Pumpametti holders to mint for free
  
  address public MettiAddress = 0x09646c5c1e42ede848A57d6542382C32f2877164;
  MettiInterface MettiContract = MettiInterface(MettiAddress);
  uint public MettiOwnersSupplyMinted = 0;
  uint public publicSupplyMinted = 0;


  constructor(
  ) ERC721("Standametti", "Standa")
  RandomlyAssigned(4500, 1) {}

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

  function MettiFreeMint(uint mettiId) public payable {
        require(mettiId > 0 && mettiId <= 300, "Token ID invalid");
        require(MettiContract.ownerOf(mettiId) == msg.sender, "Not the owner of this pumpametti");

        _safeMint(msg.sender, mettiId);
    }

    function MettiMultiFreeMint(uint256[] memory mettiIds) public payable {
        for (uint256 i = 0; i < mettiIds.length; i++) {
            require(MettiContract.ownerOf(mettiIds[i]) == msg.sender, "Not the owner of this pumpametti");
            _safeMint(_msgSender(), mettiIds[i]);
        }
    }
  
   function publicmint(uint256 _mintAmount) public payable {
    require(!paused);
    require(_mintAmount > 0);
    require(_mintAmount <= maxMintAmount);
    require( tx.origin == msg.sender, "CANNOT MINT THROUGH A CUSTOM CONTRACT");
    require(totalSupply() + _mintAmount <= maxSTANDASupply);
    require(publicSupplyMinted + _mintAmount <= maxPublicSupply, "No more public supply left");
    publicSupplyMinted = publicSupplyMinted + _mintAmount;
    require(msg.value >= cost * _mintAmount);

    for (uint256 i = 1; i <= _mintAmount; i++) {
        uint256 mintIndex = nextToken();
     if (totalSupply() < maxSTANDASupply) {
                _safeMint(_msgSender(), mintIndex);
    }
   }
  }

  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory tokenIds = new uint256[](ownerTokenCount);
    for (uint256 i; i < ownerTokenCount; i++) {
      tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
    }
    return tokenIds;
  }

  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

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

  //only owner

  function withdraw() public payable onlyOwner {
    require(payable(msg.sender).send(address(this).balance));
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MettiAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mettiId","type":"uint256"}],"name":"MettiFreeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"mettiIds","type":"uint256[]"}],"name":"MettiMultiFreeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"MettiOwnersSupplyMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMettiSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublicSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSTANDASupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSupplyMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"publicmint","outputs":[],"stateMutability":"payable","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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":[],"name":"tokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60c06040526005608081905264173539b7b760d91b60a09081526200002891600f9190620001c2565b5066470de4df82000060105561012c601155611068601255611194601355600a6014556015805460ff19169055604080516080810190915260448082526200296b602083013980516200008491601691602090910190620001c2565b50601780547309646c5c1e42ede848a57d6542382c32f28771646001600160a01b0319918216811790925560188054909116909117905560006019819055601a55348015620000d257600080fd5b50604080518082018252600b81526a5374616e64616d6574746960a81b6020808301918252835180850190945260068452655374616e646160d01b90840152815161119493600193859390926200012c91600091620001c2565b50805162000142906001906020840190620001c2565b5050506200015f620001596200016c60201b60201c565b62000170565b600c55600e5550620002a5565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001d09062000268565b90600052602060002090601f016020900481019282620001f457600085556200023f565b82601f106200020f57805160ff19168380011785556200023f565b828001600101855582156200023f579182015b828111156200023f57825182559160200191906001019062000222565b506200024d92915062000251565b5090565b5b808211156200024d576000815560010162000252565b600181811c908216806200027d57607f821691505b602082108114156200029f57634e487b7160e01b600052602260045260246000fd5b50919050565b6126b680620002b56000396000f3fe6080604052600436106102255760003560e01c806370a0823111610123578063a22cb465116100ab578063d5abeb011161006f578063d5abeb01146105c7578063e14ca353146105dc578063e91b809d146105f1578063e985e9c514610611578063f2fde38b1461065a57600080fd5b8063a22cb4651461053c578063af6a22b71461055c578063b88d4fde14610572578063c668286214610592578063c87b56dd146105a757600080fd5b80638da5cb5b116100f25780638da5cb5b146104cb57806395d89b41146104e9578063969e12ab146104fe5780639f181b5e14610511578063a1918eaa1461052657600080fd5b806370a082311461046d578063715018a61461048d578063715e6e58146104a257806388f627f7146104b557600080fd5b806326a74d8e116101b15780634f6ccce7116101755780634f6ccce7146103eb5780635a827c4d1461040b5780635c975abb1461041e5780636352211e146104385780636c0360eb1461045857600080fd5b806326a74d8e146103605780632f745c59146103765780633ccfd60b1461039657806342842e0e1461039e578063438b6300146103be57600080fd5b806313faede6116101f857806313faede6146102db57806318160ddd146102ff578063239c70ae1461031457806323b872dd1461032a5780632518ad291461034a57600080fd5b806301ffc9a71461022a57806306fdde031461025f578063081812fc14610281578063095ea7b3146102b9575b600080fd5b34801561023657600080fd5b5061024a61024536600461220f565b61067a565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b506102746106a5565b60405161025691906123d3565b34801561028d57600080fd5b506102a161029c366004612249565b610737565b6040516001600160a01b039091168152602001610256565b3480156102c557600080fd5b506102d96102d4366004612136565b6107d1565b005b3480156102e757600080fd5b506102f160105481565b604051908152602001610256565b34801561030b57600080fd5b506008546102f1565b34801561032057600080fd5b506102f160145481565b34801561033657600080fd5b506102d9610345366004611ffe565b6108e7565b34801561035657600080fd5b506102f160115481565b34801561036c57600080fd5b506102f160125481565b34801561038257600080fd5b506102f1610391366004612136565b610918565b6102d96109ae565b3480156103aa57600080fd5b506102d96103b9366004611ffe565b6109fe565b3480156103ca57600080fd5b506103de6103d9366004611f8b565b610a19565b604051610256919061238f565b3480156103f757600080fd5b506102f1610406366004612249565b610abb565b6102d9610419366004612162565b610b4e565b34801561042a57600080fd5b5060155461024a9060ff1681565b34801561044457600080fd5b506102a1610453366004612249565b610c88565b34801561046457600080fd5b50610274610cff565b34801561047957600080fd5b506102f1610488366004611f8b565b610d8d565b34801561049957600080fd5b506102d9610e14565b6102d96104b0366004612249565b610e48565b3480156104c157600080fd5b506102f1601a5481565b3480156104d757600080fd5b50600a546001600160a01b03166102a1565b3480156104f557600080fd5b50610274610fc2565b6102d961050c366004612249565b610fd1565b34801561051d57600080fd5b506102f1611101565b34801561053257600080fd5b506102f160135481565b34801561054857600080fd5b506102d9610557366004612103565b611111565b34801561056857600080fd5b506102f160195481565b34801561057e57600080fd5b506102d961058d36600461203f565b6111d6565b34801561059e57600080fd5b5061027461120e565b3480156105b357600080fd5b506102746105c2366004612249565b61121b565b3480156105d357600080fd5b50600c546102f1565b3480156105e857600080fd5b506102f16112f9565b3480156105fd57600080fd5b506017546102a1906001600160a01b031681565b34801561061d57600080fd5b5061024a61062c366004611fc5565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561066657600080fd5b506102d9610675366004611f8b565b611310565b60006001600160e01b0319821663780e9d6360e01b148061069f575061069f826113a8565b92915050565b6060600080546106b49061257d565b80601f01602080910402602001604051908101604052809291908181526020018280546106e09061257d565b801561072d5780601f106107025761010080835404028352916020019161072d565b820191906000526020600020905b81548152906001019060200180831161071057829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107b55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006107dc82610c88565b9050806001600160a01b0316836001600160a01b0316141561084a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107ac565b336001600160a01b03821614806108665750610866813361062c565b6108d85760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107ac565b6108e283836113f8565b505050565b6108f13382611466565b61090d5760405162461bcd60e51b81526004016107ac9061246d565b6108e283838361155d565b600061092383610d8d565b82106109855760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107ac565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b031633146109d85760405162461bcd60e51b81526004016107ac90612438565b60405133904780156108fc02916000818181858888f193505050506109fc57600080fd5b565b6108e2838383604051806020016040528060008152506111d6565b60606000610a2683610d8d565b905060008167ffffffffffffffff811115610a4357610a4361263f565b604051908082528060200260200182016040528015610a6c578160200160208202803683370190505b50905060005b82811015610ab357610a848582610918565b828281518110610a9657610a96612629565b602090810291909101015280610aab816125b8565b915050610a72565b509392505050565b6000610ac660085490565b8210610b295760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107ac565b60088281548110610b3c57610b3c612629565b90600052602060002001549050919050565b60005b8151811015610c8457601854825133916001600160a01b031690636352211e90859085908110610b8357610b83612629565b60200260200101516040518263ffffffff1660e01b8152600401610ba991815260200190565b60206040518083038186803b158015610bc157600080fd5b505afa158015610bd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf99190611fa8565b6001600160a01b031614610c4f5760405162461bcd60e51b815260206004820181905260248201527f4e6f7420746865206f776e6572206f6620746869732070756d70616d6574746960448201526064016107ac565b610c7233838381518110610c6557610c65612629565b6020026020010151611708565b80610c7c816125b8565b915050610b51565b5050565b6000818152600260205260408120546001600160a01b03168061069f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107ac565b60168054610d0c9061257d565b80601f0160208091040260200160405190810160405280929190818152602001828054610d389061257d565b8015610d855780601f10610d5a57610100808354040283529160200191610d85565b820191906000526020600020905b815481529060010190602001808311610d6857829003601f168201915b505050505081565b60006001600160a01b038216610df85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107ac565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610e3e5760405162461bcd60e51b81526004016107ac90612438565b6109fc6000611722565b60155460ff1615610e5857600080fd5b60008111610e6557600080fd5b601454811115610e7457600080fd5b323314610ed15760405162461bcd60e51b815260206004820152602560248201527f43414e4e4f54204d494e54205448524f554748204120435553544f4d20434f4e60448201526415149050d560da1b60648201526084016107ac565b60135481610ede60085490565b610ee891906124ef565b1115610ef357600080fd5b60125481601a54610f0491906124ef565b1115610f525760405162461bcd60e51b815260206004820152601a60248201527f4e6f206d6f7265207075626c696320737570706c79206c65667400000000000060448201526064016107ac565b80601a54610f6091906124ef565b601a55601054610f7190829061251b565b341015610f7d57600080fd5b60015b818111610c84576000610f91611774565b9050601354610f9f60085490565b1015610faf57610faf3382611708565b5080610fba816125b8565b915050610f80565b6060600180546106b49061257d565b600081118015610fe3575061012c8111155b6110225760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881251081a5b9d985b1a5960821b60448201526064016107ac565b6018546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e9060240160206040518083038186803b15801561106657600080fd5b505afa15801561107a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109e9190611fa8565b6001600160a01b0316146110f45760405162461bcd60e51b815260206004820181905260248201527f4e6f7420746865206f776e6572206f6620746869732070756d70616d6574746960448201526064016107ac565b6110fe3382611708565b50565b600061110c600b5490565b905090565b6001600160a01b03821633141561116a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107ac565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6111e03383611466565b6111fc5760405162461bcd60e51b81526004016107ac9061246d565b61120884848484611907565b50505050565b600f8054610d0c9061257d565b6000818152600260205260409020546060906001600160a01b031661129a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107ac565b60006112a461193a565b905060008151116112c457604051806020016040528060008152506112f2565b806112ce84611949565b600f6040516020016112e29392919061228e565b6040516020818303038152906040525b9392505050565b6000611303611101565b600c5461110c919061253a565b600a546001600160a01b0316331461133a5760405162461bcd60e51b81526004016107ac90612438565b6001600160a01b03811661139f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107ac565b6110fe81611722565b60006001600160e01b031982166380ac58cd60e01b14806113d957506001600160e01b03198216635b5e139f60e01b145b8061069f57506301ffc9a760e01b6001600160e01b031983161461069f565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061142d82610c88565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166114df5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107ac565b60006114ea83610c88565b9050806001600160a01b0316846001600160a01b031614806115255750836001600160a01b031661151a84610737565b6001600160a01b0316145b8061155557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661157082610c88565b6001600160a01b0316146115d85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107ac565b6001600160a01b03821661163a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107ac565b611645838383611a47565b6116506000826113f8565b6001600160a01b038316600090815260036020526040812080546001929061167990849061253a565b90915550506001600160a01b03821660009081526003602052604081208054600192906116a79084906124ef565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610c84828260405180602001604052806000815250611aff565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008061177f6112f9565b116117c75760405162461bcd60e51b81526020600482015260186024820152774e6f206d6f726520746f6b656e7320617661696c61626c6560401b60448201526064016107ac565b60006117d1611101565b600c546117de919061253a565b6040516bffffffffffffffffffffffff1933606090811b8216602084015241901b166034820152446048820152456068820152426088820152909150600090829060a8016040516020818303038152906040528051906020012060001c61184591906125d3565b6000818152600d602052604081205491925090611863575080611874565b506000818152600d60205260409020545b600d600061188360018661253a565b815260200190815260200160002054600014156118b9576118a560018461253a565b6000838152600d60205260409020556118e9565b600d60006118c860018661253a565b81526020808201929092526040908101600090812054858252600d90935220555b6118f1611b32565b50600e546118ff90826124ef565b935050505090565b61191284848461155d565b61191e84848484611ba0565b6112085760405162461bcd60e51b81526004016107ac906123e6565b6060601680546106b49061257d565b60608161196d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156119975780611981816125b8565b91506119909050600a83612507565b9150611971565b60008167ffffffffffffffff8111156119b2576119b261263f565b6040519080825280601f01601f1916602001820160405280156119dc576020820181803683370190505b5090505b8415611555576119f160018361253a565b91506119fe600a866125d3565b611a099060306124ef565b60f81b818381518110611a1e57611a1e612629565b60200101906001600160f81b031916908160001a905350611a40600a86612507565b94506119e0565b6001600160a01b038316611aa257611a9d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611ac5565b816001600160a01b0316836001600160a01b031614611ac557611ac58382611cad565b6001600160a01b038216611adc576108e281611d4a565b826001600160a01b0316826001600160a01b0316146108e2576108e28282611df9565b611b098383611e3d565b611b166000848484611ba0565b6108e25760405162461bcd60e51b81526004016107ac906123e6565b600080611b3d6112f9565b11611b855760405162461bcd60e51b81526020600482015260186024820152774e6f206d6f726520746f6b656e7320617661696c61626c6560401b60448201526064016107ac565b6000611b90600b5490565b905061110c600b80546001019055565b60006001600160a01b0384163b15611ca257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611be4903390899088908890600401612352565b602060405180830381600087803b158015611bfe57600080fd5b505af1925050508015611c2e575060408051601f3d908101601f19168201909252611c2b9181019061222c565b60015b611c88573d808015611c5c576040519150601f19603f3d011682016040523d82523d6000602084013e611c61565b606091505b508051611c805760405162461bcd60e51b81526004016107ac906123e6565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611555565b506001949350505050565b60006001611cba84610d8d565b611cc4919061253a565b600083815260076020526040902054909150808214611d17576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611d5c9060019061253a565b60008381526009602052604081205460088054939450909284908110611d8457611d84612629565b906000526020600020015490508060088381548110611da557611da5612629565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611ddd57611ddd612613565b6001900381819060005260206000200160009055905550505050565b6000611e0483610d8d565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216611e935760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107ac565b6000818152600260205260409020546001600160a01b031615611ef85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107ac565b611f0460008383611a47565b6001600160a01b0382166000908152600360205260408120805460019290611f2d9084906124ef565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060208284031215611f9d57600080fd5b81356112f281612655565b600060208284031215611fba57600080fd5b81516112f281612655565b60008060408385031215611fd857600080fd5b8235611fe381612655565b91506020830135611ff381612655565b809150509250929050565b60008060006060848603121561201357600080fd5b833561201e81612655565b9250602084013561202e81612655565b929592945050506040919091013590565b6000806000806080858703121561205557600080fd5b843561206081612655565b935060208581013561207181612655565b935060408601359250606086013567ffffffffffffffff8082111561209557600080fd5b818801915088601f8301126120a957600080fd5b8135818111156120bb576120bb61263f565b6120cd601f8201601f191685016124be565b915080825289848285010111156120e357600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561211657600080fd5b823561212181612655565b915060208301358015158114611ff357600080fd5b6000806040838503121561214957600080fd5b823561215481612655565b946020939093013593505050565b6000602080838503121561217557600080fd5b823567ffffffffffffffff8082111561218d57600080fd5b818501915085601f8301126121a157600080fd5b8135818111156121b3576121b361263f565b8060051b91506121c48483016124be565b8181528481019084860184860187018a10156121df57600080fd5b600095505b838610156122025780358352600195909501949186019186016121e4565b5098975050505050505050565b60006020828403121561222157600080fd5b81356112f28161266a565b60006020828403121561223e57600080fd5b81516112f28161266a565b60006020828403121561225b57600080fd5b5035919050565b6000815180845261227a816020860160208601612551565b601f01601f19169290920160200192915050565b6000845160206122a18285838a01612551565b8551918401916122b48184848a01612551565b8554920191600090600181811c90808316806122d157607f831692505b8583108114156122ef57634e487b7160e01b85526022600452602485fd5b808015612303576001811461231457612341565b60ff19851688528388019550612341565b60008b81526020902060005b858110156123395781548a820152908401908801612320565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061238590830184612262565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156123c7578351835292840192918401916001016123ab565b50909695505050505050565b6020815260006112f26020830184612262565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156124e7576124e761263f565b604052919050565b60008219821115612502576125026125e7565b500190565b600082612516576125166125fd565b500490565b6000816000190483118215151615612535576125356125e7565b500290565b60008282101561254c5761254c6125e7565b500390565b60005b8381101561256c578181015183820152602001612554565b838111156112085750506000910152565b600181811c9082168061259157607f821691505b602082108114156125b257634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156125cc576125cc6125e7565b5060010190565b6000826125e2576125e26125fd565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146110fe57600080fd5b6001600160e01b0319811681146110fe57600080fdfea2646970667358221220fd2839b1961fbf69c9fce4299867227a625d2f2cd7ba7ee8840d0c356b4dd5a764736f6c6343000807003368747470733a2f2f697066732e696f2f697066732f516d5a643252776e617059417445547979685647545339643872444276525045336e7672353733656431514d63582f

Deployed Bytecode

0x6080604052600436106102255760003560e01c806370a0823111610123578063a22cb465116100ab578063d5abeb011161006f578063d5abeb01146105c7578063e14ca353146105dc578063e91b809d146105f1578063e985e9c514610611578063f2fde38b1461065a57600080fd5b8063a22cb4651461053c578063af6a22b71461055c578063b88d4fde14610572578063c668286214610592578063c87b56dd146105a757600080fd5b80638da5cb5b116100f25780638da5cb5b146104cb57806395d89b41146104e9578063969e12ab146104fe5780639f181b5e14610511578063a1918eaa1461052657600080fd5b806370a082311461046d578063715018a61461048d578063715e6e58146104a257806388f627f7146104b557600080fd5b806326a74d8e116101b15780634f6ccce7116101755780634f6ccce7146103eb5780635a827c4d1461040b5780635c975abb1461041e5780636352211e146104385780636c0360eb1461045857600080fd5b806326a74d8e146103605780632f745c59146103765780633ccfd60b1461039657806342842e0e1461039e578063438b6300146103be57600080fd5b806313faede6116101f857806313faede6146102db57806318160ddd146102ff578063239c70ae1461031457806323b872dd1461032a5780632518ad291461034a57600080fd5b806301ffc9a71461022a57806306fdde031461025f578063081812fc14610281578063095ea7b3146102b9575b600080fd5b34801561023657600080fd5b5061024a61024536600461220f565b61067a565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b506102746106a5565b60405161025691906123d3565b34801561028d57600080fd5b506102a161029c366004612249565b610737565b6040516001600160a01b039091168152602001610256565b3480156102c557600080fd5b506102d96102d4366004612136565b6107d1565b005b3480156102e757600080fd5b506102f160105481565b604051908152602001610256565b34801561030b57600080fd5b506008546102f1565b34801561032057600080fd5b506102f160145481565b34801561033657600080fd5b506102d9610345366004611ffe565b6108e7565b34801561035657600080fd5b506102f160115481565b34801561036c57600080fd5b506102f160125481565b34801561038257600080fd5b506102f1610391366004612136565b610918565b6102d96109ae565b3480156103aa57600080fd5b506102d96103b9366004611ffe565b6109fe565b3480156103ca57600080fd5b506103de6103d9366004611f8b565b610a19565b604051610256919061238f565b3480156103f757600080fd5b506102f1610406366004612249565b610abb565b6102d9610419366004612162565b610b4e565b34801561042a57600080fd5b5060155461024a9060ff1681565b34801561044457600080fd5b506102a1610453366004612249565b610c88565b34801561046457600080fd5b50610274610cff565b34801561047957600080fd5b506102f1610488366004611f8b565b610d8d565b34801561049957600080fd5b506102d9610e14565b6102d96104b0366004612249565b610e48565b3480156104c157600080fd5b506102f1601a5481565b3480156104d757600080fd5b50600a546001600160a01b03166102a1565b3480156104f557600080fd5b50610274610fc2565b6102d961050c366004612249565b610fd1565b34801561051d57600080fd5b506102f1611101565b34801561053257600080fd5b506102f160135481565b34801561054857600080fd5b506102d9610557366004612103565b611111565b34801561056857600080fd5b506102f160195481565b34801561057e57600080fd5b506102d961058d36600461203f565b6111d6565b34801561059e57600080fd5b5061027461120e565b3480156105b357600080fd5b506102746105c2366004612249565b61121b565b3480156105d357600080fd5b50600c546102f1565b3480156105e857600080fd5b506102f16112f9565b3480156105fd57600080fd5b506017546102a1906001600160a01b031681565b34801561061d57600080fd5b5061024a61062c366004611fc5565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561066657600080fd5b506102d9610675366004611f8b565b611310565b60006001600160e01b0319821663780e9d6360e01b148061069f575061069f826113a8565b92915050565b6060600080546106b49061257d565b80601f01602080910402602001604051908101604052809291908181526020018280546106e09061257d565b801561072d5780601f106107025761010080835404028352916020019161072d565b820191906000526020600020905b81548152906001019060200180831161071057829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107b55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006107dc82610c88565b9050806001600160a01b0316836001600160a01b0316141561084a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107ac565b336001600160a01b03821614806108665750610866813361062c565b6108d85760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107ac565b6108e283836113f8565b505050565b6108f13382611466565b61090d5760405162461bcd60e51b81526004016107ac9061246d565b6108e283838361155d565b600061092383610d8d565b82106109855760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107ac565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b031633146109d85760405162461bcd60e51b81526004016107ac90612438565b60405133904780156108fc02916000818181858888f193505050506109fc57600080fd5b565b6108e2838383604051806020016040528060008152506111d6565b60606000610a2683610d8d565b905060008167ffffffffffffffff811115610a4357610a4361263f565b604051908082528060200260200182016040528015610a6c578160200160208202803683370190505b50905060005b82811015610ab357610a848582610918565b828281518110610a9657610a96612629565b602090810291909101015280610aab816125b8565b915050610a72565b509392505050565b6000610ac660085490565b8210610b295760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107ac565b60088281548110610b3c57610b3c612629565b90600052602060002001549050919050565b60005b8151811015610c8457601854825133916001600160a01b031690636352211e90859085908110610b8357610b83612629565b60200260200101516040518263ffffffff1660e01b8152600401610ba991815260200190565b60206040518083038186803b158015610bc157600080fd5b505afa158015610bd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf99190611fa8565b6001600160a01b031614610c4f5760405162461bcd60e51b815260206004820181905260248201527f4e6f7420746865206f776e6572206f6620746869732070756d70616d6574746960448201526064016107ac565b610c7233838381518110610c6557610c65612629565b6020026020010151611708565b80610c7c816125b8565b915050610b51565b5050565b6000818152600260205260408120546001600160a01b03168061069f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107ac565b60168054610d0c9061257d565b80601f0160208091040260200160405190810160405280929190818152602001828054610d389061257d565b8015610d855780601f10610d5a57610100808354040283529160200191610d85565b820191906000526020600020905b815481529060010190602001808311610d6857829003601f168201915b505050505081565b60006001600160a01b038216610df85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107ac565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610e3e5760405162461bcd60e51b81526004016107ac90612438565b6109fc6000611722565b60155460ff1615610e5857600080fd5b60008111610e6557600080fd5b601454811115610e7457600080fd5b323314610ed15760405162461bcd60e51b815260206004820152602560248201527f43414e4e4f54204d494e54205448524f554748204120435553544f4d20434f4e60448201526415149050d560da1b60648201526084016107ac565b60135481610ede60085490565b610ee891906124ef565b1115610ef357600080fd5b60125481601a54610f0491906124ef565b1115610f525760405162461bcd60e51b815260206004820152601a60248201527f4e6f206d6f7265207075626c696320737570706c79206c65667400000000000060448201526064016107ac565b80601a54610f6091906124ef565b601a55601054610f7190829061251b565b341015610f7d57600080fd5b60015b818111610c84576000610f91611774565b9050601354610f9f60085490565b1015610faf57610faf3382611708565b5080610fba816125b8565b915050610f80565b6060600180546106b49061257d565b600081118015610fe3575061012c8111155b6110225760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881251081a5b9d985b1a5960821b60448201526064016107ac565b6018546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e9060240160206040518083038186803b15801561106657600080fd5b505afa15801561107a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109e9190611fa8565b6001600160a01b0316146110f45760405162461bcd60e51b815260206004820181905260248201527f4e6f7420746865206f776e6572206f6620746869732070756d70616d6574746960448201526064016107ac565b6110fe3382611708565b50565b600061110c600b5490565b905090565b6001600160a01b03821633141561116a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107ac565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6111e03383611466565b6111fc5760405162461bcd60e51b81526004016107ac9061246d565b61120884848484611907565b50505050565b600f8054610d0c9061257d565b6000818152600260205260409020546060906001600160a01b031661129a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107ac565b60006112a461193a565b905060008151116112c457604051806020016040528060008152506112f2565b806112ce84611949565b600f6040516020016112e29392919061228e565b6040516020818303038152906040525b9392505050565b6000611303611101565b600c5461110c919061253a565b600a546001600160a01b0316331461133a5760405162461bcd60e51b81526004016107ac90612438565b6001600160a01b03811661139f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107ac565b6110fe81611722565b60006001600160e01b031982166380ac58cd60e01b14806113d957506001600160e01b03198216635b5e139f60e01b145b8061069f57506301ffc9a760e01b6001600160e01b031983161461069f565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061142d82610c88565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166114df5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107ac565b60006114ea83610c88565b9050806001600160a01b0316846001600160a01b031614806115255750836001600160a01b031661151a84610737565b6001600160a01b0316145b8061155557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661157082610c88565b6001600160a01b0316146115d85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107ac565b6001600160a01b03821661163a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107ac565b611645838383611a47565b6116506000826113f8565b6001600160a01b038316600090815260036020526040812080546001929061167990849061253a565b90915550506001600160a01b03821660009081526003602052604081208054600192906116a79084906124ef565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610c84828260405180602001604052806000815250611aff565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008061177f6112f9565b116117c75760405162461bcd60e51b81526020600482015260186024820152774e6f206d6f726520746f6b656e7320617661696c61626c6560401b60448201526064016107ac565b60006117d1611101565b600c546117de919061253a565b6040516bffffffffffffffffffffffff1933606090811b8216602084015241901b166034820152446048820152456068820152426088820152909150600090829060a8016040516020818303038152906040528051906020012060001c61184591906125d3565b6000818152600d602052604081205491925090611863575080611874565b506000818152600d60205260409020545b600d600061188360018661253a565b815260200190815260200160002054600014156118b9576118a560018461253a565b6000838152600d60205260409020556118e9565b600d60006118c860018661253a565b81526020808201929092526040908101600090812054858252600d90935220555b6118f1611b32565b50600e546118ff90826124ef565b935050505090565b61191284848461155d565b61191e84848484611ba0565b6112085760405162461bcd60e51b81526004016107ac906123e6565b6060601680546106b49061257d565b60608161196d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156119975780611981816125b8565b91506119909050600a83612507565b9150611971565b60008167ffffffffffffffff8111156119b2576119b261263f565b6040519080825280601f01601f1916602001820160405280156119dc576020820181803683370190505b5090505b8415611555576119f160018361253a565b91506119fe600a866125d3565b611a099060306124ef565b60f81b818381518110611a1e57611a1e612629565b60200101906001600160f81b031916908160001a905350611a40600a86612507565b94506119e0565b6001600160a01b038316611aa257611a9d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611ac5565b816001600160a01b0316836001600160a01b031614611ac557611ac58382611cad565b6001600160a01b038216611adc576108e281611d4a565b826001600160a01b0316826001600160a01b0316146108e2576108e28282611df9565b611b098383611e3d565b611b166000848484611ba0565b6108e25760405162461bcd60e51b81526004016107ac906123e6565b600080611b3d6112f9565b11611b855760405162461bcd60e51b81526020600482015260186024820152774e6f206d6f726520746f6b656e7320617661696c61626c6560401b60448201526064016107ac565b6000611b90600b5490565b905061110c600b80546001019055565b60006001600160a01b0384163b15611ca257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611be4903390899088908890600401612352565b602060405180830381600087803b158015611bfe57600080fd5b505af1925050508015611c2e575060408051601f3d908101601f19168201909252611c2b9181019061222c565b60015b611c88573d808015611c5c576040519150601f19603f3d011682016040523d82523d6000602084013e611c61565b606091505b508051611c805760405162461bcd60e51b81526004016107ac906123e6565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611555565b506001949350505050565b60006001611cba84610d8d565b611cc4919061253a565b600083815260076020526040902054909150808214611d17576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611d5c9060019061253a565b60008381526009602052604081205460088054939450909284908110611d8457611d84612629565b906000526020600020015490508060088381548110611da557611da5612629565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611ddd57611ddd612613565b6001900381819060005260206000200160009055905550505050565b6000611e0483610d8d565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216611e935760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107ac565b6000818152600260205260409020546001600160a01b031615611ef85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107ac565b611f0460008383611a47565b6001600160a01b0382166000908152600360205260408120805460019290611f2d9084906124ef565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060208284031215611f9d57600080fd5b81356112f281612655565b600060208284031215611fba57600080fd5b81516112f281612655565b60008060408385031215611fd857600080fd5b8235611fe381612655565b91506020830135611ff381612655565b809150509250929050565b60008060006060848603121561201357600080fd5b833561201e81612655565b9250602084013561202e81612655565b929592945050506040919091013590565b6000806000806080858703121561205557600080fd5b843561206081612655565b935060208581013561207181612655565b935060408601359250606086013567ffffffffffffffff8082111561209557600080fd5b818801915088601f8301126120a957600080fd5b8135818111156120bb576120bb61263f565b6120cd601f8201601f191685016124be565b915080825289848285010111156120e357600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561211657600080fd5b823561212181612655565b915060208301358015158114611ff357600080fd5b6000806040838503121561214957600080fd5b823561215481612655565b946020939093013593505050565b6000602080838503121561217557600080fd5b823567ffffffffffffffff8082111561218d57600080fd5b818501915085601f8301126121a157600080fd5b8135818111156121b3576121b361263f565b8060051b91506121c48483016124be565b8181528481019084860184860187018a10156121df57600080fd5b600095505b838610156122025780358352600195909501949186019186016121e4565b5098975050505050505050565b60006020828403121561222157600080fd5b81356112f28161266a565b60006020828403121561223e57600080fd5b81516112f28161266a565b60006020828403121561225b57600080fd5b5035919050565b6000815180845261227a816020860160208601612551565b601f01601f19169290920160200192915050565b6000845160206122a18285838a01612551565b8551918401916122b48184848a01612551565b8554920191600090600181811c90808316806122d157607f831692505b8583108114156122ef57634e487b7160e01b85526022600452602485fd5b808015612303576001811461231457612341565b60ff19851688528388019550612341565b60008b81526020902060005b858110156123395781548a820152908401908801612320565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061238590830184612262565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156123c7578351835292840192918401916001016123ab565b50909695505050505050565b6020815260006112f26020830184612262565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156124e7576124e761263f565b604052919050565b60008219821115612502576125026125e7565b500190565b600082612516576125166125fd565b500490565b6000816000190483118215151615612535576125356125e7565b500290565b60008282101561254c5761254c6125e7565b500390565b60005b8381101561256c578181015183820152602001612554565b838111156112085750506000910152565b600181811c9082168061259157607f821691505b602082108114156125b257634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156125cc576125cc6125e7565b5060010190565b6000826125e2576125e26125fd565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146110fe57600080fd5b6001600160e01b0319811681146110fe57600080fdfea2646970667358221220fd2839b1961fbf69c9fce4299867227a625d2f2cd7ba7ee8840d0c356b4dd5a764736f6c63430008070033

Deployed Bytecode Sourcemap

50870:3210:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42637:224;;;;;;;;;;-1:-1:-1;42637:224:0;;;;;:::i;:::-;;:::i;:::-;;;8729:14:1;;8722:22;8704:41;;8692:2;8677:18;42637:224:0;;;;;;;;30529:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32088:221::-;;;;;;;;;;-1:-1:-1;32088:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7390:32:1;;;7372:51;;7360:2;7345:18;32088:221:0;7226:203:1;31611:411:0;;;;;;;;;;-1:-1:-1;31611:411:0;;;;;:::i;:::-;;:::i;:::-;;51019:32;;;;;;;;;;;;;;;;;;;18153:25:1;;;18141:2;18126:18;51019:32:0;18007:177:1;43277:113:0;;;;;;;;;;-1:-1:-1;43365:10:0;:17;43277:113;;51180:33;;;;;;;;;;;;;;;;32978:339;;;;;;;;;;-1:-1:-1;32978:339:0;;;;;:::i;:::-;;:::i;51056:35::-;;;;;;;;;;;;;;;;51096:37;;;;;;;;;;;;;;;;42945:256;;;;;;;;;;-1:-1:-1;42945:256:0;;;;;:::i;:::-;;:::i;53963:114::-;;;:::i;33388:185::-;;;;;;;;;;-1:-1:-1;33388:185:0;;;;;:::i;:::-;;:::i;53162:348::-;;;;;;;;;;-1:-1:-1;53162:348:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;43467:233::-;;;;;;;;;;-1:-1:-1;43467:233:0;;;;;:::i;:::-;;:::i;52130:305::-;;;;;;:::i;:::-;;:::i;51218:26::-;;;;;;;;;;-1:-1:-1;51218:26:0;;;;;;;;30223:239;;;;;;;;;;-1:-1:-1;30223:239:0;;;;;:::i;:::-;;:::i;51253:94::-;;;;;;;;;;;;;:::i;29953:208::-;;;;;;;;;;-1:-1:-1;29953:208:0;;;;;:::i;:::-;;:::i;8154:94::-;;;;;;;;;;;;;:::i;52444:712::-;;;;;;:::i;:::-;;:::i;51597:34::-;;;;;;;;;;;;;;;;7503:87;;;;;;;;;;-1:-1:-1;7576:6:0;;-1:-1:-1;;;;;7576:6:0;7503:87;;30698:104;;;;;;;;;;;;;:::i;51850:272::-;;;;;;:::i;:::-;;:::i;2411:99::-;;;;;;;;;;;;;:::i;51138:37::-;;;;;;;;;;;;;;;;32381:295;;;;;;;;;;-1:-1:-1;32381:295:0;;;;;:::i;:::-;;:::i;51553:39::-;;;;;;;;;;;;;;;;33644:328;;;;;;;;;;-1:-1:-1;33644:328:0;;;;;:::i;:::-;;:::i;50977:37::-;;;;;;;;;;;;;:::i;53516:423::-;;;;;;;;;;-1:-1:-1;53516:423:0;;;;;:::i;:::-;;:::i;2233:87::-;;;;;;;;;;-1:-1:-1;2302:10:0;;2233:87;;2616:113;;;;;;;;;;;;;:::i;51412:72::-;;;;;;;;;;-1:-1:-1;51412:72:0;;;;-1:-1:-1;;;;;51412:72:0;;;32747:164;;;;;;;;;;-1:-1:-1;32747:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;32868:25:0;;;32844:4;32868:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;32747:164;8403:192;;;;;;;;;;-1:-1:-1;8403:192:0;;;;;:::i;:::-;;:::i;42637:224::-;42739:4;-1:-1:-1;;;;;;42763:50:0;;-1:-1:-1;;;42763:50:0;;:90;;;42817:36;42841:11;42817:23;:36::i;:::-;42756:97;42637:224;-1:-1:-1;;42637:224:0:o;30529:100::-;30583:13;30616:5;30609:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30529:100;:::o;32088:221::-;32164:7;35571:16;;;:7;:16;;;;;;-1:-1:-1;;;;;35571:16:0;32184:73;;;;-1:-1:-1;;;32184:73:0;;14315:2:1;32184:73:0;;;14297:21:1;14354:2;14334:18;;;14327:30;14393:34;14373:18;;;14366:62;-1:-1:-1;;;14444:18:1;;;14437:42;14496:19;;32184:73:0;;;;;;;;;-1:-1:-1;32277:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;32277:24:0;;32088:221::o;31611:411::-;31692:13;31708:23;31723:7;31708:14;:23::i;:::-;31692:39;;31756:5;-1:-1:-1;;;;;31750:11:0;:2;-1:-1:-1;;;;;31750:11:0;;;31742:57;;;;-1:-1:-1;;;31742:57:0;;16260:2:1;31742:57:0;;;16242:21:1;16299:2;16279:18;;;16272:30;16338:34;16318:18;;;16311:62;-1:-1:-1;;;16389:18:1;;;16382:31;16430:19;;31742:57:0;16058:397:1;31742:57:0;6371:10;-1:-1:-1;;;;;31834:21:0;;;;:62;;-1:-1:-1;31859:37:0;31876:5;6371:10;32747:164;:::i;31859:37::-;31812:168;;;;-1:-1:-1;;;31812:168:0;;12708:2:1;31812:168:0;;;12690:21:1;12747:2;12727:18;;;12720:30;12786:34;12766:18;;;12759:62;12857:26;12837:18;;;12830:54;12901:19;;31812:168:0;12506:420:1;31812:168:0;31993:21;32002:2;32006:7;31993:8;:21::i;:::-;31681:341;31611:411;;:::o;32978:339::-;33173:41;6371:10;33206:7;33173:18;:41::i;:::-;33165:103;;;;-1:-1:-1;;;33165:103:0;;;;;;;:::i;:::-;33281:28;33291:4;33297:2;33301:7;33281:9;:28::i;42945:256::-;43042:7;43078:23;43095:5;43078:16;:23::i;:::-;43070:5;:31;43062:87;;;;-1:-1:-1;;;43062:87:0;;9182:2:1;43062:87:0;;;9164:21:1;9221:2;9201:18;;;9194:30;9260:34;9240:18;;;9233:62;-1:-1:-1;;;9311:18:1;;;9304:41;9362:19;;43062:87:0;8980:407:1;43062:87:0;-1:-1:-1;;;;;;43167:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;42945:256::o;53963:114::-;7576:6;;-1:-1:-1;;;;;7576:6:0;6371:10;7723:23;7715:68;;;;-1:-1:-1;;;7715:68:0;;;;;;;:::i;:::-;54023:47:::1;::::0;54031:10:::1;::::0;54048:21:::1;54023:47:::0;::::1;;;::::0;::::1;::::0;;;54048:21;54031:10;54023:47;::::1;;;;;;54015:56;;;::::0;::::1;;53963:114::o:0;33388:185::-;33526:39;33543:4;33549:2;33553:7;33526:39;;;;;;;;;;;;:16;:39::i;53162:348::-;53237:16;53265:23;53291:17;53301:6;53291:9;:17::i;:::-;53265:43;;53315:25;53357:15;53343:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53343:30:0;;53315:58;;53385:9;53380:103;53400:15;53396:1;:19;53380:103;;;53445:30;53465:6;53473:1;53445:19;:30::i;:::-;53431:8;53440:1;53431:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;53417:3;;;;:::i;:::-;;;;53380:103;;;-1:-1:-1;53496:8:0;53162:348;-1:-1:-1;;;53162:348:0:o;43467:233::-;43542:7;43578:30;43365:10;:17;;43277:113;43578:30;43570:5;:38;43562:95;;;;-1:-1:-1;;;43562:95:0;;17080:2:1;43562:95:0;;;17062:21:1;17119:2;17099:18;;;17092:30;17158:34;17138:18;;;17131:62;-1:-1:-1;;;17209:18:1;;;17202:42;17261:19;;43562:95:0;16878:408:1;43562:95:0;43675:10;43686:5;43675:17;;;;;;;;:::i;:::-;;;;;;;;;43668:24;;43467:233;;;:::o;52130:305::-;52216:9;52211:217;52235:8;:15;52231:1;:19;52211:217;;;52280:13;;52302:11;;52318:10;;-1:-1:-1;;;;;52280:13:0;;:21;;52302:8;;52311:1;;52302:11;;;;;;:::i;:::-;;;;;;;52280:34;;;;;;;;;;;;;18153:25:1;;18141:2;18126:18;;18007:177;52280:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;52280:48:0;;52272:93;;;;-1:-1:-1;;;52272:93:0;;17493:2:1;52272:93:0;;;17475:21:1;;;17512:18;;;17505:30;17571:34;17551:18;;;17544:62;17623:18;;52272:93:0;17291:356:1;52272:93:0;52380:36;6371:10;52404:8;52413:1;52404:11;;;;;;;;:::i;:::-;;;;;;;52380:9;:36::i;:::-;52252:3;;;;:::i;:::-;;;;52211:217;;;;52130:305;:::o;30223:239::-;30295:7;30331:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30331:16:0;30366:19;30358:73;;;;-1:-1:-1;;;30358:73:0;;13544:2:1;30358:73:0;;;13526:21:1;13583:2;13563:18;;;13556:30;13622:34;13602:18;;;13595:62;-1:-1:-1;;;13673:18:1;;;13666:39;13722:19;;30358:73:0;13342:405:1;51253:94:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29953:208::-;30025:7;-1:-1:-1;;;;;30053:19:0;;30045:74;;;;-1:-1:-1;;;30045:74:0;;13133:2:1;30045:74:0;;;13115:21:1;13172:2;13152:18;;;13145:30;13211:34;13191:18;;;13184:62;-1:-1:-1;;;13262:18:1;;;13255:40;13312:19;;30045:74:0;12931:406:1;30045:74:0;-1:-1:-1;;;;;;30137:16:0;;;;;:9;:16;;;;;;;29953:208::o;8154:94::-;7576:6;;-1:-1:-1;;;;;7576:6:0;6371:10;7723:23;7715:68;;;;-1:-1:-1;;;7715:68:0;;;;;;;:::i;:::-;8219:21:::1;8237:1;8219:9;:21::i;52444:712::-:0;52516:6;;;;52515:7;52507:16;;;;;;52552:1;52538:11;:15;52530:24;;;;;;52584:13;;52569:11;:28;;52561:37;;;;;;52614:9;52627:10;52614:23;52605:74;;;;-1:-1:-1;;;52605:74:0;;10777:2:1;52605:74:0;;;10759:21:1;10816:2;10796:18;;;10789:30;10855:34;10835:18;;;10828:62;-1:-1:-1;;;10906:18:1;;;10899:35;10951:19;;52605:74:0;10575:401:1;52605:74:0;52725:15;;52710:11;52694:13;43365:10;:17;;43277:113;52694:13;:27;;;;:::i;:::-;:46;;52686:55;;;;;;52792:15;;52777:11;52756:18;;:32;;;;:::i;:::-;:51;;52748:90;;;;-1:-1:-1;;;52748:90:0;;17854:2:1;52748:90:0;;;17836:21:1;17893:2;17873:18;;;17866:30;17932:28;17912:18;;;17905:56;17978:18;;52748:90:0;17652:350:1;52748:90:0;52887:11;52866:18;;:32;;;;:::i;:::-;52845:18;:53;52926:4;;:18;;52933:11;;52926:18;:::i;:::-;52913:9;:31;;52905:40;;;;;;52971:1;52954:197;52979:11;52974:1;:16;52954:197;;53008:17;53028:11;:9;:11::i;:::-;53008:31;;53067:15;;53051:13;43365:10;:17;;43277:113;53051:13;:31;53047:98;;;53103:34;6371:10;53127:9;53103;:34::i;:::-;-1:-1:-1;52992:3:0;;;;:::i;:::-;;;;52954:197;;30698:104;30754:13;30787:7;30780:14;;;;;:::i;51850:272::-;51931:1;51921:7;:11;:29;;;;;51947:3;51936:7;:14;;51921:29;51913:58;;;;-1:-1:-1;;;51913:58:0;;15089:2:1;51913:58:0;;;15071:21:1;15128:2;15108:18;;;15101:30;-1:-1:-1;;;15147:18:1;;;15140:46;15203:18;;51913:58:0;14887:340:1;51913:58:0;51990:13;;:30;;-1:-1:-1;;;51990:30:0;;;;;18153:25:1;;;52024:10:0;;-1:-1:-1;;;;;51990:13:0;;:21;;18126:18:1;;51990:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;51990:44:0;;51982:89;;;;-1:-1:-1;;;51982:89:0;;17493:2:1;51982:89:0;;;17475:21:1;;;17512:18;;;17505:30;17571:34;17551:18;;;17544:62;17623:18;;51982:89:0;17291:356:1;51982:89:0;52084:30;52094:10;52106:7;52084:9;:30::i;:::-;51850:272;:::o;2411:99::-;2454:7;2481:21;:11;976:14;;884:114;2481:21;2474:28;;2411:99;:::o;32381:295::-;-1:-1:-1;;;;;32484:24:0;;6371:10;32484:24;;32476:62;;;;-1:-1:-1;;;32476:62:0;;11588:2:1;32476:62:0;;;11570:21:1;11627:2;11607:18;;;11600:30;11666:27;11646:18;;;11639:55;11711:18;;32476:62:0;11386:349:1;32476:62:0;6371:10;32551:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;32551:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;32551:53:0;;;;;;;;;;32620:48;;8704:41:1;;;32551:42:0;;6371:10;32620:48;;8677:18:1;32620:48:0;;;;;;;32381:295;;:::o;33644:328::-;33819:41;6371:10;33852:7;33819:18;:41::i;:::-;33811:103;;;;-1:-1:-1;;;33811:103:0;;;;;;;:::i;:::-;33925:39;33939:4;33945:2;33949:7;33958:5;33925:13;:39::i;:::-;33644:328;;;;:::o;50977:37::-;;;;;;;:::i;53516:423::-;35547:4;35571:16;;;:7;:16;;;;;;53614:13;;-1:-1:-1;;;;;35571:16:0;53639:97;;;;-1:-1:-1;;;53639:97:0;;15844:2:1;53639:97:0;;;15826:21:1;15883:2;15863:18;;;15856:30;15922:34;15902:18;;;15895:62;-1:-1:-1;;;15973:18:1;;;15966:45;16028:19;;53639:97:0;15642:411:1;53639:97:0;53745:28;53776:10;:8;:10::i;:::-;53745:41;;53831:1;53806:14;53800:28;:32;:133;;;;;;;;;;;;;;;;;53868:14;53884:18;:7;:16;:18::i;:::-;53904:13;53851:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53800:133;53793:140;53516:423;-1:-1:-1;;;53516:423:0:o;2616:113::-;2668:7;2709:12;:10;:12::i;:::-;2302:10;;2695:26;;;;:::i;8403:192::-;7576:6;;-1:-1:-1;;;;;7576:6:0;6371:10;7723:23;7715:68;;;;-1:-1:-1;;;7715:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8492:22:0;::::1;8484:73;;;::::0;-1:-1:-1;;;8484:73:0;;10013:2:1;8484:73:0::1;::::0;::::1;9995:21:1::0;10052:2;10032:18;;;10025:30;10091:34;10071:18;;;10064:62;-1:-1:-1;;;10142:18:1;;;10135:36;10188:19;;8484:73:0::1;9811:402:1::0;8484:73:0::1;8568:19;8578:8;8568:9;:19::i;29584:305::-:0;29686:4;-1:-1:-1;;;;;;29723:40:0;;-1:-1:-1;;;29723:40:0;;:105;;-1:-1:-1;;;;;;;29780:48:0;;-1:-1:-1;;;29780:48:0;29723:105;:158;;;-1:-1:-1;;;;;;;;;;16333:40:0;;;29845:36;16224:157;39464:174;39539:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;39539:29:0;-1:-1:-1;;;;;39539:29:0;;;;;;;;:24;;39593:23;39539:24;39593:14;:23::i;:::-;-1:-1:-1;;;;;39584:46:0;;;;;;;;;;;39464:174;;:::o;35776:348::-;35869:4;35571:16;;;:7;:16;;;;;;-1:-1:-1;;;;;35571:16:0;35886:73;;;;-1:-1:-1;;;35886:73:0;;12295:2:1;35886:73:0;;;12277:21:1;12334:2;12314:18;;;12307:30;12373:34;12353:18;;;12346:62;-1:-1:-1;;;12424:18:1;;;12417:42;12476:19;;35886:73:0;12093:408:1;35886:73:0;35970:13;35986:23;36001:7;35986:14;:23::i;:::-;35970:39;;36039:5;-1:-1:-1;;;;;36028:16:0;:7;-1:-1:-1;;;;;36028:16:0;;:51;;;;36072:7;-1:-1:-1;;;;;36048:31:0;:20;36060:7;36048:11;:20::i;:::-;-1:-1:-1;;;;;36048:31:0;;36028:51;:87;;;-1:-1:-1;;;;;;32868:25:0;;;32844:4;32868:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;36083:32;36020:96;35776:348;-1:-1:-1;;;;35776:348:0:o;38768:578::-;38927:4;-1:-1:-1;;;;;38900:31:0;:23;38915:7;38900:14;:23::i;:::-;-1:-1:-1;;;;;38900:31:0;;38892:85;;;;-1:-1:-1;;;38892:85:0;;15434:2:1;38892:85:0;;;15416:21:1;15473:2;15453:18;;;15446:30;15512:34;15492:18;;;15485:62;-1:-1:-1;;;15563:18:1;;;15556:39;15612:19;;38892:85:0;15232:405:1;38892:85:0;-1:-1:-1;;;;;38996:16:0;;38988:65;;;;-1:-1:-1;;;38988:65:0;;11183:2:1;38988:65:0;;;11165:21:1;11222:2;11202:18;;;11195:30;11261:34;11241:18;;;11234:62;-1:-1:-1;;;11312:18:1;;;11305:34;11356:19;;38988:65:0;10981:400:1;38988:65:0;39066:39;39087:4;39093:2;39097:7;39066:20;:39::i;:::-;39170:29;39187:1;39191:7;39170:8;:29::i;:::-;-1:-1:-1;;;;;39212:15:0;;;;;;:9;:15;;;;;:20;;39231:1;;39212:15;:20;;39231:1;;39212:20;:::i;:::-;;;;-1:-1:-1;;;;;;;39243:13:0;;;;;;:9;:13;;;;;:18;;39260:1;;39243:13;:18;;39260:1;;39243:18;:::i;:::-;;;;-1:-1:-1;;39272:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;39272:21:0;-1:-1:-1;;;;;39272:21:0;;;;;;;;;39311:27;;39272:16;;39311:27;;;;;;;38768:578;;;:::o;36466:110::-;36542:26;36552:2;36556:7;36542:26;;;;;;;;;;;;:9;:26::i;8603:173::-;8678:6;;;-1:-1:-1;;;;;8695:17:0;;;-1:-1:-1;;;;;;8695:17:0;;;;;;;8728:40;;8678:6;;;8695:17;8678:6;;8728:40;;8659:16;;8728:40;8648:128;8603:173;:::o;4397:1262::-;4464:7;3173:1;3149:21;:19;:21::i;:::-;:25;3141:62;;;;-1:-1:-1;;;3141:62:0;;11942:2:1;3141:62:0;;;11924:21:1;11981:2;11961:18;;;11954:30;-1:-1:-1;;;12000:18:1;;;11993:54;12064:18;;3141:62:0;11740:348:1;3141:62:0;4484:16:::1;4517:12;:10;:12::i;:::-;2302:10:::0;;4503:26:::1;;;;:::i;:::-;4589:195;::::0;-1:-1:-1;;4624:10:0::1;5470:2:1::0;5466:15;;;5462:24;;4589:195:0::1;::::0;::::1;5450:37:1::0;4653:14:0::1;5521:15:1::0;;5517:24;5503:12;;;5496:46;4686:16:0::1;5558:12:1::0;;;5551:28;4721:14:0::1;5595:12:1::0;;;5588:28;4754:15:0::1;5632:13:1::0;;;5625:29;4484:45:0;;-1:-1:-1;4540:14:0::1;::::0;4484:45;;5670:13:1;;4589:195:0::1;;;;;;;;;;;;4565:230;;;;;;4557:239;;:250;;;;:::i;:::-;4820:13;4852:19:::0;;;:11:::1;:19;::::0;;;;;4540:267;;-1:-1:-1;4820:13:0;4848:304:::1;;-1:-1:-1::0;4997:6:0;4848:304:::1;;;-1:-1:-1::0;5121:19:0::1;::::0;;;:11:::1;:19;::::0;;;;;4848:304:::1;5229:11;:25;5241:12;5252:1;5241:8:::0;:12:::1;:::i;:::-;5229:25;;;;;;;;;;;;5258:1;5229:30;5225:331;;;5363:12;5374:1;5363:8:::0;:12:::1;:::i;:::-;5341:19;::::0;;;:11:::1;:19;::::0;;;;:34;5225:331:::1;;;5519:11;:25;5531:12;5542:1;5531:8:::0;:12:::1;:::i;:::-;5519:25:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;5519:25:0;;;;5497:19;;;:11:::1;:19:::0;;;;:47;5225:331:::1;5597:17;:15;:17::i;:::-;-1:-1:-1::0;5642:9:0::1;::::0;5634:17:::1;::::0;:5;:17:::1;:::i;:::-;5627:24;;;;;4397:1262:::0;:::o;34854:315::-;35011:28;35021:4;35027:2;35031:7;35011:9;:28::i;:::-;35058:48;35081:4;35087:2;35091:7;35100:5;35058:22;:48::i;:::-;35050:111;;;;-1:-1:-1;;;35050:111:0;;;;;;;:::i;51742:102::-;51802:13;51831:7;51824:14;;;;;:::i;16699:723::-;16755:13;16976:10;16972:53;;-1:-1:-1;;17003:10:0;;;;;;;;;;;;-1:-1:-1;;;17003:10:0;;;;;16699:723::o;16972:53::-;17050:5;17035:12;17091:78;17098:9;;17091:78;;17124:8;;;;:::i;:::-;;-1:-1:-1;17147:10:0;;-1:-1:-1;17155:2:0;17147:10;;:::i;:::-;;;17091:78;;;17179:19;17211:6;17201:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17201:17:0;;17179:39;;17229:154;17236:10;;17229:154;;17263:11;17273:1;17263:11;;:::i;:::-;;-1:-1:-1;17332:10:0;17340:2;17332:5;:10;:::i;:::-;17319:24;;:2;:24;:::i;:::-;17306:39;;17289:6;17296;17289:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;17289:56:0;;;;;;;;-1:-1:-1;17360:11:0;17369:2;17360:11;;:::i;:::-;;;17229:154;;44313:589;-1:-1:-1;;;;;44519:18:0;;44515:187;;44554:40;44586:7;45729:10;:17;;45702:24;;;;:15;:24;;;;;:44;;;45757:24;;;;;;;;;;;;45625:164;44554:40;44515:187;;;44624:2;-1:-1:-1;;;;;44616:10:0;:4;-1:-1:-1;;;;;44616:10:0;;44612:90;;44643:47;44676:4;44682:7;44643:32;:47::i;:::-;-1:-1:-1;;;;;44716:16:0;;44712:183;;44749:45;44786:7;44749:36;:45::i;44712:183::-;44822:4;-1:-1:-1;;;;;44816:10:0;:2;-1:-1:-1;;;;;44816:10:0;;44812:83;;44843:40;44871:2;44875:7;44843:27;:40::i;36803:321::-;36933:18;36939:2;36943:7;36933:5;:18::i;:::-;36984:54;37015:1;37019:2;37023:7;37032:5;36984:22;:54::i;:::-;36962:154;;;;-1:-1:-1;;;36962:154:0;;;;;;;:::i;2839:192::-;2905:7;3173:1;3149:21;:19;:21::i;:::-;:25;3141:62;;;;-1:-1:-1;;;3141:62:0;;11942:2:1;3141:62:0;;;11924:21:1;11981:2;11961:18;;;11954:30;-1:-1:-1;;;12000:18:1;;;11993:54;12064:18;;3141:62:0;11740:348:1;3141:62:0;2925:13:::1;2941:21;:11;976:14:::0;;884:114;2941:21:::1;2925:37;;2975:23;:11;1095:19:::0;;1113:1;1095:19;;;1006:127;40203:799;40358:4;-1:-1:-1;;;;;40379:13:0;;19549:20;19597:8;40375:620;;40415:72;;-1:-1:-1;;;40415:72:0;;-1:-1:-1;;;;;40415:36:0;;;;;:72;;6371:10;;40466:4;;40472:7;;40481:5;;40415:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40415:72:0;;;;;;;;-1:-1:-1;;40415:72:0;;;;;;;;;;;;:::i;:::-;;;40411:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40657:13:0;;40653:272;;40700:60;;-1:-1:-1;;;40700:60:0;;;;;;;:::i;40653:272::-;40875:6;40869:13;40860:6;40856:2;40852:15;40845:38;40411:529;-1:-1:-1;;;;;;40538:51:0;-1:-1:-1;;;40538:51:0;;-1:-1:-1;40531:58:0;;40375:620;-1:-1:-1;40979:4:0;40203:799;;;;;;:::o;46416:988::-;46682:22;46732:1;46707:22;46724:4;46707:16;:22::i;:::-;:26;;;;:::i;:::-;46744:18;46765:26;;;:17;:26;;;;;;46682:51;;-1:-1:-1;46898:28:0;;;46894:328;;-1:-1:-1;;;;;46965:18:0;;46943:19;46965:18;;;:12;:18;;;;;;;;:34;;;;;;;;;47016:30;;;;;;:44;;;47133:30;;:17;:30;;;;;:43;;;46894:328;-1:-1:-1;47318:26:0;;;;:17;:26;;;;;;;;47311:33;;;-1:-1:-1;;;;;47362:18:0;;;;;:12;:18;;;;;:34;;;;;;;47355:41;46416:988::o;47699:1079::-;47977:10;:17;47952:22;;47977:21;;47997:1;;47977:21;:::i;:::-;48009:18;48030:24;;;:15;:24;;;;;;48403:10;:26;;47952:46;;-1:-1:-1;48030:24:0;;47952:46;;48403:26;;;;;;:::i;:::-;;;;;;;;;48381:48;;48467:11;48442:10;48453;48442:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;48547:28;;;:15;:28;;;;;;;:41;;;48719:24;;;;;48712:31;48754:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;47770:1008;;;47699:1079;:::o;45203:221::-;45288:14;45305:20;45322:2;45305:16;:20::i;:::-;-1:-1:-1;;;;;45336:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;45381:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;45203:221:0:o;37460:382::-;-1:-1:-1;;;;;37540:16:0;;37532:61;;;;-1:-1:-1;;;37532:61:0;;13954:2:1;37532:61:0;;;13936:21:1;;;13973:18;;;13966:30;14032:34;14012:18;;;14005:62;14084:18;;37532:61:0;13752:356:1;37532:61:0;35547:4;35571:16;;;:7;:16;;;;;;-1:-1:-1;;;;;35571:16:0;:30;37604:58;;;;-1:-1:-1;;;37604:58:0;;10420:2:1;37604:58:0;;;10402:21:1;10459:2;10439:18;;;10432:30;10498;10478:18;;;10471:58;10546:18;;37604:58:0;10218:352:1;37604:58:0;37675:45;37704:1;37708:2;37712:7;37675:20;:45::i;:::-;-1:-1:-1;;;;;37733:13:0;;;;;;:9;:13;;;;;:18;;37750:1;;37733:13;:18;;37750:1;;37733:18;:::i;:::-;;;;-1:-1:-1;;37762:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;37762:21:0;-1:-1:-1;;;;;37762:21:0;;;;;;;;37801:33;;37762:16;;;37801:33;;37762:16;;37801:33;37460:382;;:::o;14:247:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;522:388::-;590:6;598;651:2;639:9;630:7;626:23;622:32;619:52;;;667:1;664;657:12;619:52;706:9;693:23;725:31;750:5;725:31;:::i;:::-;775:5;-1:-1:-1;832:2:1;817:18;;804:32;845:33;804:32;845:33;:::i;:::-;897:7;887:17;;;522:388;;;;;:::o;915:456::-;992:6;1000;1008;1061:2;1049:9;1040:7;1036:23;1032:32;1029:52;;;1077:1;1074;1067:12;1029:52;1116:9;1103:23;1135:31;1160:5;1135:31;:::i;:::-;1185:5;-1:-1:-1;1242:2:1;1227:18;;1214:32;1255:33;1214:32;1255:33;:::i;:::-;915:456;;1307:7;;-1:-1:-1;;;1361:2:1;1346:18;;;;1333:32;;915:456::o;1376:1108::-;1471:6;1479;1487;1495;1548:3;1536:9;1527:7;1523:23;1519:33;1516:53;;;1565:1;1562;1555:12;1516:53;1604:9;1591:23;1623:31;1648:5;1623:31;:::i;:::-;1673:5;-1:-1:-1;1697:2:1;1736:18;;;1723:32;1764:33;1723:32;1764:33;:::i;:::-;1816:7;-1:-1:-1;1870:2:1;1855:18;;1842:32;;-1:-1:-1;1925:2:1;1910:18;;1897:32;1948:18;1978:14;;;1975:34;;;2005:1;2002;1995:12;1975:34;2043:6;2032:9;2028:22;2018:32;;2088:7;2081:4;2077:2;2073:13;2069:27;2059:55;;2110:1;2107;2100:12;2059:55;2146:2;2133:16;2168:2;2164;2161:10;2158:36;;;2174:18;;:::i;:::-;2216:53;2259:2;2240:13;;-1:-1:-1;;2236:27:1;2232:36;;2216:53;:::i;:::-;2203:66;;2292:2;2285:5;2278:17;2332:7;2327:2;2322;2318;2314:11;2310:20;2307:33;2304:53;;;2353:1;2350;2343:12;2304:53;2408:2;2403;2399;2395:11;2390:2;2383:5;2379:14;2366:45;2452:1;2447:2;2442;2435:5;2431:14;2427:23;2420:34;;2473:5;2463:15;;;;;1376:1108;;;;;;;:::o;2489:416::-;2554:6;2562;2615:2;2603:9;2594:7;2590:23;2586:32;2583:52;;;2631:1;2628;2621:12;2583:52;2670:9;2657:23;2689:31;2714:5;2689:31;:::i;:::-;2739:5;-1:-1:-1;2796:2:1;2781:18;;2768:32;2838:15;;2831:23;2819:36;;2809:64;;2869:1;2866;2859:12;2910:315;2978:6;2986;3039:2;3027:9;3018:7;3014:23;3010:32;3007:52;;;3055:1;3052;3045:12;3007:52;3094:9;3081:23;3113:31;3138:5;3113:31;:::i;:::-;3163:5;3215:2;3200:18;;;;3187:32;;-1:-1:-1;;;2910:315:1:o;3230:957::-;3314:6;3345:2;3388;3376:9;3367:7;3363:23;3359:32;3356:52;;;3404:1;3401;3394:12;3356:52;3444:9;3431:23;3473:18;3514:2;3506:6;3503:14;3500:34;;;3530:1;3527;3520:12;3500:34;3568:6;3557:9;3553:22;3543:32;;3613:7;3606:4;3602:2;3598:13;3594:27;3584:55;;3635:1;3632;3625:12;3584:55;3671:2;3658:16;3693:2;3689;3686:10;3683:36;;;3699:18;;:::i;:::-;3745:2;3742:1;3738:10;3728:20;;3768:28;3792:2;3788;3784:11;3768:28;:::i;:::-;3830:15;;;3861:12;;;;3893:11;;;3923;;;3919:20;;3916:33;-1:-1:-1;3913:53:1;;;3962:1;3959;3952:12;3913:53;3984:1;3975:10;;3994:163;4008:2;4005:1;4002:9;3994:163;;;4065:17;;4053:30;;4026:1;4019:9;;;;;4103:12;;;;4135;;3994:163;;;-1:-1:-1;4176:5:1;3230:957;-1:-1:-1;;;;;;;;3230:957:1:o;4192:245::-;4250:6;4303:2;4291:9;4282:7;4278:23;4274:32;4271:52;;;4319:1;4316;4309:12;4271:52;4358:9;4345:23;4377:30;4401:5;4377:30;:::i;4442:249::-;4511:6;4564:2;4552:9;4543:7;4539:23;4535:32;4532:52;;;4580:1;4577;4570:12;4532:52;4612:9;4606:16;4631:30;4655:5;4631:30;:::i;4696:180::-;4755:6;4808:2;4796:9;4787:7;4783:23;4779:32;4776:52;;;4824:1;4821;4814:12;4776:52;-1:-1:-1;4847:23:1;;4696:180;-1:-1:-1;4696:180:1:o;4881:257::-;4922:3;4960:5;4954:12;4987:6;4982:3;4975:19;5003:63;5059:6;5052:4;5047:3;5043:14;5036:4;5029:5;5025:16;5003:63;:::i;:::-;5120:2;5099:15;-1:-1:-1;;5095:29:1;5086:39;;;;5127:4;5082:50;;4881:257;-1:-1:-1;;4881:257:1:o;5694:1527::-;5918:3;5956:6;5950:13;5982:4;5995:51;6039:6;6034:3;6029:2;6021:6;6017:15;5995:51;:::i;:::-;6109:13;;6068:16;;;;6131:55;6109:13;6068:16;6153:15;;;6131:55;:::i;:::-;6275:13;;6208:20;;;6248:1;;6335;6357:18;;;;6410;;;;6437:93;;6515:4;6505:8;6501:19;6489:31;;6437:93;6578:2;6568:8;6565:16;6545:18;6542:40;6539:167;;;-1:-1:-1;;;6605:33:1;;6661:4;6658:1;6651:15;6691:4;6612:3;6679:17;6539:167;6722:18;6749:110;;;;6873:1;6868:328;;;;6715:481;;6749:110;-1:-1:-1;;6784:24:1;;6770:39;;6829:20;;;;-1:-1:-1;6749:110:1;;6868:328;18542:1;18535:14;;;18579:4;18566:18;;6963:1;6977:169;6991:8;6988:1;6985:15;6977:169;;;7073:14;;7058:13;;;7051:37;7116:16;;;;7008:10;;6977:169;;;6981:3;;7177:8;7170:5;7166:20;7159:27;;6715:481;-1:-1:-1;7212:3:1;;5694:1527;-1:-1:-1;;;;;;;;;;;5694:1527:1:o;7434:488::-;-1:-1:-1;;;;;7703:15:1;;;7685:34;;7755:15;;7750:2;7735:18;;7728:43;7802:2;7787:18;;7780:34;;;7850:3;7845:2;7830:18;;7823:31;;;7628:4;;7871:45;;7896:19;;7888:6;7871:45;:::i;:::-;7863:53;7434:488;-1:-1:-1;;;;;;7434:488:1:o;7927:632::-;8098:2;8150:21;;;8220:13;;8123:18;;;8242:22;;;8069:4;;8098:2;8321:15;;;;8295:2;8280:18;;;8069:4;8364:169;8378:6;8375:1;8372:13;8364:169;;;8439:13;;8427:26;;8508:15;;;;8473:12;;;;8400:1;8393:9;8364:169;;;-1:-1:-1;8550:3:1;;7927:632;-1:-1:-1;;;;;;7927:632:1:o;8756:219::-;8905:2;8894:9;8887:21;8868:4;8925:44;8965:2;8954:9;8950:18;8942:6;8925:44;:::i;9392:414::-;9594:2;9576:21;;;9633:2;9613:18;;;9606:30;9672:34;9667:2;9652:18;;9645:62;-1:-1:-1;;;9738:2:1;9723:18;;9716:48;9796:3;9781:19;;9392:414::o;14526:356::-;14728:2;14710:21;;;14747:18;;;14740:30;14806:34;14801:2;14786:18;;14779:62;14873:2;14858:18;;14526:356::o;16460:413::-;16662:2;16644:21;;;16701:2;16681:18;;;16674:30;16740:34;16735:2;16720:18;;16713:62;-1:-1:-1;;;16806:2:1;16791:18;;16784:47;16863:3;16848:19;;16460:413::o;18189:275::-;18260:2;18254:9;18325:2;18306:13;;-1:-1:-1;;18302:27:1;18290:40;;18360:18;18345:34;;18381:22;;;18342:62;18339:88;;;18407:18;;:::i;:::-;18443:2;18436:22;18189:275;;-1:-1:-1;18189:275:1:o;18595:128::-;18635:3;18666:1;18662:6;18659:1;18656:13;18653:39;;;18672:18;;:::i;:::-;-1:-1:-1;18708:9:1;;18595:128::o;18728:120::-;18768:1;18794;18784:35;;18799:18;;:::i;:::-;-1:-1:-1;18833:9:1;;18728:120::o;18853:168::-;18893:7;18959:1;18955;18951:6;18947:14;18944:1;18941:21;18936:1;18929:9;18922:17;18918:45;18915:71;;;18966:18;;:::i;:::-;-1:-1:-1;19006:9:1;;18853:168::o;19026:125::-;19066:4;19094:1;19091;19088:8;19085:34;;;19099:18;;:::i;:::-;-1:-1:-1;19136:9:1;;19026:125::o;19156:258::-;19228:1;19238:113;19252:6;19249:1;19246:13;19238:113;;;19328:11;;;19322:18;19309:11;;;19302:39;19274:2;19267:10;19238:113;;;19369:6;19366:1;19363:13;19360:48;;;-1:-1:-1;;19404:1:1;19386:16;;19379:27;19156:258::o;19419:380::-;19498:1;19494:12;;;;19541;;;19562:61;;19616:4;19608:6;19604:17;19594:27;;19562:61;19669:2;19661:6;19658:14;19638:18;19635:38;19632:161;;;19715:10;19710:3;19706:20;19703:1;19696:31;19750:4;19747:1;19740:15;19778:4;19775:1;19768:15;19632:161;;19419:380;;;:::o;19804:135::-;19843:3;-1:-1:-1;;19864:17:1;;19861:43;;;19884:18;;:::i;:::-;-1:-1:-1;19931:1:1;19920:13;;19804:135::o;19944:112::-;19976:1;20002;19992:35;;20007:18;;:::i;:::-;-1:-1:-1;20041:9:1;;19944:112::o;20061:127::-;20122:10;20117:3;20113:20;20110:1;20103:31;20153:4;20150:1;20143:15;20177:4;20174:1;20167:15;20193:127;20254:10;20249:3;20245:20;20242:1;20235:31;20285:4;20282:1;20275:15;20309:4;20306:1;20299:15;20325:127;20386:10;20381:3;20377:20;20374:1;20367:31;20417:4;20414:1;20407:15;20441:4;20438:1;20431:15;20457:127;20518:10;20513:3;20509:20;20506:1;20499:31;20549:4;20546:1;20539:15;20573:4;20570:1;20563:15;20589:127;20650:10;20645:3;20641:20;20638:1;20631:31;20681:4;20678:1;20671:15;20705:4;20702:1;20695:15;20721:131;-1:-1:-1;;;;;20796:31:1;;20786:42;;20776:70;;20842:1;20839;20832:12;20857:131;-1:-1:-1;;;;;;20931:32:1;;20921:43;;20911:71;;20978:1;20975;20968:12

Swarm Source

ipfs://fd2839b1961fbf69c9fce4299867227a625d2f2cd7ba7ee8840d0c356b4dd5a7
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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