ETH Price: $3,166.04 (+2.76%)

Token

Pixel Apepe YC (PAYC)
 

Overview

Max Total Supply

10,000 PAYC

Holders

2,011

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 PAYC
0xed9492c29839e42464b21ac78396bb39e1aebb11
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:
PixelApepe

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-12
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree 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 Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(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++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// 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 (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`.
        uint24 extraData;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

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

    // ==============================
    //            IERC721
    // ==============================

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

    // ==============================
    //        IERC721Metadata
    // ==============================

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

    // ==============================
    //            IERC2309
    // ==============================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`,
     * as defined in the ERC2309 standard. See `_mintERC2309` for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard,
 * including the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at `_startTokenId()`
 * (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with `_mintERC2309`.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309`
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The tokenId of the next token to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // 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 `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

    // 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_;
        _currentIndex = _startTokenId();
    }

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to `_startTokenId()`
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> BITPOS_AUX);
    }

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA);
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * 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) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, BITMASK_ADDRESS)
            // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

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

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }

    /**
     * @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, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`.
            result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ownerOf(tokenId);

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), 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-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @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
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    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.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @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 for each mint.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 tokenId = startTokenId;
            uint256 end = startTokenId + quantity;
            do {
                emit Transfer(address(0), to, tokenId++);
            } while (tokenId < end);

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals;
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            // Compute the slot.
            mstore(0x00, tokenId)
            mstore(0x20, tokenApprovalsPtr.slot)
            approvedAddressSlot := keccak256(0x00, 0x40)
            // Load the slot's value from storage.
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    /**
     * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`.
     */
    function _isOwnerOrApproved(
        address approvedAddress,
        address from,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean.
            from := and(from, BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, BITMASK_ADDRESS)
            // `msgSender == from || msgSender == approvedAddress`.
            result := or(eq(msgSender, from), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @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 transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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 {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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 {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred.
     * This includes minting.
     * And also called before burning one token.
     *
     * 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`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    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.
     * And also called after one token has been burned.
     *
     * 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` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for {
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } {
                // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

// File: PixelApepe.sol


pragma solidity ^0.8.7;






contract PixelApepe is ERC721A, Ownable {
    uint256 MAX_SUPPLY = 10000;
    uint256 MAX_FREE = 2000;
    uint256 MAX_MINTS = 3;
    uint256 MAX_ALLOWLIST_MINTS = 1;
    uint256 public mintRate = 0.0069 ether;
    bool public allowlistActive;
    bool public publicSaleActive; 
    string public baseURI;

    
    bytes32 public merkleRoot;

    mapping(address => bool) public whitelistClaimed;


    constructor(string memory _baseUri, bytes32 _root) ERC721A("Pixel Apepe YC", "PAYC") {baseURI = _baseUri; merkleRoot = _root;}



    function allowlistMint(bytes32[] calldata _merkleProof) public {
        require(allowlistActive, "WL sale is not active");
        require(!whitelistClaimed[msg.sender], "Address already claimed");

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(isValid(_merkleProof, leaf), "Not on Free mint list");
        //Hard coded to quantity 1 for WL
        require(totalSupply() + 1 <= MAX_FREE, "Not enough FREE tokens left");
        whitelistClaimed[msg.sender] = true;
        _safeMint(msg.sender, 1);
    }
    


    function mint(uint256 quantity) external payable {
        // _safeMint's second argument now takes in a quantity, not a tokenId.
        require(publicSaleActive, "Public sale is not active");
        require(quantity <= MAX_MINTS, "Exceeded the limit");
        require(totalSupply() + quantity <= MAX_SUPPLY, "Not enough tokens left");
    
        require(msg.value >= mintRate * quantity, "Not enough ether sent");
        _safeMint(msg.sender, quantity);
        
        
    }

    function isValid(bytes32[] calldata _proof, bytes32 leaf) public view returns(bool){
        return MerkleProof.verify(_proof, merkleRoot, leaf);

    }

    function mintForteam(uint256 quantity) external payable onlyOwner {
        require(totalSupply() + quantity <= MAX_SUPPLY, "Not enough tokens left");
        _safeMint(msg.sender, quantity);
    }

    function toggleSaleState() public onlyOwner{
        if(!allowlistActive && !publicSaleActive){
            allowlistActive = true;

        }else if(allowlistActive && !publicSaleActive){
            allowlistActive = false;
            publicSaleActive = true;
        }else{
            allowlistActive = false;
            publicSaleActive = false;
        }
    }


    function withdraw() external payable onlyOwner {

        address marketing = 0x01891895f156113516947dd4006ABC55E4a43D5D;
        payable(marketing).transfer((address(this).balance * 45 / 100));

        payable(owner()).transfer(address(this).balance);
    }

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

    function changeRoot(bytes32 _root) public onlyOwner {
        merkleRoot = _root;
    }

    function setMintRate(uint256 _mintRate) public onlyOwner {
        mintRate = _mintRate;
    }
    function setBaseURI(string calldata _base) public onlyOwner {
        baseURI = _base;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"},{"internalType":"bytes32","name":"_root","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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":"allowlistActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"allowlistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"changeRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"isValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintForteam","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"_base","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintRate","type":"uint256"}],"name":"setMintRate","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":"toggleSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526127106009556107d0600a556003600b556001600c556618838370f34000600d553480156200003257600080fd5b50604051620039513803806200395183398181016040528101906200005891906200036e565b6040518060400160405280600e81526020017f506978656c2041706570652059430000000000000000000000000000000000008152506040518060400160405280600481526020017f50415943000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000dc92919062000229565b508060039080519060200190620000f592919062000229565b50620001066200015660201b60201c565b60008190555050506200012e620001226200015b60201b60201c565b6200016360201b60201c565b81600f90805190602001906200014692919062000229565b508060108190555050506200057c565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002379062000473565b90600052602060002090601f0160209004810192826200025b5760008555620002a7565b82601f106200027657805160ff1916838001178555620002a7565b82800160010185558215620002a7579182015b82811115620002a657825182559160200191906001019062000289565b5b509050620002b69190620002ba565b5090565b5b80821115620002d5576000816000905550600101620002bb565b5090565b6000620002f0620002ea84620003fd565b620003d4565b9050828152602081018484840111156200030f576200030e62000542565b5b6200031c8482856200043d565b509392505050565b600081519050620003358162000562565b92915050565b600082601f8301126200035357620003526200053d565b5b815162000365848260208601620002d9565b91505092915050565b600080604083850312156200038857620003876200054c565b5b600083015167ffffffffffffffff811115620003a957620003a862000547565b5b620003b7858286016200033b565b9250506020620003ca8582860162000324565b9150509250929050565b6000620003e0620003f3565b9050620003ee8282620004a9565b919050565b6000604051905090565b600067ffffffffffffffff8211156200041b576200041a6200050e565b5b620004268262000551565b9050602081019050919050565b6000819050919050565b60005b838110156200045d57808201518184015260208101905062000440565b838111156200046d576000848401525b50505050565b600060028204905060018216806200048c57607f821691505b60208210811415620004a357620004a2620004df565b5b50919050565b620004b48262000551565b810181811067ffffffffffffffff82111715620004d657620004d56200050e565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200056d8162000433565b81146200057957600080fd5b50565b6133c5806200058c6000396000f3fe6080604052600436106101e35760003560e01c8063715018a611610102578063bc8893b411610095578063db4bec4411610064578063db4bec4414610691578063dbe2193f146106ce578063e985e9c5146106f7578063f2fde38b14610734576101e3565b8063bc8893b4146105e7578063c87b56dd14610612578063ca0dcf161461064f578063daaeec861461067a576101e3565b8063a0712d68116100d1578063a0712d681461053c578063a22cb46514610558578063b88d4fde14610581578063b8a20ed0146105aa576101e3565b8063715018a6146104a45780638b076b9b146104bb5780638da5cb5b146104e657806395d89b4114610511576101e3565b80633ccfd60b1161017a57806355f804b31161014957806355f804b3146103d65780636352211e146103ff5780636c0360eb1461043c57806370a0823114610467576101e3565b80633ccfd60b146103515780633d59cd601461035b57806342842e0e14610384578063537924ef146103ad576101e3565b806318160ddd116101b657806318160ddd146102b65780631d9b9efc146102e157806323b872dd146102fd5780632eb4a7ab14610326576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a91906127aa565b61075d565b60405161021c9190612b78565b60405180910390f35b34801561023157600080fd5b5061023a6107ef565b6040516102479190612bae565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190612851565b610881565b6040516102849190612b11565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190612690565b6108fd565b005b3480156102c257600080fd5b506102cb610a3e565b6040516102d89190612d10565b60405180910390f35b6102fb60048036038101906102f69190612851565b610a55565b005b34801561030957600080fd5b50610324600480360381019061031f919061257a565b610ac1565b005b34801561033257600080fd5b5061033b610de6565b6040516103489190612b93565b60405180910390f35b610359610dec565b005b34801561036757600080fd5b50610382600480360381019061037d919061277d565b610ebd565b005b34801561039057600080fd5b506103ab60048036038101906103a6919061257a565b610ecf565b005b3480156103b957600080fd5b506103d460048036038101906103cf91906126d0565b610eef565b005b3480156103e257600080fd5b506103fd60048036038101906103f89190612804565b611100565b005b34801561040b57600080fd5b5061042660048036038101906104219190612851565b61111e565b6040516104339190612b11565b60405180910390f35b34801561044857600080fd5b50610451611130565b60405161045e9190612bae565b60405180910390f35b34801561047357600080fd5b5061048e6004803603810190610489919061250d565b6111be565b60405161049b9190612d10565b60405180910390f35b3480156104b057600080fd5b506104b9611277565b005b3480156104c757600080fd5b506104d061128b565b6040516104dd9190612b78565b60405180910390f35b3480156104f257600080fd5b506104fb61129e565b6040516105089190612b11565b60405180910390f35b34801561051d57600080fd5b506105266112c8565b6040516105339190612bae565b60405180910390f35b61055660048036038101906105519190612851565b61135a565b005b34801561056457600080fd5b5061057f600480360381019061057a9190612650565b6114a2565b005b34801561058d57600080fd5b506105a860048036038101906105a391906125cd565b61161a565b005b3480156105b657600080fd5b506105d160048036038101906105cc919061271d565b61168d565b6040516105de9190612b78565b60405180910390f35b3480156105f357600080fd5b506105fc6116e6565b6040516106099190612b78565b60405180910390f35b34801561061e57600080fd5b5061063960048036038101906106349190612851565b6116f9565b6040516106469190612bae565b60405180910390f35b34801561065b57600080fd5b50610664611798565b6040516106719190612d10565b60405180910390f35b34801561068657600080fd5b5061068f61179e565b005b34801561069d57600080fd5b506106b860048036038101906106b3919061250d565b611898565b6040516106c59190612b78565b60405180910390f35b3480156106da57600080fd5b506106f560048036038101906106f09190612851565b6118b8565b005b34801561070357600080fd5b5061071e6004803603810190610719919061253a565b6118ca565b60405161072b9190612b78565b60405180910390f35b34801561074057600080fd5b5061075b6004803603810190610756919061250d565b61195e565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107b857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107e85750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546107fe90612f65565b80601f016020809104026020016040519081016040528092919081815260200182805461082a90612f65565b80156108775780601f1061084c57610100808354040283529160200191610877565b820191906000526020600020905b81548152906001019060200180831161085a57829003601f168201915b5050505050905090565b600061088c826119e2565b6108c2576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109088261111e565b90508073ffffffffffffffffffffffffffffffffffffffff16610929611a41565b73ffffffffffffffffffffffffffffffffffffffff161461098c5761095581610950611a41565b6118ca565b61098b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a48611a49565b6001546000540303905090565b610a5d611a4e565b60095481610a69610a3e565b610a739190612dc4565b1115610ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aab90612c50565b60405180910390fd5b610abe3382611acc565b50565b6000610acc82611aea565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b33576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b3f84611bb8565b91509150610b558187610b50611a41565b611bda565b610ba157610b6a86610b65611a41565b6118ca565b610ba0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610c08576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c158686866001611c1e565b8015610c2057600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610cee85610cca888887611c24565b7c020000000000000000000000000000000000000000000000000000000017611c4c565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610d76576000600185019050600060046000838152602001908152602001600020541415610d74576000548114610d73578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610dde8686866001611c77565b505050505050565b60105481565b610df4611a4e565b60007301891895f156113516947dd4006abc55e4a43d5d90508073ffffffffffffffffffffffffffffffffffffffff166108fc6064602d47610e369190612e4b565b610e409190612e1a565b9081150290604051600060405180830381858888f19350505050158015610e6b573d6000803e3d6000fd5b50610e7461129e565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610eb9573d6000803e3d6000fd5b5050565b610ec5611a4e565b8060108190555050565b610eea8383836040518060200160405280600081525061161a565b505050565b600e60009054906101000a900460ff16610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3590612c70565b60405180910390fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc290612cb0565b60405180910390fd5b600033604051602001610fde9190612ad2565b60405160208183030381529060405280519060200120905061100183838361168d565b611040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103790612c10565b60405180910390fd5b600a54600161104d610a3e565b6110579190612dc4565b1115611098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108f90612cd0565b60405180910390fd5b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506110fb336001611acc565b505050565b611108611a4e565b8181600f91906111199291906122d0565b505050565b600061112982611aea565b9050919050565b600f805461113d90612f65565b80601f016020809104026020016040519081016040528092919081815260200182805461116990612f65565b80156111b65780601f1061118b576101008083540402835291602001916111b6565b820191906000526020600020905b81548152906001019060200180831161119957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611226576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61127f611a4e565b6112896000611c7d565b565b600e60009054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546112d790612f65565b80601f016020809104026020016040519081016040528092919081815260200182805461130390612f65565b80156113505780601f1061132557610100808354040283529160200191611350565b820191906000526020600020905b81548152906001019060200180831161133357829003601f168201915b5050505050905090565b600e60019054906101000a900460ff166113a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a090612c30565b60405180910390fd5b600b548111156113ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e590612bf0565b60405180910390fd5b600954816113fa610a3e565b6114049190612dc4565b1115611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c90612c50565b60405180910390fd5b80600d546114539190612e4b565b341015611495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148c90612cf0565b60405180910390fd5b61149f3382611acc565b50565b6114aa611a41565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561150f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061151c611a41565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115c9611a41565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161160e9190612b78565b60405180910390a35050565b611625848484610ac1565b60008373ffffffffffffffffffffffffffffffffffffffff163b146116875761165084848484611d43565b611686576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60006116dd848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060105484611ea3565b90509392505050565b600e60019054906101000a900460ff1681565b6060611704826119e2565b61173a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611744611eba565b90506000815114156117655760405180602001604052806000815250611790565b8061176f84611f4c565b604051602001611780929190612aed565b6040516020818303038152906040525b915050919050565b600d5481565b6117a6611a4e565b600e60009054906101000a900460ff161580156117d05750600e60019054906101000a900460ff16155b156117f5576001600e60006101000a81548160ff021916908315150217905550611896565b600e60009054906101000a900460ff16801561181e5750600e60019054906101000a900460ff16155b1561185e576000600e60006101000a81548160ff0219169083151502179055506001600e60016101000a81548160ff021916908315150217905550611895565b6000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff0219169083151502179055505b5b565b60116020528060005260406000206000915054906101000a900460ff1681565b6118c0611a4e565b80600d8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611966611a4e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cd90612bd0565b60405180910390fd5b6119df81611c7d565b50565b6000816119ed611a49565b111580156119fc575060005482105b8015611a3a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b611a56611fa6565b73ffffffffffffffffffffffffffffffffffffffff16611a7461129e565b73ffffffffffffffffffffffffffffffffffffffff1614611aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac190612c90565b60405180910390fd5b565b611ae6828260405180602001604052806000815250611fae565b5050565b60008082905080611af9611a49565b11611b8157600054811015611b805760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611b7e575b6000811415611b74576004600083600190039350838152602001908152602001600020549050611b49565b8092505050611bb3565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611c3b86868461204b565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d69611a41565b8786866040518563ffffffff1660e01b8152600401611d8b9493929190612b2c565b602060405180830381600087803b158015611da557600080fd5b505af1925050508015611dd657506040513d601f19601f82011682018060405250810190611dd391906127d7565b60015b611e50573d8060008114611e06576040519150601f19603f3d011682016040523d82523d6000602084013e611e0b565b606091505b50600081511415611e48576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600082611eb08584612054565b1490509392505050565b6060600f8054611ec990612f65565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef590612f65565b8015611f425780601f10611f1757610100808354040283529160200191611f42565b820191906000526020600020905b815481529060010190602001808311611f2557829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015611f9257600183039250600a81066030018353600a81049050611f72565b508181036020830392508083525050919050565b600033905090565b611fb883836120aa565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461204657600080549050600083820390505b611ff86000868380600101945086611d43565b61202e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611fe557816000541461204357600080fd5b50505b505050565b60009392505050565b60008082905060005b845181101561209f5761208a8286838151811061207d5761207c6130c2565b5b602002602001015161227e565b9150808061209790612fc8565b91505061205d565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612117576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612152576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61215f6000848385611c1e565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506121d6836121c76000866000611c24565b6121d0856122a9565b17611c4c565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106121fa578060008190555050506122796000848385611c77565b505050565b60008183106122965761229182846122b9565b6122a1565b6122a083836122b9565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b8280546122dc90612f65565b90600052602060002090601f0160209004810192826122fe5760008555612345565b82601f1061231757803560ff1916838001178555612345565b82800160010185558215612345579182015b82811115612344578235825591602001919060010190612329565b5b5090506123529190612356565b5090565b5b8082111561236f576000816000905550600101612357565b5090565b600061238661238184612d50565b612d2b565b9050828152602081018484840111156123a2576123a161312f565b5b6123ad848285612f23565b509392505050565b6000813590506123c48161331c565b92915050565b60008083601f8401126123e0576123df613125565b5b8235905067ffffffffffffffff8111156123fd576123fc613120565b5b6020830191508360208202830111156124195761241861312a565b5b9250929050565b60008135905061242f81613333565b92915050565b6000813590506124448161334a565b92915050565b60008135905061245981613361565b92915050565b60008151905061246e81613361565b92915050565b600082601f83011261248957612488613125565b5b8135612499848260208601612373565b91505092915050565b60008083601f8401126124b8576124b7613125565b5b8235905067ffffffffffffffff8111156124d5576124d4613120565b5b6020830191508360018202830111156124f1576124f061312a565b5b9250929050565b60008135905061250781613378565b92915050565b60006020828403121561252357612522613139565b5b6000612531848285016123b5565b91505092915050565b6000806040838503121561255157612550613139565b5b600061255f858286016123b5565b9250506020612570858286016123b5565b9150509250929050565b60008060006060848603121561259357612592613139565b5b60006125a1868287016123b5565b93505060206125b2868287016123b5565b92505060406125c3868287016124f8565b9150509250925092565b600080600080608085870312156125e7576125e6613139565b5b60006125f5878288016123b5565b9450506020612606878288016123b5565b9350506040612617878288016124f8565b925050606085013567ffffffffffffffff81111561263857612637613134565b5b61264487828801612474565b91505092959194509250565b6000806040838503121561266757612666613139565b5b6000612675858286016123b5565b925050602061268685828601612420565b9150509250929050565b600080604083850312156126a7576126a6613139565b5b60006126b5858286016123b5565b92505060206126c6858286016124f8565b9150509250929050565b600080602083850312156126e7576126e6613139565b5b600083013567ffffffffffffffff81111561270557612704613134565b5b612711858286016123ca565b92509250509250929050565b60008060006040848603121561273657612735613139565b5b600084013567ffffffffffffffff81111561275457612753613134565b5b612760868287016123ca565b9350935050602061277386828701612435565b9150509250925092565b60006020828403121561279357612792613139565b5b60006127a184828501612435565b91505092915050565b6000602082840312156127c0576127bf613139565b5b60006127ce8482850161244a565b91505092915050565b6000602082840312156127ed576127ec613139565b5b60006127fb8482850161245f565b91505092915050565b6000806020838503121561281b5761281a613139565b5b600083013567ffffffffffffffff81111561283957612838613134565b5b612845858286016124a2565b92509250509250929050565b60006020828403121561286757612866613139565b5b6000612875848285016124f8565b91505092915050565b61288781612ea5565b82525050565b61289e61289982612ea5565b613011565b82525050565b6128ad81612eb7565b82525050565b6128bc81612ec3565b82525050565b60006128cd82612d81565b6128d78185612d97565b93506128e7818560208601612f32565b6128f08161313e565b840191505092915050565b600061290682612d8c565b6129108185612da8565b9350612920818560208601612f32565b6129298161313e565b840191505092915050565b600061293f82612d8c565b6129498185612db9565b9350612959818560208601612f32565b80840191505092915050565b6000612972602683612da8565b915061297d8261315c565b604082019050919050565b6000612995601283612da8565b91506129a0826131ab565b602082019050919050565b60006129b8601583612da8565b91506129c3826131d4565b602082019050919050565b60006129db601983612da8565b91506129e6826131fd565b602082019050919050565b60006129fe601683612da8565b9150612a0982613226565b602082019050919050565b6000612a21601583612da8565b9150612a2c8261324f565b602082019050919050565b6000612a44602083612da8565b9150612a4f82613278565b602082019050919050565b6000612a67601783612da8565b9150612a72826132a1565b602082019050919050565b6000612a8a601b83612da8565b9150612a95826132ca565b602082019050919050565b6000612aad601583612da8565b9150612ab8826132f3565b602082019050919050565b612acc81612f19565b82525050565b6000612ade828461288d565b60148201915081905092915050565b6000612af98285612934565b9150612b058284612934565b91508190509392505050565b6000602082019050612b26600083018461287e565b92915050565b6000608082019050612b41600083018761287e565b612b4e602083018661287e565b612b5b6040830185612ac3565b8181036060830152612b6d81846128c2565b905095945050505050565b6000602082019050612b8d60008301846128a4565b92915050565b6000602082019050612ba860008301846128b3565b92915050565b60006020820190508181036000830152612bc881846128fb565b905092915050565b60006020820190508181036000830152612be981612965565b9050919050565b60006020820190508181036000830152612c0981612988565b9050919050565b60006020820190508181036000830152612c29816129ab565b9050919050565b60006020820190508181036000830152612c49816129ce565b9050919050565b60006020820190508181036000830152612c69816129f1565b9050919050565b60006020820190508181036000830152612c8981612a14565b9050919050565b60006020820190508181036000830152612ca981612a37565b9050919050565b60006020820190508181036000830152612cc981612a5a565b9050919050565b60006020820190508181036000830152612ce981612a7d565b9050919050565b60006020820190508181036000830152612d0981612aa0565b9050919050565b6000602082019050612d256000830184612ac3565b92915050565b6000612d35612d46565b9050612d418282612f97565b919050565b6000604051905090565b600067ffffffffffffffff821115612d6b57612d6a6130f1565b5b612d748261313e565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612dcf82612f19565b9150612dda83612f19565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e0f57612e0e613035565b5b828201905092915050565b6000612e2582612f19565b9150612e3083612f19565b925082612e4057612e3f613064565b5b828204905092915050565b6000612e5682612f19565b9150612e6183612f19565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e9a57612e99613035565b5b828202905092915050565b6000612eb082612ef9565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612f50578082015181840152602081019050612f35565b83811115612f5f576000848401525b50505050565b60006002820490506001821680612f7d57607f821691505b60208210811415612f9157612f90613093565b5b50919050565b612fa08261313e565b810181811067ffffffffffffffff82111715612fbf57612fbe6130f1565b5b80604052505050565b6000612fd382612f19565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561300657613005613035565b5b600182019050919050565b600061301c82613023565b9050919050565b600061302e8261314f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f457863656564656420746865206c696d69740000000000000000000000000000600082015250565b7f4e6f74206f6e2046726565206d696e74206c6973740000000000000000000000600082015250565b7f5075626c69632073616c65206973206e6f742061637469766500000000000000600082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b7f574c2073616c65206973206e6f74206163746976650000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4164647265737320616c726561647920636c61696d6564000000000000000000600082015250565b7f4e6f7420656e6f756768204652454520746f6b656e73206c6566740000000000600082015250565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b61332581612ea5565b811461333057600080fd5b50565b61333c81612eb7565b811461334757600080fd5b50565b61335381612ec3565b811461335e57600080fd5b50565b61336a81612ecd565b811461337557600080fd5b50565b61338181612f19565b811461338c57600080fd5b5056fea2646970667358221220f89e1629ce78090a554ded5542076362d430992ec7a06d2c5f646b21b7c6689964736f6c634300080700330000000000000000000000000000000000000000000000000000000000000040442a43ecc3fd288b550d85baf19fb929a7475ecfb486444c56c04f82c905137d0000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d53456e384c4e597a754d63623470334544346834426664354c576161507147706f76396a454c444b343461362f00000000000000000000

Deployed Bytecode

0x6080604052600436106101e35760003560e01c8063715018a611610102578063bc8893b411610095578063db4bec4411610064578063db4bec4414610691578063dbe2193f146106ce578063e985e9c5146106f7578063f2fde38b14610734576101e3565b8063bc8893b4146105e7578063c87b56dd14610612578063ca0dcf161461064f578063daaeec861461067a576101e3565b8063a0712d68116100d1578063a0712d681461053c578063a22cb46514610558578063b88d4fde14610581578063b8a20ed0146105aa576101e3565b8063715018a6146104a45780638b076b9b146104bb5780638da5cb5b146104e657806395d89b4114610511576101e3565b80633ccfd60b1161017a57806355f804b31161014957806355f804b3146103d65780636352211e146103ff5780636c0360eb1461043c57806370a0823114610467576101e3565b80633ccfd60b146103515780633d59cd601461035b57806342842e0e14610384578063537924ef146103ad576101e3565b806318160ddd116101b657806318160ddd146102b65780631d9b9efc146102e157806323b872dd146102fd5780632eb4a7ab14610326576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a91906127aa565b61075d565b60405161021c9190612b78565b60405180910390f35b34801561023157600080fd5b5061023a6107ef565b6040516102479190612bae565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190612851565b610881565b6040516102849190612b11565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190612690565b6108fd565b005b3480156102c257600080fd5b506102cb610a3e565b6040516102d89190612d10565b60405180910390f35b6102fb60048036038101906102f69190612851565b610a55565b005b34801561030957600080fd5b50610324600480360381019061031f919061257a565b610ac1565b005b34801561033257600080fd5b5061033b610de6565b6040516103489190612b93565b60405180910390f35b610359610dec565b005b34801561036757600080fd5b50610382600480360381019061037d919061277d565b610ebd565b005b34801561039057600080fd5b506103ab60048036038101906103a6919061257a565b610ecf565b005b3480156103b957600080fd5b506103d460048036038101906103cf91906126d0565b610eef565b005b3480156103e257600080fd5b506103fd60048036038101906103f89190612804565b611100565b005b34801561040b57600080fd5b5061042660048036038101906104219190612851565b61111e565b6040516104339190612b11565b60405180910390f35b34801561044857600080fd5b50610451611130565b60405161045e9190612bae565b60405180910390f35b34801561047357600080fd5b5061048e6004803603810190610489919061250d565b6111be565b60405161049b9190612d10565b60405180910390f35b3480156104b057600080fd5b506104b9611277565b005b3480156104c757600080fd5b506104d061128b565b6040516104dd9190612b78565b60405180910390f35b3480156104f257600080fd5b506104fb61129e565b6040516105089190612b11565b60405180910390f35b34801561051d57600080fd5b506105266112c8565b6040516105339190612bae565b60405180910390f35b61055660048036038101906105519190612851565b61135a565b005b34801561056457600080fd5b5061057f600480360381019061057a9190612650565b6114a2565b005b34801561058d57600080fd5b506105a860048036038101906105a391906125cd565b61161a565b005b3480156105b657600080fd5b506105d160048036038101906105cc919061271d565b61168d565b6040516105de9190612b78565b60405180910390f35b3480156105f357600080fd5b506105fc6116e6565b6040516106099190612b78565b60405180910390f35b34801561061e57600080fd5b5061063960048036038101906106349190612851565b6116f9565b6040516106469190612bae565b60405180910390f35b34801561065b57600080fd5b50610664611798565b6040516106719190612d10565b60405180910390f35b34801561068657600080fd5b5061068f61179e565b005b34801561069d57600080fd5b506106b860048036038101906106b3919061250d565b611898565b6040516106c59190612b78565b60405180910390f35b3480156106da57600080fd5b506106f560048036038101906106f09190612851565b6118b8565b005b34801561070357600080fd5b5061071e6004803603810190610719919061253a565b6118ca565b60405161072b9190612b78565b60405180910390f35b34801561074057600080fd5b5061075b6004803603810190610756919061250d565b61195e565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107b857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107e85750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546107fe90612f65565b80601f016020809104026020016040519081016040528092919081815260200182805461082a90612f65565b80156108775780601f1061084c57610100808354040283529160200191610877565b820191906000526020600020905b81548152906001019060200180831161085a57829003601f168201915b5050505050905090565b600061088c826119e2565b6108c2576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109088261111e565b90508073ffffffffffffffffffffffffffffffffffffffff16610929611a41565b73ffffffffffffffffffffffffffffffffffffffff161461098c5761095581610950611a41565b6118ca565b61098b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a48611a49565b6001546000540303905090565b610a5d611a4e565b60095481610a69610a3e565b610a739190612dc4565b1115610ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aab90612c50565b60405180910390fd5b610abe3382611acc565b50565b6000610acc82611aea565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b33576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b3f84611bb8565b91509150610b558187610b50611a41565b611bda565b610ba157610b6a86610b65611a41565b6118ca565b610ba0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610c08576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c158686866001611c1e565b8015610c2057600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610cee85610cca888887611c24565b7c020000000000000000000000000000000000000000000000000000000017611c4c565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610d76576000600185019050600060046000838152602001908152602001600020541415610d74576000548114610d73578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610dde8686866001611c77565b505050505050565b60105481565b610df4611a4e565b60007301891895f156113516947dd4006abc55e4a43d5d90508073ffffffffffffffffffffffffffffffffffffffff166108fc6064602d47610e369190612e4b565b610e409190612e1a565b9081150290604051600060405180830381858888f19350505050158015610e6b573d6000803e3d6000fd5b50610e7461129e565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610eb9573d6000803e3d6000fd5b5050565b610ec5611a4e565b8060108190555050565b610eea8383836040518060200160405280600081525061161a565b505050565b600e60009054906101000a900460ff16610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3590612c70565b60405180910390fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc290612cb0565b60405180910390fd5b600033604051602001610fde9190612ad2565b60405160208183030381529060405280519060200120905061100183838361168d565b611040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103790612c10565b60405180910390fd5b600a54600161104d610a3e565b6110579190612dc4565b1115611098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108f90612cd0565b60405180910390fd5b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506110fb336001611acc565b505050565b611108611a4e565b8181600f91906111199291906122d0565b505050565b600061112982611aea565b9050919050565b600f805461113d90612f65565b80601f016020809104026020016040519081016040528092919081815260200182805461116990612f65565b80156111b65780601f1061118b576101008083540402835291602001916111b6565b820191906000526020600020905b81548152906001019060200180831161119957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611226576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61127f611a4e565b6112896000611c7d565b565b600e60009054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546112d790612f65565b80601f016020809104026020016040519081016040528092919081815260200182805461130390612f65565b80156113505780601f1061132557610100808354040283529160200191611350565b820191906000526020600020905b81548152906001019060200180831161133357829003601f168201915b5050505050905090565b600e60019054906101000a900460ff166113a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a090612c30565b60405180910390fd5b600b548111156113ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e590612bf0565b60405180910390fd5b600954816113fa610a3e565b6114049190612dc4565b1115611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c90612c50565b60405180910390fd5b80600d546114539190612e4b565b341015611495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148c90612cf0565b60405180910390fd5b61149f3382611acc565b50565b6114aa611a41565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561150f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061151c611a41565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115c9611a41565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161160e9190612b78565b60405180910390a35050565b611625848484610ac1565b60008373ffffffffffffffffffffffffffffffffffffffff163b146116875761165084848484611d43565b611686576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60006116dd848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060105484611ea3565b90509392505050565b600e60019054906101000a900460ff1681565b6060611704826119e2565b61173a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611744611eba565b90506000815114156117655760405180602001604052806000815250611790565b8061176f84611f4c565b604051602001611780929190612aed565b6040516020818303038152906040525b915050919050565b600d5481565b6117a6611a4e565b600e60009054906101000a900460ff161580156117d05750600e60019054906101000a900460ff16155b156117f5576001600e60006101000a81548160ff021916908315150217905550611896565b600e60009054906101000a900460ff16801561181e5750600e60019054906101000a900460ff16155b1561185e576000600e60006101000a81548160ff0219169083151502179055506001600e60016101000a81548160ff021916908315150217905550611895565b6000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff0219169083151502179055505b5b565b60116020528060005260406000206000915054906101000a900460ff1681565b6118c0611a4e565b80600d8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611966611a4e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cd90612bd0565b60405180910390fd5b6119df81611c7d565b50565b6000816119ed611a49565b111580156119fc575060005482105b8015611a3a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b611a56611fa6565b73ffffffffffffffffffffffffffffffffffffffff16611a7461129e565b73ffffffffffffffffffffffffffffffffffffffff1614611aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac190612c90565b60405180910390fd5b565b611ae6828260405180602001604052806000815250611fae565b5050565b60008082905080611af9611a49565b11611b8157600054811015611b805760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611b7e575b6000811415611b74576004600083600190039350838152602001908152602001600020549050611b49565b8092505050611bb3565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611c3b86868461204b565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d69611a41565b8786866040518563ffffffff1660e01b8152600401611d8b9493929190612b2c565b602060405180830381600087803b158015611da557600080fd5b505af1925050508015611dd657506040513d601f19601f82011682018060405250810190611dd391906127d7565b60015b611e50573d8060008114611e06576040519150601f19603f3d011682016040523d82523d6000602084013e611e0b565b606091505b50600081511415611e48576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600082611eb08584612054565b1490509392505050565b6060600f8054611ec990612f65565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef590612f65565b8015611f425780601f10611f1757610100808354040283529160200191611f42565b820191906000526020600020905b815481529060010190602001808311611f2557829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015611f9257600183039250600a81066030018353600a81049050611f72565b508181036020830392508083525050919050565b600033905090565b611fb883836120aa565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461204657600080549050600083820390505b611ff86000868380600101945086611d43565b61202e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611fe557816000541461204357600080fd5b50505b505050565b60009392505050565b60008082905060005b845181101561209f5761208a8286838151811061207d5761207c6130c2565b5b602002602001015161227e565b9150808061209790612fc8565b91505061205d565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612117576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612152576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61215f6000848385611c1e565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506121d6836121c76000866000611c24565b6121d0856122a9565b17611c4c565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106121fa578060008190555050506122796000848385611c77565b505050565b60008183106122965761229182846122b9565b6122a1565b6122a083836122b9565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b8280546122dc90612f65565b90600052602060002090601f0160209004810192826122fe5760008555612345565b82601f1061231757803560ff1916838001178555612345565b82800160010185558215612345579182015b82811115612344578235825591602001919060010190612329565b5b5090506123529190612356565b5090565b5b8082111561236f576000816000905550600101612357565b5090565b600061238661238184612d50565b612d2b565b9050828152602081018484840111156123a2576123a161312f565b5b6123ad848285612f23565b509392505050565b6000813590506123c48161331c565b92915050565b60008083601f8401126123e0576123df613125565b5b8235905067ffffffffffffffff8111156123fd576123fc613120565b5b6020830191508360208202830111156124195761241861312a565b5b9250929050565b60008135905061242f81613333565b92915050565b6000813590506124448161334a565b92915050565b60008135905061245981613361565b92915050565b60008151905061246e81613361565b92915050565b600082601f83011261248957612488613125565b5b8135612499848260208601612373565b91505092915050565b60008083601f8401126124b8576124b7613125565b5b8235905067ffffffffffffffff8111156124d5576124d4613120565b5b6020830191508360018202830111156124f1576124f061312a565b5b9250929050565b60008135905061250781613378565b92915050565b60006020828403121561252357612522613139565b5b6000612531848285016123b5565b91505092915050565b6000806040838503121561255157612550613139565b5b600061255f858286016123b5565b9250506020612570858286016123b5565b9150509250929050565b60008060006060848603121561259357612592613139565b5b60006125a1868287016123b5565b93505060206125b2868287016123b5565b92505060406125c3868287016124f8565b9150509250925092565b600080600080608085870312156125e7576125e6613139565b5b60006125f5878288016123b5565b9450506020612606878288016123b5565b9350506040612617878288016124f8565b925050606085013567ffffffffffffffff81111561263857612637613134565b5b61264487828801612474565b91505092959194509250565b6000806040838503121561266757612666613139565b5b6000612675858286016123b5565b925050602061268685828601612420565b9150509250929050565b600080604083850312156126a7576126a6613139565b5b60006126b5858286016123b5565b92505060206126c6858286016124f8565b9150509250929050565b600080602083850312156126e7576126e6613139565b5b600083013567ffffffffffffffff81111561270557612704613134565b5b612711858286016123ca565b92509250509250929050565b60008060006040848603121561273657612735613139565b5b600084013567ffffffffffffffff81111561275457612753613134565b5b612760868287016123ca565b9350935050602061277386828701612435565b9150509250925092565b60006020828403121561279357612792613139565b5b60006127a184828501612435565b91505092915050565b6000602082840312156127c0576127bf613139565b5b60006127ce8482850161244a565b91505092915050565b6000602082840312156127ed576127ec613139565b5b60006127fb8482850161245f565b91505092915050565b6000806020838503121561281b5761281a613139565b5b600083013567ffffffffffffffff81111561283957612838613134565b5b612845858286016124a2565b92509250509250929050565b60006020828403121561286757612866613139565b5b6000612875848285016124f8565b91505092915050565b61288781612ea5565b82525050565b61289e61289982612ea5565b613011565b82525050565b6128ad81612eb7565b82525050565b6128bc81612ec3565b82525050565b60006128cd82612d81565b6128d78185612d97565b93506128e7818560208601612f32565b6128f08161313e565b840191505092915050565b600061290682612d8c565b6129108185612da8565b9350612920818560208601612f32565b6129298161313e565b840191505092915050565b600061293f82612d8c565b6129498185612db9565b9350612959818560208601612f32565b80840191505092915050565b6000612972602683612da8565b915061297d8261315c565b604082019050919050565b6000612995601283612da8565b91506129a0826131ab565b602082019050919050565b60006129b8601583612da8565b91506129c3826131d4565b602082019050919050565b60006129db601983612da8565b91506129e6826131fd565b602082019050919050565b60006129fe601683612da8565b9150612a0982613226565b602082019050919050565b6000612a21601583612da8565b9150612a2c8261324f565b602082019050919050565b6000612a44602083612da8565b9150612a4f82613278565b602082019050919050565b6000612a67601783612da8565b9150612a72826132a1565b602082019050919050565b6000612a8a601b83612da8565b9150612a95826132ca565b602082019050919050565b6000612aad601583612da8565b9150612ab8826132f3565b602082019050919050565b612acc81612f19565b82525050565b6000612ade828461288d565b60148201915081905092915050565b6000612af98285612934565b9150612b058284612934565b91508190509392505050565b6000602082019050612b26600083018461287e565b92915050565b6000608082019050612b41600083018761287e565b612b4e602083018661287e565b612b5b6040830185612ac3565b8181036060830152612b6d81846128c2565b905095945050505050565b6000602082019050612b8d60008301846128a4565b92915050565b6000602082019050612ba860008301846128b3565b92915050565b60006020820190508181036000830152612bc881846128fb565b905092915050565b60006020820190508181036000830152612be981612965565b9050919050565b60006020820190508181036000830152612c0981612988565b9050919050565b60006020820190508181036000830152612c29816129ab565b9050919050565b60006020820190508181036000830152612c49816129ce565b9050919050565b60006020820190508181036000830152612c69816129f1565b9050919050565b60006020820190508181036000830152612c8981612a14565b9050919050565b60006020820190508181036000830152612ca981612a37565b9050919050565b60006020820190508181036000830152612cc981612a5a565b9050919050565b60006020820190508181036000830152612ce981612a7d565b9050919050565b60006020820190508181036000830152612d0981612aa0565b9050919050565b6000602082019050612d256000830184612ac3565b92915050565b6000612d35612d46565b9050612d418282612f97565b919050565b6000604051905090565b600067ffffffffffffffff821115612d6b57612d6a6130f1565b5b612d748261313e565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612dcf82612f19565b9150612dda83612f19565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e0f57612e0e613035565b5b828201905092915050565b6000612e2582612f19565b9150612e3083612f19565b925082612e4057612e3f613064565b5b828204905092915050565b6000612e5682612f19565b9150612e6183612f19565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e9a57612e99613035565b5b828202905092915050565b6000612eb082612ef9565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612f50578082015181840152602081019050612f35565b83811115612f5f576000848401525b50505050565b60006002820490506001821680612f7d57607f821691505b60208210811415612f9157612f90613093565b5b50919050565b612fa08261313e565b810181811067ffffffffffffffff82111715612fbf57612fbe6130f1565b5b80604052505050565b6000612fd382612f19565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561300657613005613035565b5b600182019050919050565b600061301c82613023565b9050919050565b600061302e8261314f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f457863656564656420746865206c696d69740000000000000000000000000000600082015250565b7f4e6f74206f6e2046726565206d696e74206c6973740000000000000000000000600082015250565b7f5075626c69632073616c65206973206e6f742061637469766500000000000000600082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b7f574c2073616c65206973206e6f74206163746976650000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4164647265737320616c726561647920636c61696d6564000000000000000000600082015250565b7f4e6f7420656e6f756768204652454520746f6b656e73206c6566740000000000600082015250565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b61332581612ea5565b811461333057600080fd5b50565b61333c81612eb7565b811461334757600080fd5b50565b61335381612ec3565b811461335e57600080fd5b50565b61336a81612ecd565b811461337557600080fd5b50565b61338181612f19565b811461338c57600080fd5b5056fea2646970667358221220f89e1629ce78090a554ded5542076362d430992ec7a06d2c5f646b21b7c6689964736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000040442a43ecc3fd288b550d85baf19fb929a7475ecfb486444c56c04f82c905137d0000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d53456e384c4e597a754d63623470334544346834426664354c576161507147706f76396a454c444b343461362f00000000000000000000

-----Decoded View---------------
Arg [0] : _baseUri (string): ipfs://QmSEn8LNYzuMcb4p3ED4h4Bfd5LWaaPqGpov9jELDK44a6/
Arg [1] : _root (bytes32): 0x442a43ecc3fd288b550d85baf19fb929a7475ecfb486444c56c04f82c905137d

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 442a43ecc3fd288b550d85baf19fb929a7475ecfb486444c56c04f82c905137d
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [3] : 697066733a2f2f516d53456e384c4e597a754d63623470334544346834426664
Arg [4] : 354c576161507147706f76396a454c444b343461362f00000000000000000000


Deployed Bytecode Sourcemap

57141:3065:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26943:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32590:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34536:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34084:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25997:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58930:200;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43801:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57468:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59527:265;;;:::i;:::-;;59908:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35426:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57699:550;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60107:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32379:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57432:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27622:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11534:103;;;;;;;;;;;;;:::i;:::-;;57362:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10886:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32759:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58265:494;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34812:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35682:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58767:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57396:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32934:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57317:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59138:379;;;;;;;;;;;;;:::i;:::-;;57502:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60005:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35191:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11792:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26943:615;27028:4;27343:10;27328:25;;:11;:25;;;;:102;;;;27420:10;27405:25;;:11;:25;;;;27328:102;:179;;;;27497:10;27482:25;;:11;:25;;;;27328:179;27308:199;;26943:615;;;:::o;32590:100::-;32644:13;32677:5;32670:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32590:100;:::o;34536:204::-;34604:7;34629:16;34637:7;34629;:16::i;:::-;34624:64;;34654:34;;;;;;;;;;;;;;34624:64;34708:15;:24;34724:7;34708:24;;;;;;;;;;;;;;;;;;;;;34701:31;;34536:204;;;:::o;34084:386::-;34157:13;34173:16;34181:7;34173;:16::i;:::-;34157:32;;34229:5;34206:28;;:19;:17;:19::i;:::-;:28;;;34202:175;;34254:44;34271:5;34278:19;:17;:19::i;:::-;34254:16;:44::i;:::-;34249:128;;34326:35;;;;;;;;;;;;;;34249:128;34202:175;34416:2;34389:15;:24;34405:7;34389:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34454:7;34450:2;34434:28;;34443:5;34434:28;;;;;;;;;;;;34146:324;34084:386;;:::o;25997:315::-;26050:7;26278:15;:13;:15::i;:::-;26263:12;;26247:13;;:28;:46;26240:53;;25997:315;:::o;58930:200::-;10772:13;:11;:13::i;:::-;59043:10:::1;;59031:8;59015:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;59007:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;59091:31;59101:10;59113:8;59091:9;:31::i;:::-;58930:200:::0;:::o;43801:2800::-;43935:27;43965;43984:7;43965:18;:27::i;:::-;43935:57;;44050:4;44009:45;;44025:19;44009:45;;;44005:86;;44063:28;;;;;;;;;;;;;;44005:86;44105:27;44134:23;44161:28;44181:7;44161:19;:28::i;:::-;44104:85;;;;44289:62;44308:15;44325:4;44331:19;:17;:19::i;:::-;44289:18;:62::i;:::-;44284:174;;44371:43;44388:4;44394:19;:17;:19::i;:::-;44371:16;:43::i;:::-;44366:92;;44423:35;;;;;;;;;;;;;;44366:92;44284:174;44489:1;44475:16;;:2;:16;;;44471:52;;;44500:23;;;;;;;;;;;;;;44471:52;44536:43;44558:4;44564:2;44568:7;44577:1;44536:21;:43::i;:::-;44672:15;44669:160;;;44812:1;44791:19;44784:30;44669:160;45207:18;:24;45226:4;45207:24;;;;;;;;;;;;;;;;45205:26;;;;;;;;;;;;45276:18;:22;45295:2;45276:22;;;;;;;;;;;;;;;;45274:24;;;;;;;;;;;45598:145;45635:2;45683:45;45698:4;45704:2;45708:19;45683:14;:45::i;:::-;23225:8;45656:72;45598:18;:145::i;:::-;45569:17;:26;45587:7;45569:26;;;;;;;;;;;:174;;;;45913:1;23225:8;45863:19;:46;:51;45859:626;;;45935:19;45967:1;45957:7;:11;45935:33;;46124:1;46090:17;:30;46108:11;46090:30;;;;;;;;;;;;:35;46086:384;;;46228:13;;46213:11;:28;46209:242;;46408:19;46375:17;:30;46393:11;46375:30;;;;;;;;;;;:52;;;;46209:242;46086:384;45916:569;45859:626;46532:7;46528:2;46513:27;;46522:4;46513:27;;;;;;;;;;;;46551:42;46572:4;46578:2;46582:7;46591:1;46551:20;:42::i;:::-;43924:2677;;;43801:2800;;;:::o;57468:25::-;;;;:::o;59527:265::-;10772:13;:11;:13::i;:::-;59587:17:::1;59607:42;59587:62;;59668:9;59660:27;;:63;59718:3;59713:2;59689:21;:26;;;;:::i;:::-;:32;;;;:::i;:::-;59660:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;59744:7;:5;:7::i;:::-;59736:25;;:48;59762:21;59736:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;59574:218;59527:265::o:0;59908:89::-;10772:13;:11;:13::i;:::-;59984:5:::1;59971:10;:18;;;;59908:89:::0;:::o;35426:185::-;35564:39;35581:4;35587:2;35591:7;35564:39;;;;;;;;;;;;:16;:39::i;:::-;35426:185;;;:::o;57699:550::-;57781:15;;;;;;;;;;;57773:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;57842:16;:28;57859:10;57842:28;;;;;;;;;;;;;;;;;;;;;;;;;57841:29;57833:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;57911:12;57953:10;57936:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;57926:39;;;;;;57911:54;;57984:27;57992:12;;58006:4;57984:7;:27::i;:::-;57976:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;58120:8;;58115:1;58099:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:29;;58091:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;58202:4;58171:16;:28;58188:10;58171:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;58217:24;58227:10;58239:1;58217:9;:24::i;:::-;57762:487;57699:550;;:::o;60107:94::-;10772:13;:11;:13::i;:::-;60188:5:::1;;60178:7;:15;;;;;;;:::i;:::-;;60107:94:::0;;:::o;32379:144::-;32443:7;32486:27;32505:7;32486:18;:27::i;:::-;32463:52;;32379:144;;;:::o;57432:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27622:224::-;27686:7;27727:1;27710:19;;:5;:19;;;27706:60;;;27738:28;;;;;;;;;;;;;;27706:60;22177:13;27784:18;:25;27803:5;27784:25;;;;;;;;;;;;;;;;:54;27777:61;;27622:224;;;:::o;11534:103::-;10772:13;:11;:13::i;:::-;11599:30:::1;11626:1;11599:18;:30::i;:::-;11534:103::o:0;57362:27::-;;;;;;;;;;;;;:::o;10886:87::-;10932:7;10959:6;;;;;;;;;;;10952:13;;10886:87;:::o;32759:104::-;32815:13;32848:7;32841:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32759:104;:::o;58265:494::-;58413:16;;;;;;;;;;;58405:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;58490:9;;58478:8;:21;;58470:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;58569:10;;58557:8;58541:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;58533:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58655:8;58644;;:19;;;;:::i;:::-;58631:9;:32;;58623:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;58700:31;58710:10;58722:8;58700:9;:31::i;:::-;58265:494;:::o;34812:308::-;34923:19;:17;:19::i;:::-;34911:31;;:8;:31;;;34907:61;;;34951:17;;;;;;;;;;;;;;34907:61;35033:8;34981:18;:39;35000:19;:17;:19::i;:::-;34981:39;;;;;;;;;;;;;;;:49;35021:8;34981:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;35093:8;35057:55;;35072:19;:17;:19::i;:::-;35057:55;;;35103:8;35057:55;;;;;;:::i;:::-;;;;;;;;34812:308;;:::o;35682:399::-;35849:31;35862:4;35868:2;35872:7;35849:12;:31::i;:::-;35913:1;35895:2;:14;;;:19;35891:183;;35934:56;35965:4;35971:2;35975:7;35984:5;35934:30;:56::i;:::-;35929:145;;36018:40;;;;;;;;;;;;;;35929:145;35891:183;35682:399;;;;:::o;58767:155::-;58845:4;58868:44;58887:6;;58868:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58895:10;;58907:4;58868:18;:44::i;:::-;58861:51;;58767:155;;;;;:::o;57396:28::-;;;;;;;;;;;;;:::o;32934:318::-;33007:13;33038:16;33046:7;33038;:16::i;:::-;33033:59;;33063:29;;;;;;;;;;;;;;33033:59;33105:21;33129:10;:8;:10::i;:::-;33105:34;;33182:1;33163:7;33157:21;:26;;:87;;;;;;;;;;;;;;;;;33210:7;33219:18;33229:7;33219:9;:18::i;:::-;33193:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33157:87;33150:94;;;32934:318;;;:::o;57317:38::-;;;;:::o;59138:379::-;10772:13;:11;:13::i;:::-;59196:15:::1;;;;;;;;;;;59195:16;:37;;;;;59216:16;;;;;;;;;;;59215:17;59195:37;59192:318;;;59266:4;59248:15;;:22;;;;;;;;;;;;;;;;;;59192:318;;;59292:15;;;;;;;;;;;:36;;;;;59312:16;;;;;;;;;;;59311:17;59292:36;59289:221;;;59362:5;59344:15;;:23;;;;;;;;;;;;;;;;;;59401:4;59382:16;;:23;;;;;;;;;;;;;;;;;;59289:221;;;59454:5;59436:15;;:23;;;;;;;;;;;;;;;;;;59493:5;59474:16;;:24;;;;;;;;;;;;;;;;;;59289:221;59192:318;59138:379::o:0;57502:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;60005:96::-;10772:13;:11;:13::i;:::-;60084:9:::1;60073:8;:20;;;;60005:96:::0;:::o;35191:164::-;35288:4;35312:18;:25;35331:5;35312:25;;;;;;;;;;;;;;;:35;35338:8;35312:35;;;;;;;;;;;;;;;;;;;;;;;;;35305:42;;35191:164;;;;:::o;11792:201::-;10772:13;:11;:13::i;:::-;11901:1:::1;11881:22;;:8;:22;;;;11873:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;11957:28;11976:8;11957:18;:28::i;:::-;11792:201:::0;:::o;36336:273::-;36393:4;36449:7;36430:15;:13;:15::i;:::-;:26;;:66;;;;;36483:13;;36473:7;:23;36430:66;:152;;;;;36581:1;22947:8;36534:17;:26;36552:7;36534:26;;;;;;;;;;;;:43;:48;36430:152;36410:172;;36336:273;;;:::o;54897:105::-;54957:7;54984:10;54977:17;;54897:105;:::o;25521:92::-;25577:7;25521:92;:::o;11051:132::-;11126:12;:10;:12::i;:::-;11115:23;;:7;:5;:7::i;:::-;:23;;;11107:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11051:132::o;36693:104::-;36762:27;36772:2;36776:8;36762:27;;;;;;;;;;;;:9;:27::i;:::-;36693:104;;:::o;29296:1129::-;29363:7;29383:12;29398:7;29383:22;;29466:4;29447:15;:13;:15::i;:::-;:23;29443:915;;29500:13;;29493:4;:20;29489:869;;;29538:14;29555:17;:23;29573:4;29555:23;;;;;;;;;;;;29538:40;;29671:1;22947:8;29644:6;:23;:28;29640:699;;;30163:113;30180:1;30170:6;:11;30163:113;;;30223:17;:25;30241:6;;;;;;;30223:25;;;;;;;;;;;;30214:34;;30163:113;;;30309:6;30302:13;;;;;;29640:699;29515:843;29489:869;29443:915;30386:31;;;;;;;;;;;;;;29296:1129;;;;:::o;42137:652::-;42232:27;42261:23;42302:53;42358:15;42302:71;;42544:7;42538:4;42531:21;42579:22;42573:4;42566:36;42655:4;42649;42639:21;42616:44;;42751:19;42745:26;42726:45;;42482:300;42137:652;;;:::o;42902:645::-;43044:11;43206:15;43200:4;43196:26;43188:34;;43365:15;43354:9;43350:31;43337:44;;43512:15;43501:9;43498:30;43491:4;43480:9;43477:19;43474:55;43464:65;;42902:645;;;;;:::o;53730:159::-;;;;;:::o;52042:309::-;52177:7;52197:16;23348:3;52223:19;:40;;52197:67;;23348:3;52290:31;52301:4;52307:2;52311:9;52290:10;:31::i;:::-;52282:40;;:61;;52275:68;;;52042:309;;;;;:::o;31870:447::-;31950:14;32118:15;32111:5;32107:27;32098:36;;32292:5;32278:11;32254:22;32250:40;32247:51;32240:5;32237:62;32227:72;;31870:447;;;;:::o;54548:158::-;;;;;:::o;12153:191::-;12227:16;12246:6;;;;;;;;;;;12227:25;;12272:8;12263:6;;:17;;;;;;;;;;;;;;;;;;12327:8;12296:40;;12317:8;12296:40;;;;;;;;;;;;12216:128;12153:191;:::o;50552:716::-;50715:4;50761:2;50736:45;;;50782:19;:17;:19::i;:::-;50803:4;50809:7;50818:5;50736:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50732:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51036:1;51019:6;:13;:18;51015:235;;;51065:40;;;;;;;;;;;;;;51015:235;51208:6;51202:13;51193:6;51189:2;51185:15;51178:38;50732:529;50905:54;;;50895:64;;;:6;:64;;;;50888:71;;;50552:716;;;;;;:::o;1252:190::-;1377:4;1430;1401:25;1414:5;1421:4;1401:12;:25::i;:::-;:33;1394:40;;1252:190;;;;;:::o;59800:100::-;59852:13;59885:7;59878:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59800:100;:::o;55108:1960::-;55165:17;55584:3;55577:4;55571:11;55567:21;55560:28;;55675:3;55669:4;55662:17;55781:3;56237:5;56367:1;56362:3;56358:11;56351:18;;56504:2;56498:4;56494:13;56490:2;56486:22;56481:3;56473:36;56545:2;56539:4;56535:13;56527:21;;56129:697;56564:4;56129:697;;;56755:1;56750:3;56746:11;56739:18;;56806:2;56800:4;56796:13;56792:2;56788:22;56783:3;56775:36;56659:2;56653:4;56649:13;56641:21;;56129:697;;;56133:430;56865:3;56860;56856:13;56980:2;56975:3;56971:12;56964:19;;57043:6;57038:3;57031:19;55204:1857;;55108:1960;;;:::o;9437:98::-;9490:7;9517:10;9510:17;;9437:98;:::o;37213:681::-;37336:19;37342:2;37346:8;37336:5;:19::i;:::-;37415:1;37397:2;:14;;;:19;37393:483;;37437:11;37451:13;;37437:27;;37483:13;37505:8;37499:3;:14;37483:30;;37532:233;37563:62;37602:1;37606:2;37610:7;;;;;;37619:5;37563:30;:62::i;:::-;37558:167;;37661:40;;;;;;;;;;;;;;37558:167;37760:3;37752:5;:11;37532:233;;37847:3;37830:13;;:20;37826:34;;37852:8;;;37826:34;37418:458;;37393:483;37213:681;;;:::o;52927:147::-;53064:6;52927:147;;;;;:::o;2119:296::-;2202:7;2222:20;2245:4;2222:27;;2265:9;2260:118;2284:5;:12;2280:1;:16;2260:118;;;2333:33;2343:12;2357:5;2363:1;2357:8;;;;;;;;:::i;:::-;;;;;;;;2333:9;:33::i;:::-;2318:48;;2298:3;;;;;:::i;:::-;;;;2260:118;;;;2395:12;2388:19;;;2119:296;;;;:::o;38167:1529::-;38232:20;38255:13;;38232:36;;38297:1;38283:16;;:2;:16;;;38279:48;;;38308:19;;;;;;;;;;;;;;38279:48;38354:1;38342:8;:13;38338:44;;;38364:18;;;;;;;;;;;;;;38338:44;38395:61;38425:1;38429:2;38433:12;38447:8;38395:21;:61::i;:::-;38938:1;22314:2;38909:1;:25;;38908:31;38896:8;:44;38870:18;:22;38889:2;38870:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;39217:139;39254:2;39308:33;39331:1;39335:2;39339:1;39308:14;:33::i;:::-;39275:30;39296:8;39275:20;:30::i;:::-;:66;39217:18;:139::i;:::-;39183:17;:31;39201:12;39183:31;;;;;;;;;;;:173;;;;39373:15;39391:12;39373:30;;39418:11;39447:8;39432:12;:23;39418:37;;39470:101;39522:9;;;;;;39518:2;39497:35;;39514:1;39497:35;;;;;;;;;;;;39566:3;39556:7;:13;39470:101;;39603:3;39587:13;:19;;;;38644:974;;39628:60;39657:1;39661:2;39665:12;39679:8;39628:20;:60::i;:::-;38221:1475;38167:1529;;:::o;8326:149::-;8389:7;8420:1;8416;:5;:51;;8447:20;8462:1;8465;8447:14;:20::i;:::-;8416:51;;;8424:20;8439:1;8442;8424:14;:20::i;:::-;8416:51;8409:58;;8326:149;;;;:::o;33700:322::-;33770:14;34001:1;33991:8;33988:15;33963:23;33959:45;33949:55;;33700:322;;;:::o;8483:268::-;8551:13;8658:1;8652:4;8645:15;8687:1;8681:4;8674:15;8728:4;8722;8712:21;8703:30;;8483:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;585:568::-;658:8;668:6;718:3;711:4;703:6;699:17;695:27;685:122;;726:79;;:::i;:::-;685:122;839:6;826:20;816:30;;869:18;861:6;858:30;855:117;;;891:79;;:::i;:::-;855:117;1005:4;997:6;993:17;981:29;;1059:3;1051:4;1043:6;1039:17;1029:8;1025:32;1022:41;1019:128;;;1066:79;;:::i;:::-;1019:128;585:568;;;;;:::o;1159:133::-;1202:5;1240:6;1227:20;1218:29;;1256:30;1280:5;1256:30;:::i;:::-;1159:133;;;;:::o;1298:139::-;1344:5;1382:6;1369:20;1360:29;;1398:33;1425:5;1398:33;:::i;:::-;1298:139;;;;:::o;1443:137::-;1488:5;1526:6;1513:20;1504:29;;1542:32;1568:5;1542:32;:::i;:::-;1443:137;;;;:::o;1586:141::-;1642:5;1673:6;1667:13;1658:22;;1689:32;1715:5;1689:32;:::i;:::-;1586:141;;;;:::o;1746:338::-;1801:5;1850:3;1843:4;1835:6;1831:17;1827:27;1817:122;;1858:79;;:::i;:::-;1817:122;1975:6;1962:20;2000:78;2074:3;2066:6;2059:4;2051:6;2047:17;2000:78;:::i;:::-;1991:87;;1807:277;1746:338;;;;:::o;2104:553::-;2162:8;2172:6;2222:3;2215:4;2207:6;2203:17;2199:27;2189:122;;2230:79;;:::i;:::-;2189:122;2343:6;2330:20;2320:30;;2373:18;2365:6;2362:30;2359:117;;;2395:79;;:::i;:::-;2359:117;2509:4;2501:6;2497:17;2485:29;;2563:3;2555:4;2547:6;2543:17;2533:8;2529:32;2526:41;2523:128;;;2570:79;;:::i;:::-;2523:128;2104:553;;;;;:::o;2663:139::-;2709:5;2747:6;2734:20;2725:29;;2763:33;2790:5;2763:33;:::i;:::-;2663:139;;;;:::o;2808:329::-;2867:6;2916:2;2904:9;2895:7;2891:23;2887:32;2884:119;;;2922:79;;:::i;:::-;2884:119;3042:1;3067:53;3112:7;3103:6;3092:9;3088:22;3067:53;:::i;:::-;3057:63;;3013:117;2808:329;;;;:::o;3143:474::-;3211:6;3219;3268:2;3256:9;3247:7;3243:23;3239:32;3236:119;;;3274:79;;:::i;:::-;3236:119;3394:1;3419:53;3464:7;3455:6;3444:9;3440:22;3419:53;:::i;:::-;3409:63;;3365:117;3521:2;3547:53;3592:7;3583:6;3572:9;3568:22;3547:53;:::i;:::-;3537:63;;3492:118;3143:474;;;;;:::o;3623:619::-;3700:6;3708;3716;3765:2;3753:9;3744:7;3740:23;3736:32;3733:119;;;3771:79;;:::i;:::-;3733:119;3891:1;3916:53;3961:7;3952:6;3941:9;3937:22;3916:53;:::i;:::-;3906:63;;3862:117;4018:2;4044:53;4089:7;4080:6;4069:9;4065:22;4044:53;:::i;:::-;4034:63;;3989:118;4146:2;4172:53;4217:7;4208:6;4197:9;4193:22;4172:53;:::i;:::-;4162:63;;4117:118;3623:619;;;;;:::o;4248:943::-;4343:6;4351;4359;4367;4416:3;4404:9;4395:7;4391:23;4387:33;4384:120;;;4423:79;;:::i;:::-;4384:120;4543:1;4568:53;4613:7;4604:6;4593:9;4589:22;4568:53;:::i;:::-;4558:63;;4514:117;4670:2;4696:53;4741:7;4732:6;4721:9;4717:22;4696:53;:::i;:::-;4686:63;;4641:118;4798:2;4824:53;4869:7;4860:6;4849:9;4845:22;4824:53;:::i;:::-;4814:63;;4769:118;4954:2;4943:9;4939:18;4926:32;4985:18;4977:6;4974:30;4971:117;;;5007:79;;:::i;:::-;4971:117;5112:62;5166:7;5157:6;5146:9;5142:22;5112:62;:::i;:::-;5102:72;;4897:287;4248:943;;;;;;;:::o;5197:468::-;5262:6;5270;5319:2;5307:9;5298:7;5294:23;5290:32;5287:119;;;5325:79;;:::i;:::-;5287:119;5445:1;5470:53;5515:7;5506:6;5495:9;5491:22;5470:53;:::i;:::-;5460:63;;5416:117;5572:2;5598:50;5640:7;5631:6;5620:9;5616:22;5598:50;:::i;:::-;5588:60;;5543:115;5197:468;;;;;:::o;5671:474::-;5739:6;5747;5796:2;5784:9;5775:7;5771:23;5767:32;5764:119;;;5802:79;;:::i;:::-;5764:119;5922:1;5947:53;5992:7;5983:6;5972:9;5968:22;5947:53;:::i;:::-;5937:63;;5893:117;6049:2;6075:53;6120:7;6111:6;6100:9;6096:22;6075:53;:::i;:::-;6065:63;;6020:118;5671:474;;;;;:::o;6151:559::-;6237:6;6245;6294:2;6282:9;6273:7;6269:23;6265:32;6262:119;;;6300:79;;:::i;:::-;6262:119;6448:1;6437:9;6433:17;6420:31;6478:18;6470:6;6467:30;6464:117;;;6500:79;;:::i;:::-;6464:117;6613:80;6685:7;6676:6;6665:9;6661:22;6613:80;:::i;:::-;6595:98;;;;6391:312;6151:559;;;;;:::o;6716:704::-;6811:6;6819;6827;6876:2;6864:9;6855:7;6851:23;6847:32;6844:119;;;6882:79;;:::i;:::-;6844:119;7030:1;7019:9;7015:17;7002:31;7060:18;7052:6;7049:30;7046:117;;;7082:79;;:::i;:::-;7046:117;7195:80;7267:7;7258:6;7247:9;7243:22;7195:80;:::i;:::-;7177:98;;;;6973:312;7324:2;7350:53;7395:7;7386:6;7375:9;7371:22;7350:53;:::i;:::-;7340:63;;7295:118;6716:704;;;;;:::o;7426:329::-;7485:6;7534:2;7522:9;7513:7;7509:23;7505:32;7502:119;;;7540:79;;:::i;:::-;7502:119;7660:1;7685:53;7730:7;7721:6;7710:9;7706:22;7685:53;:::i;:::-;7675:63;;7631:117;7426:329;;;;:::o;7761:327::-;7819:6;7868:2;7856:9;7847:7;7843:23;7839:32;7836:119;;;7874:79;;:::i;:::-;7836:119;7994:1;8019:52;8063:7;8054:6;8043:9;8039:22;8019:52;:::i;:::-;8009:62;;7965:116;7761:327;;;;:::o;8094:349::-;8163:6;8212:2;8200:9;8191:7;8187:23;8183:32;8180:119;;;8218:79;;:::i;:::-;8180:119;8338:1;8363:63;8418:7;8409:6;8398:9;8394:22;8363:63;:::i;:::-;8353:73;;8309:127;8094:349;;;;:::o;8449:529::-;8520:6;8528;8577:2;8565:9;8556:7;8552:23;8548:32;8545:119;;;8583:79;;:::i;:::-;8545:119;8731:1;8720:9;8716:17;8703:31;8761:18;8753:6;8750:30;8747:117;;;8783:79;;:::i;:::-;8747:117;8896:65;8953:7;8944:6;8933:9;8929:22;8896:65;:::i;:::-;8878:83;;;;8674:297;8449:529;;;;;:::o;8984:329::-;9043:6;9092:2;9080:9;9071:7;9067:23;9063:32;9060:119;;;9098:79;;:::i;:::-;9060:119;9218:1;9243:53;9288:7;9279:6;9268:9;9264:22;9243:53;:::i;:::-;9233:63;;9189:117;8984:329;;;;:::o;9319:118::-;9406:24;9424:5;9406:24;:::i;:::-;9401:3;9394:37;9319:118;;:::o;9443:157::-;9548:45;9568:24;9586:5;9568:24;:::i;:::-;9548:45;:::i;:::-;9543:3;9536:58;9443:157;;:::o;9606:109::-;9687:21;9702:5;9687:21;:::i;:::-;9682:3;9675:34;9606:109;;:::o;9721:118::-;9808:24;9826:5;9808:24;:::i;:::-;9803:3;9796:37;9721:118;;:::o;9845:360::-;9931:3;9959:38;9991:5;9959:38;:::i;:::-;10013:70;10076:6;10071:3;10013:70;:::i;:::-;10006:77;;10092:52;10137:6;10132:3;10125:4;10118:5;10114:16;10092:52;:::i;:::-;10169:29;10191:6;10169:29;:::i;:::-;10164:3;10160:39;10153:46;;9935:270;9845:360;;;;:::o;10211:364::-;10299:3;10327:39;10360:5;10327:39;:::i;:::-;10382:71;10446:6;10441:3;10382:71;:::i;:::-;10375:78;;10462:52;10507:6;10502:3;10495:4;10488:5;10484:16;10462:52;:::i;:::-;10539:29;10561:6;10539:29;:::i;:::-;10534:3;10530:39;10523:46;;10303:272;10211:364;;;;:::o;10581:377::-;10687:3;10715:39;10748:5;10715:39;:::i;:::-;10770:89;10852:6;10847:3;10770:89;:::i;:::-;10763:96;;10868:52;10913:6;10908:3;10901:4;10894:5;10890:16;10868:52;:::i;:::-;10945:6;10940:3;10936:16;10929:23;;10691:267;10581:377;;;;:::o;10964:366::-;11106:3;11127:67;11191:2;11186:3;11127:67;:::i;:::-;11120:74;;11203:93;11292:3;11203:93;:::i;:::-;11321:2;11316:3;11312:12;11305:19;;10964:366;;;:::o;11336:::-;11478:3;11499:67;11563:2;11558:3;11499:67;:::i;:::-;11492:74;;11575:93;11664:3;11575:93;:::i;:::-;11693:2;11688:3;11684:12;11677:19;;11336:366;;;:::o;11708:::-;11850:3;11871:67;11935:2;11930:3;11871:67;:::i;:::-;11864:74;;11947:93;12036:3;11947:93;:::i;:::-;12065:2;12060:3;12056:12;12049:19;;11708:366;;;:::o;12080:::-;12222:3;12243:67;12307:2;12302:3;12243:67;:::i;:::-;12236:74;;12319:93;12408:3;12319:93;:::i;:::-;12437:2;12432:3;12428:12;12421:19;;12080:366;;;:::o;12452:::-;12594:3;12615:67;12679:2;12674:3;12615:67;:::i;:::-;12608:74;;12691:93;12780:3;12691:93;:::i;:::-;12809:2;12804:3;12800:12;12793:19;;12452:366;;;:::o;12824:::-;12966:3;12987:67;13051:2;13046:3;12987:67;:::i;:::-;12980:74;;13063:93;13152:3;13063:93;:::i;:::-;13181:2;13176:3;13172:12;13165:19;;12824:366;;;:::o;13196:::-;13338:3;13359:67;13423:2;13418:3;13359:67;:::i;:::-;13352:74;;13435:93;13524:3;13435:93;:::i;:::-;13553:2;13548:3;13544:12;13537:19;;13196:366;;;:::o;13568:::-;13710:3;13731:67;13795:2;13790:3;13731:67;:::i;:::-;13724:74;;13807:93;13896:3;13807:93;:::i;:::-;13925:2;13920:3;13916:12;13909:19;;13568:366;;;:::o;13940:::-;14082:3;14103:67;14167:2;14162:3;14103:67;:::i;:::-;14096:74;;14179:93;14268:3;14179:93;:::i;:::-;14297:2;14292:3;14288:12;14281:19;;13940:366;;;:::o;14312:::-;14454:3;14475:67;14539:2;14534:3;14475:67;:::i;:::-;14468:74;;14551:93;14640:3;14551:93;:::i;:::-;14669:2;14664:3;14660:12;14653:19;;14312:366;;;:::o;14684:118::-;14771:24;14789:5;14771:24;:::i;:::-;14766:3;14759:37;14684:118;;:::o;14808:256::-;14920:3;14935:75;15006:3;14997:6;14935:75;:::i;:::-;15035:2;15030:3;15026:12;15019:19;;15055:3;15048:10;;14808:256;;;;:::o;15070:435::-;15250:3;15272:95;15363:3;15354:6;15272:95;:::i;:::-;15265:102;;15384:95;15475:3;15466:6;15384:95;:::i;:::-;15377:102;;15496:3;15489:10;;15070:435;;;;;:::o;15511:222::-;15604:4;15642:2;15631:9;15627:18;15619:26;;15655:71;15723:1;15712:9;15708:17;15699:6;15655:71;:::i;:::-;15511:222;;;;:::o;15739:640::-;15934:4;15972:3;15961:9;15957:19;15949:27;;15986:71;16054:1;16043:9;16039:17;16030:6;15986:71;:::i;:::-;16067:72;16135:2;16124:9;16120:18;16111:6;16067:72;:::i;:::-;16149;16217:2;16206:9;16202:18;16193:6;16149:72;:::i;:::-;16268:9;16262:4;16258:20;16253:2;16242:9;16238:18;16231:48;16296:76;16367:4;16358:6;16296:76;:::i;:::-;16288:84;;15739:640;;;;;;;:::o;16385:210::-;16472:4;16510:2;16499:9;16495:18;16487:26;;16523:65;16585:1;16574:9;16570:17;16561:6;16523:65;:::i;:::-;16385:210;;;;:::o;16601:222::-;16694:4;16732:2;16721:9;16717:18;16709:26;;16745:71;16813:1;16802:9;16798:17;16789:6;16745:71;:::i;:::-;16601:222;;;;:::o;16829:313::-;16942:4;16980:2;16969:9;16965:18;16957:26;;17029:9;17023:4;17019:20;17015:1;17004:9;17000:17;16993:47;17057:78;17130:4;17121:6;17057:78;:::i;:::-;17049:86;;16829:313;;;;:::o;17148:419::-;17314:4;17352:2;17341:9;17337:18;17329:26;;17401:9;17395:4;17391:20;17387:1;17376:9;17372:17;17365:47;17429:131;17555:4;17429:131;:::i;:::-;17421:139;;17148:419;;;:::o;17573:::-;17739:4;17777:2;17766:9;17762:18;17754:26;;17826:9;17820:4;17816:20;17812:1;17801:9;17797:17;17790:47;17854:131;17980:4;17854:131;:::i;:::-;17846:139;;17573:419;;;:::o;17998:::-;18164:4;18202:2;18191:9;18187:18;18179:26;;18251:9;18245:4;18241:20;18237:1;18226:9;18222:17;18215:47;18279:131;18405:4;18279:131;:::i;:::-;18271:139;;17998:419;;;:::o;18423:::-;18589:4;18627:2;18616:9;18612:18;18604:26;;18676:9;18670:4;18666:20;18662:1;18651:9;18647:17;18640:47;18704:131;18830:4;18704:131;:::i;:::-;18696:139;;18423:419;;;:::o;18848:::-;19014:4;19052:2;19041:9;19037:18;19029:26;;19101:9;19095:4;19091:20;19087:1;19076:9;19072:17;19065:47;19129:131;19255:4;19129:131;:::i;:::-;19121:139;;18848:419;;;:::o;19273:::-;19439:4;19477:2;19466:9;19462:18;19454:26;;19526:9;19520:4;19516:20;19512:1;19501:9;19497:17;19490:47;19554:131;19680:4;19554:131;:::i;:::-;19546:139;;19273:419;;;:::o;19698:::-;19864:4;19902:2;19891:9;19887:18;19879:26;;19951:9;19945:4;19941:20;19937:1;19926:9;19922:17;19915:47;19979:131;20105:4;19979:131;:::i;:::-;19971:139;;19698:419;;;:::o;20123:::-;20289:4;20327:2;20316:9;20312:18;20304:26;;20376:9;20370:4;20366:20;20362:1;20351:9;20347:17;20340:47;20404:131;20530:4;20404:131;:::i;:::-;20396:139;;20123:419;;;:::o;20548:::-;20714:4;20752:2;20741:9;20737:18;20729:26;;20801:9;20795:4;20791:20;20787:1;20776:9;20772:17;20765:47;20829:131;20955:4;20829:131;:::i;:::-;20821:139;;20548:419;;;:::o;20973:::-;21139:4;21177:2;21166:9;21162:18;21154:26;;21226:9;21220:4;21216:20;21212:1;21201:9;21197:17;21190:47;21254:131;21380:4;21254:131;:::i;:::-;21246:139;;20973:419;;;:::o;21398:222::-;21491:4;21529:2;21518:9;21514:18;21506:26;;21542:71;21610:1;21599:9;21595:17;21586:6;21542:71;:::i;:::-;21398:222;;;;:::o;21626:129::-;21660:6;21687:20;;:::i;:::-;21677:30;;21716:33;21744:4;21736:6;21716:33;:::i;:::-;21626:129;;;:::o;21761:75::-;21794:6;21827:2;21821:9;21811:19;;21761:75;:::o;21842:307::-;21903:4;21993:18;21985:6;21982:30;21979:56;;;22015:18;;:::i;:::-;21979:56;22053:29;22075:6;22053:29;:::i;:::-;22045:37;;22137:4;22131;22127:15;22119:23;;21842:307;;;:::o;22155:98::-;22206:6;22240:5;22234:12;22224:22;;22155:98;;;:::o;22259:99::-;22311:6;22345:5;22339:12;22329:22;;22259:99;;;:::o;22364:168::-;22447:11;22481:6;22476:3;22469:19;22521:4;22516:3;22512:14;22497:29;;22364:168;;;;:::o;22538:169::-;22622:11;22656:6;22651:3;22644:19;22696:4;22691:3;22687:14;22672:29;;22538:169;;;;:::o;22713:148::-;22815:11;22852:3;22837:18;;22713:148;;;;:::o;22867:305::-;22907:3;22926:20;22944:1;22926:20;:::i;:::-;22921:25;;22960:20;22978:1;22960:20;:::i;:::-;22955:25;;23114:1;23046:66;23042:74;23039:1;23036:81;23033:107;;;23120:18;;:::i;:::-;23033:107;23164:1;23161;23157:9;23150:16;;22867:305;;;;:::o;23178:185::-;23218:1;23235:20;23253:1;23235:20;:::i;:::-;23230:25;;23269:20;23287:1;23269:20;:::i;:::-;23264:25;;23308:1;23298:35;;23313:18;;:::i;:::-;23298:35;23355:1;23352;23348:9;23343:14;;23178:185;;;;:::o;23369:348::-;23409:7;23432:20;23450:1;23432:20;:::i;:::-;23427:25;;23466:20;23484:1;23466:20;:::i;:::-;23461:25;;23654:1;23586:66;23582:74;23579:1;23576:81;23571:1;23564:9;23557:17;23553:105;23550:131;;;23661:18;;:::i;:::-;23550:131;23709:1;23706;23702:9;23691:20;;23369:348;;;;:::o;23723:96::-;23760:7;23789:24;23807:5;23789:24;:::i;:::-;23778:35;;23723:96;;;:::o;23825:90::-;23859:7;23902:5;23895:13;23888:21;23877:32;;23825:90;;;:::o;23921:77::-;23958:7;23987:5;23976:16;;23921:77;;;:::o;24004:149::-;24040:7;24080:66;24073:5;24069:78;24058:89;;24004:149;;;:::o;24159:126::-;24196:7;24236:42;24229:5;24225:54;24214:65;;24159:126;;;:::o;24291:77::-;24328:7;24357:5;24346:16;;24291:77;;;:::o;24374:154::-;24458:6;24453:3;24448;24435:30;24520:1;24511:6;24506:3;24502:16;24495:27;24374:154;;;:::o;24534:307::-;24602:1;24612:113;24626:6;24623:1;24620:13;24612:113;;;24711:1;24706:3;24702:11;24696:18;24692:1;24687:3;24683:11;24676:39;24648:2;24645:1;24641:10;24636:15;;24612:113;;;24743:6;24740:1;24737:13;24734:101;;;24823:1;24814:6;24809:3;24805:16;24798:27;24734:101;24583:258;24534:307;;;:::o;24847:320::-;24891:6;24928:1;24922:4;24918:12;24908:22;;24975:1;24969:4;24965:12;24996:18;24986:81;;25052:4;25044:6;25040:17;25030:27;;24986:81;25114:2;25106:6;25103:14;25083:18;25080:38;25077:84;;;25133:18;;:::i;:::-;25077:84;24898:269;24847:320;;;:::o;25173:281::-;25256:27;25278:4;25256:27;:::i;:::-;25248:6;25244:40;25386:6;25374:10;25371:22;25350:18;25338:10;25335:34;25332:62;25329:88;;;25397:18;;:::i;:::-;25329:88;25437:10;25433:2;25426:22;25216:238;25173:281;;:::o;25460:233::-;25499:3;25522:24;25540:5;25522:24;:::i;:::-;25513:33;;25568:66;25561:5;25558:77;25555:103;;;25638:18;;:::i;:::-;25555:103;25685:1;25678:5;25674:13;25667:20;;25460:233;;;:::o;25699:100::-;25738:7;25767:26;25787:5;25767:26;:::i;:::-;25756:37;;25699:100;;;:::o;25805:94::-;25844:7;25873:20;25887:5;25873:20;:::i;:::-;25862:31;;25805:94;;;:::o;25905:180::-;25953:77;25950:1;25943:88;26050:4;26047:1;26040:15;26074:4;26071:1;26064:15;26091:180;26139:77;26136:1;26129:88;26236:4;26233:1;26226:15;26260:4;26257:1;26250:15;26277:180;26325:77;26322:1;26315:88;26422:4;26419:1;26412:15;26446:4;26443:1;26436:15;26463:180;26511:77;26508:1;26501:88;26608:4;26605:1;26598:15;26632:4;26629:1;26622:15;26649:180;26697:77;26694:1;26687:88;26794:4;26791:1;26784:15;26818:4;26815:1;26808:15;26835:117;26944:1;26941;26934:12;26958:117;27067:1;27064;27057:12;27081:117;27190:1;27187;27180:12;27204:117;27313:1;27310;27303:12;27327:117;27436:1;27433;27426:12;27450:117;27559:1;27556;27549:12;27573:102;27614:6;27665:2;27661:7;27656:2;27649:5;27645:14;27641:28;27631:38;;27573:102;;;:::o;27681:94::-;27714:8;27762:5;27758:2;27754:14;27733:35;;27681:94;;;:::o;27781:225::-;27921:34;27917:1;27909:6;27905:14;27898:58;27990:8;27985:2;27977:6;27973:15;27966:33;27781:225;:::o;28012:168::-;28152:20;28148:1;28140:6;28136:14;28129:44;28012:168;:::o;28186:171::-;28326:23;28322:1;28314:6;28310:14;28303:47;28186:171;:::o;28363:175::-;28503:27;28499:1;28491:6;28487:14;28480:51;28363:175;:::o;28544:172::-;28684:24;28680:1;28672:6;28668:14;28661:48;28544:172;:::o;28722:171::-;28862:23;28858:1;28850:6;28846:14;28839:47;28722:171;:::o;28899:182::-;29039:34;29035:1;29027:6;29023:14;29016:58;28899:182;:::o;29087:173::-;29227:25;29223:1;29215:6;29211:14;29204:49;29087:173;:::o;29266:177::-;29406:29;29402:1;29394:6;29390:14;29383:53;29266:177;:::o;29449:171::-;29589:23;29585:1;29577:6;29573:14;29566:47;29449:171;:::o;29626:122::-;29699:24;29717:5;29699:24;:::i;:::-;29692:5;29689:35;29679:63;;29738:1;29735;29728:12;29679:63;29626:122;:::o;29754:116::-;29824:21;29839:5;29824:21;:::i;:::-;29817:5;29814:32;29804:60;;29860:1;29857;29850:12;29804:60;29754:116;:::o;29876:122::-;29949:24;29967:5;29949:24;:::i;:::-;29942:5;29939:35;29929:63;;29988:1;29985;29978:12;29929:63;29876:122;:::o;30004:120::-;30076:23;30093:5;30076:23;:::i;:::-;30069:5;30066:34;30056:62;;30114:1;30111;30104:12;30056:62;30004:120;:::o;30130:122::-;30203:24;30221:5;30203:24;:::i;:::-;30196:5;30193:35;30183:63;;30242:1;30239;30232:12;30183:63;30130:122;:::o

Swarm Source

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