ETH Price: $3,435.12 (-1.47%)

Token

FroyoKittens (FroyoKitten)
 

Overview

Max Total Supply

10,000 FroyoKitten

Holders

3,068

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
13 FroyoKitten
0x6545c3f95c0fa51a0e4d9f7fc2f77dae133717e6
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

froyo kittens is a collection hand drawn and composed by jessie morii. The combination of a froyo kitten aesthetic was custom generated from 444 hand drawn traits, so each kitten is unique and made out of 100% love with sprinkles of cuteness!

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
FroyoKittens

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


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

pragma solidity ^0.8.0;

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

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

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (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);

    /**
     * @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: contracts/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 and Enumerable extensions
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
  using Address for address;
  using Strings for uint256;

  string private _name;
  string private _symbol;

  // nft ownership + burns data
  address[] public owners;
  uint public burnedTokens;

  function totalSupply() public override view returns (uint256) {
    return owners.length - burnedTokens;
  }

  function tokenByIndex(uint256 id) public override pure returns (uint256) {
    return id;
  }
  function tokenOfOwnerByIndex(address user, uint256 id) public override view returns (uint256) {
    uint256 ownedCount = 0;
    for(uint i = 0; i < owners.length; i++) {
      if(owners[i] == user) {
        if(ownedCount == id) {
          return i;
        } else {
          ownedCount++;
        }
      }
    }

    revert("ID_TOO_HIGH");
  }

  // 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");
    uint count;
    for(uint i = 0; i < owners.length; i++) {
      if(owner == owners[i]) {
        count++;
      }
    }
    return count;
  }

  /**
  * @dev See {IERC721-ownerOf}.
  */
  function ownerOf(uint256 tokenId) public view virtual override returns (address) {
    require(tokenId < owners.length, "ERC721: owner query for nonexistent token");
    address owner = owners[tokenId];
    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.length > tokenId && 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), "ALREADY_MINTED");

    owners.push(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);

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

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

    // delete owners[tokenId];
    owners[tokenId] = address(0);
    burnedTokens++;

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

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

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


// File: contracts/FroyoKittens.sol


pragma solidity ^0.8.6;





contract FroyoKittens is ERC721, Ownable {

  //---------------------------------------------------------------
  //  CONSTANTS
  //---------------------------------------------------------------
  uint256 public constant MAX_SUPPLY = 10000;
  uint256 public constant NFT_PRICE = 0.1 ether;
  uint256 public constant WHITELIST_PRICE = 0.1 ether;
  uint256 public mintStartTime;
  bool    public isRevealed;

  //---------------------------------------------------------------
  //  METADATA
  //---------------------------------------------------------------
  string public baseURI;
  string public coverURI;

  function tokenURI(uint256 id) public view virtual override returns (string memory) {
    require(_exists(id), "ERC721Metadata: URI query for nonexistent token");
    if(!isRevealed) {
      return coverURI;
    }

    return string(abi.encodePacked(baseURI, Strings.toString(id), ".json"));
  }

  //---------------------------------------------------------------
  //  CONSTRUCTOR
  //---------------------------------------------------------------

  constructor(string memory _coverURI) ERC721("FroyoKittens", "FroyoKitten") {
    coverURI = _coverURI;
    // Sunday, 10 April 2022 at 00:00 UTC
    mintStartTime = 1649563200;
  }

  function mint(uint256 amount) public payable {
    require(msg.value == (amount * NFT_PRICE), "WRONG_ETH_AMOUNT");
    require(owners.length + amount <= MAX_SUPPLY, "MAX_SUPPLY");
    require(block.timestamp >= mintStartTime, "NOT_LIVE");

    minters[msg.sender] += amount;
    require(minters[msg.sender] < 3, "ADDRESS_MAX_REACHED");
    for(uint256 i = 0; i < amount; i++) {
      _safeMint(msg.sender, owners.length);
    }
  }

  mapping (address => uint256) public minters;

  function burn(uint256 id) public {
    _burn(id);
  }

  //----------------------------------------------------------------
  //  WHITELISTS
  //----------------------------------------------------------------

  /// @dev - Merkle Tree root hash
  bytes32 public root;

  function setMerkleRoot(bytes32 merkleroot) public onlyOwner {
    root = merkleroot;
  }

  function premint(uint256 amount, bytes32[] calldata proof)
  external
  payable
  {
    address account = msg.sender;
    require(_verify(_leaf(account), proof), "INVALID_MERKLE_PROOF");
    require(msg.value == (amount * WHITELIST_PRICE), "WRONG_ETH_AMOUNT");
    require(owners.length + amount <= MAX_SUPPLY, "MAX_SUPPLY");

    minters[msg.sender] += amount;
    require(minters[account] < 3, "ADDRESS_MAX_REACHED");

    for(uint256 i = 0; i < amount; i++) {
      _safeMint(account, owners.length);
    }
  }

  function _leaf(address account)
  internal pure returns (bytes32)
  {
    return keccak256(abi.encodePacked(account));
  }

  function _verify(bytes32 leaf, bytes32[] memory proof)
  internal view returns (bool)
  {
    return MerkleProof.verify(proof, root, leaf);
  }

  //----------------------------------------------------------------
  //  ADMIN FUNCTIONS
  //----------------------------------------------------------------

  function setCoverURI(string memory uri) public onlyOwner {
    coverURI = uri;
  }
  function setBaseURI(string memory uri) public onlyOwner {
    baseURI = uri;
  }
  function setMintStartTime(uint256 _startTime) public onlyOwner {
    mintStartTime = _startTime;
  }
  function setIsRevealed(bool _isRevealed) public onlyOwner {
    isRevealed = _isRevealed;
  }

  //---------------------------------------------------------------
  // WITHDRAWAL
  //---------------------------------------------------------------

  function withdraw(address to, uint256 amount) public onlyOwner {
    (bool success,) = payable(to).call{ value: amount }("");
    require(success, "WITHDRAWAL_FAILED");
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_coverURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"coverURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"owners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"premint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setCoverURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isRevealed","type":"bool"}],"name":"setIsRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleroot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"setMintStartTime","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":"id","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162002861380380620028618339810160408190526200003491620001df565b604080518082018252600c81526b46726f796f4b697474656e7360a01b60208083019182528351808501909452600b84526a233937bcb7a5b4ba3a32b760a91b9084015281519192916200008b9160009162000139565b508051620000a190600190602084019062000139565b505050620000be620000b8620000e360201b60201c565b620000e7565b8051620000d390600a90602084019062000139565b505063625256406007556200030e565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200014790620002bb565b90600052602060002090601f0160209004810192826200016b5760008555620001b6565b82601f106200018657805160ff1916838001178555620001b6565b82800160010185558215620001b6579182015b82811115620001b657825182559160200191906001019062000199565b50620001c4929150620001c8565b5090565b5b80821115620001c45760008155600101620001c9565b60006020808385031215620001f357600080fd5b82516001600160401b03808211156200020b57600080fd5b818501915085601f8301126200022057600080fd5b815181811115620002355762000235620002f8565b604051601f8201601f19908116603f01168101908382118183101715620002605762000260620002f8565b8160405282815288868487010111156200027957600080fd5b600093505b828410156200029d57848401860151818501870152928501926200027e565b82841115620002af5760008684830101525b98975050505050505050565b600181811c90821680620002d057607f821691505b60208210811415620002f257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b612543806200031e6000396000f3fe6080604052600436106102305760003560e01c8063676dd5631161012e578063b88d4fde116100ab578063ebf0c7171161006f578063ebf0c71714610640578063ecd783c414610656578063f2fde38b14610676578063f3fef3a314610696578063f46eccc4146106b657600080fd5b8063b88d4fde14610584578063c87b56dd146105a4578063d5b3621b146105c4578063df341adf146105e4578063e985e9c5146105f757600080fd5b80638da5cb5b116100f25780638da5cb5b14610508578063931e2e491461052657806395d89b411461053c578063a0712d6814610551578063a22cb4651461056457600080fd5b8063676dd563146103065780636c0360eb1461049e57806370a08231146104b3578063715018a6146104d35780637cb64759146104e857600080fd5b806332cb6b0c116101bc5780634f6ccce7116101805780634f6ccce71461041157806354214f691461042f57806355f804b31461044957806358039706146104695780636352211e1461047e57600080fd5b806332cb6b0c1461038557806342842e0e1461039b57806342966c68146103bb57806347b5dd54146103db57806349a5980a146103f157600080fd5b8063095ea7b311610203578063095ea7b3146102e457806317e7f2951461030657806318160ddd1461033057806323b872dd146103455780632f745c591461036557600080fd5b806301ffc9a714610235578063025e7c271461026a57806306fdde03146102a2578063081812fc146102c4575b600080fd5b34801561024157600080fd5b5061025561025036600461201d565b6106e3565b60405190151581526020015b60405180910390f35b34801561027657600080fd5b5061028a610285366004612004565b610735565b6040516001600160a01b039091168152602001610261565b3480156102ae57600080fd5b506102b761075f565b604051610261919061225f565b3480156102d057600080fd5b5061028a6102df366004612004565b6107f1565b3480156102f057600080fd5b506103046102ff366004611fbf565b61087e565b005b34801561031257600080fd5b5061032267016345785d8a000081565b604051908152602001610261565b34801561033c57600080fd5b5061032261093e565b34801561035157600080fd5b50610304610360366004611edd565b610955565b34801561037157600080fd5b50610322610380366004611fbf565b610986565b34801561039157600080fd5b5061032261271081565b3480156103a757600080fd5b506103046103b6366004611edd565b610a35565b3480156103c757600080fd5b506103046103d6366004612004565b610a50565b3480156103e757600080fd5b5061032260035481565b3480156103fd57600080fd5b5061030461040c366004611fe9565b610a5c565b34801561041d57600080fd5b5061032261042c366004612004565b90565b34801561043b57600080fd5b506008546102559060ff1681565b34801561045557600080fd5b50610304610464366004612057565b610a99565b34801561047557600080fd5b506102b7610ada565b34801561048a57600080fd5b5061028a610499366004612004565b610b68565b3480156104aa57600080fd5b506102b7610bff565b3480156104bf57600080fd5b506103226104ce366004611e8f565b610c0c565b3480156104df57600080fd5b50610304610cde565b3480156104f457600080fd5b50610304610503366004612004565b610d14565b34801561051457600080fd5b506006546001600160a01b031661028a565b34801561053257600080fd5b5061032260075481565b34801561054857600080fd5b506102b7610d43565b61030461055f366004612004565b610d52565b34801561057057600080fd5b5061030461057f366004611f95565b610ed3565b34801561059057600080fd5b5061030461059f366004611f19565b610f98565b3480156105b057600080fd5b506102b76105bf366004612004565b610fd0565b3480156105d057600080fd5b506103046105df366004612004565b61110d565b6103046105f23660046120a0565b61113c565b34801561060357600080fd5b50610255610612366004611eaa565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561064c57600080fd5b50610322600c5481565b34801561066257600080fd5b50610304610671366004612057565b611353565b34801561068257600080fd5b50610304610691366004611e8f565b611390565b3480156106a257600080fd5b506103046106b1366004611fbf565b611428565b3480156106c257600080fd5b506103226106d1366004611e8f565b600b6020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b148061071457506001600160e01b03198216635b5e139f60e01b145b8061072f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6002818154811061074557600080fd5b6000918252602090912001546001600160a01b0316905081565b60606000805461076e90612435565b80601f016020809104026020016040519081016040528092919081815260200182805461079a90612435565b80156107e75780601f106107bc576101008083540402835291602001916107e7565b820191906000526020600020905b8154815290600101906020018083116107ca57829003601f168201915b5050505050905090565b60006107fc826114e9565b6108625760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061088982610b68565b9050806001600160a01b0316836001600160a01b031614156108f75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610859565b336001600160a01b038216148061091357506109138133610612565b61092f5760405162461bcd60e51b8152600401610859906122c4565b6109398383611533565b505050565b600354600254600091610950916123f2565b905090565b61095f33826115a1565b61097b5760405162461bcd60e51b815260040161085990612356565b61093983838361168b565b600080805b6002548110156109fe57846001600160a01b0316600282815481106109b2576109b26124cb565b6000918252602090912001546001600160a01b031614156109ec57838214156109de57915061072f9050565b816109e881612470565b9250505b806109f681612470565b91505061098b565b5060405162461bcd60e51b815260206004820152600b60248201526a09288bea89e9ebe90928e960ab1b6044820152606401610859565b61093983838360405180602001604052806000815250610f98565b610a59816117e1565b50565b6006546001600160a01b03163314610a865760405162461bcd60e51b815260040161085990612321565b6008805460ff1916911515919091179055565b6006546001600160a01b03163314610ac35760405162461bcd60e51b815260040161085990612321565b8051610ad6906009906020840190611d54565b5050565b600a8054610ae790612435565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1390612435565b8015610b605780601f10610b3557610100808354040283529160200191610b60565b820191906000526020600020905b815481529060010190602001808311610b4357829003601f168201915b505050505081565b6002546000908210610bce5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610859565b600060028381548110610be357610be36124cb565b6000918252602090912001546001600160a01b03169392505050565b60098054610ae790612435565b60006001600160a01b038216610c775760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610859565b6000805b600254811015610cd75760028181548110610c9857610c986124cb565b6000918252602090912001546001600160a01b0385811691161415610cc55781610cc181612470565b9250505b80610ccf81612470565b915050610c7b565b5092915050565b6006546001600160a01b03163314610d085760405162461bcd60e51b815260040161085990612321565b610d1260006118be565b565b6006546001600160a01b03163314610d3e5760405162461bcd60e51b815260040161085990612321565b600c55565b60606001805461076e90612435565b610d6467016345785d8a0000826123d3565b3414610da55760405162461bcd60e51b815260206004820152601060248201526f15d493d391d7d1551217d05353d5539560821b6044820152606401610859565b60025461271090610db79083906123a7565b1115610df25760405162461bcd60e51b815260206004820152600a6024820152694d41585f535550504c5960b01b6044820152606401610859565b600754421015610e2f5760405162461bcd60e51b81526020600482015260086024820152674e4f545f4c49564560c01b6044820152606401610859565b336000908152600b602052604081208054839290610e4e9084906123a7565b9091555050336000908152600b6020526040902054600311610ea85760405162461bcd60e51b8152602060048201526013602482015272105111149154d4d7d3505617d4915050d21151606a1b6044820152606401610859565b60005b81811015610ad657600254610ec1903390611910565b80610ecb81612470565b915050610eab565b6001600160a01b038216331415610f2c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610859565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610fa233836115a1565b610fbe5760405162461bcd60e51b815260040161085990612356565b610fca8484848461192a565b50505050565b6060610fdb826114e9565b61103f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610859565b60085460ff166110db57600a805461105690612435565b80601f016020809104026020016040519081016040528092919081815260200182805461108290612435565b80156110cf5780601f106110a4576101008083540402835291602001916110cf565b820191906000526020600020905b8154815290600101906020018083116110b257829003601f168201915b50505050509050919050565b60096110e68361195d565b6040516020016110f7929190612167565b6040516020818303038152906040529050919050565b6006546001600160a01b031633146111375760405162461bcd60e51b815260040161085990612321565b600755565b336111bc611183826040516bffffffffffffffffffffffff19606083901b166020820152600090603401604051602081830303815290604052805190602001209050919050565b848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611a5b92505050565b6111ff5760405162461bcd60e51b815260206004820152601460248201527324a72b20a624a22fa6a2a925a622afa82927a7a360611b6044820152606401610859565b61121167016345785d8a0000856123d3565b34146112525760405162461bcd60e51b815260206004820152601060248201526f15d493d391d7d1551217d05353d5539560821b6044820152606401610859565b600254612710906112649086906123a7565b111561129f5760405162461bcd60e51b815260206004820152600a6024820152694d41585f535550504c5960b01b6044820152606401610859565b336000908152600b6020526040812080548692906112be9084906123a7565b90915550506001600160a01b0381166000908152600b60205260409020546003116113215760405162461bcd60e51b8152602060048201526013602482015272105111149154d4d7d3505617d4915050d21151606a1b6044820152606401610859565b60005b8481101561134c5760025461133a908390611910565b8061134481612470565b915050611324565b5050505050565b6006546001600160a01b0316331461137d5760405162461bcd60e51b815260040161085990612321565b8051610ad690600a906020840190611d54565b6006546001600160a01b031633146113ba5760405162461bcd60e51b815260040161085990612321565b6001600160a01b03811661141f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610859565b610a59816118be565b6006546001600160a01b031633146114525760405162461bcd60e51b815260040161085990612321565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461149f576040519150601f19603f3d011682016040523d82523d6000602084013e6114a4565b606091505b50509050806109395760405162461bcd60e51b815260206004820152601160248201527015d2551211149055d05317d19052531151607a1b6044820152606401610859565b6002546000908210801561072f575060006001600160a01b031660028381548110611516576115166124cb565b6000918252602090912001546001600160a01b0316141592915050565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061156882610b68565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006115ac826114e9565b61160d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610859565b600061161883610b68565b9050806001600160a01b0316846001600160a01b031614806116535750836001600160a01b0316611648846107f1565b6001600160a01b0316145b8061168357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661169e82610b68565b6001600160a01b0316146117065760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610859565b6001600160a01b0382166117685760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610859565b611773600082611533565b8160028281548110611787576117876124cb565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b60006117ec82610b68565b9050336001600160a01b038216148061180a575061180a8133610612565b6118265760405162461bcd60e51b8152600401610859906122c4565b611831600083611533565b600060028381548110611846576118466124cb565b6000918252602082200180546001600160a01b0319166001600160a01b039390931692909217909155600380549161187d83612470565b909155505060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610ad6828260405180602001604052806000815250611a71565b61193584848461168b565b61194184848484611aa4565b610fca5760405162461bcd60e51b815260040161085990612272565b6060816119815750506040805180820190915260018152600360fc1b602082015290565b8160005b81156119ab578061199581612470565b91506119a49050600a836123bf565b9150611985565b60008167ffffffffffffffff8111156119c6576119c66124e1565b6040519080825280601f01601f1916602001820160405280156119f0576020820181803683370190505b5090505b841561168357611a056001836123f2565b9150611a12600a8661248b565b611a1d9060306123a7565b60f81b818381518110611a3257611a326124cb565b60200101906001600160f81b031916908160001a905350611a54600a866123bf565b94506119f4565b6000611a6a82600c5485611bb1565b9392505050565b611a7b8383611bc7565b611a886000848484611aa4565b6109395760405162461bcd60e51b815260040161085990612272565b60006001600160a01b0384163b15611ba657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ae8903390899088908890600401612222565b602060405180830381600087803b158015611b0257600080fd5b505af1925050508015611b32575060408051601f3d908101601f19168201909252611b2f9181019061203a565b60015b611b8c573d808015611b60576040519150601f19603f3d011682016040523d82523d6000602084013e611b65565b606091505b508051611b845760405162461bcd60e51b815260040161085990612272565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611683565b506001949350505050565b600082611bbe8584611ce0565b14949350505050565b6001600160a01b038216611c1d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610859565b611c26816114e9565b15611c645760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610859565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b8451811015611d4c576000858281518110611d0257611d026124cb565b60200260200101519050808311611d285760008381526020829052604090209250611d39565b600081815260208490526040902092505b5080611d4481612470565b915050611ce5565b509392505050565b828054611d6090612435565b90600052602060002090601f016020900481019282611d825760008555611dc8565b82601f10611d9b57805160ff1916838001178555611dc8565b82800160010185558215611dc8579182015b82811115611dc8578251825591602001919060010190611dad565b50611dd4929150611dd8565b5090565b5b80821115611dd45760008155600101611dd9565b600067ffffffffffffffff80841115611e0857611e086124e1565b604051601f8501601f19908116603f01168101908282118183101715611e3057611e306124e1565b81604052809350858152868686011115611e4957600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611e7a57600080fd5b919050565b80358015158114611e7a57600080fd5b600060208284031215611ea157600080fd5b611a6a82611e63565b60008060408385031215611ebd57600080fd5b611ec683611e63565b9150611ed460208401611e63565b90509250929050565b600080600060608486031215611ef257600080fd5b611efb84611e63565b9250611f0960208501611e63565b9150604084013590509250925092565b60008060008060808587031215611f2f57600080fd5b611f3885611e63565b9350611f4660208601611e63565b925060408501359150606085013567ffffffffffffffff811115611f6957600080fd5b8501601f81018713611f7a57600080fd5b611f8987823560208401611ded565b91505092959194509250565b60008060408385031215611fa857600080fd5b611fb183611e63565b9150611ed460208401611e7f565b60008060408385031215611fd257600080fd5b611fdb83611e63565b946020939093013593505050565b600060208284031215611ffb57600080fd5b611a6a82611e7f565b60006020828403121561201657600080fd5b5035919050565b60006020828403121561202f57600080fd5b8135611a6a816124f7565b60006020828403121561204c57600080fd5b8151611a6a816124f7565b60006020828403121561206957600080fd5b813567ffffffffffffffff81111561208057600080fd5b8201601f8101841361209157600080fd5b61168384823560208401611ded565b6000806000604084860312156120b557600080fd5b83359250602084013567ffffffffffffffff808211156120d457600080fd5b818601915086601f8301126120e857600080fd5b8135818111156120f757600080fd5b8760208260051b850101111561210c57600080fd5b6020830194508093505050509250925092565b60008151808452612137816020860160208601612409565b601f01601f19169290920160200192915050565b6000815161215d818560208601612409565b9290920192915050565b600080845481600182811c91508083168061218357607f831692505b60208084108214156121a357634e487b7160e01b86526022600452602486fd5b8180156121b757600181146121c8576121f5565b60ff198616895284890196506121f5565b60008b81526020902060005b868110156121ed5781548b8201529085019083016121d4565b505084890196505b505050505050612219612208828661214b565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906122559083018461211f565b9695505050505050565b602081526000611a6a602083018461211f565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156123ba576123ba61249f565b500190565b6000826123ce576123ce6124b5565b500490565b60008160001904831182151516156123ed576123ed61249f565b500290565b6000828210156124045761240461249f565b500390565b60005b8381101561242457818101518382015260200161240c565b83811115610fca5750506000910152565b600181811c9082168061244957607f821691505b6020821081141561246a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156124845761248461249f565b5060010190565b60008261249a5761249a6124b5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610a5957600080fdfea264697066735822122002f76a8281d02cb0d650d36088fd33b62cfa924cb48e1396e9d0ffce70f8fbd364736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102305760003560e01c8063676dd5631161012e578063b88d4fde116100ab578063ebf0c7171161006f578063ebf0c71714610640578063ecd783c414610656578063f2fde38b14610676578063f3fef3a314610696578063f46eccc4146106b657600080fd5b8063b88d4fde14610584578063c87b56dd146105a4578063d5b3621b146105c4578063df341adf146105e4578063e985e9c5146105f757600080fd5b80638da5cb5b116100f25780638da5cb5b14610508578063931e2e491461052657806395d89b411461053c578063a0712d6814610551578063a22cb4651461056457600080fd5b8063676dd563146103065780636c0360eb1461049e57806370a08231146104b3578063715018a6146104d35780637cb64759146104e857600080fd5b806332cb6b0c116101bc5780634f6ccce7116101805780634f6ccce71461041157806354214f691461042f57806355f804b31461044957806358039706146104695780636352211e1461047e57600080fd5b806332cb6b0c1461038557806342842e0e1461039b57806342966c68146103bb57806347b5dd54146103db57806349a5980a146103f157600080fd5b8063095ea7b311610203578063095ea7b3146102e457806317e7f2951461030657806318160ddd1461033057806323b872dd146103455780632f745c591461036557600080fd5b806301ffc9a714610235578063025e7c271461026a57806306fdde03146102a2578063081812fc146102c4575b600080fd5b34801561024157600080fd5b5061025561025036600461201d565b6106e3565b60405190151581526020015b60405180910390f35b34801561027657600080fd5b5061028a610285366004612004565b610735565b6040516001600160a01b039091168152602001610261565b3480156102ae57600080fd5b506102b761075f565b604051610261919061225f565b3480156102d057600080fd5b5061028a6102df366004612004565b6107f1565b3480156102f057600080fd5b506103046102ff366004611fbf565b61087e565b005b34801561031257600080fd5b5061032267016345785d8a000081565b604051908152602001610261565b34801561033c57600080fd5b5061032261093e565b34801561035157600080fd5b50610304610360366004611edd565b610955565b34801561037157600080fd5b50610322610380366004611fbf565b610986565b34801561039157600080fd5b5061032261271081565b3480156103a757600080fd5b506103046103b6366004611edd565b610a35565b3480156103c757600080fd5b506103046103d6366004612004565b610a50565b3480156103e757600080fd5b5061032260035481565b3480156103fd57600080fd5b5061030461040c366004611fe9565b610a5c565b34801561041d57600080fd5b5061032261042c366004612004565b90565b34801561043b57600080fd5b506008546102559060ff1681565b34801561045557600080fd5b50610304610464366004612057565b610a99565b34801561047557600080fd5b506102b7610ada565b34801561048a57600080fd5b5061028a610499366004612004565b610b68565b3480156104aa57600080fd5b506102b7610bff565b3480156104bf57600080fd5b506103226104ce366004611e8f565b610c0c565b3480156104df57600080fd5b50610304610cde565b3480156104f457600080fd5b50610304610503366004612004565b610d14565b34801561051457600080fd5b506006546001600160a01b031661028a565b34801561053257600080fd5b5061032260075481565b34801561054857600080fd5b506102b7610d43565b61030461055f366004612004565b610d52565b34801561057057600080fd5b5061030461057f366004611f95565b610ed3565b34801561059057600080fd5b5061030461059f366004611f19565b610f98565b3480156105b057600080fd5b506102b76105bf366004612004565b610fd0565b3480156105d057600080fd5b506103046105df366004612004565b61110d565b6103046105f23660046120a0565b61113c565b34801561060357600080fd5b50610255610612366004611eaa565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561064c57600080fd5b50610322600c5481565b34801561066257600080fd5b50610304610671366004612057565b611353565b34801561068257600080fd5b50610304610691366004611e8f565b611390565b3480156106a257600080fd5b506103046106b1366004611fbf565b611428565b3480156106c257600080fd5b506103226106d1366004611e8f565b600b6020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b148061071457506001600160e01b03198216635b5e139f60e01b145b8061072f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6002818154811061074557600080fd5b6000918252602090912001546001600160a01b0316905081565b60606000805461076e90612435565b80601f016020809104026020016040519081016040528092919081815260200182805461079a90612435565b80156107e75780601f106107bc576101008083540402835291602001916107e7565b820191906000526020600020905b8154815290600101906020018083116107ca57829003601f168201915b5050505050905090565b60006107fc826114e9565b6108625760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061088982610b68565b9050806001600160a01b0316836001600160a01b031614156108f75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610859565b336001600160a01b038216148061091357506109138133610612565b61092f5760405162461bcd60e51b8152600401610859906122c4565b6109398383611533565b505050565b600354600254600091610950916123f2565b905090565b61095f33826115a1565b61097b5760405162461bcd60e51b815260040161085990612356565b61093983838361168b565b600080805b6002548110156109fe57846001600160a01b0316600282815481106109b2576109b26124cb565b6000918252602090912001546001600160a01b031614156109ec57838214156109de57915061072f9050565b816109e881612470565b9250505b806109f681612470565b91505061098b565b5060405162461bcd60e51b815260206004820152600b60248201526a09288bea89e9ebe90928e960ab1b6044820152606401610859565b61093983838360405180602001604052806000815250610f98565b610a59816117e1565b50565b6006546001600160a01b03163314610a865760405162461bcd60e51b815260040161085990612321565b6008805460ff1916911515919091179055565b6006546001600160a01b03163314610ac35760405162461bcd60e51b815260040161085990612321565b8051610ad6906009906020840190611d54565b5050565b600a8054610ae790612435565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1390612435565b8015610b605780601f10610b3557610100808354040283529160200191610b60565b820191906000526020600020905b815481529060010190602001808311610b4357829003601f168201915b505050505081565b6002546000908210610bce5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610859565b600060028381548110610be357610be36124cb565b6000918252602090912001546001600160a01b03169392505050565b60098054610ae790612435565b60006001600160a01b038216610c775760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610859565b6000805b600254811015610cd75760028181548110610c9857610c986124cb565b6000918252602090912001546001600160a01b0385811691161415610cc55781610cc181612470565b9250505b80610ccf81612470565b915050610c7b565b5092915050565b6006546001600160a01b03163314610d085760405162461bcd60e51b815260040161085990612321565b610d1260006118be565b565b6006546001600160a01b03163314610d3e5760405162461bcd60e51b815260040161085990612321565b600c55565b60606001805461076e90612435565b610d6467016345785d8a0000826123d3565b3414610da55760405162461bcd60e51b815260206004820152601060248201526f15d493d391d7d1551217d05353d5539560821b6044820152606401610859565b60025461271090610db79083906123a7565b1115610df25760405162461bcd60e51b815260206004820152600a6024820152694d41585f535550504c5960b01b6044820152606401610859565b600754421015610e2f5760405162461bcd60e51b81526020600482015260086024820152674e4f545f4c49564560c01b6044820152606401610859565b336000908152600b602052604081208054839290610e4e9084906123a7565b9091555050336000908152600b6020526040902054600311610ea85760405162461bcd60e51b8152602060048201526013602482015272105111149154d4d7d3505617d4915050d21151606a1b6044820152606401610859565b60005b81811015610ad657600254610ec1903390611910565b80610ecb81612470565b915050610eab565b6001600160a01b038216331415610f2c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610859565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610fa233836115a1565b610fbe5760405162461bcd60e51b815260040161085990612356565b610fca8484848461192a565b50505050565b6060610fdb826114e9565b61103f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610859565b60085460ff166110db57600a805461105690612435565b80601f016020809104026020016040519081016040528092919081815260200182805461108290612435565b80156110cf5780601f106110a4576101008083540402835291602001916110cf565b820191906000526020600020905b8154815290600101906020018083116110b257829003601f168201915b50505050509050919050565b60096110e68361195d565b6040516020016110f7929190612167565b6040516020818303038152906040529050919050565b6006546001600160a01b031633146111375760405162461bcd60e51b815260040161085990612321565b600755565b336111bc611183826040516bffffffffffffffffffffffff19606083901b166020820152600090603401604051602081830303815290604052805190602001209050919050565b848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611a5b92505050565b6111ff5760405162461bcd60e51b815260206004820152601460248201527324a72b20a624a22fa6a2a925a622afa82927a7a360611b6044820152606401610859565b61121167016345785d8a0000856123d3565b34146112525760405162461bcd60e51b815260206004820152601060248201526f15d493d391d7d1551217d05353d5539560821b6044820152606401610859565b600254612710906112649086906123a7565b111561129f5760405162461bcd60e51b815260206004820152600a6024820152694d41585f535550504c5960b01b6044820152606401610859565b336000908152600b6020526040812080548692906112be9084906123a7565b90915550506001600160a01b0381166000908152600b60205260409020546003116113215760405162461bcd60e51b8152602060048201526013602482015272105111149154d4d7d3505617d4915050d21151606a1b6044820152606401610859565b60005b8481101561134c5760025461133a908390611910565b8061134481612470565b915050611324565b5050505050565b6006546001600160a01b0316331461137d5760405162461bcd60e51b815260040161085990612321565b8051610ad690600a906020840190611d54565b6006546001600160a01b031633146113ba5760405162461bcd60e51b815260040161085990612321565b6001600160a01b03811661141f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610859565b610a59816118be565b6006546001600160a01b031633146114525760405162461bcd60e51b815260040161085990612321565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461149f576040519150601f19603f3d011682016040523d82523d6000602084013e6114a4565b606091505b50509050806109395760405162461bcd60e51b815260206004820152601160248201527015d2551211149055d05317d19052531151607a1b6044820152606401610859565b6002546000908210801561072f575060006001600160a01b031660028381548110611516576115166124cb565b6000918252602090912001546001600160a01b0316141592915050565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061156882610b68565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006115ac826114e9565b61160d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610859565b600061161883610b68565b9050806001600160a01b0316846001600160a01b031614806116535750836001600160a01b0316611648846107f1565b6001600160a01b0316145b8061168357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661169e82610b68565b6001600160a01b0316146117065760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610859565b6001600160a01b0382166117685760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610859565b611773600082611533565b8160028281548110611787576117876124cb565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b60006117ec82610b68565b9050336001600160a01b038216148061180a575061180a8133610612565b6118265760405162461bcd60e51b8152600401610859906122c4565b611831600083611533565b600060028381548110611846576118466124cb565b6000918252602082200180546001600160a01b0319166001600160a01b039390931692909217909155600380549161187d83612470565b909155505060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610ad6828260405180602001604052806000815250611a71565b61193584848461168b565b61194184848484611aa4565b610fca5760405162461bcd60e51b815260040161085990612272565b6060816119815750506040805180820190915260018152600360fc1b602082015290565b8160005b81156119ab578061199581612470565b91506119a49050600a836123bf565b9150611985565b60008167ffffffffffffffff8111156119c6576119c66124e1565b6040519080825280601f01601f1916602001820160405280156119f0576020820181803683370190505b5090505b841561168357611a056001836123f2565b9150611a12600a8661248b565b611a1d9060306123a7565b60f81b818381518110611a3257611a326124cb565b60200101906001600160f81b031916908160001a905350611a54600a866123bf565b94506119f4565b6000611a6a82600c5485611bb1565b9392505050565b611a7b8383611bc7565b611a886000848484611aa4565b6109395760405162461bcd60e51b815260040161085990612272565b60006001600160a01b0384163b15611ba657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ae8903390899088908890600401612222565b602060405180830381600087803b158015611b0257600080fd5b505af1925050508015611b32575060408051601f3d908101601f19168201909252611b2f9181019061203a565b60015b611b8c573d808015611b60576040519150601f19603f3d011682016040523d82523d6000602084013e611b65565b606091505b508051611b845760405162461bcd60e51b815260040161085990612272565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611683565b506001949350505050565b600082611bbe8584611ce0565b14949350505050565b6001600160a01b038216611c1d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610859565b611c26816114e9565b15611c645760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610859565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b8451811015611d4c576000858281518110611d0257611d026124cb565b60200260200101519050808311611d285760008381526020829052604090209250611d39565b600081815260208490526040902092505b5080611d4481612470565b915050611ce5565b509392505050565b828054611d6090612435565b90600052602060002090601f016020900481019282611d825760008555611dc8565b82601f10611d9b57805160ff1916838001178555611dc8565b82800160010185558215611dc8579182015b82811115611dc8578251825591602001919060010190611dad565b50611dd4929150611dd8565b5090565b5b80821115611dd45760008155600101611dd9565b600067ffffffffffffffff80841115611e0857611e086124e1565b604051601f8501601f19908116603f01168101908282118183101715611e3057611e306124e1565b81604052809350858152868686011115611e4957600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611e7a57600080fd5b919050565b80358015158114611e7a57600080fd5b600060208284031215611ea157600080fd5b611a6a82611e63565b60008060408385031215611ebd57600080fd5b611ec683611e63565b9150611ed460208401611e63565b90509250929050565b600080600060608486031215611ef257600080fd5b611efb84611e63565b9250611f0960208501611e63565b9150604084013590509250925092565b60008060008060808587031215611f2f57600080fd5b611f3885611e63565b9350611f4660208601611e63565b925060408501359150606085013567ffffffffffffffff811115611f6957600080fd5b8501601f81018713611f7a57600080fd5b611f8987823560208401611ded565b91505092959194509250565b60008060408385031215611fa857600080fd5b611fb183611e63565b9150611ed460208401611e7f565b60008060408385031215611fd257600080fd5b611fdb83611e63565b946020939093013593505050565b600060208284031215611ffb57600080fd5b611a6a82611e7f565b60006020828403121561201657600080fd5b5035919050565b60006020828403121561202f57600080fd5b8135611a6a816124f7565b60006020828403121561204c57600080fd5b8151611a6a816124f7565b60006020828403121561206957600080fd5b813567ffffffffffffffff81111561208057600080fd5b8201601f8101841361209157600080fd5b61168384823560208401611ded565b6000806000604084860312156120b557600080fd5b83359250602084013567ffffffffffffffff808211156120d457600080fd5b818601915086601f8301126120e857600080fd5b8135818111156120f757600080fd5b8760208260051b850101111561210c57600080fd5b6020830194508093505050509250925092565b60008151808452612137816020860160208601612409565b601f01601f19169290920160200192915050565b6000815161215d818560208601612409565b9290920192915050565b600080845481600182811c91508083168061218357607f831692505b60208084108214156121a357634e487b7160e01b86526022600452602486fd5b8180156121b757600181146121c8576121f5565b60ff198616895284890196506121f5565b60008b81526020902060005b868110156121ed5781548b8201529085019083016121d4565b505084890196505b505050505050612219612208828661214b565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906122559083018461211f565b9695505050505050565b602081526000611a6a602083018461211f565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156123ba576123ba61249f565b500190565b6000826123ce576123ce6124b5565b500490565b60008160001904831182151516156123ed576123ed61249f565b500290565b6000828210156124045761240461249f565b500390565b60005b8381101561242457818101518382015260200161240c565b83811115610fca5750506000910152565b600181811c9082168061244957607f821691505b6020821081141561246a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156124845761248461249f565b5060010190565b60008261249a5761249a6124b5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610a5957600080fdfea264697066735822122002f76a8281d02cb0d650d36088fd33b62cfa924cb48e1396e9d0ffce70f8fbd364736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _coverURI (string):

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

38500:3862:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27798:279;;;;;;;;;;-1:-1:-1;27798:279:0;;;;;:::i;:::-;;:::i;:::-;;;8359:14:1;;8352:22;8334:41;;8322:2;8307:18;27798:279:0;;;;;;;;26651:23;;;;;;;;;;-1:-1:-1;26651:23:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7657:32:1;;;7639:51;;7627:2;7612:18;26651:23:0;7493:203:1;28785:94:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30224:211::-;;;;;;;;;;-1:-1:-1;30224:211:0;;;;;:::i;:::-;;:::i;29791:377::-;;;;;;;;;;-1:-1:-1;29791:377:0;;;;;:::i;:::-;;:::i;:::-;;38800:51;;;;;;;;;;;;38842:9;38800:51;;;;;8532:25:1;;;8520:2;8505:18;38800:51:0;8386:177:1;26710:110:0;;;;;;;;;;;;;:::i;31054:311::-;;;;;;;;;;-1:-1:-1;31054:311:0;;;;;:::i;:::-;;:::i;26925:360::-;;;;;;;;;;-1:-1:-1;26925:360:0;;;;;:::i;:::-;;:::i;38703:42::-;;;;;;;;;;;;38740:5;38703:42;;31426:165;;;;;;;;;;-1:-1:-1;31426:165:0;;;;;:::i;:::-;;:::i;40283:55::-;;;;;;;;;;-1:-1:-1;40283:55:0;;;;;:::i;:::-;;:::i;26679:24::-;;;;;;;;;;;;;;;;41926:95;;;;;;;;;;-1:-1:-1;41926:95:0;;;;;:::i;:::-;;:::i;26826:::-;;;;;;;;;;-1:-1:-1;26826:95:0;;;;;:::i;:::-;26913:2;26826:95;38889:25;;;;;;;;;;-1:-1:-1;38889:25:0;;;;;;;;41734:82;;;;;;;;;;-1:-1:-1;41734:82:0;;;;;:::i;:::-;;:::i;39101:22::-;;;;;;;;;;;;;:::i;28500:228::-;;;;;;;;;;-1:-1:-1;28500:228:0;;;;;:::i;:::-;;:::i;39075:21::-;;;;;;;;;;;;;:::i;28131:317::-;;;;;;;;;;-1:-1:-1;28131:317:0;;;;;:::i;:::-;;:::i;7119:103::-;;;;;;;;;;;;;:::i;40566:90::-;;;;;;;;;;-1:-1:-1;40566:90:0;;;;;:::i;:::-;;:::i;6468:87::-;;;;;;;;;;-1:-1:-1;6541:6:0;;-1:-1:-1;;;;;6541:6:0;6468:87;;38856:28;;;;;;;;;;;;;;;;28938:98;;;;;;;;;;;;;:::i;39786:441::-;;;;;;:::i;:::-;;:::i;30497:281::-;;;;;;;;;;-1:-1:-1;30497:281:0;;;;;:::i;:::-;;:::i;31652:300::-;;;;;;;;;;-1:-1:-1;31652:300:0;;;;;:::i;:::-;;:::i;39130:301::-;;;;;;;;;;-1:-1:-1;39130:301:0;;;;;:::i;:::-;;:::i;41820:102::-;;;;;;;;;;-1:-1:-1;41820:102:0;;;;;:::i;:::-;;:::i;40662:528::-;;;;;;:::i;:::-;;:::i;30839:158::-;;;;;;;;;;-1:-1:-1;30839:158:0;;;;;:::i;:::-;-1:-1:-1;;;;;30956:25:0;;;30936:4;30956:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30839:158;40540:19;;;;;;;;;;;;;;;;41646:84;;;;;;;;;;-1:-1:-1;41646:84:0;;;;;:::i;:::-;;:::i;7377:201::-;;;;;;;;;;-1:-1:-1;7377:201:0;;;;;:::i;:::-;;:::i;42184:175::-;;;;;;;;;;-1:-1:-1;42184:175:0;;;;;:::i;:::-;;:::i;40233:43::-;;;;;;;;;;-1:-1:-1;40233:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;27798:279;27900:4;-1:-1:-1;;;;;;27925:40:0;;-1:-1:-1;;;27925:40:0;;:99;;-1:-1:-1;;;;;;;27976:48:0;;-1:-1:-1;;;27976:48:0;27925:99;:146;;;-1:-1:-1;;;;;;;;;;19361:40:0;;;28035:36;27913:158;27798:279;-1:-1:-1;;27798:279:0:o;26651:23::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26651:23:0;;-1:-1:-1;26651:23:0;:::o;28785:94::-;28839:13;28868:5;28861:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28785:94;:::o;30224:211::-;30300:7;30324:16;30332:7;30324;:16::i;:::-;30316:73;;;;-1:-1:-1;;;30316:73:0;;13296:2:1;30316:73:0;;;13278:21:1;13335:2;13315:18;;;13308:30;13374:34;13354:18;;;13347:62;-1:-1:-1;;;13425:18:1;;;13418:42;13477:19;;30316:73:0;;;;;;;;;-1:-1:-1;30405:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30405:24:0;;30224:211::o;29791:377::-;29868:13;29884:23;29899:7;29884:14;:23::i;:::-;29868:39;;29928:5;-1:-1:-1;;;;;29922:11:0;:2;-1:-1:-1;;;;;29922:11:0;;;29914:57;;;;-1:-1:-1;;;29914:57:0;;15587:2:1;29914:57:0;;;15569:21:1;15626:2;15606:18;;;15599:30;15665:34;15645:18;;;15638:62;-1:-1:-1;;;15716:18:1;;;15709:31;15757:19;;29914:57:0;15385:397:1;29914:57:0;5272:10;-1:-1:-1;;;;;29996:21:0;;;;:62;;-1:-1:-1;30021:37:0;30038:5;5272:10;30839:158;:::i;30021:37::-;29980:152;;;;-1:-1:-1;;;29980:152:0;;;;;;;:::i;:::-;30141:21;30150:2;30154:7;30141:8;:21::i;:::-;29861:307;29791:377;;:::o;26710:110::-;26802:12;;26786:6;:13;26763:7;;26786:28;;;:::i;:::-;26779:35;;26710:110;:::o;31054:311::-;31227:41;5272:10;31260:7;31227:18;:41::i;:::-;31219:103;;;;-1:-1:-1;;;31219:103:0;;;;;;;:::i;:::-;31331:28;31341:4;31347:2;31351:7;31331:9;:28::i;26925:360::-;27010:7;;;27055:195;27075:6;:13;27071:17;;27055:195;;;27120:4;-1:-1:-1;;;;;27107:17:0;:6;27114:1;27107:9;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;27107:9:0;:17;27104:139;;;27154:2;27140:10;:16;27137:97;;;27178:1;-1:-1:-1;27171:8:0;;-1:-1:-1;27171:8:0;27137:97;27210:12;;;;:::i;:::-;;;;27137:97;27090:3;;;;:::i;:::-;;;;27055:195;;;-1:-1:-1;27258:21:0;;-1:-1:-1;;;27258:21:0;;16407:2:1;27258:21:0;;;16389::1;16446:2;16426:18;;;16419:30;-1:-1:-1;;;16465:18:1;;;16458:41;16516:18;;27258:21:0;16205:335:1;31426:165:0;31546:39;31563:4;31569:2;31573:7;31546:39;;;;;;;;;;;;:16;:39::i;40283:55::-;40323:9;40329:2;40323:5;:9::i;:::-;40283:55;:::o;41926:95::-;6541:6;;-1:-1:-1;;;;;6541:6:0;5272:10;6688:23;6680:68;;;;-1:-1:-1;;;6680:68:0;;;;;;;:::i;:::-;41991:10:::1;:24:::0;;-1:-1:-1;;41991:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;41926:95::o;41734:82::-;6541:6;;-1:-1:-1;;;;;6541:6:0;5272:10;6688:23;6680:68;;;;-1:-1:-1;;;6680:68:0;;;;;;;:::i;:::-;41797:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;;41734:82:::0;:::o;39101:22::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28500:228::-;28606:6;:13;28572:7;;28596:23;;28588:77;;;;-1:-1:-1;;;28588:77:0;;12525:2:1;28588:77:0;;;12507:21:1;12564:2;12544:18;;;12537:30;12603:34;12583:18;;;12576:62;-1:-1:-1;;;12654:18:1;;;12647:39;12703:19;;28588:77:0;12323:405:1;28588:77:0;28672:13;28688:6;28695:7;28688:15;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;28688:15:0;;28500:228;-1:-1:-1;;;28500:228:0:o;39075:21::-;;;;;;;:::i;28131:317::-;28203:7;-1:-1:-1;;;;;28227:19:0;;28219:74;;;;-1:-1:-1;;;28219:74:0;;12114:2:1;28219:74:0;;;12096:21:1;12153:2;12133:18;;;12126:30;12192:34;12172:18;;;12165:62;-1:-1:-1;;;12243:18:1;;;12236:40;12293:19;;28219:74:0;11912:406:1;28219:74:0;28300:10;;28317:107;28337:6;:13;28333:17;;28317:107;;;28378:6;28385:1;28378:9;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;28369:18:0;;;28378:9;;28369:18;28366:51;;;28400:7;;;;:::i;:::-;;;;28366:51;28352:3;;;;:::i;:::-;;;;28317:107;;;-1:-1:-1;28437:5:0;28131:317;-1:-1:-1;;28131:317:0:o;7119:103::-;6541:6;;-1:-1:-1;;;;;6541:6:0;5272:10;6688:23;6680:68;;;;-1:-1:-1;;;6680:68:0;;;;;;;:::i;:::-;7184:30:::1;7211:1;7184:18;:30::i;:::-;7119:103::o:0;40566:90::-;6541:6;;-1:-1:-1;;;;;6541:6:0;5272:10;6688:23;6680:68;;;;-1:-1:-1;;;6680:68:0;;;;;;;:::i;:::-;40633:4:::1;:17:::0;40566:90::o;28938:98::-;28994:13;29023:7;29016:14;;;;;:::i;39786:441::-;39860:18;38786:9;39860:6;:18;:::i;:::-;39846:9;:33;39838:62;;;;-1:-1:-1;;;39838:62:0;;14826:2:1;39838:62:0;;;14808:21:1;14865:2;14845:18;;;14838:30;-1:-1:-1;;;14884:18:1;;;14877:46;14940:18;;39838:62:0;14624:340:1;39838:62:0;39915:6;:13;38740:5;;39915:22;;39931:6;;39915:22;:::i;:::-;:36;;39907:59;;;;-1:-1:-1;;;39907:59:0;;16747:2:1;39907:59:0;;;16729:21:1;16786:2;16766:18;;;16759:30;-1:-1:-1;;;16805:18:1;;;16798:40;16855:18;;39907:59:0;16545:334:1;39907:59:0;40000:13;;39981:15;:32;;39973:53;;;;-1:-1:-1;;;39973:53:0;;17429:2:1;39973:53:0;;;17411:21:1;17468:1;17448:18;;;17441:29;-1:-1:-1;;;17486:18:1;;;17479:38;17534:18;;39973:53:0;17227:331:1;39973:53:0;40043:10;40035:19;;;;:7;:19;;;;;:29;;40058:6;;40035:19;:29;;40058:6;;40035:29;:::i;:::-;;;;-1:-1:-1;;40087:10:0;40079:19;;;;:7;:19;;;;;;40101:1;-1:-1:-1;40071:55:0;;;;-1:-1:-1;;;40071:55:0;;8994:2:1;40071:55:0;;;8976:21:1;9033:2;9013:18;;;9006:30;-1:-1:-1;;;9052:18:1;;;9045:49;9111:18;;40071:55:0;8792:343:1;40071:55:0;40137:9;40133:89;40156:6;40152:1;:10;40133:89;;;40200:6;:13;40178:36;;40188:10;;40178:9;:36::i;:::-;40164:3;;;;:::i;:::-;;;;40133:89;;30497:281;-1:-1:-1;;;;;30596:24:0;;5272:10;30596:24;;30588:62;;;;-1:-1:-1;;;30588:62:0;;10573:2:1;30588:62:0;;;10555:21:1;10612:2;10592:18;;;10585:30;10651:27;10631:18;;;10624:55;10696:18;;30588:62:0;10371:349:1;30588:62:0;5272:10;30659:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;30659:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;30659:53:0;;;;;;;;;;30724:48;;8334:41:1;;;30659:42:0;;5272:10;30724:48;;8307:18:1;30724:48:0;;;;;;;30497:281;;:::o;31652:300::-;31805:41;5272:10;31838:7;31805:18;:41::i;:::-;31797:103;;;;-1:-1:-1;;;31797:103:0;;;;;;;:::i;:::-;31907:39;31921:4;31927:2;31931:7;31940:5;31907:13;:39::i;:::-;31652:300;;;;:::o;39130:301::-;39198:13;39228:11;39236:2;39228:7;:11::i;:::-;39220:71;;;;-1:-1:-1;;;39220:71:0;;15171:2:1;39220:71:0;;;15153:21:1;15210:2;15190:18;;;15183:30;15249:34;15229:18;;;15222:62;-1:-1:-1;;;15300:18:1;;;15293:45;15355:19;;39220:71:0;14969:411:1;39220:71:0;39302:10;;;;39298:48;;39330:8;39323:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39130:301;;;:::o;39298:48::-;39385:7;39394:20;39411:2;39394:16;:20::i;:::-;39368:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39354:71;;39130:301;;;:::o;41820:102::-;6541:6;;-1:-1:-1;;;;;6541:6:0;5272:10;6688:23;6680:68;;;;-1:-1:-1;;;6680:68:0;;;;;;;:::i;:::-;41890:13:::1;:26:::0;41820:102::o;40662:528::-;40772:10;40797:30;40805:14;40772:10;41290:25;;-1:-1:-1;;5892:2:1;5888:15;;;5884:53;41290:25:0;;;5872:66:1;41254:7:0;;5954:12:1;;41290:25:0;;;;;;;;;;;;41280:36;;;;;;41273:43;;41196:126;;;;40805:14;40821:5;;40797:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40797:7:0;;-1:-1:-1;;;40797:30:0:i;:::-;40789:63;;;;-1:-1:-1;;;40789:63:0;;11340:2:1;40789:63:0;;;11322:21:1;11379:2;11359:18;;;11352:30;-1:-1:-1;;;11398:18:1;;;11391:50;11458:18;;40789:63:0;11138:344:1;40789:63:0;40881:24;38842:9;40881:6;:24;:::i;:::-;40867:9;:39;40859:68;;;;-1:-1:-1;;;40859:68:0;;14826:2:1;40859:68:0;;;14808:21:1;14865:2;14845:18;;;14838:30;-1:-1:-1;;;14884:18:1;;;14877:46;14940:18;;40859:68:0;14624:340:1;40859:68:0;40942:6;:13;38740:5;;40942:22;;40958:6;;40942:22;:::i;:::-;:36;;40934:59;;;;-1:-1:-1;;;40934:59:0;;16747:2:1;40934:59:0;;;16729:21:1;16786:2;16766:18;;;16759:30;-1:-1:-1;;;16805:18:1;;;16798:40;16855:18;;40934:59:0;16545:334:1;40934:59:0;41010:10;41002:19;;;;:7;:19;;;;;:29;;41025:6;;41002:19;:29;;41025:6;;41002:29;:::i;:::-;;;;-1:-1:-1;;;;;;;41046:16:0;;;;;;:7;:16;;;;;;41065:1;-1:-1:-1;41038:52:0;;;;-1:-1:-1;;;41038:52:0;;8994:2:1;41038:52:0;;;8976:21:1;9033:2;9013:18;;;9006:30;-1:-1:-1;;;9052:18:1;;;9045:49;9111:18;;41038:52:0;8792:343:1;41038:52:0;41103:9;41099:86;41122:6;41118:1;:10;41099:86;;;41163:6;:13;41144:33;;41154:7;;41144:9;:33::i;:::-;41130:3;;;;:::i;:::-;;;;41099:86;;;;40747:443;40662:528;;;:::o;41646:84::-;6541:6;;-1:-1:-1;;;;;6541:6:0;5272:10;6688:23;6680:68;;;;-1:-1:-1;;;6680:68:0;;;;;;;:::i;:::-;41710:14;;::::1;::::0;:8:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;7377:201::-:0;6541:6;;-1:-1:-1;;;;;6541:6:0;5272:10;6688:23;6680:68;;;;-1:-1:-1;;;6680:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7466:22:0;::::1;7458:73;;;::::0;-1:-1:-1;;;7458:73:0;;9761:2:1;7458:73:0::1;::::0;::::1;9743:21:1::0;9800:2;9780:18;;;9773:30;9839:34;9819:18;;;9812:62;-1:-1:-1;;;9890:18:1;;;9883:36;9936:19;;7458:73:0::1;9559:402:1::0;7458:73:0::1;7542:28;7561:8;7542:18;:28::i;42184:175::-:0;6541:6;;-1:-1:-1;;;;;6541:6:0;5272:10;6688:23;6680:68;;;;-1:-1:-1;;;6680:68:0;;;;;;;:::i;:::-;42255:12:::1;42280:2;-1:-1:-1::0;;;;;42272:16:0::1;42297:6;42272:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42254:55;;;42324:7;42316:37;;;::::0;-1:-1:-1;;;42316:37:0;;14070:2:1;42316:37:0::1;::::0;::::1;14052:21:1::0;14109:2;14089:18;;;14082:30;-1:-1:-1;;;14128:18:1;;;14121:47;14185:18;;42316:37:0::1;13868:341:1::0;33392:147:0;33477:6;:13;33457:4;;33477:23;-1:-1:-1;33477:56:0;;;;;33531:1;-1:-1:-1;;;;;33504:29:0;:6;33511:7;33504:15;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;33504:15:0;:29;;33470:63;33392:147;-1:-1:-1;;33392:147:0:o;37048:164::-;37119:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;37119:29:0;-1:-1:-1;;;;;37119:29:0;;;;;;;;:24;;37169:23;37119:24;37169:14;:23::i;:::-;-1:-1:-1;;;;;37160:46:0;;;;;;;;;;;37048:164;;:::o;33692:334::-;33785:4;33806:16;33814:7;33806;:16::i;:::-;33798:73;;;;-1:-1:-1;;;33798:73:0;;10927:2:1;33798:73:0;;;10909:21:1;10966:2;10946:18;;;10939:30;11005:34;10985:18;;;10978:62;-1:-1:-1;;;11056:18:1;;;11049:42;11108:19;;33798:73:0;10725:408:1;33798:73:0;33878:13;33894:23;33909:7;33894:14;:23::i;:::-;33878:39;;33943:5;-1:-1:-1;;;;;33932:16:0;:7;-1:-1:-1;;;;;33932:16:0;;:51;;;;33976:7;-1:-1:-1;;;;;33952:31:0;:20;33964:7;33952:11;:20::i;:::-;-1:-1:-1;;;;;33952:31:0;;33932:51;:87;;;-1:-1:-1;;;;;;30956:25:0;;;30936:4;30956:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;33987:32;33924:96;33692:334;-1:-1:-1;;;;33692:334:0:o;36517:425::-;36658:4;-1:-1:-1;;;;;36631:31:0;:23;36646:7;36631:14;:23::i;:::-;-1:-1:-1;;;;;36631:31:0;;36623:85;;;;-1:-1:-1;;;36623:85:0;;14416:2:1;36623:85:0;;;14398:21:1;14455:2;14435:18;;;14428:30;14494:34;14474:18;;;14467:62;-1:-1:-1;;;14545:18:1;;;14538:39;14594:19;;36623:85:0;14214:405:1;36623:85:0;-1:-1:-1;;;;;36723:16:0;;36715:65;;;;-1:-1:-1;;;36715:65:0;;10168:2:1;36715:65:0;;;10150:21:1;10207:2;10187:18;;;10180:30;10246:34;10226:18;;;10219:62;-1:-1:-1;;;10297:18:1;;;10290:34;10341:19;;36715:65:0;9966:400:1;36715:65:0;36837:29;36854:1;36858:7;36837:8;:29::i;:::-;36893:2;36875:6;36882:7;36875:15;;;;;;;;:::i;:::-;;;;;;;;;:20;;-1:-1:-1;;;;;;36875:20:0;-1:-1:-1;;;;;36875:20:0;;;;;;36909:27;;36928:7;;36909:27;;;;;;;;;;36875:15;36909:27;36517:425;;;:::o;35734:464::-;35790:13;35806:23;35821:7;35806:14;:23::i;:::-;35790:39;-1:-1:-1;5272:10:0;-1:-1:-1;;;;;35854:21:0;;;;:62;;-1:-1:-1;35879:37:0;35896:5;5272:10;30839:158;:::i;35879:37::-;35838:152;;;;-1:-1:-1;;;35838:152:0;;;;;;;:::i;:::-;36023:29;36040:1;36044:7;36023:8;:29::i;:::-;36119:1;36093:6;36100:7;36093:15;;;;;;;;:::i;:::-;;;;;;;;;:28;;-1:-1:-1;;;;;;36093:28:0;-1:-1:-1;;;;;36093:28:0;;;;;;;;;;;36128:12;:14;;;;;;:::i;:::-;;;;-1:-1:-1;;36156:36:0;;36184:7;;36180:1;;-1:-1:-1;;;;;36156:36:0;;;;;36180:1;;36156:36;35783:415;35734:464;:::o;7738:191::-;7831:6;;;-1:-1:-1;;;;;7848:17:0;;;-1:-1:-1;;;;;;7848:17:0;;;;;;;7881:40;;7831:6;;;7848:17;7831:6;;7881:40;;7812:16;;7881:40;7801:128;7738:191;:::o;34351:104::-;34423:26;34433:2;34437:7;34423:26;;;;;;;;;;;;:9;:26::i;32809:287::-;32944:28;32954:4;32960:2;32964:7;32944:9;:28::i;:::-;32987:48;33010:4;33016:2;33020:7;33029:5;32987:22;:48::i;:::-;32979:111;;;;-1:-1:-1;;;32979:111:0;;;;;;;:::i;2754:723::-;2810:13;3031:10;3027:53;;-1:-1:-1;;3058:10:0;;;;;;;;;;;;-1:-1:-1;;;3058:10:0;;;;;2754:723::o;3027:53::-;3105:5;3090:12;3146:78;3153:9;;3146:78;;3179:8;;;;:::i;:::-;;-1:-1:-1;3202:10:0;;-1:-1:-1;3210:2:0;3202:10;;:::i;:::-;;;3146:78;;;3234:19;3266:6;3256:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3256:17:0;;3234:39;;3284:154;3291:10;;3284:154;;3318:11;3328:1;3318:11;;:::i;:::-;;-1:-1:-1;3387:10:0;3395:2;3387:5;:10;:::i;:::-;3374:24;;:2;:24;:::i;:::-;3361:39;;3344:6;3351;3344:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;3344:56:0;;;;;;;;-1:-1:-1;3415:11:0;3424:2;3415:11;;:::i;:::-;;;3284:154;;41328:147;41409:4;41432:37;41451:5;41458:4;;41464;41432:18;:37::i;:::-;41425:44;41328:147;-1:-1:-1;;;41328:147:0:o;34671:281::-;34783:18;34789:2;34793:7;34783:5;:18::i;:::-;34824:54;34855:1;34859:2;34863:7;34872:5;34824:22;:54::i;:::-;34808:138;;;;-1:-1:-1;;;34808:138:0;;;;;;;:::i;37746:669::-;37883:4;-1:-1:-1;;;;;37900:13:0;;9464:19;:23;37896:514;;37930:72;;-1:-1:-1;;;37930:72:0;;-1:-1:-1;;;;;37930:36:0;;;;;:72;;5272:10;;37981:4;;37987:7;;37996:5;;37930:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37930:72:0;;;;;;;;-1:-1:-1;;37930:72:0;;;;;;;;;;;;:::i;:::-;;;37926:443;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38150:13:0;;38146:214;;38183:60;;-1:-1:-1;;;38183:60:0;;;;;;;:::i;38146:214::-;38328:6;38322:13;38313:6;38309:2;38305:15;38298:38;37926:443;-1:-1:-1;;;;;;38045:51:0;-1:-1:-1;;;38045:51:0;;-1:-1:-1;38038:58:0;;37896:514;-1:-1:-1;38398:4:0;37746:669;;;;;;:::o;923:190::-;1048:4;1101;1072:25;1085:5;1092:4;1072:12;:25::i;:::-;:33;;923:190;-1:-1:-1;;;;923:190:0:o;35267:255::-;-1:-1:-1;;;;;35343:16:0;;35335:61;;;;-1:-1:-1;;;35335:61:0;;12935:2:1;35335:61:0;;;12917:21:1;;;12954:18;;;12947:30;13013:34;12993:18;;;12986:62;13065:18;;35335:61:0;12733:356:1;35335:61:0;35412:16;35420:7;35412;:16::i;:::-;35411:17;35403:44;;;;-1:-1:-1;;;35403:44:0;;17086:2:1;35403:44:0;;;17068:21:1;17125:2;17105:18;;;17098:30;-1:-1:-1;;;17144:18:1;;;17137:44;17198:18;;35403:44:0;16884:338:1;35403:44:0;35456:6;:15;;;;;;;-1:-1:-1;35456:15:0;;;;;;;-1:-1:-1;;;;;;35456:15:0;-1:-1:-1;;;;;35456:15:0;;;;;;;;35483:33;;35508:7;;-1:-1:-1;35483:33:0;;-1:-1:-1;;35483:33:0;35267:255;;:::o;1475:675::-;1558:7;1601:4;1558:7;1616:497;1640:5;:12;1636:1;:16;1616:497;;;1674:20;1697:5;1703:1;1697:8;;;;;;;;:::i;:::-;;;;;;;1674:31;;1740:12;1724;:28;1720:382;;2226:13;2276:15;;;2312:4;2305:15;;;2359:4;2343:21;;1852:57;;1720:382;;;2226:13;2276:15;;;2312:4;2305:15;;;2359:4;2343:21;;2029:57;;1720:382;-1:-1:-1;1654:3:0;;;;:::i;:::-;;;;1616:497;;;-1:-1:-1;2130:12:0;1475:675;-1:-1:-1;;;1475:675:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:160::-;893:20;;949:13;;942:21;932:32;;922:60;;978:1;975;968:12;993:186;1052:6;1105:2;1093:9;1084:7;1080:23;1076:32;1073:52;;;1121:1;1118;1111:12;1073:52;1144:29;1163:9;1144:29;:::i;1184:260::-;1252:6;1260;1313:2;1301:9;1292:7;1288:23;1284:32;1281:52;;;1329:1;1326;1319:12;1281:52;1352:29;1371:9;1352:29;:::i;:::-;1342:39;;1400:38;1434:2;1423:9;1419:18;1400:38;:::i;:::-;1390:48;;1184:260;;;;;:::o;1449:328::-;1526:6;1534;1542;1595:2;1583:9;1574:7;1570:23;1566:32;1563:52;;;1611:1;1608;1601:12;1563:52;1634:29;1653:9;1634:29;:::i;:::-;1624:39;;1682:38;1716:2;1705:9;1701:18;1682:38;:::i;:::-;1672:48;;1767:2;1756:9;1752:18;1739:32;1729:42;;1449:328;;;;;:::o;1782:666::-;1877:6;1885;1893;1901;1954:3;1942:9;1933:7;1929:23;1925:33;1922:53;;;1971:1;1968;1961:12;1922:53;1994:29;2013:9;1994:29;:::i;:::-;1984:39;;2042:38;2076:2;2065:9;2061:18;2042:38;:::i;:::-;2032:48;;2127:2;2116:9;2112:18;2099:32;2089:42;;2182:2;2171:9;2167:18;2154:32;2209:18;2201:6;2198:30;2195:50;;;2241:1;2238;2231:12;2195:50;2264:22;;2317:4;2309:13;;2305:27;-1:-1:-1;2295:55:1;;2346:1;2343;2336:12;2295:55;2369:73;2434:7;2429:2;2416:16;2411:2;2407;2403:11;2369:73;:::i;:::-;2359:83;;;1782:666;;;;;;;:::o;2453:254::-;2518:6;2526;2579:2;2567:9;2558:7;2554:23;2550:32;2547:52;;;2595:1;2592;2585:12;2547:52;2618:29;2637:9;2618:29;:::i;:::-;2608:39;;2666:35;2697:2;2686:9;2682:18;2666:35;:::i;2712:254::-;2780:6;2788;2841:2;2829:9;2820:7;2816:23;2812:32;2809:52;;;2857:1;2854;2847:12;2809:52;2880:29;2899:9;2880:29;:::i;:::-;2870:39;2956:2;2941:18;;;;2928:32;;-1:-1:-1;;;2712:254:1:o;2971:180::-;3027:6;3080:2;3068:9;3059:7;3055:23;3051:32;3048:52;;;3096:1;3093;3086:12;3048:52;3119:26;3135:9;3119:26;:::i;3156:180::-;3215:6;3268:2;3256:9;3247:7;3243:23;3239:32;3236:52;;;3284:1;3281;3274:12;3236:52;-1:-1:-1;3307:23:1;;3156:180;-1:-1:-1;3156:180:1:o;3341:245::-;3399:6;3452:2;3440:9;3431:7;3427:23;3423:32;3420:52;;;3468:1;3465;3458:12;3420:52;3507:9;3494:23;3526:30;3550:5;3526:30;:::i;3591:249::-;3660:6;3713:2;3701:9;3692:7;3688:23;3684:32;3681:52;;;3729:1;3726;3719:12;3681:52;3761:9;3755:16;3780:30;3804:5;3780:30;:::i;3845:450::-;3914:6;3967:2;3955:9;3946:7;3942:23;3938:32;3935:52;;;3983:1;3980;3973:12;3935:52;4023:9;4010:23;4056:18;4048:6;4045:30;4042:50;;;4088:1;4085;4078:12;4042:50;4111:22;;4164:4;4156:13;;4152:27;-1:-1:-1;4142:55:1;;4193:1;4190;4183:12;4142:55;4216:73;4281:7;4276:2;4263:16;4258:2;4254;4250:11;4216:73;:::i;4485:683::-;4580:6;4588;4596;4649:2;4637:9;4628:7;4624:23;4620:32;4617:52;;;4665:1;4662;4655:12;4617:52;4701:9;4688:23;4678:33;;4762:2;4751:9;4747:18;4734:32;4785:18;4826:2;4818:6;4815:14;4812:34;;;4842:1;4839;4832:12;4812:34;4880:6;4869:9;4865:22;4855:32;;4925:7;4918:4;4914:2;4910:13;4906:27;4896:55;;4947:1;4944;4937:12;4896:55;4987:2;4974:16;5013:2;5005:6;5002:14;4999:34;;;5029:1;5026;5019:12;4999:34;5082:7;5077:2;5067:6;5064:1;5060:14;5056:2;5052:23;5048:32;5045:45;5042:65;;;5103:1;5100;5093:12;5042:65;5134:2;5130;5126:11;5116:21;;5156:6;5146:16;;;;;4485:683;;;;;:::o;5173:257::-;5214:3;5252:5;5246:12;5279:6;5274:3;5267:19;5295:63;5351:6;5344:4;5339:3;5335:14;5328:4;5321:5;5317:16;5295:63;:::i;:::-;5412:2;5391:15;-1:-1:-1;;5387:29:1;5378:39;;;;5419:4;5374:50;;5173:257;-1:-1:-1;;5173:257:1:o;5435:185::-;5477:3;5515:5;5509:12;5530:52;5575:6;5570:3;5563:4;5556:5;5552:16;5530:52;:::i;:::-;5598:16;;;;;5435:185;-1:-1:-1;;5435:185:1:o;5977:1301::-;6254:3;6283:1;6316:6;6310:13;6346:3;6368:1;6396:9;6392:2;6388:18;6378:28;;6456:2;6445:9;6441:18;6478;6468:61;;6522:4;6514:6;6510:17;6500:27;;6468:61;6548:2;6596;6588:6;6585:14;6565:18;6562:38;6559:165;;;-1:-1:-1;;;6623:33:1;;6679:4;6676:1;6669:15;6709:4;6630:3;6697:17;6559:165;6740:18;6767:104;;;;6885:1;6880:320;;;;6733:467;;6767:104;-1:-1:-1;;6800:24:1;;6788:37;;6845:16;;;;-1:-1:-1;6767:104:1;;6880:320;17818:1;17811:14;;;17855:4;17842:18;;6975:1;6989:165;7003:6;7000:1;6997:13;6989:165;;;7081:14;;7068:11;;;7061:35;7124:16;;;;7018:10;;6989:165;;;6993:3;;7183:6;7178:3;7174:16;7167:23;;6733:467;;;;;;;7216:56;7241:30;7267:3;7259:6;7241:30;:::i;:::-;-1:-1:-1;;;5685:20:1;;5730:1;5721:11;;5625:113;7216:56;7209:63;5977:1301;-1:-1:-1;;;;;5977:1301:1:o;7701:488::-;-1:-1:-1;;;;;7970:15:1;;;7952:34;;8022:15;;8017:2;8002:18;;7995:43;8069:2;8054:18;;8047:34;;;8117:3;8112:2;8097:18;;8090:31;;;7895:4;;8138:45;;8163:19;;8155:6;8138:45;:::i;:::-;8130:53;7701:488;-1:-1:-1;;;;;;7701:488:1:o;8568:219::-;8717:2;8706:9;8699:21;8680:4;8737:44;8777:2;8766:9;8762:18;8754:6;8737:44;:::i;9140:414::-;9342:2;9324:21;;;9381:2;9361:18;;;9354:30;9420:34;9415:2;9400:18;;9393:62;-1:-1:-1;;;9486:2:1;9471:18;;9464:48;9544:3;9529:19;;9140:414::o;11487:420::-;11689:2;11671:21;;;11728:2;11708:18;;;11701:30;11767:34;11762:2;11747:18;;11740:62;11838:26;11833:2;11818:18;;11811:54;11897:3;11882:19;;11487:420::o;13507:356::-;13709:2;13691:21;;;13728:18;;;13721:30;13787:34;13782:2;13767:18;;13760:62;13854:2;13839:18;;13507:356::o;15787:413::-;15989:2;15971:21;;;16028:2;16008:18;;;16001:30;16067:34;16062:2;16047:18;;16040:62;-1:-1:-1;;;16133:2:1;16118:18;;16111:47;16190:3;16175:19;;15787:413::o;17871:128::-;17911:3;17942:1;17938:6;17935:1;17932:13;17929:39;;;17948:18;;:::i;:::-;-1:-1:-1;17984:9:1;;17871:128::o;18004:120::-;18044:1;18070;18060:35;;18075:18;;:::i;:::-;-1:-1:-1;18109:9:1;;18004:120::o;18129:168::-;18169:7;18235:1;18231;18227:6;18223:14;18220:1;18217:21;18212:1;18205:9;18198:17;18194:45;18191:71;;;18242:18;;:::i;:::-;-1:-1:-1;18282:9:1;;18129:168::o;18302:125::-;18342:4;18370:1;18367;18364:8;18361:34;;;18375:18;;:::i;:::-;-1:-1:-1;18412:9:1;;18302:125::o;18432:258::-;18504:1;18514:113;18528:6;18525:1;18522:13;18514:113;;;18604:11;;;18598:18;18585:11;;;18578:39;18550:2;18543:10;18514:113;;;18645:6;18642:1;18639:13;18636:48;;;-1:-1:-1;;18680:1:1;18662:16;;18655:27;18432:258::o;18695:380::-;18774:1;18770:12;;;;18817;;;18838:61;;18892:4;18884:6;18880:17;18870:27;;18838:61;18945:2;18937:6;18934:14;18914:18;18911:38;18908:161;;;18991:10;18986:3;18982:20;18979:1;18972:31;19026:4;19023:1;19016:15;19054:4;19051:1;19044:15;18908:161;;18695:380;;;:::o;19080:135::-;19119:3;-1:-1:-1;;19140:17:1;;19137:43;;;19160:18;;:::i;:::-;-1:-1:-1;19207:1:1;19196:13;;19080:135::o;19220:112::-;19252:1;19278;19268:35;;19283:18;;:::i;:::-;-1:-1:-1;19317:9:1;;19220:112::o;19337:127::-;19398:10;19393:3;19389:20;19386:1;19379:31;19429:4;19426:1;19419:15;19453:4;19450:1;19443:15;19469:127;19530:10;19525:3;19521:20;19518:1;19511:31;19561:4;19558:1;19551:15;19585:4;19582:1;19575:15;19601:127;19662:10;19657:3;19653:20;19650:1;19643:31;19693:4;19690:1;19683:15;19717:4;19714:1;19707:15;19733:127;19794:10;19789:3;19785:20;19782:1;19775:31;19825:4;19822:1;19815:15;19849:4;19846:1;19839:15;19865:131;-1:-1:-1;;;;;;19939:32:1;;19929:43;;19919:71;;19986:1;19983;19976:12

Swarm Source

ipfs://02f76a8281d02cb0d650d36088fd33b62cfa924cb48e1396e9d0ffce70f8fbd3
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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