ETH Price: $2,637.15 (+0.61%)

Token

AstroMallows (AstroMallows)
 

Overview

Max Total Supply

136 AstroMallows

Holders

23

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
bolara.eth
Balance
2 AstroMallows
0x754546a93304602561140fb112c896bc0345D5bD
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
AstroMallows

Compiler Version
v0.8.4+commit.c7e474f2

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-27
*/

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


// OpenZeppelin Contracts (last updated v4.6.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.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
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 Merkle 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 (last updated v4.6.0) (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 `IERC721Receiver.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 (last updated v4.6.0) (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`.
     *
     * 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;

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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);
}

// 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: @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: contracts/ERC721A.sol


// Creator: Chiru Labs

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 extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        revert('ERC721A: unable to get token of owner by index');
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @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 override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, 'ERC721A: approval to current owner');

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: 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 override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: 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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        require(quantity != 0, 'ERC721A: quantity must be greater than 0');

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    require(
                        _checkOnERC721Received(address(0), to, updatedIndex, _data),
                        'ERC721A: transfer to non ERC721Receiver implementer'
                    );
                }

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, 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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert('ERC721A: transfer to non ERC721Receiver implementer');
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}
// File: contracts/AstroMallows.sol


pragma solidity ^0.8.4;





contract AstroMallows is ERC721A, Ownable {
    using Strings for uint256;

    //----- VARIABLES -----
    uint256 public constant MAX_SUPPLY = 4444; 
    uint256 public constant MAX_PER_WL = 2;  
    uint256 public constant MAX_PER_TX = 3;
    uint256 public constant PRICE_WL = 0.06 ether; 
    uint256 public constant PRICE_PUBLIC = 0.09 ether; 

    bool public isPublicSaleActive = false;

    string private _baseTokenURI;

    uint256 private _reservedSupply = 200;
    mapping(address => uint256) private _whitelistClaimed;
    bytes32 private _merkleRoot;

    address private constant _a1 = 0xA302249fE90E51F259C391763FBc6D2B44256df6;
    address private constant _a2 = 0xCC765e1409B5E6648B58fAD73754D62C5D84dcF6;

    //----- MODIFIERS -----
    modifier onlyEOA() {
        require(tx.origin == msg.sender, "No mass minting contracts.");
        _;
    }

    //----- CONSTRUCTOR -----
    constructor() ERC721A("AstroMallows", "AstroMallows") {}

    //----- MINT FUNCTIONS -----
    function mintWhitelist(bytes32[] calldata _merkleProof, uint256 quantity) external payable onlyEOA {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(_merkleProof, _merkleRoot, leaf), "Wallet is not eligible for whitelist");   
        require(quantity > 0, "Quantity cannot be zero");
        require(quantity <= MAX_PER_WL, "Quantity exceeds max quantity per transaction");
        require(totalSupply() + quantity <= MAX_SUPPLY, "Quantity exceeds maximum supply");
        require(_whitelistClaimed[msg.sender] + quantity <= MAX_PER_WL, "Quantity exceeds max quantity per wallet"); 
        require(PRICE_WL * quantity == msg.value, "Invalid ETH amount provided");

        _whitelistClaimed[msg.sender] += quantity;
        _safeMint(msg.sender, quantity);
    }

    function mintPublic(uint256 quantity) external payable onlyEOA {
        require(isPublicSaleActive, "Public sale is not active");
        require(quantity > 0, "Quantity cannot be zero");
        require(quantity <= MAX_PER_TX, "Quantity exceeds max quantity per transaction");
        require(totalSupply() + quantity <= MAX_SUPPLY, "Quantity exceeds maximum public supply");
        require(PRICE_PUBLIC * quantity == msg.value, "Invalid ETH amount provided");

        _safeMint(msg.sender, quantity);
    }

    function mintReserved(uint256 quantity) external onlyOwner {
        require(quantity <= _reservedSupply);
        require(totalSupply() + quantity <= MAX_SUPPLY, "Quantity exceeds maximum supply");

        _reservedSupply -= quantity;
        _safeMint(msg.sender, quantity);
    }

    //----- TOKEN URI FUNCTIONS-----
    function setBaseTokenURI(string calldata URI) external onlyOwner {
        _baseTokenURI = URI;    }
    
    function _baseURI() internal view override returns (string memory) {
        return _baseTokenURI;
    }

    function baseTokenURI() public view returns (string memory) {
        return _baseTokenURI;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        return super.tokenURI(tokenId);
    }


    //----- OTHER FUNCTIONS -----
    function isWhitelistSaleActive() external view returns (bool) {
        return (_merkleRoot != "");
    }

    function togglePublic() external onlyOwner {
        isPublicSaleActive = !isPublicSaleActive;
    }

    function countClaimedWhitelist(address addr) external view returns (uint256) {
        require(addr != address(0), "Null Address");
        return _whitelistClaimed[addr];
    }

    function setMerkleRoot(bytes32 rootHash) external onlyOwner {
        _merkleRoot = rootHash;
    }

    //----- WITHDRAW -----
    function withdraw() external onlyOwner {
        uint _a1amount = address(this).balance * 90/100;
        uint _a2amount = address(this).balance * 10/100;
       

        require(payable(_a1).send(_a1amount), "Failed to send to a1");
        require(payable(_a2).send(_a2amount), "Failed to send to a2");
    }    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_WL","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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"countClaimedWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"rootHash","type":"bytes32"}],"name":"setMerkleRoot","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":[],"name":"togglePublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526007805460ff60a01b1916905560c86009553480156200002357600080fd5b50604080518082018252600c8082526b417374726f4d616c6c6f777360a01b6020808401828152855180870190965292855284015281519192916200006b91600191620000fa565b50805162000081906002906020840190620000fa565b5050506200009e62000098620000a460201b60201c565b620000a8565b620001dd565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200010890620001a0565b90600052602060002090601f0160209004810192826200012c576000855562000177565b82601f106200014757805160ff191683800117855562000177565b8280016001018555821562000177579182015b82811115620001775782518255916020019190600101906200015a565b506200018592915062000189565b5090565b5b808211156200018557600081556001016200018a565b600181811c90821680620001b557607f821691505b60208210811415620001d757634e487b7160e01b600052602260045260246000fd5b50919050565b6125f680620001ed6000396000f3fe6080604052600436106102045760003560e01c80637cb6475911610118578063b3957bc9116100a0578063d547cfb71161006f578063d547cfb714610598578063e985e9c5146105ad578063efd0cbf9146105f6578063f2fde38b14610609578063f43a22dc1461062957600080fd5b8063b3957bc91461052c578063b88d4fde14610541578063b98451cf14610561578063c87b56dd1461057857600080fd5b8063981d8771116100e7578063981d8771146104a85780639a5d140b146104bd578063a22cb465146104dd578063a56d7730146104fd578063a6d612f91461051957600080fd5b80637cb647591461043a578063801613591461045a5780638da5cb5b1461047557806395d89b411461049357600080fd5b806330176e131161019b5780634f6ccce71161016a5780634f6ccce7146103a55780636352211e146103c557806370188965146103e557806370a0823114610405578063715018a61461042557600080fd5b806330176e131461033a57806332cb6b0c1461035a5780633ccfd60b1461037057806342842e0e1461038557600080fd5b806318160ddd116101d757806318160ddd146102ba5780631e84c413146102d957806323b872dd146102fa5780632f745c591461031a57600080fd5b806301ffc9a71461020957806306fdde031461023e578063081812fc14610260578063095ea7b314610298575b600080fd5b34801561021557600080fd5b5061022961022436600461224b565b61063e565b60405190151581526020015b60405180910390f35b34801561024a57600080fd5b506102536106ab565b6040516102359190612388565b34801561026c57600080fd5b5061028061027b366004612233565b61073d565b6040516001600160a01b039091168152602001610235565b3480156102a457600080fd5b506102b86102b3366004612194565b6107cd565b005b3480156102c657600080fd5b506000545b604051908152602001610235565b3480156102e557600080fd5b5060075461022990600160a01b900460ff1681565b34801561030657600080fd5b506102b861031536600461204a565b6108e5565b34801561032657600080fd5b506102cb610335366004612194565b6108f0565b34801561034657600080fd5b506102b8610355366004612283565b610a4d565b34801561036657600080fd5b506102cb61115c81565b34801561037c57600080fd5b506102b8610a83565b34801561039157600080fd5b506102b86103a036600461204a565b610bce565b3480156103b157600080fd5b506102cb6103c0366004612233565b610be9565b3480156103d157600080fd5b506102806103e0366004612233565b610c4b565b3480156103f157600080fd5b506102cb610400366004611ffe565b610c5d565b34801561041157600080fd5b506102cb610420366004611ffe565b610cc0565b34801561043157600080fd5b506102b8610d51565b34801561044657600080fd5b506102b8610455366004612233565b610d87565b34801561046657600080fd5b506102cb66d529ae9e86000081565b34801561048157600080fd5b506007546001600160a01b0316610280565b34801561049f57600080fd5b50610253610db6565b3480156104b457600080fd5b506102b8610dc5565b3480156104c957600080fd5b506102b86104d8366004612233565b610e10565b3480156104e957600080fd5b506102b86104f836600461215a565b610ed3565b34801561050957600080fd5b506102cb67013fbe85edc9000081565b6102b86105273660046121bd565b610f98565b34801561053857600080fd5b506102cb600281565b34801561054d57600080fd5b506102b861055c366004612085565b61129a565b34801561056d57600080fd5b50600b541515610229565b34801561058457600080fd5b50610253610593366004612233565b6112cd565b3480156105a457600080fd5b506102536112d8565b3480156105b957600080fd5b506102296105c8366004612018565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6102b8610604366004612233565b6112e7565b34801561061557600080fd5b506102b8610624366004611ffe565b6114d8565b34801561063557600080fd5b506102cb600381565b60006001600160e01b031982166380ac58cd60e01b148061066f57506001600160e01b03198216635b5e139f60e01b145b8061068a57506001600160e01b0319821663780e9d6360e01b145b806106a557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546106ba906124fe565b80601f01602080910402602001604051908101604052809291908181526020018280546106e6906124fe565b80156107335780601f1061070857610100808354040283529160200191610733565b820191906000526020600020905b81548152906001019060200180831161071657829003601f168201915b5050505050905090565b600061074a826000541190565b6107b15760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006107d882610c4b565b9050806001600160a01b0316836001600160a01b031614156108475760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016107a8565b336001600160a01b0382161480610863575061086381336105c8565b6108d55760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016107a8565b6108e0838383611570565b505050565b6108e08383836115cc565b60006108fb83610cc0565b82106109545760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016107a8565b600080549080805b838110156109ed576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff1691830191909152156109af57805192505b876001600160a01b0316836001600160a01b031614156109e457868414156109dd575093506106a592505050565b6001909301925b5060010161095c565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016107a8565b6007546001600160a01b03163314610a775760405162461bcd60e51b81526004016107a8906123e8565b6108e060088383611f52565b6007546001600160a01b03163314610aad5760405162461bcd60e51b81526004016107a8906123e8565b60006064610abc47605a61249c565b610ac69190612488565b905060006064610ad747600a61249c565b610ae19190612488565b60405190915073a302249fe90e51f259c391763fbc6d2b44256df69083156108fc029084906000818181858888f19350505050610b575760405162461bcd60e51b81526020600482015260146024820152734661696c656420746f2073656e6420746f20613160601b60448201526064016107a8565b60405173cc765e1409b5e6648b58fad73754d62c5d84dcf69082156108fc029083906000818181858888f19350505050610bca5760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b732103a3790309960611b60448201526064016107a8565b5050565b6108e08383836040518060200160405280600081525061129a565b600080548210610c475760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016107a8565b5090565b6000610c56826118b1565b5192915050565b60006001600160a01b038216610ca45760405162461bcd60e51b815260206004820152600c60248201526b4e756c6c204164647265737360a01b60448201526064016107a8565b506001600160a01b03166000908152600a602052604090205490565b60006001600160a01b038216610d2c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016107a8565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b03163314610d7b5760405162461bcd60e51b81526004016107a8906123e8565b610d856000611988565b565b6007546001600160a01b03163314610db15760405162461bcd60e51b81526004016107a8906123e8565b600b55565b6060600280546106ba906124fe565b6007546001600160a01b03163314610def5760405162461bcd60e51b81526004016107a8906123e8565b6007805460ff60a01b198116600160a01b9182900460ff1615909102179055565b6007546001600160a01b03163314610e3a5760405162461bcd60e51b81526004016107a8906123e8565b600954811115610e4957600080fd5b61115c81610e5660005490565b610e609190612470565b1115610eae5760405162461bcd60e51b815260206004820152601f60248201527f5175616e746974792065786365656473206d6178696d756d20737570706c790060448201526064016107a8565b8060096000828254610ec091906124bb565b90915550610ed0905033826119da565b50565b6001600160a01b038216331415610f2c5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016107a8565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b323314610fe75760405162461bcd60e51b815260206004820152601a60248201527f4e6f206d617373206d696e74696e6720636f6e7472616374732e00000000000060448201526064016107a8565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061106184848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600b5491508490506119f4565b6110b95760405162461bcd60e51b8152602060048201526024808201527f57616c6c6574206973206e6f7420656c696769626c6520666f722077686974656044820152631b1a5cdd60e21b60648201526084016107a8565b600082116111035760405162461bcd60e51b81526020600482015260176024820152765175616e746974792063616e6e6f74206265207a65726f60481b60448201526064016107a8565b60028211156111245760405162461bcd60e51b81526004016107a89061239b565b61115c8261113160005490565b61113b9190612470565b11156111895760405162461bcd60e51b815260206004820152601f60248201527f5175616e746974792065786365656473206d6178696d756d20737570706c790060448201526064016107a8565b336000908152600a60205260409020546002906111a7908490612470565b11156112065760405162461bcd60e51b815260206004820152602860248201527f5175616e746974792065786365656473206d6178207175616e746974792070656044820152671c881dd85b1b195d60c21b60648201526084016107a8565b346112188366d529ae9e86000061249c565b146112655760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642045544820616d6f756e742070726f7669646564000000000060448201526064016107a8565b336000908152600a602052604081208054849290611284908490612470565b90915550611294905033836119da565b50505050565b6112a58484846115cc565b6112b184848484611a0a565b6112945760405162461bcd60e51b81526004016107a89061241d565b60606106a582611b18565b6060600880546106ba906124fe565b3233146113365760405162461bcd60e51b815260206004820152601a60248201527f4e6f206d617373206d696e74696e6720636f6e7472616374732e00000000000060448201526064016107a8565b600754600160a01b900460ff1661138f5760405162461bcd60e51b815260206004820152601960248201527f5075626c69632073616c65206973206e6f74206163746976650000000000000060448201526064016107a8565b600081116113d95760405162461bcd60e51b81526020600482015260176024820152765175616e746974792063616e6e6f74206265207a65726f60481b60448201526064016107a8565b60038111156113fa5760405162461bcd60e51b81526004016107a89061239b565b61115c8161140760005490565b6114119190612470565b111561146e5760405162461bcd60e51b815260206004820152602660248201527f5175616e746974792065786365656473206d6178696d756d207075626c696320604482015265737570706c7960d01b60648201526084016107a8565b346114818267013fbe85edc9000061249c565b146114ce5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642045544820616d6f756e742070726f7669646564000000000060448201526064016107a8565b610ed033826119da565b6007546001600160a01b031633146115025760405162461bcd60e51b81526004016107a8906123e8565b6001600160a01b0381166115675760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107a8565b610ed081611988565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006115d7826118b1565b80519091506000906001600160a01b0316336001600160a01b0316148061160e5750336116038461073d565b6001600160a01b0316145b806116205750815161162090336105c8565b90508061168a5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016107a8565b846001600160a01b031682600001516001600160a01b0316146116fe5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016107a8565b6001600160a01b0384166117625760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016107a8565b6117726000848460000151611570565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b4267ffffffffffffffff16021790559086018083529120549091166118675761181a816000541190565b15611867578251600082815260036020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60408051808201909152600080825260208201526118d0826000541190565b61192f5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016107a8565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561197e579392505050565b5060001901611931565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610bca828260405180602001604052806000815250611be6565b600082611a018584611bf3565b14949350505050565b60006001600160a01b0384163b15611b0c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a4e90339089908890889060040161234b565b602060405180830381600087803b158015611a6857600080fd5b505af1925050508015611a98575060408051601f3d908101601f19168201909252611a9591810190612267565b60015b611af2573d808015611ac6576040519150601f19603f3d011682016040523d82523d6000602084013e611acb565b606091505b508051611aea5760405162461bcd60e51b81526004016107a89061241d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b10565b5060015b949350505050565b6060611b25826000541190565b611b895760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107a8565b6000611b936112d8565b9050805160001415611bb45760405180602001604052806000815250611bdf565b80611bbe84611c75565b604051602001611bcf92919061231c565b6040516020818303038152906040525b9392505050565b6108e08383836001611d8f565b600081815b8451811015611c6d576000858281518110611c2357634e487b7160e01b600052603260045260246000fd5b60200260200101519050808311611c495760008381526020829052604090209250611c5a565b600081815260208490526040902092505b5080611c6581612539565b915050611bf8565b509392505050565b606081611c995750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611cc35780611cad81612539565b9150611cbc9050600a83612488565b9150611c9d565b60008167ffffffffffffffff811115611cec57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611d16576020820181803683370190505b5090505b8415611b1057611d2b6001836124bb565b9150611d38600a86612554565b611d43906030612470565b60f81b818381518110611d6657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611d88600a86612488565b9450611d1a565b6000546001600160a01b038516611df25760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016107a8565b83611e505760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b60648201526084016107a8565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b85811015611f495760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315611f3d57611f216000888488611a0a565b611f3d5760405162461bcd60e51b81526004016107a89061241d565b60019182019101611ece565b506000556118aa565b828054611f5e906124fe565b90600052602060002090601f016020900481019282611f805760008555611fc6565b82601f10611f995782800160ff19823516178555611fc6565b82800160010185558215611fc6579182015b82811115611fc6578235825591602001919060010190611fab565b50610c479291505b80821115610c475760008155600101611fce565b80356001600160a01b0381168114611ff957600080fd5b919050565b60006020828403121561200f578081fd5b611bdf82611fe2565b6000806040838503121561202a578081fd5b61203383611fe2565b915061204160208401611fe2565b90509250929050565b60008060006060848603121561205e578081fd5b61206784611fe2565b925061207560208501611fe2565b9150604084013590509250925092565b6000806000806080858703121561209a578081fd5b6120a385611fe2565b93506120b160208601611fe2565b925060408501359150606085013567ffffffffffffffff808211156120d4578283fd5b818701915087601f8301126120e7578283fd5b8135818111156120f9576120f9612594565b604051601f8201601f19908116603f0116810190838211818310171561212157612121612594565b816040528281528a6020848701011115612139578586fd5b82602086016020830137918201602001949094529598949750929550505050565b6000806040838503121561216c578182fd5b61217583611fe2565b915060208301358015158114612189578182fd5b809150509250929050565b600080604083850312156121a6578182fd5b6121af83611fe2565b946020939093013593505050565b6000806000604084860312156121d1578283fd5b833567ffffffffffffffff808211156121e8578485fd5b818601915086601f8301126121fb578485fd5b813581811115612209578586fd5b8760208260051b850101111561221d578586fd5b6020928301989097509590910135949350505050565b600060208284031215612244578081fd5b5035919050565b60006020828403121561225c578081fd5b8135611bdf816125aa565b600060208284031215612278578081fd5b8151611bdf816125aa565b60008060208385031215612295578182fd5b823567ffffffffffffffff808211156122ac578384fd5b818501915085601f8301126122bf578384fd5b8135818111156122cd578485fd5b8660208285010111156122de578485fd5b60209290920196919550909350505050565b600081518084526123088160208601602086016124d2565b601f01601f19169290920160200192915050565b6000835161232e8184602088016124d2565b8351908301906123428183602088016124d2565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061237e908301846122f0565b9695505050505050565b602081526000611bdf60208301846122f0565b6020808252602d908201527f5175616e746974792065786365656473206d6178207175616e7469747920706560408201526c39103a3930b739b0b1ba34b7b760991b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6000821982111561248357612483612568565b500190565b6000826124975761249761257e565b500490565b60008160001904831182151516156124b6576124b6612568565b500290565b6000828210156124cd576124cd612568565b500390565b60005b838110156124ed5781810151838201526020016124d5565b838111156112945750506000910152565b600181811c9082168061251257607f821691505b6020821081141561253357634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561254d5761254d612568565b5060010190565b6000826125635761256361257e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610ed057600080fdfea2646970667358221220a638a2aab453d4089a23344b3cc66a3b8171af37c107f6226f57268cb714a17264736f6c63430008040033

Deployed Bytecode

0x6080604052600436106102045760003560e01c80637cb6475911610118578063b3957bc9116100a0578063d547cfb71161006f578063d547cfb714610598578063e985e9c5146105ad578063efd0cbf9146105f6578063f2fde38b14610609578063f43a22dc1461062957600080fd5b8063b3957bc91461052c578063b88d4fde14610541578063b98451cf14610561578063c87b56dd1461057857600080fd5b8063981d8771116100e7578063981d8771146104a85780639a5d140b146104bd578063a22cb465146104dd578063a56d7730146104fd578063a6d612f91461051957600080fd5b80637cb647591461043a578063801613591461045a5780638da5cb5b1461047557806395d89b411461049357600080fd5b806330176e131161019b5780634f6ccce71161016a5780634f6ccce7146103a55780636352211e146103c557806370188965146103e557806370a0823114610405578063715018a61461042557600080fd5b806330176e131461033a57806332cb6b0c1461035a5780633ccfd60b1461037057806342842e0e1461038557600080fd5b806318160ddd116101d757806318160ddd146102ba5780631e84c413146102d957806323b872dd146102fa5780632f745c591461031a57600080fd5b806301ffc9a71461020957806306fdde031461023e578063081812fc14610260578063095ea7b314610298575b600080fd5b34801561021557600080fd5b5061022961022436600461224b565b61063e565b60405190151581526020015b60405180910390f35b34801561024a57600080fd5b506102536106ab565b6040516102359190612388565b34801561026c57600080fd5b5061028061027b366004612233565b61073d565b6040516001600160a01b039091168152602001610235565b3480156102a457600080fd5b506102b86102b3366004612194565b6107cd565b005b3480156102c657600080fd5b506000545b604051908152602001610235565b3480156102e557600080fd5b5060075461022990600160a01b900460ff1681565b34801561030657600080fd5b506102b861031536600461204a565b6108e5565b34801561032657600080fd5b506102cb610335366004612194565b6108f0565b34801561034657600080fd5b506102b8610355366004612283565b610a4d565b34801561036657600080fd5b506102cb61115c81565b34801561037c57600080fd5b506102b8610a83565b34801561039157600080fd5b506102b86103a036600461204a565b610bce565b3480156103b157600080fd5b506102cb6103c0366004612233565b610be9565b3480156103d157600080fd5b506102806103e0366004612233565b610c4b565b3480156103f157600080fd5b506102cb610400366004611ffe565b610c5d565b34801561041157600080fd5b506102cb610420366004611ffe565b610cc0565b34801561043157600080fd5b506102b8610d51565b34801561044657600080fd5b506102b8610455366004612233565b610d87565b34801561046657600080fd5b506102cb66d529ae9e86000081565b34801561048157600080fd5b506007546001600160a01b0316610280565b34801561049f57600080fd5b50610253610db6565b3480156104b457600080fd5b506102b8610dc5565b3480156104c957600080fd5b506102b86104d8366004612233565b610e10565b3480156104e957600080fd5b506102b86104f836600461215a565b610ed3565b34801561050957600080fd5b506102cb67013fbe85edc9000081565b6102b86105273660046121bd565b610f98565b34801561053857600080fd5b506102cb600281565b34801561054d57600080fd5b506102b861055c366004612085565b61129a565b34801561056d57600080fd5b50600b541515610229565b34801561058457600080fd5b50610253610593366004612233565b6112cd565b3480156105a457600080fd5b506102536112d8565b3480156105b957600080fd5b506102296105c8366004612018565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6102b8610604366004612233565b6112e7565b34801561061557600080fd5b506102b8610624366004611ffe565b6114d8565b34801561063557600080fd5b506102cb600381565b60006001600160e01b031982166380ac58cd60e01b148061066f57506001600160e01b03198216635b5e139f60e01b145b8061068a57506001600160e01b0319821663780e9d6360e01b145b806106a557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546106ba906124fe565b80601f01602080910402602001604051908101604052809291908181526020018280546106e6906124fe565b80156107335780601f1061070857610100808354040283529160200191610733565b820191906000526020600020905b81548152906001019060200180831161071657829003601f168201915b5050505050905090565b600061074a826000541190565b6107b15760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006107d882610c4b565b9050806001600160a01b0316836001600160a01b031614156108475760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016107a8565b336001600160a01b0382161480610863575061086381336105c8565b6108d55760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016107a8565b6108e0838383611570565b505050565b6108e08383836115cc565b60006108fb83610cc0565b82106109545760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016107a8565b600080549080805b838110156109ed576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff1691830191909152156109af57805192505b876001600160a01b0316836001600160a01b031614156109e457868414156109dd575093506106a592505050565b6001909301925b5060010161095c565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016107a8565b6007546001600160a01b03163314610a775760405162461bcd60e51b81526004016107a8906123e8565b6108e060088383611f52565b6007546001600160a01b03163314610aad5760405162461bcd60e51b81526004016107a8906123e8565b60006064610abc47605a61249c565b610ac69190612488565b905060006064610ad747600a61249c565b610ae19190612488565b60405190915073a302249fe90e51f259c391763fbc6d2b44256df69083156108fc029084906000818181858888f19350505050610b575760405162461bcd60e51b81526020600482015260146024820152734661696c656420746f2073656e6420746f20613160601b60448201526064016107a8565b60405173cc765e1409b5e6648b58fad73754d62c5d84dcf69082156108fc029083906000818181858888f19350505050610bca5760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b732103a3790309960611b60448201526064016107a8565b5050565b6108e08383836040518060200160405280600081525061129a565b600080548210610c475760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016107a8565b5090565b6000610c56826118b1565b5192915050565b60006001600160a01b038216610ca45760405162461bcd60e51b815260206004820152600c60248201526b4e756c6c204164647265737360a01b60448201526064016107a8565b506001600160a01b03166000908152600a602052604090205490565b60006001600160a01b038216610d2c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016107a8565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b03163314610d7b5760405162461bcd60e51b81526004016107a8906123e8565b610d856000611988565b565b6007546001600160a01b03163314610db15760405162461bcd60e51b81526004016107a8906123e8565b600b55565b6060600280546106ba906124fe565b6007546001600160a01b03163314610def5760405162461bcd60e51b81526004016107a8906123e8565b6007805460ff60a01b198116600160a01b9182900460ff1615909102179055565b6007546001600160a01b03163314610e3a5760405162461bcd60e51b81526004016107a8906123e8565b600954811115610e4957600080fd5b61115c81610e5660005490565b610e609190612470565b1115610eae5760405162461bcd60e51b815260206004820152601f60248201527f5175616e746974792065786365656473206d6178696d756d20737570706c790060448201526064016107a8565b8060096000828254610ec091906124bb565b90915550610ed0905033826119da565b50565b6001600160a01b038216331415610f2c5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016107a8565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b323314610fe75760405162461bcd60e51b815260206004820152601a60248201527f4e6f206d617373206d696e74696e6720636f6e7472616374732e00000000000060448201526064016107a8565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061106184848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600b5491508490506119f4565b6110b95760405162461bcd60e51b8152602060048201526024808201527f57616c6c6574206973206e6f7420656c696769626c6520666f722077686974656044820152631b1a5cdd60e21b60648201526084016107a8565b600082116111035760405162461bcd60e51b81526020600482015260176024820152765175616e746974792063616e6e6f74206265207a65726f60481b60448201526064016107a8565b60028211156111245760405162461bcd60e51b81526004016107a89061239b565b61115c8261113160005490565b61113b9190612470565b11156111895760405162461bcd60e51b815260206004820152601f60248201527f5175616e746974792065786365656473206d6178696d756d20737570706c790060448201526064016107a8565b336000908152600a60205260409020546002906111a7908490612470565b11156112065760405162461bcd60e51b815260206004820152602860248201527f5175616e746974792065786365656473206d6178207175616e746974792070656044820152671c881dd85b1b195d60c21b60648201526084016107a8565b346112188366d529ae9e86000061249c565b146112655760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642045544820616d6f756e742070726f7669646564000000000060448201526064016107a8565b336000908152600a602052604081208054849290611284908490612470565b90915550611294905033836119da565b50505050565b6112a58484846115cc565b6112b184848484611a0a565b6112945760405162461bcd60e51b81526004016107a89061241d565b60606106a582611b18565b6060600880546106ba906124fe565b3233146113365760405162461bcd60e51b815260206004820152601a60248201527f4e6f206d617373206d696e74696e6720636f6e7472616374732e00000000000060448201526064016107a8565b600754600160a01b900460ff1661138f5760405162461bcd60e51b815260206004820152601960248201527f5075626c69632073616c65206973206e6f74206163746976650000000000000060448201526064016107a8565b600081116113d95760405162461bcd60e51b81526020600482015260176024820152765175616e746974792063616e6e6f74206265207a65726f60481b60448201526064016107a8565b60038111156113fa5760405162461bcd60e51b81526004016107a89061239b565b61115c8161140760005490565b6114119190612470565b111561146e5760405162461bcd60e51b815260206004820152602660248201527f5175616e746974792065786365656473206d6178696d756d207075626c696320604482015265737570706c7960d01b60648201526084016107a8565b346114818267013fbe85edc9000061249c565b146114ce5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642045544820616d6f756e742070726f7669646564000000000060448201526064016107a8565b610ed033826119da565b6007546001600160a01b031633146115025760405162461bcd60e51b81526004016107a8906123e8565b6001600160a01b0381166115675760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107a8565b610ed081611988565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006115d7826118b1565b80519091506000906001600160a01b0316336001600160a01b0316148061160e5750336116038461073d565b6001600160a01b0316145b806116205750815161162090336105c8565b90508061168a5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016107a8565b846001600160a01b031682600001516001600160a01b0316146116fe5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016107a8565b6001600160a01b0384166117625760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016107a8565b6117726000848460000151611570565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b4267ffffffffffffffff16021790559086018083529120549091166118675761181a816000541190565b15611867578251600082815260036020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60408051808201909152600080825260208201526118d0826000541190565b61192f5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016107a8565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561197e579392505050565b5060001901611931565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610bca828260405180602001604052806000815250611be6565b600082611a018584611bf3565b14949350505050565b60006001600160a01b0384163b15611b0c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a4e90339089908890889060040161234b565b602060405180830381600087803b158015611a6857600080fd5b505af1925050508015611a98575060408051601f3d908101601f19168201909252611a9591810190612267565b60015b611af2573d808015611ac6576040519150601f19603f3d011682016040523d82523d6000602084013e611acb565b606091505b508051611aea5760405162461bcd60e51b81526004016107a89061241d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b10565b5060015b949350505050565b6060611b25826000541190565b611b895760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107a8565b6000611b936112d8565b9050805160001415611bb45760405180602001604052806000815250611bdf565b80611bbe84611c75565b604051602001611bcf92919061231c565b6040516020818303038152906040525b9392505050565b6108e08383836001611d8f565b600081815b8451811015611c6d576000858281518110611c2357634e487b7160e01b600052603260045260246000fd5b60200260200101519050808311611c495760008381526020829052604090209250611c5a565b600081815260208490526040902092505b5080611c6581612539565b915050611bf8565b509392505050565b606081611c995750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611cc35780611cad81612539565b9150611cbc9050600a83612488565b9150611c9d565b60008167ffffffffffffffff811115611cec57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611d16576020820181803683370190505b5090505b8415611b1057611d2b6001836124bb565b9150611d38600a86612554565b611d43906030612470565b60f81b818381518110611d6657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611d88600a86612488565b9450611d1a565b6000546001600160a01b038516611df25760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016107a8565b83611e505760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b60648201526084016107a8565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b85811015611f495760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315611f3d57611f216000888488611a0a565b611f3d5760405162461bcd60e51b81526004016107a89061241d565b60019182019101611ece565b506000556118aa565b828054611f5e906124fe565b90600052602060002090601f016020900481019282611f805760008555611fc6565b82601f10611f995782800160ff19823516178555611fc6565b82800160010185558215611fc6579182015b82811115611fc6578235825591602001919060010190611fab565b50610c479291505b80821115610c475760008155600101611fce565b80356001600160a01b0381168114611ff957600080fd5b919050565b60006020828403121561200f578081fd5b611bdf82611fe2565b6000806040838503121561202a578081fd5b61203383611fe2565b915061204160208401611fe2565b90509250929050565b60008060006060848603121561205e578081fd5b61206784611fe2565b925061207560208501611fe2565b9150604084013590509250925092565b6000806000806080858703121561209a578081fd5b6120a385611fe2565b93506120b160208601611fe2565b925060408501359150606085013567ffffffffffffffff808211156120d4578283fd5b818701915087601f8301126120e7578283fd5b8135818111156120f9576120f9612594565b604051601f8201601f19908116603f0116810190838211818310171561212157612121612594565b816040528281528a6020848701011115612139578586fd5b82602086016020830137918201602001949094529598949750929550505050565b6000806040838503121561216c578182fd5b61217583611fe2565b915060208301358015158114612189578182fd5b809150509250929050565b600080604083850312156121a6578182fd5b6121af83611fe2565b946020939093013593505050565b6000806000604084860312156121d1578283fd5b833567ffffffffffffffff808211156121e8578485fd5b818601915086601f8301126121fb578485fd5b813581811115612209578586fd5b8760208260051b850101111561221d578586fd5b6020928301989097509590910135949350505050565b600060208284031215612244578081fd5b5035919050565b60006020828403121561225c578081fd5b8135611bdf816125aa565b600060208284031215612278578081fd5b8151611bdf816125aa565b60008060208385031215612295578182fd5b823567ffffffffffffffff808211156122ac578384fd5b818501915085601f8301126122bf578384fd5b8135818111156122cd578485fd5b8660208285010111156122de578485fd5b60209290920196919550909350505050565b600081518084526123088160208601602086016124d2565b601f01601f19169290920160200192915050565b6000835161232e8184602088016124d2565b8351908301906123428183602088016124d2565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061237e908301846122f0565b9695505050505050565b602081526000611bdf60208301846122f0565b6020808252602d908201527f5175616e746974792065786365656473206d6178207175616e7469747920706560408201526c39103a3930b739b0b1ba34b7b760991b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6000821982111561248357612483612568565b500190565b6000826124975761249761257e565b500490565b60008160001904831182151516156124b6576124b6612568565b500290565b6000828210156124cd576124cd612568565b500390565b60005b838110156124ed5781810151838201526020016124d5565b838111156112945750506000910152565b600181811c9082168061251257607f821691505b6020821081141561253357634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561254d5761254d612568565b5060010190565b6000826125635761256361257e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610ed057600080fdfea2646970667358221220a638a2aab453d4089a23344b3cc66a3b8171af37c107f6226f57268cb714a17264736f6c63430008040033

Deployed Bytecode Sourcemap

43259:4109:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30061:372;;;;;;;;;;-1:-1:-1;30061:372:0;;;;;:::i;:::-;;:::i;:::-;;;6982:14:1;;6975:22;6957:41;;6945:2;6930:18;30061:372:0;;;;;;;;31947:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33509:214::-;;;;;;;;;;-1:-1:-1;33509:214:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6280:32:1;;;6262:51;;6250:2;6235:18;33509:214:0;6217:102:1;33030:413:0;;;;;;;;;;-1:-1:-1;33030:413:0;;;;;:::i;:::-;;:::i;:::-;;28318:100;;;;;;;;;;-1:-1:-1;28371:7:0;28398:12;28318:100;;;19536:25:1;;;19524:2;19509:18;28318:100:0;19491:76:1;43624:38:0;;;;;;;;;;-1:-1:-1;43624:38:0;;;;-1:-1:-1;;;43624:38:0;;;;;;34385:162;;;;;;;;;;-1:-1:-1;34385:162:0;;;;;:::i;:::-;;:::i;28982:1007::-;;;;;;;;;;-1:-1:-1;28982:1007:0;;;;;:::i;:::-;;:::i;45985:101::-;;;;;;;;;;-1:-1:-1;45985:101:0;;;;;:::i;:::-;;:::i;43371:41::-;;;;;;;;;;;;43408:4;43371:41;;47043:318;;;;;;;;;;;;;:::i;34618:177::-;;;;;;;;;;-1:-1:-1;34618:177:0;;;;;:::i;:::-;;:::i;28495:187::-;;;;;;;;;;-1:-1:-1;28495:187:0;;;;;:::i;:::-;;:::i;31756:124::-;;;;;;;;;;-1:-1:-1;31756:124:0;;;;;:::i;:::-;;:::i;46718:180::-;;;;;;;;;;-1:-1:-1;46718:180:0;;;;;:::i;:::-;;:::i;30497:221::-;;;;;;;;;;-1:-1:-1;30497:221:0;;;;;:::i;:::-;;:::i;7415:103::-;;;;;;;;;;;;;:::i;46906:101::-;;;;;;;;;;-1:-1:-1;46906:101:0;;;;;:::i;:::-;;:::i;43512:45::-;;;;;;;;;;;;43547:10;43512:45;;6764:87;;;;;;;;;;-1:-1:-1;6837:6:0;;-1:-1:-1;;;;;6837:6:0;6764:87;;32116:104;;;;;;;;;;;;;:::i;46608:102::-;;;;;;;;;;;;;:::i;45650:289::-;;;;;;;;;;-1:-1:-1;45650:289:0;;;;;:::i;:::-;;:::i;33795:288::-;;;;;;;;;;-1:-1:-1;33795:288:0;;;;;:::i;:::-;;:::i;43565:49::-;;;;;;;;;;;;43604:10;43565:49;;44288:827;;;;;;:::i;:::-;;:::i;43420:38::-;;;;;;;;;;;;43457:1;43420:38;;34866:355;;;;;;;;;;-1:-1:-1;34866:355:0;;;;;:::i;:::-;;:::i;46493:107::-;;;;;;;;;;-1:-1:-1;46574:11:0;;:17;;46493:107;;46319:129;;;;;;;;;;-1:-1:-1;46319:129:0;;;;;:::i;:::-;;:::i;46212:99::-;;;;;;;;;;;;;:::i;34154:164::-;;;;;;;;;;-1:-1:-1;34154:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;34275:25:0;;;34251:4;34275:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34154:164;45123:519;;;;;;:::i;:::-;;:::i;7673:201::-;;;;;;;;;;-1:-1:-1;7673:201:0;;;;;:::i;:::-;;:::i;43467:38::-;;;;;;;;;;;;43504:1;43467:38;;30061:372;30163:4;-1:-1:-1;;;;;;30200:40:0;;-1:-1:-1;;;30200:40:0;;:105;;-1:-1:-1;;;;;;;30257:48:0;;-1:-1:-1;;;30257:48:0;30200:105;:172;;;-1:-1:-1;;;;;;;30322:50:0;;-1:-1:-1;;;30322:50:0;30200:172;:225;;;-1:-1:-1;;;;;;;;;;19680:40:0;;;30389:36;30180:245;30061:372;-1:-1:-1;;30061:372:0:o;31947:100::-;32001:13;32034:5;32027:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31947:100;:::o;33509:214::-;33577:7;33605:16;33613:7;35533:4;35567:12;-1:-1:-1;35557:22:0;35476:111;33605:16;33597:74;;;;-1:-1:-1;;;33597:74:0;;18837:2:1;33597:74:0;;;18819:21:1;18876:2;18856:18;;;18849:30;18915:34;18895:18;;;18888:62;-1:-1:-1;;;18966:18:1;;;18959:43;19019:19;;33597:74:0;;;;;;;;;-1:-1:-1;33691:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;33691:24:0;;33509:214::o;33030:413::-;33103:13;33119:24;33135:7;33119:15;:24::i;:::-;33103:40;;33168:5;-1:-1:-1;;;;;33162:11:0;:2;-1:-1:-1;;;;;33162:11:0;;;33154:58;;;;-1:-1:-1;;;33154:58:0;;16023:2:1;33154:58:0;;;16005:21:1;16062:2;16042:18;;;16035:30;16101:34;16081:18;;;16074:62;-1:-1:-1;;;16152:18:1;;;16145:32;16194:19;;33154:58:0;15995:224:1;33154:58:0;5568:10;-1:-1:-1;;;;;33247:21:0;;;;:62;;-1:-1:-1;33272:37:0;33289:5;5568:10;34154:164;:::i;33272:37::-;33225:169;;;;-1:-1:-1;;;33225:169:0;;10992:2:1;33225:169:0;;;10974:21:1;11031:2;11011:18;;;11004:30;11070:34;11050:18;;;11043:62;11141:27;11121:18;;;11114:55;11186:19;;33225:169:0;10964:247:1;33225:169:0;33407:28;33416:2;33420:7;33429:5;33407:8;:28::i;:::-;33030:413;;;:::o;34385:162::-;34511:28;34521:4;34527:2;34531:7;34511:9;:28::i;28982:1007::-;29071:7;29107:16;29117:5;29107:9;:16::i;:::-;29099:5;:24;29091:71;;;;-1:-1:-1;;;29091:71:0;;7435:2:1;29091:71:0;;;7417:21:1;7474:2;7454:18;;;7447:30;7513:34;7493:18;;;7486:62;-1:-1:-1;;;7564:18:1;;;7557:32;7606:19;;29091:71:0;7407:224:1;29091:71:0;29173:22;28398:12;;;29173:22;;29436:466;29456:14;29452:1;:18;29436:466;;;29496:31;29530:14;;;:11;:14;;;;;;;;;29496:48;;;;;;;;;-1:-1:-1;;;;;29496:48:0;;;;;-1:-1:-1;;;29496:48:0;;;;;;;;;;;;29567:28;29563:111;;29640:14;;;-1:-1:-1;29563:111:0;29717:5;-1:-1:-1;;;;;29696:26:0;:17;-1:-1:-1;;;;;29696:26:0;;29692:195;;;29766:5;29751:11;:20;29747:85;;;-1:-1:-1;29807:1:0;-1:-1:-1;29800:8:0;;-1:-1:-1;;;29800:8:0;29747:85;29854:13;;;;;29692:195;-1:-1:-1;29472:3:0;;29436:466;;;-1:-1:-1;29925:56:0;;-1:-1:-1;;;29925:56:0;;18006:2:1;29925:56:0;;;17988:21:1;18045:2;18025:18;;;18018:30;18084:34;18064:18;;;18057:62;-1:-1:-1;;;18135:18:1;;;18128:44;18189:19;;29925:56:0;17978:236:1;45985:101:0;6837:6;;-1:-1:-1;;;;;6837:6:0;5568:10;6984:23;6976:68;;;;-1:-1:-1;;;6976:68:0;;;;;;;:::i;:::-;46061:19:::1;:13;46077:3:::0;;46061:19:::1;:::i;47043:318::-:0;6837:6;;-1:-1:-1;;;;;6837:6:0;5568:10;6984:23;6976:68;;;;-1:-1:-1;;;6976:68:0;;;;;;;:::i;:::-;47093:14:::1;47137:3;47110:26;:21;47134:2;47110:26;:::i;:::-;:30;;;;:::i;:::-;47093:47:::0;-1:-1:-1;47151:14:0::1;47195:3;47168:26;:21;47192:2;47168:26;:::i;:::-;:30;;;;:::i;:::-;47228:28;::::0;47151:47;;-1:-1:-1;43879:42:0::1;::::0;47228:28;::::1;;;::::0;47246:9;;47228:28:::1;::::0;;;47246:9;43879:42;47228:28;::::1;;;;;;47220:61;;;::::0;-1:-1:-1;;;47220:61:0;;13768:2:1;47220:61:0::1;::::0;::::1;13750:21:1::0;13807:2;13787:18;;;13780:30;-1:-1:-1;;;13826:18:1;;;13819:50;13886:18;;47220:61:0::1;13740:170:1::0;47220:61:0::1;47300:28;::::0;43959:42:::1;::::0;47300:28;::::1;;;::::0;47318:9;;47300:28:::1;::::0;;;47318:9;43959:42;47300:28;::::1;;;;;;47292:61;;;::::0;-1:-1:-1;;;47292:61:0;;16846:2:1;47292:61:0::1;::::0;::::1;16828:21:1::0;16885:2;16865:18;;;16858:30;-1:-1:-1;;;16904:18:1;;;16897:50;16964:18;;47292:61:0::1;16818:170:1::0;47292:61:0::1;7055:1;;47043:318::o:0;34618:177::-;34748:39;34765:4;34771:2;34775:7;34748:39;;;;;;;;;;;;:16;:39::i;28495:187::-;28562:7;28398:12;;28590:5;:21;28582:69;;;;-1:-1:-1;;;28582:69:0;;8656:2:1;28582:69:0;;;8638:21:1;8695:2;8675:18;;;8668:30;8734:34;8714:18;;;8707:62;-1:-1:-1;;;8785:18:1;;;8778:33;8828:19;;28582:69:0;8628:225:1;28582:69:0;-1:-1:-1;28669:5:0;28495:187::o;31756:124::-;31820:7;31847:20;31859:7;31847:11;:20::i;:::-;:25;;31756:124;-1:-1:-1;;31756:124:0:o;46718:180::-;46786:7;-1:-1:-1;;;;;46814:18:0;;46806:43;;;;-1:-1:-1;;;46806:43:0;;19251:2:1;46806:43:0;;;19233:21:1;19290:2;19270:18;;;19263:30;-1:-1:-1;;;19309:18:1;;;19302:42;19361:18;;46806:43:0;19223:162:1;46806:43:0;-1:-1:-1;;;;;;46867:23:0;;;;;:17;:23;;;;;;;46718:180::o;30497:221::-;30561:7;-1:-1:-1;;;;;30589:19:0;;30581:75;;;;-1:-1:-1;;;30581:75:0;;11772:2:1;30581:75:0;;;11754:21:1;11811:2;11791:18;;;11784:30;11850:34;11830:18;;;11823:62;-1:-1:-1;;;11901:18:1;;;11894:41;11952:19;;30581:75:0;11744:233:1;30581:75:0;-1:-1:-1;;;;;;30682:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;30682:27:0;;30497:221::o;7415:103::-;6837:6;;-1:-1:-1;;;;;6837:6:0;5568:10;6984:23;6976:68;;;;-1:-1:-1;;;6976:68:0;;;;;;;:::i;:::-;7480:30:::1;7507:1;7480:18;:30::i;:::-;7415:103::o:0;46906:101::-;6837:6;;-1:-1:-1;;;;;6837:6:0;5568:10;6984:23;6976:68;;;;-1:-1:-1;;;6976:68:0;;;;;;;:::i;:::-;46977:11:::1;:22:::0;46906:101::o;32116:104::-;32172:13;32205:7;32198:14;;;;;:::i;46608:102::-;6837:6;;-1:-1:-1;;;;;6837:6:0;5568:10;6984:23;6976:68;;;;-1:-1:-1;;;6976:68:0;;;;;;;:::i;:::-;46684:18:::1;::::0;;-1:-1:-1;;;;46662:40:0;::::1;-1:-1:-1::0;;;46684:18:0;;;::::1;;;46683:19;46662:40:::0;;::::1;;::::0;;46608:102::o;45650:289::-;6837:6;;-1:-1:-1;;;;;6837:6:0;5568:10;6984:23;6976:68;;;;-1:-1:-1;;;6976:68:0;;;;;;;:::i;:::-;45740:15:::1;;45728:8;:27;;45720:36;;;::::0;::::1;;43408:4;45791:8;45775:13;28371:7:::0;28398:12;;28318:100;45775:13:::1;:24;;;;:::i;:::-;:38;;45767:82;;;::::0;-1:-1:-1;;;45767:82:0;;15307:2:1;45767:82:0::1;::::0;::::1;15289:21:1::0;15346:2;15326:18;;;15319:30;15385:33;15365:18;;;15358:61;15436:18;;45767:82:0::1;15279:181:1::0;45767:82:0::1;45881:8;45862:15;;:27;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;45900:31:0::1;::::0;-1:-1:-1;45910:10:0::1;45922:8:::0;45900:9:::1;:31::i;:::-;45650:289:::0;:::o;33795:288::-;-1:-1:-1;;;;;33890:24:0;;5568:10;33890:24;;33882:63;;;;-1:-1:-1;;;33882:63:0;;14533:2:1;33882:63:0;;;14515:21:1;14572:2;14552:18;;;14545:30;14611:28;14591:18;;;14584:56;14657:18;;33882:63:0;14505:176:1;33882:63:0;5568:10;33958:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;33958:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;33958:53:0;;;;;;;;;;34027:48;;6957:41:1;;;33958:42:0;;5568:10;34027:48;;6930:18:1;34027:48:0;;;;;;;33795:288;;:::o;44288:827::-;44077:9;44090:10;44077:23;44069:62;;;;-1:-1:-1;;;44069:62:0;;9880:2:1;44069:62:0;;;9862:21:1;9919:2;9899:18;;;9892:30;9958:28;9938:18;;;9931:56;10004:18;;44069:62:0;9852:176:1;44069:62:0;44423:28:::1;::::0;-1:-1:-1;;44440:10:0::1;5556:2:1::0;5552:15;5548:53;44423:28:0::1;::::0;::::1;5536:66:1::0;44398:12:0::1;::::0;5618::1;;44423:28:0::1;;;;;;;;;;;;44413:39;;;;;;44398:54;;44471:51;44490:12;;44471:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;44504:11:0::1;::::0;;-1:-1:-1;44517:4:0;;-1:-1:-1;44471:18:0::1;:51::i;:::-;44463:100;;;::::0;-1:-1:-1;;;44463:100:0;;10235:2:1;44463:100:0::1;::::0;::::1;10217:21:1::0;10274:2;10254:18;;;10247:30;10313:34;10293:18;;;10286:62;-1:-1:-1;;;10364:18:1;;;10357:34;10408:19;;44463:100:0::1;10207:226:1::0;44463:100:0::1;44596:1;44585:8;:12;44577:48;;;::::0;-1:-1:-1;;;44577:48:0;;10640:2:1;44577:48:0::1;::::0;::::1;10622:21:1::0;10679:2;10659:18;;;10652:30;-1:-1:-1;;;10698:18:1;;;10691:53;10761:18;;44577:48:0::1;10612:173:1::0;44577:48:0::1;43457:1;44644:8;:22;;44636:80;;;;-1:-1:-1::0;;;44636:80:0::1;;;;;;;:::i;:::-;43408:4;44751:8;44735:13;28371:7:::0;28398:12;;28318:100;44735:13:::1;:24;;;;:::i;:::-;:38;;44727:82;;;::::0;-1:-1:-1;;;44727:82:0;;15307:2:1;44727:82:0::1;::::0;::::1;15289:21:1::0;15346:2;15326:18;;;15319:30;15385:33;15365:18;;;15358:61;15436:18;;44727:82:0::1;15279:181:1::0;44727:82:0::1;44846:10;44828:29;::::0;;;:17:::1;:29;::::0;;;;;43457:1:::1;::::0;44828:40:::1;::::0;44860:8;;44828:40:::1;:::i;:::-;:54;;44820:107;;;::::0;-1:-1:-1;;;44820:107:0;;12184:2:1;44820:107:0::1;::::0;::::1;12166:21:1::0;12223:2;12203:18;;;12196:30;12262:34;12242:18;;;12235:62;-1:-1:-1;;;12313:18:1;;;12306:38;12361:19;;44820:107:0::1;12156:230:1::0;44820:107:0::1;44970:9;44947:19;44958:8:::0;43547:10:::1;44947:19;:::i;:::-;:32;44939:72;;;::::0;-1:-1:-1;;;44939:72:0;;15667:2:1;44939:72:0::1;::::0;::::1;15649:21:1::0;15706:2;15686:18;;;15679:30;15745:29;15725:18;;;15718:57;15792:18;;44939:72:0::1;15639:177:1::0;44939:72:0::1;45042:10;45024:29;::::0;;;:17:::1;:29;::::0;;;;:41;;45057:8;;45024:29;:41:::1;::::0;45057:8;;45024:41:::1;:::i;:::-;::::0;;;-1:-1:-1;45076:31:0::1;::::0;-1:-1:-1;45086:10:0::1;45098:8:::0;45076:9:::1;:31::i;:::-;44142:1;44288:827:::0;;;:::o;34866:355::-;35025:28;35035:4;35041:2;35045:7;35025:9;:28::i;:::-;35086:48;35109:4;35115:2;35119:7;35128:5;35086:22;:48::i;:::-;35064:149;;;;-1:-1:-1;;;35064:149:0;;;;;;;:::i;46319:129::-;46384:13;46417:23;46432:7;46417:14;:23::i;46212:99::-;46257:13;46290;46283:20;;;;;:::i;45123:519::-;44077:9;44090:10;44077:23;44069:62;;;;-1:-1:-1;;;44069:62:0;;9880:2:1;44069:62:0;;;9862:21:1;9919:2;9899:18;;;9892:30;9958:28;9938:18;;;9931:56;10004:18;;44069:62:0;9852:176:1;44069:62:0;45205:18:::1;::::0;-1:-1:-1;;;45205:18:0;::::1;;;45197:56;;;::::0;-1:-1:-1;;;45197:56:0;;11418:2:1;45197:56:0::1;::::0;::::1;11400:21:1::0;11457:2;11437:18;;;11430:30;11496:27;11476:18;;;11469:55;11541:18;;45197:56:0::1;11390:175:1::0;45197:56:0::1;45283:1;45272:8;:12;45264:48;;;::::0;-1:-1:-1;;;45264:48:0;;10640:2:1;45264:48:0::1;::::0;::::1;10622:21:1::0;10679:2;10659:18;;;10652:30;-1:-1:-1;;;10698:18:1;;;10691:53;10761:18;;45264:48:0::1;10612:173:1::0;45264:48:0::1;43504:1;45331:8;:22;;45323:80;;;;-1:-1:-1::0;;;45323:80:0::1;;;;;;;:::i;:::-;43408:4;45438:8;45422:13;28371:7:::0;28398:12;;28318:100;45422:13:::1;:24;;;;:::i;:::-;:38;;45414:89;;;::::0;-1:-1:-1;;;45414:89:0;;12593:2:1;45414:89:0::1;::::0;::::1;12575:21:1::0;12632:2;12612:18;;;12605:30;12671:34;12651:18;;;12644:62;-1:-1:-1;;;12722:18:1;;;12715:36;12768:19;;45414:89:0::1;12565:228:1::0;45414:89:0::1;45549:9;45522:23;45537:8:::0;43604:10:::1;45522:23;:::i;:::-;:36;45514:76;;;::::0;-1:-1:-1;;;45514:76:0;;15667:2:1;45514:76:0::1;::::0;::::1;15649:21:1::0;15706:2;15686:18;;;15679:30;15745:29;15725:18;;;15718:57;15792:18;;45514:76:0::1;15639:177:1::0;45514:76:0::1;45603:31;45613:10;45625:8;45603:9;:31::i;7673:201::-:0;6837:6;;-1:-1:-1;;;;;6837:6:0;5568:10;6984:23;6976:68;;;;-1:-1:-1;;;6976:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7762:22:0;::::1;7754:73;;;::::0;-1:-1:-1;;;7754:73:0;;7838:2:1;7754:73:0::1;::::0;::::1;7820:21:1::0;7877:2;7857:18;;;7850:30;7916:34;7896:18;;;7889:62;-1:-1:-1;;;7967:18:1;;;7960:36;8013:19;;7754:73:0::1;7810:228:1::0;7754:73:0::1;7838:28;7857:8;7838:18;:28::i;40396:196::-:0;40511:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;40511:29:0;-1:-1:-1;;;;;40511:29:0;;;;;;;;;40556:28;;40511:24;;40556:28;;;;;;;40396:196;;;:::o;38276:2002::-;38391:35;38429:20;38441:7;38429:11;:20::i;:::-;38504:18;;38391:58;;-1:-1:-1;38462:22:0;;-1:-1:-1;;;;;38488:34:0;5568:10;-1:-1:-1;;;;;38488:34:0;;:87;;;-1:-1:-1;5568:10:0;38539:20;38551:7;38539:11;:20::i;:::-;-1:-1:-1;;;;;38539:36:0;;38488:87;:154;;;-1:-1:-1;38609:18:0;;38592:50;;5568:10;34154:164;:::i;38592:50::-;38462:181;;38664:17;38656:80;;;;-1:-1:-1;;;38656:80:0;;14888:2:1;38656:80:0;;;14870:21:1;14927:2;14907:18;;;14900:30;14966:34;14946:18;;;14939:62;-1:-1:-1;;;15017:18:1;;;15010:48;15075:19;;38656:80:0;14860:240:1;38656:80:0;38779:4;-1:-1:-1;;;;;38757:26:0;:13;:18;;;-1:-1:-1;;;;;38757:26:0;;38749:77;;;;-1:-1:-1;;;38749:77:0;;13000:2:1;38749:77:0;;;12982:21:1;13039:2;13019:18;;;13012:30;13078:34;13058:18;;;13051:62;-1:-1:-1;;;13129:18:1;;;13122:36;13175:19;;38749:77:0;12972:228:1;38749:77:0;-1:-1:-1;;;;;38845:16:0;;38837:66;;;;-1:-1:-1;;;38837:66:0;;9060:2:1;38837:66:0;;;9042:21:1;9099:2;9079:18;;;9072:30;9138:34;9118:18;;;9111:62;-1:-1:-1;;;9189:18:1;;;9182:35;9234:19;;38837:66:0;9032:227:1;38837:66:0;39024:49;39041:1;39045:7;39054:13;:18;;;39024:8;:49::i;:::-;-1:-1:-1;;;;;39369:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;;;;;39369:31:0;;;-1:-1:-1;;;;;39369:31:0;;;-1:-1:-1;;39369:31:0;;;;;;;39415:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;39415:29:0;;;;;;;;;;;;;39461:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;39506:61:0;;;;-1:-1:-1;;;39551:15:0;39506:61;;;;;;39841:11;;;39871:24;;;;;:29;39841:11;;39871:29;39867:295;;39939:20;39947:11;35533:4;35567:12;-1:-1:-1;35557:22:0;35476:111;39939:20;39935:212;;;40016:18;;;39984:24;;;:11;:24;;;;;;;;:50;;40099:28;;;;40057:70;;-1:-1:-1;;;40057:70:0;-1:-1:-1;;;;;;40057:70:0;;;-1:-1:-1;;;;;39984:50:0;;;40057:70;;;;;;;39935:212;38276:2002;40209:7;40205:2;-1:-1:-1;;;;;40190:27:0;40199:4;-1:-1:-1;;;;;40190:27:0;;;;;;;;;;;40228:42;38276:2002;;;;;:::o;31157:537::-;-1:-1:-1;;;;;;;;;;;;;;;;;31260:16:0;31268:7;35533:4;35567:12;-1:-1:-1;35557:22:0;35476:111;31260:16;31252:71;;;;-1:-1:-1;;;31252:71:0;;8245:2:1;31252:71:0;;;8227:21:1;8284:2;8264:18;;;8257:30;8323:34;8303:18;;;8296:62;-1:-1:-1;;;8374:18:1;;;8367:40;8424:19;;31252:71:0;8217:232:1;31252:71:0;31381:7;31361:245;31428:31;31462:17;;;:11;:17;;;;;;;;;31428:51;;;;;;;;;-1:-1:-1;;;;;31428:51:0;;;;;-1:-1:-1;;;31428:51:0;;;;;;;;;;;;31502:28;31498:93;;31562:9;31157:537;-1:-1:-1;;;31157:537:0:o;31498:93::-;-1:-1:-1;;;31401:6:0;31361:245;;8034:191;8127:6;;;-1:-1:-1;;;;;8144:17:0;;;-1:-1:-1;;;;;;8144:17:0;;;;;;;8177:40;;8127:6;;;8144:17;8127:6;;8177:40;;8108:16;;8177:40;8034:191;;:::o;35595:104::-;35664:27;35674:2;35678:8;35664:27;;;;;;;;;;;;:9;:27::i;1220:190::-;1345:4;1398;1369:25;1382:5;1389:4;1369:12;:25::i;:::-;:33;;1220:190;-1:-1:-1;;;;1220:190:0:o;41157:804::-;41312:4;-1:-1:-1;;;;;41333:13:0;;9760:19;:23;41329:625;;41369:72;;-1:-1:-1;;;41369:72:0;;-1:-1:-1;;;;;41369:36:0;;;;;:72;;5568:10;;41420:4;;41426:7;;41435:5;;41369:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41369:72:0;;;;;;;;-1:-1:-1;;41369:72:0;;;;;;;;;;;;:::i;:::-;;;41365:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41615:13:0;;41611:273;;41658:61;;-1:-1:-1;;;41658:61:0;;;;;;;:::i;41611:273::-;41834:6;41828:13;41819:6;41815:2;41811:15;41804:38;41365:534;-1:-1:-1;;;;;;41492:55:0;-1:-1:-1;;;41492:55:0;;-1:-1:-1;41485:62:0;;41329:625;-1:-1:-1;41938:4:0;41329:625;41157:804;;;;;;:::o;32291:335::-;32364:13;32398:16;32406:7;35533:4;35567:12;-1:-1:-1;35557:22:0;35476:111;32398:16;32390:76;;;;-1:-1:-1;;;32390:76:0;;14117:2:1;32390:76:0;;;14099:21:1;14156:2;14136:18;;;14129:30;14195:34;14175:18;;;14168:62;-1:-1:-1;;;14246:18:1;;;14239:45;14301:19;;32390:76:0;14089:237:1;32390:76:0;32479:21;32503:10;:8;:10::i;:::-;32479:34;;32537:7;32531:21;32556:1;32531:26;;:87;;;;;;;;;;;;;;;;;32584:7;32593:18;:7;:16;:18::i;:::-;32567:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32531:87;32524:94;32291:335;-1:-1:-1;;;32291:335:0:o;36062:163::-;36185:32;36191:2;36195:8;36205:5;36212:4;36185:5;:32::i;1771:675::-;1854:7;1897:4;1854:7;1912:497;1936:5;:12;1932:1;:16;1912:497;;;1970:20;1993:5;1999:1;1993:8;;;;;;-1:-1:-1;;;1993:8:0;;;;;;;;;;;;;;;1970:31;;2036:12;2020;:28;2016:382;;2522:13;2572:15;;;2608:4;2601:15;;;2655:4;2639:21;;2148:57;;2016:382;;;2522:13;2572:15;;;2608:4;2601:15;;;2655:4;2639:21;;2325:57;;2016:382;-1:-1:-1;1950:3:0;;;;:::i;:::-;;;;1912:497;;;-1:-1:-1;2426:12:0;1771:675;-1:-1:-1;;;1771:675:0:o;3050:723::-;3106:13;3327:10;3323:53;;-1:-1:-1;;3354:10:0;;;;;;;;;;;;-1:-1:-1;;;3354:10:0;;;;;3050:723::o;3323:53::-;3401:5;3386:12;3442:78;3449:9;;3442:78;;3475:8;;;;:::i;:::-;;-1:-1:-1;3498:10:0;;-1:-1:-1;3506:2:0;3498:10;;:::i;:::-;;;3442:78;;;3530:19;3562:6;3552:17;;;;;;-1:-1:-1;;;3552:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3552:17:0;;3530:39;;3580:154;3587:10;;3580:154;;3614:11;3624:1;3614:11;;:::i;:::-;;-1:-1:-1;3683:10:0;3691:2;3683:5;:10;:::i;:::-;3670:24;;:2;:24;:::i;:::-;3657:39;;3640:6;3647;3640:14;;;;;;-1:-1:-1;;;3640:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;3640:56:0;;;;;;;;-1:-1:-1;3711:11:0;3720:2;3711:11;;:::i;:::-;;;3580:154;;36484:1538;36623:20;36646:12;-1:-1:-1;;;;;36677:16:0;;36669:62;;;;-1:-1:-1;;;36669:62:0;;17195:2:1;36669:62:0;;;17177:21:1;17234:2;17214:18;;;17207:30;17273:34;17253:18;;;17246:62;-1:-1:-1;;;17324:18:1;;;17317:31;17365:19;;36669:62:0;17167:223:1;36669:62:0;36750:13;36742:66;;;;-1:-1:-1;;;36742:66:0;;17597:2:1;36742:66:0;;;17579:21:1;17636:2;17616:18;;;17609:30;17675:34;17655:18;;;17648:62;-1:-1:-1;;;17726:18:1;;;17719:38;17774:19;;36742:66:0;17569:230:1;36742:66:0;-1:-1:-1;;;;;37160:16:0;;;;;;:12;:16;;;;;;;;:45;;-1:-1:-1;;;;;;;;;37160:45:0;;-1:-1:-1;;;;;37160:45:0;;;;;;;;;;37220:50;;;;;;;;;;;;;;37287:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;37337:66:0;;;;-1:-1:-1;;;37387:15:0;37337:66;;;;;;;37287:25;;37472:415;37492:8;37488:1;:12;37472:415;;;37531:38;;37556:12;;-1:-1:-1;;;;;37531:38:0;;;37548:1;;37531:38;;37548:1;;37531:38;37592:4;37588:249;;;37655:59;37686:1;37690:2;37694:12;37708:5;37655:22;:59::i;:::-;37621:196;;;;-1:-1:-1;;;37621:196:0;;;;;;;:::i;:::-;37857:14;;;;;37502:3;37472:415;;;-1:-1:-1;37903:12:0;:27;37954:60;44288:827;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:196::-;251:6;304:2;292:9;283:7;279:23;275:32;272:2;;;325:6;317;310:22;272:2;353:29;372:9;353:29;:::i;393:270::-;461:6;469;522:2;510:9;501:7;497:23;493:32;490:2;;;543:6;535;528:22;490:2;571:29;590:9;571:29;:::i;:::-;561:39;;619:38;653:2;642:9;638:18;619:38;:::i;:::-;609:48;;480:183;;;;;:::o;668:338::-;745:6;753;761;814:2;802:9;793:7;789:23;785:32;782:2;;;835:6;827;820:22;782:2;863:29;882:9;863:29;:::i;:::-;853:39;;911:38;945:2;934:9;930:18;911:38;:::i;:::-;901:48;;996:2;985:9;981:18;968:32;958:42;;772:234;;;;;:::o;1011:1183::-;1106:6;1114;1122;1130;1183:3;1171:9;1162:7;1158:23;1154:33;1151:2;;;1205:6;1197;1190:22;1151:2;1233:29;1252:9;1233:29;:::i;:::-;1223:39;;1281:38;1315:2;1304:9;1300:18;1281:38;:::i;:::-;1271:48;;1366:2;1355:9;1351:18;1338:32;1328:42;;1421:2;1410:9;1406:18;1393:32;1444:18;1485:2;1477:6;1474:14;1471:2;;;1506:6;1498;1491:22;1471:2;1549:6;1538:9;1534:22;1524:32;;1594:7;1587:4;1583:2;1579:13;1575:27;1565:2;;1621:6;1613;1606:22;1565:2;1662;1649:16;1684:2;1680;1677:10;1674:2;;;1690:18;;:::i;:::-;1765:2;1759:9;1733:2;1819:13;;-1:-1:-1;;1815:22:1;;;1839:2;1811:31;1807:40;1795:53;;;1863:18;;;1883:22;;;1860:46;1857:2;;;1909:18;;:::i;:::-;1949:10;1945:2;1938:22;1984:2;1976:6;1969:18;2024:7;2019:2;2014;2010;2006:11;2002:20;1999:33;1996:2;;;2050:6;2042;2035:22;1996:2;2111;2106;2102;2098:11;2093:2;2085:6;2081:15;2068:46;2134:15;;;2151:2;2130:24;2123:40;;;;1141:1053;;;;-1:-1:-1;1141:1053:1;;-1:-1:-1;;;;1141:1053:1:o;2199:367::-;2264:6;2272;2325:2;2313:9;2304:7;2300:23;2296:32;2293:2;;;2346:6;2338;2331:22;2293:2;2374:29;2393:9;2374:29;:::i;:::-;2364:39;;2453:2;2442:9;2438:18;2425:32;2500:5;2493:13;2486:21;2479:5;2476:32;2466:2;;2527:6;2519;2512:22;2466:2;2555:5;2545:15;;;2283:283;;;;;:::o;2571:264::-;2639:6;2647;2700:2;2688:9;2679:7;2675:23;2671:32;2668:2;;;2721:6;2713;2706:22;2668:2;2749:29;2768:9;2749:29;:::i;:::-;2739:39;2825:2;2810:18;;;;2797:32;;-1:-1:-1;;;2658:177:1:o;2840:739::-;2935:6;2943;2951;3004:2;2992:9;2983:7;2979:23;2975:32;2972:2;;;3025:6;3017;3010:22;2972:2;3070:9;3057:23;3099:18;3140:2;3132:6;3129:14;3126:2;;;3161:6;3153;3146:22;3126:2;3204:6;3193:9;3189:22;3179:32;;3249:7;3242:4;3238:2;3234:13;3230:27;3220:2;;3276:6;3268;3261:22;3220:2;3321;3308:16;3347:2;3339:6;3336:14;3333:2;;;3368:6;3360;3353:22;3333:2;3428:7;3421:4;3411:6;3408:1;3404:14;3400:2;3396:23;3392:34;3389:47;3386:2;;;3454:6;3446;3439:22;3386:2;3490:4;3482:13;;;;3514:6;;-1:-1:-1;3552:20:1;;;;3539:34;;2962:617;-1:-1:-1;;;;2962:617:1:o;3584:190::-;3643:6;3696:2;3684:9;3675:7;3671:23;3667:32;3664:2;;;3717:6;3709;3702:22;3664:2;-1:-1:-1;3745:23:1;;3654:120;-1:-1:-1;3654:120:1:o;3779:255::-;3837:6;3890:2;3878:9;3869:7;3865:23;3861:32;3858:2;;;3911:6;3903;3896:22;3858:2;3955:9;3942:23;3974:30;3998:5;3974:30;:::i;4039:259::-;4108:6;4161:2;4149:9;4140:7;4136:23;4132:32;4129:2;;;4182:6;4174;4167:22;4129:2;4219:9;4213:16;4238:30;4262:5;4238:30;:::i;4303:642::-;4374:6;4382;4435:2;4423:9;4414:7;4410:23;4406:32;4403:2;;;4456:6;4448;4441:22;4403:2;4501:9;4488:23;4530:18;4571:2;4563:6;4560:14;4557:2;;;4592:6;4584;4577:22;4557:2;4635:6;4624:9;4620:22;4610:32;;4680:7;4673:4;4669:2;4665:13;4661:27;4651:2;;4707:6;4699;4692:22;4651:2;4752;4739:16;4778:2;4770:6;4767:14;4764:2;;;4799:6;4791;4784:22;4764:2;4849:7;4844:2;4835:6;4831:2;4827:15;4823:24;4820:37;4817:2;;;4875:6;4867;4860:22;4817:2;4911;4903:11;;;;;4933:6;;-1:-1:-1;4393:552:1;;-1:-1:-1;;;;4393:552:1:o;5145:257::-;5186:3;5224:5;5218:12;5251:6;5246:3;5239:19;5267:63;5323:6;5316:4;5311:3;5307:14;5300:4;5293:5;5289:16;5267:63;:::i;:::-;5384:2;5363:15;-1:-1:-1;;5359:29:1;5350:39;;;;5391:4;5346:50;;5194:208;-1:-1:-1;;5194:208:1:o;5641:470::-;5820:3;5858:6;5852:13;5874:53;5920:6;5915:3;5908:4;5900:6;5896:17;5874:53;:::i;:::-;5990:13;;5949:16;;;;6012:57;5990:13;5949:16;6046:4;6034:17;;6012:57;:::i;:::-;6085:20;;5828:283;-1:-1:-1;;;;5828:283:1:o;6324:488::-;-1:-1:-1;;;;;6593:15:1;;;6575:34;;6645:15;;6640:2;6625:18;;6618:43;6692:2;6677:18;;6670:34;;;6740:3;6735:2;6720:18;;6713:31;;;6518:4;;6761:45;;6786:19;;6778:6;6761:45;:::i;:::-;6753:53;6527:285;-1:-1:-1;;;;;;6527:285:1:o;7009:219::-;7158:2;7147:9;7140:21;7121:4;7178:44;7218:2;7207:9;7203:18;7195:6;7178:44;:::i;9264:409::-;9466:2;9448:21;;;9505:2;9485:18;;;9478:30;9544:34;9539:2;9524:18;;9517:62;-1:-1:-1;;;9610:2:1;9595:18;;9588:43;9663:3;9648:19;;9438:235::o;13205:356::-;13407:2;13389:21;;;13426:18;;;13419:30;13485:34;13480:2;13465:18;;13458:62;13552:2;13537:18;;13379:182::o;16224:415::-;16426:2;16408:21;;;16465:2;16445:18;;;16438:30;16504:34;16499:2;16484:18;;16477:62;-1:-1:-1;;;16570:2:1;16555:18;;16548:49;16629:3;16614:19;;16398:241::o;19572:128::-;19612:3;19643:1;19639:6;19636:1;19633:13;19630:2;;;19649:18;;:::i;:::-;-1:-1:-1;19685:9:1;;19620:80::o;19705:120::-;19745:1;19771;19761:2;;19776:18;;:::i;:::-;-1:-1:-1;19810:9:1;;19751:74::o;19830:168::-;19870:7;19936:1;19932;19928:6;19924:14;19921:1;19918:21;19913:1;19906:9;19899:17;19895:45;19892:2;;;19943:18;;:::i;:::-;-1:-1:-1;19983:9:1;;19882:116::o;20003:125::-;20043:4;20071:1;20068;20065:8;20062:2;;;20076:18;;:::i;:::-;-1:-1:-1;20113:9:1;;20052:76::o;20133:258::-;20205:1;20215:113;20229:6;20226:1;20223:13;20215:113;;;20305:11;;;20299:18;20286:11;;;20279:39;20251:2;20244:10;20215:113;;;20346:6;20343:1;20340:13;20337:2;;;-1:-1:-1;;20381:1:1;20363:16;;20356:27;20186:205::o;20396:380::-;20475:1;20471:12;;;;20518;;;20539:2;;20593:4;20585:6;20581:17;20571:27;;20539:2;20646;20638:6;20635:14;20615:18;20612:38;20609:2;;;20692:10;20687:3;20683:20;20680:1;20673:31;20727:4;20724:1;20717:15;20755:4;20752:1;20745:15;20609:2;;20451:325;;;:::o;20781:135::-;20820:3;-1:-1:-1;;20841:17:1;;20838:2;;;20861:18;;:::i;:::-;-1:-1:-1;20908:1:1;20897:13;;20828:88::o;20921:112::-;20953:1;20979;20969:2;;20984:18;;:::i;:::-;-1:-1:-1;21018:9:1;;20959:74::o;21038:127::-;21099:10;21094:3;21090:20;21087:1;21080:31;21130:4;21127:1;21120:15;21154:4;21151:1;21144:15;21170:127;21231:10;21226:3;21222:20;21219:1;21212:31;21262:4;21259:1;21252:15;21286:4;21283:1;21276:15;21302:127;21363:10;21358:3;21354:20;21351:1;21344:31;21394:4;21391:1;21384:15;21418:4;21415:1;21408:15;21434:131;-1:-1:-1;;;;;;21508:32:1;;21498:43;;21488:2;;21555:1;21552;21545:12

Swarm Source

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