ETH Price: $3,289.61 (-3.54%)
Gas: 14 Gwei

Token

JAFOO SERIES I (JAFOO)
 

Overview

Max Total Supply

360 JAFOO

Holders

102

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
katsparrow.eth
Balance
1 JAFOO
0x2aDFB78d7a98C4Aca8C5a57E273667369F239e3c
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:
JFO

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/**
//-------------------------------------//
////////////////////////////////////////


       ░░█ ▄▀█ █▀▀ █▀█ █▀█
       █▄█ █▀█ █▀░ █▄█ █▄█
                  SERIES I

     Jafoo.art             
///////////////////////////////////////
//-----------------------------------//
*/




// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev 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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/common/ERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

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

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

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/ERC721Enumerable.sol


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// 

// 



pragma solidity >=0.7.0 <0.9.0;





contract JFO is ERC721Enumerable, ERC2981, Ownable {
  using Strings for uint256;

  string public baseURI;
  string public contractURI;
  string public baseExtension = ".json";
  string public notRevealedUri;
  uint256 public cost = .08 ether; //amount
  uint256 public maxSupply = 1500;  /// total NFT
  uint256 public maxMintAmount = 100;
  uint256 public nftPerAddressLimit = 15;
  uint96 royaltyFeesInBips;
  address royaltyReceiver;
  bool public paused = false;  /// 
  bool public revealed = false;
  bool public onlyWhitelisted = true;
  address[] public whitelistedAddresses;
  mapping(address => uint256) public addressMintedBalance;

  constructor(
    string memory _name,  ///  JAFOO SERIES I
    string memory _symbol, ///  JAFOO
    string memory _initBaseURI, /// ipfs://  metadata
    string memory _initNotRevealedUri, 
    string memory _contractURI, 
    
    uint96 _royaltyFeesInBips
  ) ERC721(_name, _symbol) {
    setBaseURI(_initBaseURI);
    setNotRevealedURI(_initNotRevealedUri);
    setContractURI(_contractURI);
    setRoyaltyInfo(msg.sender, _royaltyFeesInBips); // SET ROYALTY
    mint(100); 
  }


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

  
  function mint(uint256 _mintAmount) public payable {
    require(!paused, "the contract is paused");
    uint256 supply = totalSupply();
    require(_mintAmount > 0, "need to mint at least 1 NFT");
    require(_mintAmount <= maxMintAmount, "max mint amount per session exceeded");
    require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded");

    if (msg.sender != owner()) {
        if(onlyWhitelisted == true) {
            require(isWhitelisted(msg.sender), "user is not on THE LIST");
            uint256 ownerMintedCount = addressMintedBalance[msg.sender];
            require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "max NFT per address exceeded");
        }
        require(msg.value >= cost * _mintAmount, "insufficient funds");
    }

    for (uint256 i = 1; i <= _mintAmount; i++) {
      addressMintedBalance[msg.sender]++;
      _safeMint(msg.sender, supply + i);
    }
  }
  
  function isWhitelisted(address _user) public view returns (bool) {
    for (uint i = 0; i < whitelistedAddresses.length; i++) {
      if (whitelistedAddresses[i] == _user) {
          return true;
      }
    }
    return false;
  }

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

  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );
    
    if(revealed == false) {
        return notRevealedUri;
    }

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

 
  function reveal(bool _status) public onlyOwner { 
      revealed = _status; 
  }
  
  function setNftPerAddressLimit(uint256 _limit) public onlyOwner {
    nftPerAddressLimit = _limit;
  }
  
  function setCost(uint256 _newCost) public onlyOwner {
    cost = _newCost;
  }

  function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
    maxMintAmount = _newmaxMintAmount;
  }

  function setBaseURI(string memory _newBaseURI) public onlyOwner {
    baseURI = _newBaseURI;
  }

  function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
    baseExtension = _newBaseExtension;
  }
  
  function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
    notRevealedUri = _notRevealedURI;
  }

  function setContractURI(string memory _contractURI) public onlyOwner {
    contractURI = _contractURI;
  }


  function pause(bool _state) public onlyOwner {
    paused = _state;
  }
  
  function setOnlyWhitelisted(bool _state) public onlyOwner {
    onlyWhitelisted = _state;
  }
  
  function whitelistUsers(address[] calldata _users) public onlyOwner {
    delete whitelistedAddresses;
    whitelistedAddresses = _users;
  }

  function supportsInterface(bytes4 interfaceId) public view override(ERC2981, ERC721Enumerable) returns (bool) {
    return super.supportsInterface(interfaceId);
  }
 

  function setRoyaltyInfo(address _receiver, uint96 _royaltyFeesInBips) public onlyOwner {
   _setDefaultRoyalty(_receiver, _royaltyFeesInBips);
  }


 
  function withdraw() public payable onlyOwner {
    // =============================================================================
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
    // =============================================================================
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"},{"internalType":"string","name":"_contractURI","type":"string"},{"internalType":"uint96","name":"_royaltyFeesInBips","type":"uint96"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_royaltyFeesInBips","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60c06040526005608081905264173539b7b760d91b60a09081526200002891600f919062000d55565b5067011c37937e0800006011556105dc6012556064601355600f6014556016805462ffffff1916620100001790553480156200006357600080fd5b5060405162003cd238038062003cd2833981016040819052620000869162000edc565b8551869086906200009f90600090602085019062000d55565b508051620000b590600190602084019062000d55565b505050620000d2620000cc6200011760201b60201c565b6200011b565b620000dd846200016d565b620000e88362000190565b620000f382620001af565b620000ff3382620001ce565b6200010b6064620001e4565b50505050505062001161565b3390565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200017762000505565b80516200018c90600d90602084019062000d55565b5050565b6200019a62000505565b80516200018c90601090602084019062000d55565b620001b962000505565b80516200018c90600e90602084019062000d55565b620001d862000505565b6200018c828262000563565b60165460ff16156200023d5760405162461bcd60e51b815260206004820152601660248201527f74686520636f6e7472616374206973207061757365640000000000000000000060448201526064015b60405180910390fd5b60006200024960085490565b9050600082116200029d5760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e46540000000000604482015260640162000234565b601354821115620002fd5760405162461bcd60e51b8152602060048201526024808201527f6d6178206d696e7420616d6f756e74207065722073657373696f6e20657863656044820152631959195960e21b606482015260840162000234565b6012546200030c838362001024565b11156200035c5760405162461bcd60e51b815260206004820152601660248201527f6d6178204e4654206c696d697420657863656564656400000000000000000000604482015260640162000234565b600c546001600160a01b03163314620004a65760165462010000900460ff161515600114156200045057620003913362000664565b620003df5760405162461bcd60e51b815260206004820152601760248201527f75736572206973206e6f74206f6e20544845204c495354000000000000000000604482015260640162000234565b33600090815260186020526040902054601454620003fe848362001024565b11156200044e5760405162461bcd60e51b815260206004820152601c60248201527f6d6178204e465420706572206164647265737320657863656564656400000000604482015260640162000234565b505b816011546200046091906200103f565b341015620004a65760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b604482015260640162000234565b60015b8281116200050057336000908152601860205260408120805491620004ce83620010eb565b90915550620004eb905033620004e5838562001024565b620006d6565b80620004f781620010eb565b915050620004a9565b505050565b600c546001600160a01b03163314620005615760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000234565b565b6127106001600160601b0382161115620005d35760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b606482015260840162000234565b6001600160a01b0382166200062b5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640162000234565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b6000805b601754811015620006cd57826001600160a01b03166017828154811062000693576200069362001135565b6000918252602090912001546001600160a01b03161415620006b85750600192915050565b80620006c481620010eb565b91505062000668565b50600092915050565b6200018c828260405180602001604052806000815250620006f860201b60201c565b6200070483836200076b565b620007136000848484620008c1565b620005005760405162461bcd60e51b8152602060048201526032602482015260008051602062003cb283398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840162000234565b6001600160a01b038216620007c35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640162000234565b6000818152600260205260409020546001600160a01b0316156200082a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640162000234565b620008386000838362000a2a565b6001600160a01b03821660009081526003602052604081208054600192906200086390849062001024565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000620008e2846001600160a01b031662000b0660201b620016901760201c565b1562000a1e57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906200091c90339089908890889060040162000fce565b602060405180830381600087803b1580156200093757600080fd5b505af19250505080156200096a575060408051601f3d908101601f19168201909252620009679181019062000ea9565b60015b62000a03573d8080156200099b576040519150601f19603f3d011682016040523d82523d6000602084013e620009a0565b606091505b508051620009fb5760405162461bcd60e51b8152602060048201526032602482015260008051602062003cb283398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840162000234565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905062000a22565b5060015b949350505050565b62000a428383836200050060201b62000b701760201c565b6001600160a01b03831662000aa05762000a9a81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b62000ac6565b816001600160a01b0316836001600160a01b03161462000ac65762000ac6838262000b15565b6001600160a01b03821662000ae057620005008162000bc2565b826001600160a01b0316826001600160a01b031614620005005762000500828262000c7c565b6001600160a01b03163b151590565b6000600162000b2f8462000ccd60201b62000fd71760201c565b62000b3b919062001061565b60008381526007602052604090205490915080821462000b8f576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009062000bd69060019062001061565b6000838152600960205260408120546008805493945090928490811062000c015762000c0162001135565b90600052602060002001549050806008838154811062000c255762000c2562001135565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548062000c605762000c606200111f565b6001900381819060005260206000200160009055905550505050565b600062000c948362000ccd60201b62000fd71760201c565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60006001600160a01b03821662000d395760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b606482015260840162000234565b506001600160a01b031660009081526003602052604090205490565b82805462000d6390620010ae565b90600052602060002090601f01602090048101928262000d87576000855562000dd2565b82601f1062000da257805160ff191683800117855562000dd2565b8280016001018555821562000dd2579182015b8281111562000dd257825182559160200191906001019062000db5565b5062000de092915062000de4565b5090565b5b8082111562000de0576000815560010162000de5565b600082601f83011262000e0d57600080fd5b81516001600160401b038082111562000e2a5762000e2a6200114b565b604051601f8301601f19908116603f0116810190828211818310171562000e555762000e556200114b565b8160405283815286602085880101111562000e6f57600080fd5b62000e828460208301602089016200107b565b9695505050505050565b80516001600160601b038116811462000ea457600080fd5b919050565b60006020828403121562000ebc57600080fd5b81516001600160e01b03198116811462000ed557600080fd5b9392505050565b60008060008060008060c0878903121562000ef657600080fd5b86516001600160401b038082111562000f0e57600080fd5b62000f1c8a838b0162000dfb565b9750602089015191508082111562000f3357600080fd5b62000f418a838b0162000dfb565b9650604089015191508082111562000f5857600080fd5b62000f668a838b0162000dfb565b9550606089015191508082111562000f7d57600080fd5b62000f8b8a838b0162000dfb565b9450608089015191508082111562000fa257600080fd5b5062000fb189828a0162000dfb565b92505062000fc260a0880162000e8c565b90509295509295509295565b600060018060a01b0380871683528086166020840152508360408301526080606083015282518060808401526200100d8160a08501602087016200107b565b601f01601f19169190910160a00195945050505050565b600082198211156200103a576200103a62001109565b500190565b60008160001904831182151516156200105c576200105c62001109565b500290565b60008282101562001076576200107662001109565b500390565b60005b83811015620010985781810151838201526020016200107e565b83811115620010a8576000848401525b50505050565b600181811c90821680620010c357607f821691505b60208210811415620010e557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141562001102576200110262001109565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b612b4180620011716000396000f3fe6080604052600436106102ae5760003560e01c80636352211e11610175578063b88d4fde116100dc578063d5abeb0111610095578063e985e9c51161006f578063e985e9c514610828578063edec5f2714610871578063f2c4ce1e14610891578063f2fde38b146108b157600080fd5b8063d5abeb01146107dd578063da3ef23f146107f3578063e8a3d4851461081357600080fd5b8063b88d4fde14610732578063ba4e5c4914610752578063ba7d2c7614610772578063c668286214610788578063c87b56dd1461079d578063d0eb26b0146107bd57600080fd5b8063938e3d7b1161012e578063938e3d7b1461068a578063940cd05b146106aa57806395d89b41146106ca5780639c70b512146106df578063a0712d68146106ff578063a22cb4651461071257600080fd5b80636352211e146105e25780636c0360eb1461060257806370a0823114610617578063715018a6146106375780637f00c7a61461064c5780638da5cb5b1461066c57600080fd5b80632a55205a11610219578063438b6300116101d2578063438b63001461051c57806344a0d68a146105495780634f6ccce714610569578063518302271461058957806355f804b3146105a85780635c975abb146105c857600080fd5b80632a55205a146104555780632f745c59146104945780633af32abf146104b45780633c952764146104d45780633ccfd60b146104f457806342842e0e146104fc57600080fd5b8063095ea7b31161026b578063095ea7b31461039957806313faede6146103b957806318160ddd146103dd57806318cae269146103f2578063239c70ae1461041f57806323b872dd1461043557600080fd5b806301ffc9a7146102b357806302329a29146102e857806302fa7c471461030a57806306fdde031461032a578063081812fc1461034c578063081c8c4414610384575b600080fd5b3480156102bf57600080fd5b506102d36102ce3660046126ad565b6108d1565b60405190151581526020015b60405180910390f35b3480156102f457600080fd5b50610308610303366004612692565b6108e2565b005b34801561031657600080fd5b506103086103253660046125da565b6108fd565b34801561033657600080fd5b5061033f610913565b6040516102df91906128dc565b34801561035857600080fd5b5061036c610367366004612730565b6109a5565b6040516001600160a01b0390911681526020016102df565b34801561039057600080fd5b5061033f6109cc565b3480156103a557600080fd5b506103086103b43660046125b0565b610a5a565b3480156103c557600080fd5b506103cf60115481565b6040519081526020016102df565b3480156103e957600080fd5b506008546103cf565b3480156103fe57600080fd5b506103cf61040d366004612480565b60186020526000908152604090205481565b34801561042b57600080fd5b506103cf60135481565b34801561044157600080fd5b506103086104503660046124ce565b610b75565b34801561046157600080fd5b50610475610470366004612749565b610ba6565b604080516001600160a01b0390931683526020830191909152016102df565b3480156104a057600080fd5b506103cf6104af3660046125b0565b610c52565b3480156104c057600080fd5b506102d36104cf366004612480565b610ce8565b3480156104e057600080fd5b506103086104ef366004612692565b610d52565b610308610d76565b34801561050857600080fd5b506103086105173660046124ce565b610df2565b34801561052857600080fd5b5061053c610537366004612480565b610e0d565b6040516102df9190612898565b34801561055557600080fd5b50610308610564366004612730565b610eaf565b34801561057557600080fd5b506103cf610584366004612730565b610ebc565b34801561059557600080fd5b506016546102d390610100900460ff1681565b3480156105b457600080fd5b506103086105c33660046126e7565b610f4f565b3480156105d457600080fd5b506016546102d39060ff1681565b3480156105ee57600080fd5b5061036c6105fd366004612730565b610f6a565b34801561060e57600080fd5b5061033f610fca565b34801561062357600080fd5b506103cf610632366004612480565b610fd7565b34801561064357600080fd5b5061030861105d565b34801561065857600080fd5b50610308610667366004612730565b611071565b34801561067857600080fd5b50600c546001600160a01b031661036c565b34801561069657600080fd5b506103086106a53660046126e7565b61107e565b3480156106b657600080fd5b506103086106c5366004612692565b611099565b3480156106d657600080fd5b5061033f6110bb565b3480156106eb57600080fd5b506016546102d39062010000900460ff1681565b61030861070d366004612730565b6110ca565b34801561071e57600080fd5b5061030861072d366004612586565b6113b1565b34801561073e57600080fd5b5061030861074d36600461250a565b6113bc565b34801561075e57600080fd5b5061036c61076d366004612730565b6113f4565b34801561077e57600080fd5b506103cf60145481565b34801561079457600080fd5b5061033f61141e565b3480156107a957600080fd5b5061033f6107b8366004612730565b61142b565b3480156107c957600080fd5b506103086107d8366004612730565b6115aa565b3480156107e957600080fd5b506103cf60125481565b3480156107ff57600080fd5b5061030861080e3660046126e7565b6115b7565b34801561081f57600080fd5b5061033f6115d2565b34801561083457600080fd5b506102d361084336600461249b565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561087d57600080fd5b5061030861088c36600461261d565b6115df565b34801561089d57600080fd5b506103086108ac3660046126e7565b6115ff565b3480156108bd57600080fd5b506103086108cc366004612480565b61161a565b60006108dc8261169f565b92915050565b6108ea6116c4565b6016805460ff1916911515919091179055565b6109056116c4565b61090f828261171e565b5050565b60606000805461092290612a1d565b80601f016020809104026020016040519081016040528092919081815260200182805461094e90612a1d565b801561099b5780601f106109705761010080835404028352916020019161099b565b820191906000526020600020905b81548152906001019060200180831161097e57829003601f168201915b5050505050905090565b60006109b08261181b565b506000908152600460205260409020546001600160a01b031690565b601080546109d990612a1d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0590612a1d565b8015610a525780601f10610a2757610100808354040283529160200191610a52565b820191906000526020600020905b815481529060010190602001808311610a3557829003601f168201915b505050505081565b6000610a6582610f6a565b9050806001600160a01b0316836001600160a01b03161415610ad85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610af45750610af48133610843565b610b665760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610acf565b610b70838361187a565b505050565b610b7f33826118e8565b610b9b5760405162461bcd60e51b8152600401610acf90612941565b610b70838383611967565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610c1b575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610c3a906001600160601b0316876129bb565b610c4491906129a7565b915196919550909350505050565b6000610c5d83610fd7565b8210610cbf5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610acf565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000805b601754811015610d4957826001600160a01b031660178281548110610d1357610d13612ac9565b6000918252602090912001546001600160a01b03161415610d375750600192915050565b80610d4181612a58565b915050610cec565b50600092915050565b610d5a6116c4565b60168054911515620100000262ff000019909216919091179055565b610d7e6116c4565b6000610d92600c546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610ddc576040519150601f19603f3d011682016040523d82523d6000602084013e610de1565b606091505b5050905080610def57600080fd5b50565b610b70838383604051806020016040528060008152506113bc565b60606000610e1a83610fd7565b905060008167ffffffffffffffff811115610e3757610e37612adf565b604051908082528060200260200182016040528015610e60578160200160208202803683370190505b50905060005b82811015610ea757610e788582610c52565b828281518110610e8a57610e8a612ac9565b602090810291909101015280610e9f81612a58565b915050610e66565b509392505050565b610eb76116c4565b601155565b6000610ec760085490565b8210610f2a5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610acf565b60088281548110610f3d57610f3d612ac9565b90600052602060002001549050919050565b610f576116c4565b805161090f90600d9060208401906122d4565b6000818152600260205260408120546001600160a01b0316806108dc5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610acf565b600d80546109d990612a1d565b60006001600160a01b0382166110415760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610acf565b506001600160a01b031660009081526003602052604090205490565b6110656116c4565b61106f6000611b0e565b565b6110796116c4565b601355565b6110866116c4565b805161090f90600e9060208401906122d4565b6110a16116c4565b601680549115156101000261ff0019909216919091179055565b60606001805461092290612a1d565b60165460ff16156111165760405162461bcd60e51b81526020600482015260166024820152751d1a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b6044820152606401610acf565b600061112160085490565b9050600082116111735760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e465400000000006044820152606401610acf565b6013548211156111d15760405162461bcd60e51b8152602060048201526024808201527f6d6178206d696e7420616d6f756e74207065722073657373696f6e20657863656044820152631959195960e21b6064820152608401610acf565b6012546111de838361298f565b11156112255760405162461bcd60e51b81526020600482015260166024820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b6044820152606401610acf565b600c546001600160a01b031633146113615760165462010000900460ff1615156001141561130f5761125633610ce8565b6112a25760405162461bcd60e51b815260206004820152601760248201527f75736572206973206e6f74206f6e20544845204c4953540000000000000000006044820152606401610acf565b336000908152601860205260409020546014546112bf848361298f565b111561130d5760405162461bcd60e51b815260206004820152601c60248201527f6d6178204e4654207065722061646472657373206578636565646564000000006044820152606401610acf565b505b8160115461131d91906129bb565b3410156113615760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610acf565b60015b828111610b705733600090815260186020526040812080549161138683612a58565b9091555061139f90503361139a838561298f565b611b60565b806113a981612a58565b915050611364565b61090f338383611b7a565b6113c633836118e8565b6113e25760405162461bcd60e51b8152600401610acf90612941565b6113ee84848484611c49565b50505050565b6017818154811061140457600080fd5b6000918252602090912001546001600160a01b0316905081565b600f80546109d990612a1d565b6000818152600260205260409020546060906001600160a01b03166114aa5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610acf565b601654610100900460ff1661154b57601080546114c690612a1d565b80601f01602080910402602001604051908101604052809291908181526020018280546114f290612a1d565b801561153f5780601f106115145761010080835404028352916020019161153f565b820191906000526020600020905b81548152906001019060200180831161152257829003601f168201915b50505050509050919050565b6000611555611c7c565b9050600081511161157557604051806020016040528060008152506115a3565b8061157f84611c8b565b600f60405160200161159393929190612797565b6040516020818303038152906040525b9392505050565b6115b26116c4565b601455565b6115bf6116c4565b805161090f90600f9060208401906122d4565b600e80546109d990612a1d565b6115e76116c4565b6115f360176000612358565b610b7060178383612376565b6116076116c4565b805161090f9060109060208401906122d4565b6116226116c4565b6001600160a01b0381166116875760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610acf565b610def81611b0e565b6001600160a01b03163b151590565b60006001600160e01b0319821663152a902d60e11b14806108dc57506108dc82611d89565b600c546001600160a01b0316331461106f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610acf565b6127106001600160601b038216111561178c5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610acf565b6001600160a01b0382166117e25760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610acf565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b6000818152600260205260409020546001600160a01b0316610def5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610acf565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118af82610f6a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806118f483610f6a565b9050806001600160a01b0316846001600160a01b0316148061193b57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b8061195f5750836001600160a01b0316611954846109a5565b6001600160a01b0316145b949350505050565b826001600160a01b031661197a82610f6a565b6001600160a01b0316146119de5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610acf565b6001600160a01b038216611a405760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610acf565b611a4b838383611dae565b611a5660008261187a565b6001600160a01b0383166000908152600360205260408120805460019290611a7f9084906129da565b90915550506001600160a01b0382166000908152600360205260408120805460019290611aad90849061298f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61090f828260405180602001604052806000815250611e66565b816001600160a01b0316836001600160a01b03161415611bdc5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610acf565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611c54848484611967565b611c6084848484611e99565b6113ee5760405162461bcd60e51b8152600401610acf906128ef565b6060600d805461092290612a1d565b606081611caf5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611cd95780611cc381612a58565b9150611cd29050600a836129a7565b9150611cb3565b60008167ffffffffffffffff811115611cf457611cf4612adf565b6040519080825280601f01601f191660200182016040528015611d1e576020820181803683370190505b5090505b841561195f57611d336001836129da565b9150611d40600a86612a73565b611d4b90603061298f565b60f81b818381518110611d6057611d60612ac9565b60200101906001600160f81b031916908160001a905350611d82600a866129a7565b9450611d22565b60006001600160e01b0319821663780e9d6360e01b14806108dc57506108dc82611fa6565b6001600160a01b038316611e0957611e0481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611e2c565b816001600160a01b0316836001600160a01b031614611e2c57611e2c8382611ff6565b6001600160a01b038216611e4357610b7081612093565b826001600160a01b0316826001600160a01b031614610b7057610b708282612142565b611e708383612186565b611e7d6000848484611e99565b610b705760405162461bcd60e51b8152600401610acf906128ef565b60006001600160a01b0384163b15611f9b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611edd90339089908890889060040161285b565b602060405180830381600087803b158015611ef757600080fd5b505af1925050508015611f27575060408051601f3d908101601f19168201909252611f24918101906126ca565b60015b611f81573d808015611f55576040519150601f19603f3d011682016040523d82523d6000602084013e611f5a565b606091505b508051611f795760405162461bcd60e51b8152600401610acf906128ef565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061195f565b506001949350505050565b60006001600160e01b031982166380ac58cd60e01b1480611fd757506001600160e01b03198216635b5e139f60e01b145b806108dc57506301ffc9a760e01b6001600160e01b03198316146108dc565b6000600161200384610fd7565b61200d91906129da565b600083815260076020526040902054909150808214612060576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906120a5906001906129da565b600083815260096020526040812054600880549394509092849081106120cd576120cd612ac9565b9060005260206000200154905080600883815481106120ee576120ee612ac9565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061212657612126612ab3565b6001900381819060005260206000200160009055905550505050565b600061214d83610fd7565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166121dc5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610acf565b6000818152600260205260409020546001600160a01b0316156122415760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610acf565b61224d60008383611dae565b6001600160a01b038216600090815260036020526040812080546001929061227690849061298f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546122e090612a1d565b90600052602060002090601f0160209004810192826123025760008555612348565b82601f1061231b57805160ff1916838001178555612348565b82800160010185558215612348579182015b8281111561234857825182559160200191906001019061232d565b506123549291506123c9565b5090565b5080546000825590600052602060002090810190610def91906123c9565b828054828255906000526020600020908101928215612348579160200282015b828111156123485781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612396565b5b8082111561235457600081556001016123ca565b600067ffffffffffffffff808411156123f9576123f9612adf565b604051601f8501601f19908116603f0116810190828211818310171561242157612421612adf565b8160405280935085815286868601111561243a57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461246b57600080fd5b919050565b8035801515811461246b57600080fd5b60006020828403121561249257600080fd5b6115a382612454565b600080604083850312156124ae57600080fd5b6124b783612454565b91506124c560208401612454565b90509250929050565b6000806000606084860312156124e357600080fd5b6124ec84612454565b92506124fa60208501612454565b9150604084013590509250925092565b6000806000806080858703121561252057600080fd5b61252985612454565b935061253760208601612454565b925060408501359150606085013567ffffffffffffffff81111561255a57600080fd5b8501601f8101871361256b57600080fd5b61257a878235602084016123de565b91505092959194509250565b6000806040838503121561259957600080fd5b6125a283612454565b91506124c560208401612470565b600080604083850312156125c357600080fd5b6125cc83612454565b946020939093013593505050565b600080604083850312156125ed57600080fd5b6125f683612454565b915060208301356001600160601b038116811461261257600080fd5b809150509250929050565b6000806020838503121561263057600080fd5b823567ffffffffffffffff8082111561264857600080fd5b818501915085601f83011261265c57600080fd5b81358181111561266b57600080fd5b8660208260051b850101111561268057600080fd5b60209290920196919550909350505050565b6000602082840312156126a457600080fd5b6115a382612470565b6000602082840312156126bf57600080fd5b81356115a381612af5565b6000602082840312156126dc57600080fd5b81516115a381612af5565b6000602082840312156126f957600080fd5b813567ffffffffffffffff81111561271057600080fd5b8201601f8101841361272157600080fd5b61195f848235602084016123de565b60006020828403121561274257600080fd5b5035919050565b6000806040838503121561275c57600080fd5b50508035926020909101359150565b600081518084526127838160208601602086016129f1565b601f01601f19169290920160200192915050565b6000845160206127aa8285838a016129f1565b8551918401916127bd8184848a016129f1565b8554920191600090600181811c90808316806127da57607f831692505b8583108114156127f857634e487b7160e01b85526022600452602485fd5b80801561280c576001811461281d5761284a565b60ff1985168852838801955061284a565b60008b81526020902060005b858110156128425781548a820152908401908801612829565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061288e9083018461276b565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156128d0578351835292840192918401916001016128b4565b50909695505050505050565b6020815260006115a3602083018461276b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b600082198211156129a2576129a2612a87565b500190565b6000826129b6576129b6612a9d565b500490565b60008160001904831182151516156129d5576129d5612a87565b500290565b6000828210156129ec576129ec612a87565b500390565b60005b83811015612a0c5781810151838201526020016129f4565b838111156113ee5750506000910152565b600181811c90821680612a3157607f821691505b60208210811415612a5257634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612a6c57612a6c612a87565b5060010190565b600082612a8257612a82612a9d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610def57600080fdfea2646970667358221220d3e1e849a69bc9061439023e7db471b86ccc034ed898d05c4b0f15682925ede764736f6c634300080700334552433732313a207472616e7366657220746f206e6f6e20455243373231526500000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002bc000000000000000000000000000000000000000000000000000000000000000e4a41464f4f20534552494553204900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054a41464f4f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d6172775678624d374b506b373876783963663777633979456239694a3350394d556a6a5544444d4d315553762f68696464656e2e6a736f6e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f516d514c4b345847444a72414b4c5064444d74615378584b336b394a6557534d334a4a5043547542506b777267712f6d657461446174612e6a736f6e0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c80636352211e11610175578063b88d4fde116100dc578063d5abeb0111610095578063e985e9c51161006f578063e985e9c514610828578063edec5f2714610871578063f2c4ce1e14610891578063f2fde38b146108b157600080fd5b8063d5abeb01146107dd578063da3ef23f146107f3578063e8a3d4851461081357600080fd5b8063b88d4fde14610732578063ba4e5c4914610752578063ba7d2c7614610772578063c668286214610788578063c87b56dd1461079d578063d0eb26b0146107bd57600080fd5b8063938e3d7b1161012e578063938e3d7b1461068a578063940cd05b146106aa57806395d89b41146106ca5780639c70b512146106df578063a0712d68146106ff578063a22cb4651461071257600080fd5b80636352211e146105e25780636c0360eb1461060257806370a0823114610617578063715018a6146106375780637f00c7a61461064c5780638da5cb5b1461066c57600080fd5b80632a55205a11610219578063438b6300116101d2578063438b63001461051c57806344a0d68a146105495780634f6ccce714610569578063518302271461058957806355f804b3146105a85780635c975abb146105c857600080fd5b80632a55205a146104555780632f745c59146104945780633af32abf146104b45780633c952764146104d45780633ccfd60b146104f457806342842e0e146104fc57600080fd5b8063095ea7b31161026b578063095ea7b31461039957806313faede6146103b957806318160ddd146103dd57806318cae269146103f2578063239c70ae1461041f57806323b872dd1461043557600080fd5b806301ffc9a7146102b357806302329a29146102e857806302fa7c471461030a57806306fdde031461032a578063081812fc1461034c578063081c8c4414610384575b600080fd5b3480156102bf57600080fd5b506102d36102ce3660046126ad565b6108d1565b60405190151581526020015b60405180910390f35b3480156102f457600080fd5b50610308610303366004612692565b6108e2565b005b34801561031657600080fd5b506103086103253660046125da565b6108fd565b34801561033657600080fd5b5061033f610913565b6040516102df91906128dc565b34801561035857600080fd5b5061036c610367366004612730565b6109a5565b6040516001600160a01b0390911681526020016102df565b34801561039057600080fd5b5061033f6109cc565b3480156103a557600080fd5b506103086103b43660046125b0565b610a5a565b3480156103c557600080fd5b506103cf60115481565b6040519081526020016102df565b3480156103e957600080fd5b506008546103cf565b3480156103fe57600080fd5b506103cf61040d366004612480565b60186020526000908152604090205481565b34801561042b57600080fd5b506103cf60135481565b34801561044157600080fd5b506103086104503660046124ce565b610b75565b34801561046157600080fd5b50610475610470366004612749565b610ba6565b604080516001600160a01b0390931683526020830191909152016102df565b3480156104a057600080fd5b506103cf6104af3660046125b0565b610c52565b3480156104c057600080fd5b506102d36104cf366004612480565b610ce8565b3480156104e057600080fd5b506103086104ef366004612692565b610d52565b610308610d76565b34801561050857600080fd5b506103086105173660046124ce565b610df2565b34801561052857600080fd5b5061053c610537366004612480565b610e0d565b6040516102df9190612898565b34801561055557600080fd5b50610308610564366004612730565b610eaf565b34801561057557600080fd5b506103cf610584366004612730565b610ebc565b34801561059557600080fd5b506016546102d390610100900460ff1681565b3480156105b457600080fd5b506103086105c33660046126e7565b610f4f565b3480156105d457600080fd5b506016546102d39060ff1681565b3480156105ee57600080fd5b5061036c6105fd366004612730565b610f6a565b34801561060e57600080fd5b5061033f610fca565b34801561062357600080fd5b506103cf610632366004612480565b610fd7565b34801561064357600080fd5b5061030861105d565b34801561065857600080fd5b50610308610667366004612730565b611071565b34801561067857600080fd5b50600c546001600160a01b031661036c565b34801561069657600080fd5b506103086106a53660046126e7565b61107e565b3480156106b657600080fd5b506103086106c5366004612692565b611099565b3480156106d657600080fd5b5061033f6110bb565b3480156106eb57600080fd5b506016546102d39062010000900460ff1681565b61030861070d366004612730565b6110ca565b34801561071e57600080fd5b5061030861072d366004612586565b6113b1565b34801561073e57600080fd5b5061030861074d36600461250a565b6113bc565b34801561075e57600080fd5b5061036c61076d366004612730565b6113f4565b34801561077e57600080fd5b506103cf60145481565b34801561079457600080fd5b5061033f61141e565b3480156107a957600080fd5b5061033f6107b8366004612730565b61142b565b3480156107c957600080fd5b506103086107d8366004612730565b6115aa565b3480156107e957600080fd5b506103cf60125481565b3480156107ff57600080fd5b5061030861080e3660046126e7565b6115b7565b34801561081f57600080fd5b5061033f6115d2565b34801561083457600080fd5b506102d361084336600461249b565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561087d57600080fd5b5061030861088c36600461261d565b6115df565b34801561089d57600080fd5b506103086108ac3660046126e7565b6115ff565b3480156108bd57600080fd5b506103086108cc366004612480565b61161a565b60006108dc8261169f565b92915050565b6108ea6116c4565b6016805460ff1916911515919091179055565b6109056116c4565b61090f828261171e565b5050565b60606000805461092290612a1d565b80601f016020809104026020016040519081016040528092919081815260200182805461094e90612a1d565b801561099b5780601f106109705761010080835404028352916020019161099b565b820191906000526020600020905b81548152906001019060200180831161097e57829003601f168201915b5050505050905090565b60006109b08261181b565b506000908152600460205260409020546001600160a01b031690565b601080546109d990612a1d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0590612a1d565b8015610a525780601f10610a2757610100808354040283529160200191610a52565b820191906000526020600020905b815481529060010190602001808311610a3557829003601f168201915b505050505081565b6000610a6582610f6a565b9050806001600160a01b0316836001600160a01b03161415610ad85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610af45750610af48133610843565b610b665760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610acf565b610b70838361187a565b505050565b610b7f33826118e8565b610b9b5760405162461bcd60e51b8152600401610acf90612941565b610b70838383611967565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610c1b575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610c3a906001600160601b0316876129bb565b610c4491906129a7565b915196919550909350505050565b6000610c5d83610fd7565b8210610cbf5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610acf565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000805b601754811015610d4957826001600160a01b031660178281548110610d1357610d13612ac9565b6000918252602090912001546001600160a01b03161415610d375750600192915050565b80610d4181612a58565b915050610cec565b50600092915050565b610d5a6116c4565b60168054911515620100000262ff000019909216919091179055565b610d7e6116c4565b6000610d92600c546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610ddc576040519150601f19603f3d011682016040523d82523d6000602084013e610de1565b606091505b5050905080610def57600080fd5b50565b610b70838383604051806020016040528060008152506113bc565b60606000610e1a83610fd7565b905060008167ffffffffffffffff811115610e3757610e37612adf565b604051908082528060200260200182016040528015610e60578160200160208202803683370190505b50905060005b82811015610ea757610e788582610c52565b828281518110610e8a57610e8a612ac9565b602090810291909101015280610e9f81612a58565b915050610e66565b509392505050565b610eb76116c4565b601155565b6000610ec760085490565b8210610f2a5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610acf565b60088281548110610f3d57610f3d612ac9565b90600052602060002001549050919050565b610f576116c4565b805161090f90600d9060208401906122d4565b6000818152600260205260408120546001600160a01b0316806108dc5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610acf565b600d80546109d990612a1d565b60006001600160a01b0382166110415760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610acf565b506001600160a01b031660009081526003602052604090205490565b6110656116c4565b61106f6000611b0e565b565b6110796116c4565b601355565b6110866116c4565b805161090f90600e9060208401906122d4565b6110a16116c4565b601680549115156101000261ff0019909216919091179055565b60606001805461092290612a1d565b60165460ff16156111165760405162461bcd60e51b81526020600482015260166024820152751d1a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b6044820152606401610acf565b600061112160085490565b9050600082116111735760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e465400000000006044820152606401610acf565b6013548211156111d15760405162461bcd60e51b8152602060048201526024808201527f6d6178206d696e7420616d6f756e74207065722073657373696f6e20657863656044820152631959195960e21b6064820152608401610acf565b6012546111de838361298f565b11156112255760405162461bcd60e51b81526020600482015260166024820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b6044820152606401610acf565b600c546001600160a01b031633146113615760165462010000900460ff1615156001141561130f5761125633610ce8565b6112a25760405162461bcd60e51b815260206004820152601760248201527f75736572206973206e6f74206f6e20544845204c4953540000000000000000006044820152606401610acf565b336000908152601860205260409020546014546112bf848361298f565b111561130d5760405162461bcd60e51b815260206004820152601c60248201527f6d6178204e4654207065722061646472657373206578636565646564000000006044820152606401610acf565b505b8160115461131d91906129bb565b3410156113615760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610acf565b60015b828111610b705733600090815260186020526040812080549161138683612a58565b9091555061139f90503361139a838561298f565b611b60565b806113a981612a58565b915050611364565b61090f338383611b7a565b6113c633836118e8565b6113e25760405162461bcd60e51b8152600401610acf90612941565b6113ee84848484611c49565b50505050565b6017818154811061140457600080fd5b6000918252602090912001546001600160a01b0316905081565b600f80546109d990612a1d565b6000818152600260205260409020546060906001600160a01b03166114aa5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610acf565b601654610100900460ff1661154b57601080546114c690612a1d565b80601f01602080910402602001604051908101604052809291908181526020018280546114f290612a1d565b801561153f5780601f106115145761010080835404028352916020019161153f565b820191906000526020600020905b81548152906001019060200180831161152257829003601f168201915b50505050509050919050565b6000611555611c7c565b9050600081511161157557604051806020016040528060008152506115a3565b8061157f84611c8b565b600f60405160200161159393929190612797565b6040516020818303038152906040525b9392505050565b6115b26116c4565b601455565b6115bf6116c4565b805161090f90600f9060208401906122d4565b600e80546109d990612a1d565b6115e76116c4565b6115f360176000612358565b610b7060178383612376565b6116076116c4565b805161090f9060109060208401906122d4565b6116226116c4565b6001600160a01b0381166116875760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610acf565b610def81611b0e565b6001600160a01b03163b151590565b60006001600160e01b0319821663152a902d60e11b14806108dc57506108dc82611d89565b600c546001600160a01b0316331461106f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610acf565b6127106001600160601b038216111561178c5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610acf565b6001600160a01b0382166117e25760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610acf565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b6000818152600260205260409020546001600160a01b0316610def5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610acf565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118af82610f6a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806118f483610f6a565b9050806001600160a01b0316846001600160a01b0316148061193b57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b8061195f5750836001600160a01b0316611954846109a5565b6001600160a01b0316145b949350505050565b826001600160a01b031661197a82610f6a565b6001600160a01b0316146119de5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610acf565b6001600160a01b038216611a405760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610acf565b611a4b838383611dae565b611a5660008261187a565b6001600160a01b0383166000908152600360205260408120805460019290611a7f9084906129da565b90915550506001600160a01b0382166000908152600360205260408120805460019290611aad90849061298f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61090f828260405180602001604052806000815250611e66565b816001600160a01b0316836001600160a01b03161415611bdc5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610acf565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611c54848484611967565b611c6084848484611e99565b6113ee5760405162461bcd60e51b8152600401610acf906128ef565b6060600d805461092290612a1d565b606081611caf5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611cd95780611cc381612a58565b9150611cd29050600a836129a7565b9150611cb3565b60008167ffffffffffffffff811115611cf457611cf4612adf565b6040519080825280601f01601f191660200182016040528015611d1e576020820181803683370190505b5090505b841561195f57611d336001836129da565b9150611d40600a86612a73565b611d4b90603061298f565b60f81b818381518110611d6057611d60612ac9565b60200101906001600160f81b031916908160001a905350611d82600a866129a7565b9450611d22565b60006001600160e01b0319821663780e9d6360e01b14806108dc57506108dc82611fa6565b6001600160a01b038316611e0957611e0481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611e2c565b816001600160a01b0316836001600160a01b031614611e2c57611e2c8382611ff6565b6001600160a01b038216611e4357610b7081612093565b826001600160a01b0316826001600160a01b031614610b7057610b708282612142565b611e708383612186565b611e7d6000848484611e99565b610b705760405162461bcd60e51b8152600401610acf906128ef565b60006001600160a01b0384163b15611f9b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611edd90339089908890889060040161285b565b602060405180830381600087803b158015611ef757600080fd5b505af1925050508015611f27575060408051601f3d908101601f19168201909252611f24918101906126ca565b60015b611f81573d808015611f55576040519150601f19603f3d011682016040523d82523d6000602084013e611f5a565b606091505b508051611f795760405162461bcd60e51b8152600401610acf906128ef565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061195f565b506001949350505050565b60006001600160e01b031982166380ac58cd60e01b1480611fd757506001600160e01b03198216635b5e139f60e01b145b806108dc57506301ffc9a760e01b6001600160e01b03198316146108dc565b6000600161200384610fd7565b61200d91906129da565b600083815260076020526040902054909150808214612060576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906120a5906001906129da565b600083815260096020526040812054600880549394509092849081106120cd576120cd612ac9565b9060005260206000200154905080600883815481106120ee576120ee612ac9565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061212657612126612ab3565b6001900381819060005260206000200160009055905550505050565b600061214d83610fd7565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166121dc5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610acf565b6000818152600260205260409020546001600160a01b0316156122415760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610acf565b61224d60008383611dae565b6001600160a01b038216600090815260036020526040812080546001929061227690849061298f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546122e090612a1d565b90600052602060002090601f0160209004810192826123025760008555612348565b82601f1061231b57805160ff1916838001178555612348565b82800160010185558215612348579182015b8281111561234857825182559160200191906001019061232d565b506123549291506123c9565b5090565b5080546000825590600052602060002090810190610def91906123c9565b828054828255906000526020600020908101928215612348579160200282015b828111156123485781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612396565b5b8082111561235457600081556001016123ca565b600067ffffffffffffffff808411156123f9576123f9612adf565b604051601f8501601f19908116603f0116810190828211818310171561242157612421612adf565b8160405280935085815286868601111561243a57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461246b57600080fd5b919050565b8035801515811461246b57600080fd5b60006020828403121561249257600080fd5b6115a382612454565b600080604083850312156124ae57600080fd5b6124b783612454565b91506124c560208401612454565b90509250929050565b6000806000606084860312156124e357600080fd5b6124ec84612454565b92506124fa60208501612454565b9150604084013590509250925092565b6000806000806080858703121561252057600080fd5b61252985612454565b935061253760208601612454565b925060408501359150606085013567ffffffffffffffff81111561255a57600080fd5b8501601f8101871361256b57600080fd5b61257a878235602084016123de565b91505092959194509250565b6000806040838503121561259957600080fd5b6125a283612454565b91506124c560208401612470565b600080604083850312156125c357600080fd5b6125cc83612454565b946020939093013593505050565b600080604083850312156125ed57600080fd5b6125f683612454565b915060208301356001600160601b038116811461261257600080fd5b809150509250929050565b6000806020838503121561263057600080fd5b823567ffffffffffffffff8082111561264857600080fd5b818501915085601f83011261265c57600080fd5b81358181111561266b57600080fd5b8660208260051b850101111561268057600080fd5b60209290920196919550909350505050565b6000602082840312156126a457600080fd5b6115a382612470565b6000602082840312156126bf57600080fd5b81356115a381612af5565b6000602082840312156126dc57600080fd5b81516115a381612af5565b6000602082840312156126f957600080fd5b813567ffffffffffffffff81111561271057600080fd5b8201601f8101841361272157600080fd5b61195f848235602084016123de565b60006020828403121561274257600080fd5b5035919050565b6000806040838503121561275c57600080fd5b50508035926020909101359150565b600081518084526127838160208601602086016129f1565b601f01601f19169290920160200192915050565b6000845160206127aa8285838a016129f1565b8551918401916127bd8184848a016129f1565b8554920191600090600181811c90808316806127da57607f831692505b8583108114156127f857634e487b7160e01b85526022600452602485fd5b80801561280c576001811461281d5761284a565b60ff1985168852838801955061284a565b60008b81526020902060005b858110156128425781548a820152908401908801612829565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061288e9083018461276b565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156128d0578351835292840192918401916001016128b4565b50909695505050505050565b6020815260006115a3602083018461276b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b600082198211156129a2576129a2612a87565b500190565b6000826129b6576129b6612a9d565b500490565b60008160001904831182151516156129d5576129d5612a87565b500290565b6000828210156129ec576129ec612a87565b500390565b60005b83811015612a0c5781810151838201526020016129f4565b838111156113ee5750506000910152565b600181811c90821680612a3157607f821691505b60208210811415612a5257634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612a6c57612a6c612a87565b5060010190565b600082612a8257612a82612a9d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610def57600080fdfea2646970667358221220d3e1e849a69bc9061439023e7db471b86ccc034ed898d05c4b0f15682925ede764736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002bc000000000000000000000000000000000000000000000000000000000000000e4a41464f4f20534552494553204900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054a41464f4f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d6172775678624d374b506b373876783963663777633979456239694a3350394d556a6a5544444d4d315553762f68696464656e2e6a736f6e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f516d514c4b345847444a72414b4c5064444d74615378584b336b394a6557534d334a4a5043547542506b777267712f6d657461446174612e6a736f6e0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): JAFOO SERIES I
Arg [1] : _symbol (string): JAFOO
Arg [2] : _initBaseURI (string):
Arg [3] : _initNotRevealedUri (string): ipfs://QmarwVxbM7KPk78vx9cf7wc9yEb9iJ3P9MUjjUDDMM1USv/hidden.json
Arg [4] : _contractURI (string): ipfs://QmQLK4XGDJrAKLPdDMtaSxXK3k9JeWSM3JJPCTuBPkwrgq/metaData.json
Arg [5] : _royaltyFeesInBips (uint96): 700

-----Encoded View---------------
19 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [5] : 00000000000000000000000000000000000000000000000000000000000002bc
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [7] : 4a41464f4f205345524945532049000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [9] : 4a41464f4f000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000041
Arg [12] : 697066733a2f2f516d6172775678624d374b506b373876783963663777633979
Arg [13] : 456239694a3350394d556a6a5544444d4d315553762f68696464656e2e6a736f
Arg [14] : 6e00000000000000000000000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [16] : 697066733a2f2f516d514c4b345847444a72414b4c5064444d74615378584b33
Arg [17] : 6b394a6557534d334a4a5043547542506b777267712f6d657461446174612e6a
Arg [18] : 736f6e0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

52361:5201:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56908:166;;;;;;;;;;-1:-1:-1;56908:166:0;;;;;:::i;:::-;;:::i;:::-;;;9330:14:1;;9323:22;9305:41;;9293:2;9278:18;56908:166:0;;;;;;;;56574:73;;;;;;;;;;-1:-1:-1;56574:73:0;;;;;:::i;:::-;;:::i;:::-;;57083:148;;;;;;;;;;-1:-1:-1;57083:148:0;;;;;:::i;:::-;;:::i;32833:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;34346:171::-;;;;;;;;;;-1:-1:-1;34346:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7712:32:1;;;7694:51;;7682:2;7667:18;34346:171:0;7548:203:1;52547:28:0;;;;;;;;;;;;;:::i;33863:417::-;;;;;;;;;;-1:-1:-1;33863:417:0;;;;;:::i;:::-;;:::i;52580:31::-;;;;;;;;;;;;;;;;;;;19333:25:1;;;19321:2;19306:18;52580:31:0;19187:177:1;46792:113:0;;;;;;;;;;-1:-1:-1;46880:10:0;:17;46792:113;;52966:55;;;;;;;;;;-1:-1:-1;52966:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;52676:34;;;;;;;;;;;;;;;;35046:336;;;;;;;;;;-1:-1:-1;35046:336:0;;;;;:::i;:::-;;:::i;21023:442::-;;;;;;;;;;-1:-1:-1;21023:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;8441:32:1;;;8423:51;;8505:2;8490:18;;8483:34;;;;8396:18;21023:442:0;8249:274:1;46460:256:0;;;;;;;;;;-1:-1:-1;46460:256:0;;;;;:::i;:::-;;:::i;54583:239::-;;;;;;;;;;-1:-1:-1;54583:239:0;;;;;:::i;:::-;;:::i;56655:95::-;;;;;;;;;;-1:-1:-1;56655:95:0;;;;;:::i;:::-;;:::i;57242:317::-;;;:::i;35453:185::-;;;;;;;;;;-1:-1:-1;35453:185:0;;;;;:::i;:::-;;:::i;54828:348::-;;;;;;;;;;-1:-1:-1;54828:348:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;55890:80::-;;;;;;;;;;-1:-1:-1;55890:80:0;;;;;:::i;:::-;;:::i;46982:233::-;;;;;;;;;;-1:-1:-1;46982:233:0;;;;;:::i;:::-;;:::i;52852:28::-;;;;;;;;;;-1:-1:-1;52852:28:0;;;;;;;;;;;56098:98;;;;;;;;;;-1:-1:-1;56098:98:0;;;;;:::i;:::-;;:::i;52815:26::-;;;;;;;;;;-1:-1:-1;52815:26:0;;;;;;;;32544:222;;;;;;;;;;-1:-1:-1;32544:222:0;;;;;:::i;:::-;;:::i;52449:21::-;;;;;;;;;;;;;:::i;32275:207::-;;;;;;;;;;-1:-1:-1;32275:207:0;;;;;:::i;:::-;;:::i;5781:103::-;;;;;;;;;;;;;:::i;55976:116::-;;;;;;;;;;-1:-1:-1;55976:116:0;;;;;:::i;:::-;;:::i;5133:87::-;;;;;;;;;;-1:-1:-1;5206:6:0;;-1:-1:-1;;;;;5206:6:0;5133:87;;56458:108;;;;;;;;;;-1:-1:-1;56458:108:0;;;;;:::i;:::-;;:::i;55688:82::-;;;;;;;;;;-1:-1:-1;55688:82:0;;;;;:::i;:::-;;:::i;33002:104::-;;;;;;;;;;;;;:::i;52885:34::-;;;;;;;;;;-1:-1:-1;52885:34:0;;;;;;;;;;;53644:931;;;;;;:::i;:::-;;:::i;34589:155::-;;;;;;;;;;-1:-1:-1;34589:155:0;;;;;:::i;:::-;;:::i;35709:323::-;;;;;;;;;;-1:-1:-1;35709:323:0;;;;;:::i;:::-;;:::i;52924:37::-;;;;;;;;;;-1:-1:-1;52924:37:0;;;;;:::i;:::-;;:::i;52715:38::-;;;;;;;;;;;;;;;;52505:37;;;;;;;;;;;;;:::i;55182:497::-;;;;;;;;;;-1:-1:-1;55182:497:0;;;;;:::i;:::-;;:::i;55778:104::-;;;;;;;;;;-1:-1:-1;55778:104:0;;;;;:::i;:::-;;:::i;52625:31::-;;;;;;;;;;;;;;;;56202:122;;;;;;;;;;-1:-1:-1;56202:122:0;;;;;:::i;:::-;;:::i;52475:25::-;;;;;;;;;;;;;:::i;34815:164::-;;;;;;;;;;-1:-1:-1;34815:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;34936:25:0;;;34912:4;34936:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34815:164;56758:144;;;;;;;;;;-1:-1:-1;56758:144:0;;;;;:::i;:::-;;:::i;56332:120::-;;;;;;;;;;-1:-1:-1;56332:120:0;;;;;:::i;:::-;;:::i;6039:201::-;;;;;;;;;;-1:-1:-1;6039:201:0;;;;;:::i;:::-;;:::i;56908:166::-;57012:4;57032:36;57056:11;57032:23;:36::i;:::-;57025:43;56908:166;-1:-1:-1;;56908:166:0:o;56574:73::-;5019:13;:11;:13::i;:::-;56626:6:::1;:15:::0;;-1:-1:-1;;56626:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;56574:73::o;57083:148::-;5019:13;:11;:13::i;:::-;57176:49:::1;57195:9;57206:18;57176;:49::i;:::-;57083:148:::0;;:::o;32833:100::-;32887:13;32920:5;32913:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32833:100;:::o;34346:171::-;34422:7;34442:23;34457:7;34442:14;:23::i;:::-;-1:-1:-1;34485:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;34485:24:0;;34346:171::o;52547:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33863:417::-;33944:13;33960:23;33975:7;33960:14;:23::i;:::-;33944:39;;34008:5;-1:-1:-1;;;;;34002:11:0;:2;-1:-1:-1;;;;;34002:11:0;;;33994:57;;;;-1:-1:-1;;;33994:57:0;;16691:2:1;33994:57:0;;;16673:21:1;16730:2;16710:18;;;16703:30;16769:34;16749:18;;;16742:62;-1:-1:-1;;;16820:18:1;;;16813:31;16861:19;;33994:57:0;;;;;;;;;3726:10;-1:-1:-1;;;;;34086:21:0;;;;:62;;-1:-1:-1;34111:37:0;34128:5;3726:10;34815:164;:::i;34111:37::-;34064:174;;;;-1:-1:-1;;;34064:174:0;;14418:2:1;34064:174:0;;;14400:21:1;14457:2;14437:18;;;14430:30;14496:34;14476:18;;;14469:62;14567:32;14547:18;;;14540:60;14617:19;;34064:174:0;14216:426:1;34064:174:0;34251:21;34260:2;34264:7;34251:8;:21::i;:::-;33933:347;33863:417;;:::o;35046:336::-;35241:41;3726:10;35274:7;35241:18;:41::i;:::-;35233:100;;;;-1:-1:-1;;;35233:100:0;;;;;;;:::i;:::-;35346:28;35356:4;35362:2;35366:7;35346:9;:28::i;21023:442::-;21120:7;21178:27;;;:17;:27;;;;;;;;21149:56;;;;;;;;;-1:-1:-1;;;;;21149:56:0;;;;;-1:-1:-1;;;21149:56:0;;;-1:-1:-1;;;;;21149:56:0;;;;;;;;21120:7;;21218:92;;-1:-1:-1;21269:29:0;;;;;;;;;21279:19;21269:29;-1:-1:-1;;;;;21269:29:0;;;;-1:-1:-1;;;21269:29:0;;-1:-1:-1;;;;;21269:29:0;;;;;21218:92;21360:23;;;;21322:21;;21831:5;;21347:36;;-1:-1:-1;;;;;21347:36:0;:10;:36;:::i;:::-;21346:58;;;;:::i;:::-;21425:16;;;;;-1:-1:-1;21023:442:0;;-1:-1:-1;;;;21023:442:0:o;46460:256::-;46557:7;46593:23;46610:5;46593:16;:23::i;:::-;46585:5;:31;46577:87;;;;-1:-1:-1;;;46577:87:0;;10135:2:1;46577:87:0;;;10117:21:1;10174:2;10154:18;;;10147:30;10213:34;10193:18;;;10186:62;-1:-1:-1;;;10264:18:1;;;10257:41;10315:19;;46577:87:0;9933:407:1;46577:87:0;-1:-1:-1;;;;;;46682:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;46460:256::o;54583:239::-;54642:4;;54655:143;54676:20;:27;54672:31;;54655:143;;;54750:5;-1:-1:-1;;;;;54723:32:0;:20;54744:1;54723:23;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;54723:23:0;:32;54719:72;;;-1:-1:-1;54777:4:0;;54583:239;-1:-1:-1;;54583:239:0:o;54719:72::-;54705:3;;;;:::i;:::-;;;;54655:143;;;-1:-1:-1;54811:5:0;;54583:239;-1:-1:-1;;54583:239:0:o;56655:95::-;5019:13;:11;:13::i;:::-;56720:15:::1;:24:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;56720:24:0;;::::1;::::0;;;::::1;::::0;;56655:95::o;57242:317::-;5019:13;:11;:13::i;:::-;57381:7:::1;57402;5206:6:::0;;-1:-1:-1;;;;;5206:6:0;;5133:87;57402:7:::1;-1:-1:-1::0;;;;;57394:21:0::1;57423;57394:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57380:69;;;57464:2;57456:11;;;::::0;::::1;;57287:272;57242:317::o:0;35453:185::-;35591:39;35608:4;35614:2;35618:7;35591:39;;;;;;;;;;;;:16;:39::i;54828:348::-;54903:16;54931:23;54957:17;54967:6;54957:9;:17::i;:::-;54931:43;;54981:25;55023:15;55009:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55009:30:0;;54981:58;;55051:9;55046:103;55066:15;55062:1;:19;55046:103;;;55111:30;55131:6;55139:1;55111:19;:30::i;:::-;55097:8;55106:1;55097:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;55083:3;;;;:::i;:::-;;;;55046:103;;;-1:-1:-1;55162:8:0;54828:348;-1:-1:-1;;;54828:348:0:o;55890:80::-;5019:13;:11;:13::i;:::-;55949:4:::1;:15:::0;55890:80::o;46982:233::-;47057:7;47093:30;46880:10;:17;;46792:113;47093:30;47085:5;:38;47077:95;;;;-1:-1:-1;;;47077:95:0;;17440:2:1;47077:95:0;;;17422:21:1;17479:2;17459:18;;;17452:30;17518:34;17498:18;;;17491:62;-1:-1:-1;;;17569:18:1;;;17562:42;17621:19;;47077:95:0;17238:408:1;47077:95:0;47190:10;47201:5;47190:17;;;;;;;;:::i;:::-;;;;;;;;;47183:24;;46982:233;;;:::o;56098:98::-;5019:13;:11;:13::i;:::-;56169:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;32544:222::-:0;32616:7;32652:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32652:16:0;32687:19;32679:56;;;;-1:-1:-1;;;32679:56:0;;16338:2:1;32679:56:0;;;16320:21:1;16377:2;16357:18;;;16350:30;-1:-1:-1;;;16396:18:1;;;16389:54;16460:18;;32679:56:0;16136:348:1;52449:21:0;;;;;;;:::i;32275:207::-;32347:7;-1:-1:-1;;;;;32375:19:0;;32367:73;;;;-1:-1:-1;;;32367:73:0;;13252:2:1;32367:73:0;;;13234:21:1;13291:2;13271:18;;;13264:30;13330:34;13310:18;;;13303:62;-1:-1:-1;;;13381:18:1;;;13374:39;13430:19;;32367:73:0;13050:405:1;32367:73:0;-1:-1:-1;;;;;;32458:16:0;;;;;:9;:16;;;;;;;32275:207::o;5781:103::-;5019:13;:11;:13::i;:::-;5846:30:::1;5873:1;5846:18;:30::i;:::-;5781:103::o:0;55976:116::-;5019:13;:11;:13::i;:::-;56053::::1;:33:::0;55976:116::o;56458:108::-;5019:13;:11;:13::i;:::-;56534:26;;::::1;::::0;:11:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;55688:82::-:0;5019:13;:11;:13::i;:::-;55745:8:::1;:18:::0;;;::::1;;;;-1:-1:-1::0;;55745:18:0;;::::1;::::0;;;::::1;::::0;;55688:82::o;33002:104::-;33058:13;33091:7;33084:14;;;;;:::i;53644:931::-;53710:6;;;;53709:7;53701:42;;;;-1:-1:-1;;;53701:42:0;;15571:2:1;53701:42:0;;;15553:21:1;15610:2;15590:18;;;15583:30;-1:-1:-1;;;15629:18:1;;;15622:52;15691:18;;53701:42:0;15369:346:1;53701:42:0;53750:14;53767:13;46880:10;:17;;46792:113;53767:13;53750:30;;53809:1;53795:11;:15;53787:55;;;;-1:-1:-1;;;53787:55:0;;19033:2:1;53787:55:0;;;19015:21:1;19072:2;19052:18;;;19045:30;19111:29;19091:18;;;19084:57;19158:18;;53787:55:0;18831:351:1;53787:55:0;53872:13;;53857:11;:28;;53849:77;;;;-1:-1:-1;;;53849:77:0;;14013:2:1;53849:77:0;;;13995:21:1;14052:2;14032:18;;;14025:30;14091:34;14071:18;;;14064:62;-1:-1:-1;;;14142:18:1;;;14135:34;14186:19;;53849:77:0;13811:400:1;53849:77:0;53965:9;;53941:20;53950:11;53941:6;:20;:::i;:::-;:33;;53933:68;;;;-1:-1:-1;;;53933:68:0;;13662:2:1;53933:68:0;;;13644:21:1;13701:2;13681:18;;;13674:30;-1:-1:-1;;;13720:18:1;;;13713:52;13782:18;;53933:68:0;13460:346:1;53933:68:0;5206:6;;-1:-1:-1;;;;;5206:6:0;54014:10;:21;54010:416;;54051:15;;;;;;;:23;;54070:4;54051:23;54048:298;;;54099:25;54113:10;54099:13;:25::i;:::-;54091:61;;;;-1:-1:-1;;;54091:61:0;;9783:2:1;54091:61:0;;;9765:21:1;9822:2;9802:18;;;9795:30;9861:25;9841:18;;;9834:53;9904:18;;54091:61:0;9581:347:1;54091:61:0;54215:10;54167:24;54194:32;;;:20;:32;;;;;;54283:18;;54249:30;54268:11;54194:32;54249:30;:::i;:::-;:52;;54241:93;;;;-1:-1:-1;;;54241:93:0;;12136:2:1;54241:93:0;;;12118:21:1;12175:2;12155:18;;;12148:30;12214;12194:18;;;12187:58;12262:18;;54241:93:0;11934:352:1;54241:93:0;54076:270;54048:298;54384:11;54377:4;;:18;;;;:::i;:::-;54364:9;:31;;54356:62;;;;-1:-1:-1;;;54356:62:0;;17093:2:1;54356:62:0;;;17075:21:1;17132:2;17112:18;;;17105:30;-1:-1:-1;;;17151:18:1;;;17144:48;17209:18;;54356:62:0;16891:342:1;54356:62:0;54451:1;54434:136;54459:11;54454:1;:16;54434:136;;54507:10;54486:32;;;;:20;:32;;;;;:34;;;;;;:::i;:::-;;;;-1:-1:-1;54529:33:0;;-1:-1:-1;54539:10:0;54551;54560:1;54551:6;:10;:::i;:::-;54529:9;:33::i;:::-;54472:3;;;;:::i;:::-;;;;54434:136;;34589:155;34684:52;3726:10;34717:8;34727;34684:18;:52::i;35709:323::-;35883:41;3726:10;35916:7;35883:18;:41::i;:::-;35875:100;;;;-1:-1:-1;;;35875:100:0;;;;;;;:::i;:::-;35986:38;36000:4;36006:2;36010:7;36019:4;35986:13;:38::i;:::-;35709:323;;;;:::o;52924:37::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52924:37:0;;-1:-1:-1;52924:37:0;:::o;52505:::-;;;;;;;:::i;55182:497::-;37604:4;37628:16;;;:7;:16;;;;;;55280:13;;-1:-1:-1;;;;;37628:16:0;55305:97;;;;-1:-1:-1;;;55305:97:0;;15922:2:1;55305:97:0;;;15904:21:1;15961:2;15941:18;;;15934:30;16000:34;15980:18;;;15973:62;-1:-1:-1;;;16051:18:1;;;16044:45;16106:19;;55305:97:0;15720:411:1;55305:97:0;55418:8;;;;;;;55415:62;;55455:14;55448:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55182:497;;;:::o;55415:62::-;55485:28;55516:10;:8;:10::i;:::-;55485:41;;55571:1;55546:14;55540:28;:32;:133;;;;;;;;;;;;;;;;;55608:14;55624:18;:7;:16;:18::i;:::-;55644:13;55591:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55540:133;55533:140;55182:497;-1:-1:-1;;;55182:497:0:o;55778:104::-;5019:13;:11;:13::i;:::-;55849:18:::1;:27:::0;55778:104::o;56202:122::-;5019:13;:11;:13::i;:::-;56285:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;52475:25::-:0;;;;;;;:::i;56758:144::-;5019:13;:11;:13::i;:::-;56833:27:::1;56840:20;;56833:27;:::i;:::-;56867:29;:20;56890:6:::0;;56867:29:::1;:::i;56332:120::-:0;5019:13;:11;:13::i;:::-;56414:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;6039:201::-:0;5019:13;:11;:13::i;:::-;-1:-1:-1;;;;;6128:22:0;::::1;6120:73;;;::::0;-1:-1:-1;;;6120:73:0;;10966:2:1;6120:73:0::1;::::0;::::1;10948:21:1::0;11005:2;10985:18;;;10978:30;11044:34;11024:18;;;11017:62;-1:-1:-1;;;11095:18:1;;;11088:36;11141:19;;6120:73:0::1;10764:402:1::0;6120:73:0::1;6204:28;6223:8;6204:18;:28::i;7884:326::-:0;-1:-1:-1;;;;;8179:19:0;;:23;;;7884:326::o;20753:215::-;20855:4;-1:-1:-1;;;;;;20879:41:0;;-1:-1:-1;;;20879:41:0;;:81;;;20924:36;20948:11;20924:23;:36::i;5298:132::-;5206:6;;-1:-1:-1;;;;;5206:6:0;3726:10;5362:23;5354:68;;;;-1:-1:-1;;;5354:68:0;;15210:2:1;5354:68:0;;;15192:21:1;;;15229:18;;;15222:30;15288:34;15268:18;;;15261:62;15340:18;;5354:68:0;15008:356:1;22115:332:0;21831:5;-1:-1:-1;;;;;22218:33:0;;;;22210:88;;;;-1:-1:-1;;;22210:88:0;;17853:2:1;22210:88:0;;;17835:21:1;17892:2;17872:18;;;17865:30;17931:34;17911:18;;;17904:62;-1:-1:-1;;;17982:18:1;;;17975:40;18032:19;;22210:88:0;17651:406:1;22210:88:0;-1:-1:-1;;;;;22317:22:0;;22309:60;;;;-1:-1:-1;;;22309:60:0;;18679:2:1;22309:60:0;;;18661:21:1;18718:2;18698:18;;;18691:30;18757:27;18737:18;;;18730:55;18802:18;;22309:60:0;18477:349:1;22309:60:0;22404:35;;;;;;;;;-1:-1:-1;;;;;22404:35:0;;;;;;-1:-1:-1;;;;;22404:35:0;;;;;;;;;;-1:-1:-1;;;22382:57:0;;;;:19;:57;22115:332::o;42321:135::-;37604:4;37628:16;;;:7;:16;;;;;;-1:-1:-1;;;;;37628:16:0;42395:53;;;;-1:-1:-1;;;42395:53:0;;16338:2:1;42395:53:0;;;16320:21:1;16377:2;16357:18;;;16350:30;-1:-1:-1;;;16396:18:1;;;16389:54;16460:18;;42395:53:0;16136:348:1;41600:174:0;41675:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;41675:29:0;-1:-1:-1;;;;;41675:29:0;;;;;;;;:24;;41729:23;41675:24;41729:14;:23::i;:::-;-1:-1:-1;;;;;41720:46:0;;;;;;;;;;;41600:174;;:::o;37833:264::-;37926:4;37943:13;37959:23;37974:7;37959:14;:23::i;:::-;37943:39;;38012:5;-1:-1:-1;;;;;38001:16:0;:7;-1:-1:-1;;;;;38001:16:0;;:52;;;-1:-1:-1;;;;;;34936:25:0;;;34912:4;34936:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;38021:32;38001:87;;;;38081:7;-1:-1:-1;;;;;38057:31:0;:20;38069:7;38057:11;:20::i;:::-;-1:-1:-1;;;;;38057:31:0;;38001:87;37993:96;37833:264;-1:-1:-1;;;;37833:264:0:o;40856:625::-;41015:4;-1:-1:-1;;;;;40988:31:0;:23;41003:7;40988:14;:23::i;:::-;-1:-1:-1;;;;;40988:31:0;;40980:81;;;;-1:-1:-1;;;40980:81:0;;11373:2:1;40980:81:0;;;11355:21:1;11412:2;11392:18;;;11385:30;11451:34;11431:18;;;11424:62;-1:-1:-1;;;11502:18:1;;;11495:35;11547:19;;40980:81:0;11171:401:1;40980:81:0;-1:-1:-1;;;;;41080:16:0;;41072:65;;;;-1:-1:-1;;;41072:65:0;;12493:2:1;41072:65:0;;;12475:21:1;12532:2;12512:18;;;12505:30;12571:34;12551:18;;;12544:62;-1:-1:-1;;;12622:18:1;;;12615:34;12666:19;;41072:65:0;12291:400:1;41072:65:0;41150:39;41171:4;41177:2;41181:7;41150:20;:39::i;:::-;41254:29;41271:1;41275:7;41254:8;:29::i;:::-;-1:-1:-1;;;;;41296:15:0;;;;;;:9;:15;;;;;:20;;41315:1;;41296:15;:20;;41315:1;;41296:20;:::i;:::-;;;;-1:-1:-1;;;;;;;41327:13:0;;;;;;:9;:13;;;;;:18;;41344:1;;41327:13;:18;;41344:1;;41327:18;:::i;:::-;;;;-1:-1:-1;;41356:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;41356:21:0;-1:-1:-1;;;;;41356:21:0;;;;;;;;;41395:27;;41356:16;;41395:27;;;;;;;33933:347;33863:417;;:::o;6400:191::-;6493:6;;;-1:-1:-1;;;;;6510:17:0;;;-1:-1:-1;;;;;;6510:17:0;;;;;;;6543:40;;6493:6;;;6510:17;6493:6;;6543:40;;6474:16;;6543:40;6463:128;6400:191;:::o;38439:110::-;38515:26;38525:2;38529:7;38515:26;;;;;;;;;;;;:9;:26::i;41917:315::-;42072:8;-1:-1:-1;;;;;42063:17:0;:5;-1:-1:-1;;;;;42063:17:0;;;42055:55;;;;-1:-1:-1;;;42055:55:0;;12898:2:1;42055:55:0;;;12880:21:1;12937:2;12917:18;;;12910:30;12976:27;12956:18;;;12949:55;13021:18;;42055:55:0;12696:349:1;42055:55:0;-1:-1:-1;;;;;42121:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;42121:46:0;;;;;;;;;;42183:41;;9305::1;;;42183::0;;9278:18:1;42183:41:0;;;;;;;41917:315;;;:::o;36913:313::-;37069:28;37079:4;37085:2;37089:7;37069:9;:28::i;:::-;37116:47;37139:4;37145:2;37149:7;37158:4;37116:22;:47::i;:::-;37108:110;;;;-1:-1:-1;;;37108:110:0;;;;;;;:::i;53532:102::-;53592:13;53621:7;53614:14;;;;;:::i;847:723::-;903:13;1124:10;1120:53;;-1:-1:-1;;1151:10:0;;;;;;;;;;;;-1:-1:-1;;;1151:10:0;;;;;847:723::o;1120:53::-;1198:5;1183:12;1239:78;1246:9;;1239:78;;1272:8;;;;:::i;:::-;;-1:-1:-1;1295:10:0;;-1:-1:-1;1303:2:0;1295:10;;:::i;:::-;;;1239:78;;;1327:19;1359:6;1349:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1349:17:0;;1327:39;;1377:154;1384:10;;1377:154;;1411:11;1421:1;1411:11;;:::i;:::-;;-1:-1:-1;1480:10:0;1488:2;1480:5;:10;:::i;:::-;1467:24;;:2;:24;:::i;:::-;1454:39;;1437:6;1444;1437:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1437:56:0;;;;;;;;-1:-1:-1;1508:11:0;1517:2;1508:11;;:::i;:::-;;;1377:154;;46152:224;46254:4;-1:-1:-1;;;;;;46278:50:0;;-1:-1:-1;;;46278:50:0;;:90;;;46332:36;46356:11;46332:23;:36::i;47828:589::-;-1:-1:-1;;;;;48034:18:0;;48030:187;;48069:40;48101:7;49244:10;:17;;49217:24;;;;:15;:24;;;;;:44;;;49272:24;;;;;;;;;;;;49140:164;48069:40;48030:187;;;48139:2;-1:-1:-1;;;;;48131:10:0;:4;-1:-1:-1;;;;;48131:10:0;;48127:90;;48158:47;48191:4;48197:7;48158:32;:47::i;:::-;-1:-1:-1;;;;;48231:16:0;;48227:183;;48264:45;48301:7;48264:36;:45::i;48227:183::-;48337:4;-1:-1:-1;;;;;48331:10:0;:2;-1:-1:-1;;;;;48331:10:0;;48327:83;;48358:40;48386:2;48390:7;48358:27;:40::i;38776:319::-;38905:18;38911:2;38915:7;38905:5;:18::i;:::-;38956:53;38987:1;38991:2;38995:7;39004:4;38956:22;:53::i;:::-;38934:153;;;;-1:-1:-1;;;38934:153:0;;;;;;;:::i;43020:853::-;43174:4;-1:-1:-1;;;;;43195:13:0;;8179:19;:23;43191:675;;43231:71;;-1:-1:-1;;;43231:71:0;;-1:-1:-1;;;;;43231:36:0;;;;;:71;;3726:10;;43282:4;;43288:7;;43297:4;;43231:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43231:71:0;;;;;;;;-1:-1:-1;;43231:71:0;;;;;;;;;;;;:::i;:::-;;;43227:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43472:13:0;;43468:328;;43515:60;;-1:-1:-1;;;43515:60:0;;;;;;;:::i;43468:328::-;43746:6;43740:13;43731:6;43727:2;43723:15;43716:38;43227:584;-1:-1:-1;;;;;;43353:51:0;-1:-1:-1;;;43353:51:0;;-1:-1:-1;43346:58:0;;43191:675;-1:-1:-1;43850:4:0;43020:853;;;;;;:::o;31906:305::-;32008:4;-1:-1:-1;;;;;;32045:40:0;;-1:-1:-1;;;32045:40:0;;:105;;-1:-1:-1;;;;;;;32102:48:0;;-1:-1:-1;;;32102:48:0;32045:105;:158;;;-1:-1:-1;;;;;;;;;;19259:40:0;;;32167:36;19150:157;49931:988;50197:22;50247:1;50222:22;50239:4;50222:16;:22::i;:::-;:26;;;;:::i;:::-;50259:18;50280:26;;;:17;:26;;;;;;50197:51;;-1:-1:-1;50413:28:0;;;50409:328;;-1:-1:-1;;;;;50480:18:0;;50458:19;50480:18;;;:12;:18;;;;;;;;:34;;;;;;;;;50531:30;;;;;;:44;;;50648:30;;:17;:30;;;;;:43;;;50409:328;-1:-1:-1;50833:26:0;;;;:17;:26;;;;;;;;50826:33;;;-1:-1:-1;;;;;50877:18:0;;;;;:12;:18;;;;;:34;;;;;;;50870:41;49931:988::o;51214:1079::-;51492:10;:17;51467:22;;51492:21;;51512:1;;51492:21;:::i;:::-;51524:18;51545:24;;;:15;:24;;;;;;51918:10;:26;;51467:46;;-1:-1:-1;51545:24:0;;51467:46;;51918:26;;;;;;:::i;:::-;;;;;;;;;51896:48;;51982:11;51957:10;51968;51957:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;52062:28;;;:15;:28;;;;;;;:41;;;52234:24;;;;;52227:31;52269:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;51285:1008;;;51214:1079;:::o;48718:221::-;48803:14;48820:20;48837:2;48820:16;:20::i;:::-;-1:-1:-1;;;;;48851:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;48896:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;48718:221:0:o;39431:439::-;-1:-1:-1;;;;;39511:16:0;;39503:61;;;;-1:-1:-1;;;39503:61:0;;14849:2:1;39503:61:0;;;14831:21:1;;;14868:18;;;14861:30;14927:34;14907:18;;;14900:62;14979:18;;39503:61:0;14647:356:1;39503:61:0;37604:4;37628:16;;;:7;:16;;;;;;-1:-1:-1;;;;;37628:16:0;:30;39575:58;;;;-1:-1:-1;;;39575:58:0;;11779:2:1;39575:58:0;;;11761:21:1;11818:2;11798:18;;;11791:30;11857;11837:18;;;11830:58;11905:18;;39575:58:0;11577:352:1;39575:58:0;39646:45;39675:1;39679:2;39683:7;39646:20;:45::i;:::-;-1:-1:-1;;;;;39704:13:0;;;;;;:9;:13;;;;;:18;;39721:1;;39704:13;:18;;39721:1;;39704:18;:::i;:::-;;;;-1:-1:-1;;39733:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;39733:21:0;-1:-1:-1;;;;;39733:21:0;;;;;;;;39772:33;;39733:16;;;39772:33;;39733:16;;39772:33;57083:148;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:160::-;893:20;;949:13;;942:21;932:32;;922:60;;978:1;975;968:12;993:186;1052:6;1105:2;1093:9;1084:7;1080:23;1076:32;1073:52;;;1121:1;1118;1111:12;1073:52;1144:29;1163:9;1144:29;:::i;1184:260::-;1252:6;1260;1313:2;1301:9;1292:7;1288:23;1284:32;1281:52;;;1329:1;1326;1319:12;1281:52;1352:29;1371:9;1352:29;:::i;:::-;1342:39;;1400:38;1434:2;1423:9;1419:18;1400:38;:::i;:::-;1390:48;;1184:260;;;;;:::o;1449:328::-;1526:6;1534;1542;1595:2;1583:9;1574:7;1570:23;1566:32;1563:52;;;1611:1;1608;1601:12;1563:52;1634:29;1653:9;1634:29;:::i;:::-;1624:39;;1682:38;1716:2;1705:9;1701:18;1682:38;:::i;:::-;1672:48;;1767:2;1756:9;1752:18;1739:32;1729:42;;1449:328;;;;;:::o;1782:666::-;1877:6;1885;1893;1901;1954:3;1942:9;1933:7;1929:23;1925:33;1922:53;;;1971:1;1968;1961:12;1922:53;1994:29;2013:9;1994:29;:::i;:::-;1984:39;;2042:38;2076:2;2065:9;2061:18;2042:38;:::i;:::-;2032:48;;2127:2;2116:9;2112:18;2099:32;2089:42;;2182:2;2171:9;2167:18;2154:32;2209:18;2201:6;2198:30;2195:50;;;2241:1;2238;2231:12;2195:50;2264:22;;2317:4;2309:13;;2305:27;-1:-1:-1;2295:55:1;;2346:1;2343;2336:12;2295:55;2369:73;2434:7;2429:2;2416:16;2411:2;2407;2403:11;2369:73;:::i;:::-;2359:83;;;1782:666;;;;;;;:::o;2453:254::-;2518:6;2526;2579:2;2567:9;2558:7;2554:23;2550:32;2547:52;;;2595:1;2592;2585:12;2547:52;2618:29;2637:9;2618:29;:::i;:::-;2608:39;;2666:35;2697:2;2686:9;2682:18;2666:35;:::i;2712:254::-;2780:6;2788;2841:2;2829:9;2820:7;2816:23;2812:32;2809:52;;;2857:1;2854;2847:12;2809:52;2880:29;2899:9;2880:29;:::i;:::-;2870:39;2956:2;2941:18;;;;2928:32;;-1:-1:-1;;;2712:254:1:o;2971:366::-;3038:6;3046;3099:2;3087:9;3078:7;3074:23;3070:32;3067:52;;;3115:1;3112;3105:12;3067:52;3138:29;3157:9;3138:29;:::i;:::-;3128:39;;3217:2;3206:9;3202:18;3189:32;-1:-1:-1;;;;;3254:5:1;3250:38;3243:5;3240:49;3230:77;;3303:1;3300;3293:12;3230:77;3326:5;3316:15;;;2971:366;;;;;:::o;3342:615::-;3428:6;3436;3489:2;3477:9;3468:7;3464:23;3460:32;3457:52;;;3505:1;3502;3495:12;3457:52;3545:9;3532:23;3574:18;3615:2;3607:6;3604:14;3601:34;;;3631:1;3628;3621:12;3601:34;3669:6;3658:9;3654:22;3644:32;;3714:7;3707:4;3703:2;3699:13;3695:27;3685:55;;3736:1;3733;3726:12;3685:55;3776:2;3763:16;3802:2;3794:6;3791:14;3788:34;;;3818:1;3815;3808:12;3788:34;3871:7;3866:2;3856:6;3853:1;3849:14;3845:2;3841:23;3837:32;3834:45;3831:65;;;3892:1;3889;3882:12;3831:65;3923:2;3915:11;;;;;3945:6;;-1:-1:-1;3342:615:1;;-1:-1:-1;;;;3342:615:1:o;3962:180::-;4018:6;4071:2;4059:9;4050:7;4046:23;4042:32;4039:52;;;4087:1;4084;4077:12;4039:52;4110:26;4126:9;4110:26;:::i;4147:245::-;4205:6;4258:2;4246:9;4237:7;4233:23;4229:32;4226:52;;;4274:1;4271;4264:12;4226:52;4313:9;4300:23;4332:30;4356:5;4332:30;:::i;4397:249::-;4466:6;4519:2;4507:9;4498:7;4494:23;4490:32;4487:52;;;4535:1;4532;4525:12;4487:52;4567:9;4561:16;4586:30;4610:5;4586:30;:::i;4651:450::-;4720:6;4773:2;4761:9;4752:7;4748:23;4744:32;4741:52;;;4789:1;4786;4779:12;4741:52;4829:9;4816:23;4862:18;4854:6;4851:30;4848:50;;;4894:1;4891;4884:12;4848:50;4917:22;;4970:4;4962:13;;4958:27;-1:-1:-1;4948:55:1;;4999:1;4996;4989:12;4948:55;5022:73;5087:7;5082:2;5069:16;5064:2;5060;5056:11;5022:73;:::i;5106:180::-;5165:6;5218:2;5206:9;5197:7;5193:23;5189:32;5186:52;;;5234:1;5231;5224:12;5186:52;-1:-1:-1;5257:23:1;;5106:180;-1:-1:-1;5106:180:1:o;5291:248::-;5359:6;5367;5420:2;5408:9;5399:7;5395:23;5391:32;5388:52;;;5436:1;5433;5426:12;5388:52;-1:-1:-1;;5459:23:1;;;5529:2;5514:18;;;5501:32;;-1:-1:-1;5291:248:1:o;5544:257::-;5585:3;5623:5;5617:12;5650:6;5645:3;5638:19;5666:63;5722:6;5715:4;5710:3;5706:14;5699:4;5692:5;5688:16;5666:63;:::i;:::-;5783:2;5762:15;-1:-1:-1;;5758:29:1;5749:39;;;;5790:4;5745:50;;5544:257;-1:-1:-1;;5544:257:1:o;5806:1527::-;6030:3;6068:6;6062:13;6094:4;6107:51;6151:6;6146:3;6141:2;6133:6;6129:15;6107:51;:::i;:::-;6221:13;;6180:16;;;;6243:55;6221:13;6180:16;6265:15;;;6243:55;:::i;:::-;6387:13;;6320:20;;;6360:1;;6447;6469:18;;;;6522;;;;6549:93;;6627:4;6617:8;6613:19;6601:31;;6549:93;6690:2;6680:8;6677:16;6657:18;6654:40;6651:167;;;-1:-1:-1;;;6717:33:1;;6773:4;6770:1;6763:15;6803:4;6724:3;6791:17;6651:167;6834:18;6861:110;;;;6985:1;6980:328;;;;6827:481;;6861:110;-1:-1:-1;;6896:24:1;;6882:39;;6941:20;;;;-1:-1:-1;6861:110:1;;6980:328;19442:1;19435:14;;;19479:4;19466:18;;7075:1;7089:169;7103:8;7100:1;7097:15;7089:169;;;7185:14;;7170:13;;;7163:37;7228:16;;;;7120:10;;7089:169;;;7093:3;;7289:8;7282:5;7278:20;7271:27;;6827:481;-1:-1:-1;7324:3:1;;5806:1527;-1:-1:-1;;;;;;;;;;;5806:1527:1:o;7756:488::-;-1:-1:-1;;;;;8025:15:1;;;8007:34;;8077:15;;8072:2;8057:18;;8050:43;8124:2;8109:18;;8102:34;;;8172:3;8167:2;8152:18;;8145:31;;;7950:4;;8193:45;;8218:19;;8210:6;8193:45;:::i;:::-;8185:53;7756:488;-1:-1:-1;;;;;;7756:488:1:o;8528:632::-;8699:2;8751:21;;;8821:13;;8724:18;;;8843:22;;;8670:4;;8699:2;8922:15;;;;8896:2;8881:18;;;8670:4;8965:169;8979:6;8976:1;8973:13;8965:169;;;9040:13;;9028:26;;9109:15;;;;9074:12;;;;9001:1;8994:9;8965:169;;;-1:-1:-1;9151:3:1;;8528:632;-1:-1:-1;;;;;;8528:632:1:o;9357:219::-;9506:2;9495:9;9488:21;9469:4;9526:44;9566:2;9555:9;9551:18;9543:6;9526:44;:::i;10345:414::-;10547:2;10529:21;;;10586:2;10566:18;;;10559:30;10625:34;10620:2;10605:18;;10598:62;-1:-1:-1;;;10691:2:1;10676:18;;10669:48;10749:3;10734:19;;10345:414::o;18062:410::-;18264:2;18246:21;;;18303:2;18283:18;;;18276:30;18342:34;18337:2;18322:18;;18315:62;-1:-1:-1;;;18408:2:1;18393:18;;18386:44;18462:3;18447:19;;18062:410::o;19495:128::-;19535:3;19566:1;19562:6;19559:1;19556:13;19553:39;;;19572:18;;:::i;:::-;-1:-1:-1;19608:9:1;;19495:128::o;19628:120::-;19668:1;19694;19684:35;;19699:18;;:::i;:::-;-1:-1:-1;19733:9:1;;19628:120::o;19753:168::-;19793:7;19859:1;19855;19851:6;19847:14;19844:1;19841:21;19836:1;19829:9;19822:17;19818:45;19815:71;;;19866:18;;:::i;:::-;-1:-1:-1;19906:9:1;;19753:168::o;19926:125::-;19966:4;19994:1;19991;19988:8;19985:34;;;19999:18;;:::i;:::-;-1:-1:-1;20036:9:1;;19926:125::o;20056:258::-;20128:1;20138:113;20152:6;20149:1;20146:13;20138:113;;;20228:11;;;20222:18;20209:11;;;20202:39;20174:2;20167:10;20138:113;;;20269:6;20266:1;20263:13;20260:48;;;-1:-1:-1;;20304:1:1;20286:16;;20279:27;20056:258::o;20319:380::-;20398:1;20394:12;;;;20441;;;20462:61;;20516:4;20508:6;20504:17;20494:27;;20462:61;20569:2;20561:6;20558:14;20538:18;20535:38;20532:161;;;20615:10;20610:3;20606:20;20603:1;20596:31;20650:4;20647:1;20640:15;20678:4;20675:1;20668:15;20532:161;;20319:380;;;:::o;20704:135::-;20743:3;-1:-1:-1;;20764:17:1;;20761:43;;;20784:18;;:::i;:::-;-1:-1:-1;20831:1:1;20820:13;;20704:135::o;20844:112::-;20876:1;20902;20892:35;;20907:18;;:::i;:::-;-1:-1:-1;20941:9:1;;20844:112::o;20961:127::-;21022:10;21017:3;21013:20;21010:1;21003:31;21053:4;21050:1;21043:15;21077:4;21074:1;21067:15;21093:127;21154:10;21149:3;21145:20;21142:1;21135:31;21185:4;21182:1;21175:15;21209:4;21206:1;21199:15;21225:127;21286:10;21281:3;21277:20;21274:1;21267:31;21317:4;21314:1;21307:15;21341:4;21338:1;21331:15;21357:127;21418:10;21413:3;21409:20;21406:1;21399:31;21449:4;21446:1;21439:15;21473:4;21470:1;21463:15;21489:127;21550:10;21545:3;21541:20;21538:1;21531:31;21581:4;21578:1;21571:15;21605:4;21602:1;21595:15;21621:131;-1:-1:-1;;;;;;21695:32:1;;21685:43;;21675:71;;21742:1;21739;21732:12

Swarm Source

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