ETH Price: $2,988.60 (+4.45%)
Gas: 2 Gwei

Token

Fae NFT (FAE)
 

Overview

Max Total Supply

626 FAE

Holders

261

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
*超级赛亚人.🔮️🔮️🔮️🔮️🔮️🔮️🔮️.eth
Balance
1 FAE
0x7499003740393Bec0eCe8745e099C2eB3f59dc9d
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:
FaeNFT

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-06
*/

/*
  _   _ ______ _______ ______          __  __   ______ _    _ 
 | \ | |  ____|__   __|  ____|   /\   |  \/  | |  ____| |  | |
 |  \| | |__     | |  | |__     /  \  | \  / | | |__  | |  | |
 | . ` |  __|    | |  |  __|   / /\ \ | |\/| | |  __| | |  | |
 | |\  | |       | |  | |____ / ____ \| |  | |_| |____| |__| |
 |_| \_|_|       |_|  |______/_/    \_\_|  |_(_)______|\____/ 
 
*/


// File @openzeppelin/contracts/utils/introspection/[email protected]

// SPDX-License-Identifier: BSD-3-Clause

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]



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 contracts/Blimpie/ERC721B.sol


pragma solidity ^0.8.0;

/********************
* @author: Squeebo *
********************/

abstract contract ERC721B is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    address[] internal _owners;

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

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

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

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

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

        uint count = 0;
        uint length = _owners.length;
        for( uint i = 0; i < length; ++i ){
          if( owner == _owners[i] ){
            ++count;
          }
        }

        delete length;
        return count;
    }

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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


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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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


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

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

        _beforeTokenTransfer(address(0), to, tokenId);
        _owners.push(to);

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

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

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

        // Clear approvals
        _approve(address(0), tokenId);
        _owners[tokenId] = address(0);

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

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

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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


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

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

// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/access/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

pragma solidity ^0.8.7;

library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }
}

pragma solidity ^0.8.9;

contract FaeNFT is  Ownable, ERC721B {

    using ECDSA for bytes32;
    using Strings for uint256;

    uint256 public constant COLLECTIBLE_MAX = 5556;
    uint256 public constant COLLECTIBLE_GIFT = 100;
    uint256 public constant COLLECTIBLE_PRICE = 0.1 ether;
    uint256 public constant COLLECTIBLE_PRESALE_PRICE = 0.06 ether;
    uint256 public constant COLLECTIBLE_PER_MINT = 10;
    uint256 public constant COLLECTIBLE_PRESALE_PURCHASE_LIMIT = 5;
    uint256 public giftedAmount;

    string public provenance;
    string private _tokenBaseURI;

    address private signerAddress = 0xDD01b77662E97AD121E3D1676fE618a2fe28A6E1;

    bool public presaleLive;
    bool public saleLive;

    mapping(address => uint256) public presalerListPurchases;
    mapping(address => uint256) public purchases;

    mapping(address => bool) public freeList;
    mapping(address => uint256) public freePurchases;
    
    constructor(
        string memory baseUri
    ) ERC721B("Fae NFT", "FAE") { 
        _tokenBaseURI = baseUri;
        _mint( msg.sender, 0 );
    }

    function addToFreeList(address[] calldata entries) external onlyOwner {
        for(uint256 i = 0; i < entries.length; i++) {
            address entry = entries[i];
            require(entry != address(0), "NULL_ADDRESS");
            require(!freeList[entry], "DUPLICATED_ENTRY");
            freeList[entry] = true;
        }   
    }

    function removeFromFreeList(address[] calldata entries) external onlyOwner {
        for(uint256 i = 0; i < entries.length; i++) {
            address entry = entries[i];
            require(entry != address(0), "NULL_ADDRESS");
            freeList[entry] = false;
        }
    }

    function freeMint() external {
        require(freeList[msg.sender], "NOT_QUALIFIED");
        require(freePurchases[msg.sender] < 2, "MAX_REACHED");
        require(totalSupply() <= COLLECTIBLE_MAX, "EXCEED_MAX_SALE_SUPPLY");

        freePurchases[msg.sender]++;

        uint mintIndex = totalSupply();
        _mint( msg.sender, mintIndex );
    }

    function totalSupply() public view virtual returns (uint256) {
        return _owners.length;
    }

    function buy(bytes32 hash, bytes memory signature, uint256 tokenQuantity) external payable {
        require(saleLive, "SALE_CLOSED");
        require(!presaleLive, "ONLY_PRESALE");
        require(tokenQuantity <= COLLECTIBLE_PER_MINT, "EXCEED_COLLECTIBLE_PER_MINT");
        require(COLLECTIBLE_PRICE * tokenQuantity <= msg.value, "INSUFFICIENT_ETH");
        require(totalSupply() + tokenQuantity <= COLLECTIBLE_MAX, "EXCEED_MAX_SALE_SUPPLY");
        require(matchAddressSigner(hash, signature), "NO_DIRECT_MINT");

        for(uint256 i = 0; i < tokenQuantity; i++) {
            uint mintIndex = totalSupply();
           _mint( msg.sender, mintIndex );
        }
    } 

    function presaleBuy(bytes32 hash, bytes memory signature, uint256 tokenQuantity) external payable {
        require(!saleLive && presaleLive, "PRESALE_CLOSED");
        require(presalerListPurchases[msg.sender] + tokenQuantity <= COLLECTIBLE_PRESALE_PURCHASE_LIMIT, "EXCEED_ALLOC");
        require(tokenQuantity <= COLLECTIBLE_PER_MINT, "EXCEED_COLLECTIBLE_PER_MINT");
        require(COLLECTIBLE_PRESALE_PRICE * tokenQuantity <= msg.value, "INSUFFICIENT_ETH");
        require(totalSupply() + tokenQuantity <= COLLECTIBLE_MAX, "EXCEED_MAX_SALE_SUPPLY");
        require(matchAddressSigner(hash, signature), "NO_DIRECT_MINT");

        presalerListPurchases[msg.sender] += tokenQuantity;

        for (uint256 i = 0; i < tokenQuantity; i++) {
            uint mintIndex = totalSupply();
            _mint( msg.sender, mintIndex );
        }
    } 

    function withdraw() external onlyOwner {
        _withdraw(msg.sender, address(this).balance);
    }

    function _withdraw(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "Transfer failed.");
    }

    function gift(address _to, uint256 _reserveAmount) external onlyOwner {
        require(totalSupply() + _reserveAmount <= COLLECTIBLE_MAX, "MAX_MINT");
        require(giftedAmount + _reserveAmount <= COLLECTIBLE_GIFT, "NO_GIFTS");
        
        for (uint256 i = 0; i < _reserveAmount; i++) {
            uint mintIndex = totalSupply();
            giftedAmount++;
            _safeMint(_to, mintIndex );
        }
    }

    function togglePresaleStatus() external onlyOwner {
        presaleLive = !presaleLive;
    } 

    function toggleSaleStatus() external onlyOwner {
        saleLive = !saleLive;
    }

    function setBaseURI(string calldata URI) external onlyOwner {
        _tokenBaseURI = URI;
    }
    
    function setProvenanceHash(string calldata hash) external onlyOwner {
        provenance = hash;
    } 

    function tokenURI(uint256 tokenId) external view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return string(abi.encodePacked(_tokenBaseURI, tokenId.toString()));
    } 

    function presalePurchasedCount(address addr) external view returns (uint256) {
        return presalerListPurchases[addr];
    } 

    function matchAddressSigner(bytes32 hash, bytes memory signature) private view returns(bool) {
        return signerAddress == hash.recover(signature);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"COLLECTIBLE_GIFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COLLECTIBLE_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COLLECTIBLE_PER_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COLLECTIBLE_PRESALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COLLECTIBLE_PRESALE_PURCHASE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COLLECTIBLE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"addToFreeList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freePurchases","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":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"giftedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"presaleBuy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"presalePurchasedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presalerListPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"purchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"removeFromFreeList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"hash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePresaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600980546001600160a01b03191673dd01b77662e97ad121e3d1676fe618a2fe28a6e11790553480156200003757600080fd5b506040516200307b3803806200307b8339810160408190526200005a9162000399565b604051806040016040528060078152602001661198594813919560ca1b8152506040518060400160405280600381526020016246414560e81b815250620000b0620000aa6200010860201b60201c565b6200010c565b8151620000c5906001906020850190620002dd565b508051620000db906002906020840190620002dd565b50508151620000f391506008906020840190620002dd565b50620001013360006200015c565b50620004c8565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216620001b85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064015b60405180910390fd5b620001c3816200028e565b15620002125760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401620001af565b6003805460018101825560009182527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60035460009082108015620002d7575060006001600160a01b031660038381548110620002bf57620002bf62000475565b6000918252602090912001546001600160a01b031614155b92915050565b828054620002eb906200048b565b90600052602060002090601f0160209004810192826200030f57600085556200035a565b82601f106200032a57805160ff19168380011785556200035a565b828001600101855582156200035a579182015b828111156200035a5782518255916020019190600101906200033d565b50620003689291506200036c565b5090565b5b808211156200036857600081556001016200036d565b634e487b7160e01b600052604160045260246000fd5b60006020808385031215620003ad57600080fd5b82516001600160401b0380821115620003c557600080fd5b818501915085601f830112620003da57600080fd5b815181811115620003ef57620003ef62000383565b604051601f8201601f19908116603f011681019083821181831017156200041a576200041a62000383565b8160405282815288868487010111156200043357600080fd5b600093505b8284101562000457578484018601518185018701529285019262000438565b82841115620004695760008684830101525b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680620004a057607f821691505b60208210811415620004c257634e487b7160e01b600052602260045260246000fd5b50919050565b612ba380620004d86000396000f3fe60806040526004361061025c5760003560e01c806370a0823111610144578063b4f149a4116100b6578063df03bd381161007a578063df03bd38146106e7578063e081b781146106fa578063e985e9c51461071b578063f16c3c6514610764578063f2fde38b14610779578063fdffbc711461079957600080fd5b8063b4f149a41461065f578063b88d4fde14610672578063c87b56dd14610692578063cbce4c97146106b2578063d3c3baab146106d257600080fd5b806383a9e0491161010857806383a9e04914610591578063842a77d3146105b25780638da5cb5b146105df57806395d89b41146105fd5780639bf8031614610612578063a22cb4651461063f57600080fd5b806370a082311461050b578063715018a61461052b57806374b77cf714610540578063770bba6a146105605780637bffb4ce1461057c57600080fd5b80631b57190e116101dd57806342842e0e116101a157806342842e0e1461044057806344f5b5cb1461046057806355f804b3146104805780635b70ea9f146104a05780635ce7af1f146104b55780636352211e146104eb57600080fd5b80631b57190e146103aa57806323b872dd146103c057806327db591e146103e05780632979b209146104105780633ccfd60b1461042b57600080fd5b8063095ea7b311610224578063095ea7b31461032a5780630a3acb3c1461034a5780630f7309e814610360578063109695231461037557806318160ddd1461039557600080fd5b806301ffc9a714610261578063049c5c491461029657806306fdde03146102ad578063081812fc146102cf57806308344b0314610307575b600080fd5b34801561026d57600080fd5b5061028161027c366004612440565b6107c6565b60405190151581526020015b60405180910390f35b3480156102a257600080fd5b506102ab610818565b005b3480156102b957600080fd5b506102c261086c565b60405161028d91906124bc565b3480156102db57600080fd5b506102ef6102ea3660046124cf565b6108fe565b6040516001600160a01b03909116815260200161028d565b34801561031357600080fd5b5061031c600581565b60405190815260200161028d565b34801561033657600080fd5b506102ab610345366004612504565b610986565b34801561035657600080fd5b5061031c6115b481565b34801561036c57600080fd5b506102c2610a9c565b34801561038157600080fd5b506102ab61039036600461252e565b610b2a565b3480156103a157600080fd5b5060035461031c565b3480156103b657600080fd5b5061031c60065481565b3480156103cc57600080fd5b506102ab6103db3660046125a0565b610b60565b3480156103ec57600080fd5b506102816103fb3660046125dc565b600c6020526000908152604090205460ff1681565b34801561041c57600080fd5b5061031c66d529ae9e86000081565b34801561043757600080fd5b506102ab610b91565b34801561044c57600080fd5b506102ab61045b3660046125a0565b610bc7565b34801561046c57600080fd5b506102ab61047b3660046125f7565b610be2565b34801561048c57600080fd5b506102ab61049b36600461252e565b610d17565b3480156104ac57600080fd5b506102ab610d4d565b3480156104c157600080fd5b5061031c6104d03660046125dc565b6001600160a01b03166000908152600a602052604090205490565b3480156104f757600080fd5b506102ef6105063660046124cf565b610e4d565b34801561051757600080fd5b5061031c6105263660046125dc565b610ed9565b34801561053757600080fd5b506102ab610fab565b34801561054c57600080fd5b506102ab61055b3660046125f7565b610fdf565b34801561056c57600080fd5b5061031c67016345785d8a000081565b34801561058857600080fd5b506102ab6110b5565b34801561059d57600080fd5b5060095461028190600160a01b900460ff1681565b3480156105be57600080fd5b5061031c6105cd3660046125dc565b600b6020526000908152604090205481565b3480156105eb57600080fd5b506000546001600160a01b03166102ef565b34801561060957600080fd5b506102c2611100565b34801561061e57600080fd5b5061031c61062d3660046125dc565b600a6020526000908152604090205481565b34801561064b57600080fd5b506102ab61065a36600461265a565b61110f565b6102ab61066d366004612739565b6111d4565b34801561067e57600080fd5b506102ab61068d366004612789565b61140f565b34801561069e57600080fd5b506102c26106ad3660046124cf565b611441565b3480156106be57600080fd5b506102ab6106cd366004612504565b6114e2565b3480156106de57600080fd5b5061031c606481565b6102ab6106f5366004612739565b6115ef565b34801561070657600080fd5b5060095461028190600160a81b900460ff1681565b34801561072757600080fd5b506102816107363660046127f1565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561077057600080fd5b5061031c600a81565b34801561078557600080fd5b506102ab6107943660046125dc565b6117d5565b3480156107a557600080fd5b5061031c6107b43660046125dc565b600d6020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b14806107f757506001600160e01b03198216635b5e139f60e01b145b8061081257506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b0316331461084b5760405162461bcd60e51b815260040161084290612824565b60405180910390fd5b6009805460ff60a81b198116600160a81b9182900460ff1615909102179055565b60606001805461087b90612859565b80601f01602080910402602001604051908101604052809291908181526020018280546108a790612859565b80156108f45780601f106108c9576101008083540402835291602001916108f4565b820191906000526020600020905b8154815290600101906020018083116108d757829003601f168201915b5050505050905090565b60006109098261186d565b61096a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610842565b506000908152600460205260409020546001600160a01b031690565b600061099182610e4d565b9050806001600160a01b0316836001600160a01b031614156109ff5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610842565b336001600160a01b0382161480610a1b5750610a1b8133610736565b610a8d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610842565b610a9783836118b7565b505050565b60078054610aa990612859565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad590612859565b8015610b225780601f10610af757610100808354040283529160200191610b22565b820191906000526020600020905b815481529060010190602001808311610b0557829003601f168201915b505050505081565b6000546001600160a01b03163314610b545760405162461bcd60e51b815260040161084290612824565b610a9760078383612391565b610b6a3382611925565b610b865760405162461bcd60e51b815260040161084290612894565b610a97838383611a0f565b6000546001600160a01b03163314610bbb5760405162461bcd60e51b815260040161084290612824565b610bc53347611b65565b565b610a978383836040518060200160405280600081525061140f565b6000546001600160a01b03163314610c0c5760405162461bcd60e51b815260040161084290612824565b60005b81811015610a97576000838383818110610c2b57610c2b6128e5565b9050602002016020810190610c4091906125dc565b90506001600160a01b038116610c875760405162461bcd60e51b815260206004820152600c60248201526b4e554c4c5f4144445245535360a01b6044820152606401610842565b6001600160a01b0381166000908152600c602052604090205460ff1615610ce35760405162461bcd60e51b815260206004820152601060248201526f4455504c4943415445445f454e54525960801b6044820152606401610842565b6001600160a01b03166000908152600c60205260409020805460ff1916600117905580610d0f81612911565b915050610c0f565b6000546001600160a01b03163314610d415760405162461bcd60e51b815260040161084290612824565b610a9760088383612391565b336000908152600c602052604090205460ff16610d9c5760405162461bcd60e51b815260206004820152600d60248201526c1393d517d45550531251925151609a1b6044820152606401610842565b336000908152600d6020526040902054600211610de95760405162461bcd60e51b815260206004820152600b60248201526a13505617d4915050d2115160aa1b6044820152606401610842565b6115b4610df560035490565b1115610e135760405162461bcd60e51b81526004016108429061292c565b336000908152600d60205260408120805491610e2e83612911565b91905055506000610e3e60035490565b9050610e4a3382611bfb565b50565b60008060038381548110610e6357610e636128e5565b6000918252602090912001546001600160a01b03169050806108125760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610842565b60006001600160a01b038216610f445760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610842565b600354600090815b81811015610fa25760038181548110610f6757610f676128e5565b6000918252602090912001546001600160a01b0386811691161415610f9257610f8f83612911565b92505b610f9b81612911565b9050610f4c565b50909392505050565b6000546001600160a01b03163314610fd55760405162461bcd60e51b815260040161084290612824565b610bc56000611d23565b6000546001600160a01b031633146110095760405162461bcd60e51b815260040161084290612824565b60005b81811015610a97576000838383818110611028576110286128e5565b905060200201602081019061103d91906125dc565b90506001600160a01b0381166110845760405162461bcd60e51b815260206004820152600c60248201526b4e554c4c5f4144445245535360a01b6044820152606401610842565b6001600160a01b03166000908152600c60205260409020805460ff19169055806110ad81612911565b91505061100c565b6000546001600160a01b031633146110df5760405162461bcd60e51b815260040161084290612824565b6009805460ff60a01b198116600160a01b9182900460ff1615909102179055565b60606002805461087b90612859565b6001600160a01b0382163314156111685760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610842565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600954600160a81b900460ff161580156111f75750600954600160a01b900460ff165b6112345760405162461bcd60e51b815260206004820152600e60248201526d14149154d0531157d0d313d4d15160921b6044820152606401610842565b336000908152600a602052604090205460059061125290839061295c565b111561128f5760405162461bcd60e51b815260206004820152600c60248201526b4558434545445f414c4c4f4360a01b6044820152606401610842565b600a8111156112e05760405162461bcd60e51b815260206004820152601b60248201527f4558434545445f434f4c4c45435449424c455f5045525f4d494e5400000000006044820152606401610842565b346112f28266d529ae9e860000612974565b11156113335760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b6044820152606401610842565b6115b48161134060035490565b61134a919061295c565b11156113685760405162461bcd60e51b81526004016108429061292c565b6113728383611d73565b6113af5760405162461bcd60e51b815260206004820152600e60248201526d1393d7d112549150d517d352539560921b6044820152606401610842565b336000908152600a6020526040812080548392906113ce90849061295c565b90915550600090505b818110156114095760006113ea60035490565b90506113f63382611bfb565b508061140181612911565b9150506113d7565b50505050565b6114193383611925565b6114355760405162461bcd60e51b815260040161084290612894565b61140984848484611d97565b606061144c8261186d565b6114b05760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610842565b60086114bb83611dca565b6040516020016114cc9291906129af565b6040516020818303038152906040529050919050565b6000546001600160a01b0316331461150c5760405162461bcd60e51b815260040161084290612824565b6115b48161151960035490565b611523919061295c565b111561155c5760405162461bcd60e51b815260206004820152600860248201526713505617d352539560c21b6044820152606401610842565b60648160065461156c919061295c565b11156115a55760405162461bcd60e51b81526020600482015260086024820152674e4f5f474946545360c01b6044820152606401610842565b60005b81811015610a975760006115bb60035490565b6006805491925060006115cd83612911565b91905055506115dc8482611ec8565b50806115e781612911565b9150506115a8565b600954600160a81b900460ff166116365760405162461bcd60e51b815260206004820152600b60248201526a14d0531157d0d313d4d15160aa1b6044820152606401610842565b600954600160a01b900460ff161561167f5760405162461bcd60e51b815260206004820152600c60248201526b4f4e4c595f50524553414c4560a01b6044820152606401610842565b600a8111156116d05760405162461bcd60e51b815260206004820152601b60248201527f4558434545445f434f4c4c45435449424c455f5045525f4d494e5400000000006044820152606401610842565b346116e38267016345785d8a0000612974565b11156117245760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b6044820152606401610842565b6115b48161173160035490565b61173b919061295c565b11156117595760405162461bcd60e51b81526004016108429061292c565b6117638383611d73565b6117a05760405162461bcd60e51b815260206004820152600e60248201526d1393d7d112549150d517d352539560921b6044820152606401610842565b60005b818110156114095760006117b660035490565b90506117c23382611bfb565b50806117cd81612911565b9150506117a3565b6000546001600160a01b031633146117ff5760405162461bcd60e51b815260040161084290612824565b6001600160a01b0381166118645760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610842565b610e4a81611d23565b60035460009082108015610812575060006001600160a01b03166003838154811061189a5761189a6128e5565b6000918252602090912001546001600160a01b0316141592915050565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118ec82610e4d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006119308261186d565b6119915760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610842565b600061199c83610e4d565b9050806001600160a01b0316846001600160a01b031614806119d75750836001600160a01b03166119cc846108fe565b6001600160a01b0316145b80611a0757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611a2282610e4d565b6001600160a01b031614611a8a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610842565b6001600160a01b038216611aec5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610842565b611af76000826118b7565b8160038281548110611b0b57611b0b6128e5565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611bb2576040519150601f19603f3d011682016040523d82523d6000602084013e611bb7565b606091505b5050905080610a975760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610842565b6001600160a01b038216611c515760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610842565b611c5a8161186d565b15611ca75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610842565b6003805460018101825560009182527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000611d7f8383611ee6565b6009546001600160a01b039182169116149392505050565b611da2848484611a0f565b611dae84848484611f0a565b6114095760405162461bcd60e51b815260040161084290612a56565b606081611dee5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e185780611e0281612911565b9150611e119050600a83612abe565b9150611df2565b60008167ffffffffffffffff811115611e3357611e33612696565b6040519080825280601f01601f191660200182016040528015611e5d576020820181803683370190505b5090505b8415611a0757611e72600183612ad2565b9150611e7f600a86612ae9565b611e8a90603061295c565b60f81b818381518110611e9f57611e9f6128e5565b60200101906001600160f81b031916908160001a905350611ec1600a86612abe565b9450611e61565b611ee2828260405180602001604052806000815250612017565b5050565b6000806000611ef5858561204a565b91509150611f02816120ba565b509392505050565b60006001600160a01b0384163b1561200c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611f4e903390899088908890600401612afd565b602060405180830381600087803b158015611f6857600080fd5b505af1925050508015611f98575060408051601f3d908101601f19168201909252611f9591810190612b3a565b60015b611ff2573d808015611fc6576040519150601f19603f3d011682016040523d82523d6000602084013e611fcb565b606091505b508051611fea5760405162461bcd60e51b815260040161084290612a56565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a07565b506001949350505050565b6120218383611bfb565b61202e6000848484611f0a565b610a975760405162461bcd60e51b815260040161084290612a56565b6000808251604114156120815760208301516040840151606085015160001a61207587828585612275565b945094505050506120b3565b8251604014156120ab57602083015160408401516120a0868383612362565b9350935050506120b3565b506000905060025b9250929050565b60008160048111156120ce576120ce612b57565b14156120d75750565b60018160048111156120eb576120eb612b57565b14156121395760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610842565b600281600481111561214d5761214d612b57565b141561219b5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610842565b60038160048111156121af576121af612b57565b14156122085760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610842565b600481600481111561221c5761221c612b57565b1415610e4a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610842565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156122ac5750600090506003612359565b8460ff16601b141580156122c457508460ff16601c14155b156122d55750600090506004612359565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612329573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661235257600060019250925050612359565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161238387828885612275565b935093505050935093915050565b82805461239d90612859565b90600052602060002090601f0160209004810192826123bf5760008555612405565b82601f106123d85782800160ff19823516178555612405565b82800160010185558215612405579182015b828111156124055782358255916020019190600101906123ea565b50612411929150612415565b5090565b5b808211156124115760008155600101612416565b6001600160e01b031981168114610e4a57600080fd5b60006020828403121561245257600080fd5b813561245d8161242a565b9392505050565b60005b8381101561247f578181015183820152602001612467565b838111156114095750506000910152565b600081518084526124a8816020860160208601612464565b601f01601f19169290920160200192915050565b60208152600061245d6020830184612490565b6000602082840312156124e157600080fd5b5035919050565b80356001600160a01b03811681146124ff57600080fd5b919050565b6000806040838503121561251757600080fd5b612520836124e8565b946020939093013593505050565b6000806020838503121561254157600080fd5b823567ffffffffffffffff8082111561255957600080fd5b818501915085601f83011261256d57600080fd5b81358181111561257c57600080fd5b86602082850101111561258e57600080fd5b60209290920196919550909350505050565b6000806000606084860312156125b557600080fd5b6125be846124e8565b92506125cc602085016124e8565b9150604084013590509250925092565b6000602082840312156125ee57600080fd5b61245d826124e8565b6000806020838503121561260a57600080fd5b823567ffffffffffffffff8082111561262257600080fd5b818501915085601f83011261263657600080fd5b81358181111561264557600080fd5b8660208260051b850101111561258e57600080fd5b6000806040838503121561266d57600080fd5b612676836124e8565b91506020830135801515811461268b57600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126126bd57600080fd5b813567ffffffffffffffff808211156126d8576126d8612696565b604051601f8301601f19908116603f0116810190828211818310171561270057612700612696565b8160405283815286602085880101111561271957600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561274e57600080fd5b83359250602084013567ffffffffffffffff81111561276c57600080fd5b612778868287016126ac565b925050604084013590509250925092565b6000806000806080858703121561279f57600080fd5b6127a8856124e8565b93506127b6602086016124e8565b925060408501359150606085013567ffffffffffffffff8111156127d957600080fd5b6127e5878288016126ac565b91505092959194509250565b6000806040838503121561280457600080fd5b61280d836124e8565b915061281b602084016124e8565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061286d57607f821691505b6020821081141561288e57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612925576129256128fb565b5060010190565b6020808252601690820152754558434545445f4d41585f53414c455f535550504c5960501b604082015260600190565b6000821982111561296f5761296f6128fb565b500190565b600081600019048311821515161561298e5761298e6128fb565b500290565b600081516129a5818560208601612464565b9290920192915050565b600080845481600182811c9150808316806129cb57607f831692505b60208084108214156129eb57634e487b7160e01b86526022600452602486fd5b8180156129ff5760018114612a1057612a3d565b60ff19861689528489019650612a3d565b60008b81526020902060005b86811015612a355781548b820152908501908301612a1c565b505084890196505b505050505050612a4d8185612993565b95945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612acd57612acd612aa8565b500490565b600082821015612ae457612ae46128fb565b500390565b600082612af857612af8612aa8565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b3090830184612490565b9695505050505050565b600060208284031215612b4c57600080fd5b815161245d8161242a565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220fed00dea3a5d6f50f47cfab7cf1f52e513ae31951f37e2cb4917f8bc9e2623eb64736f6c634300080900330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003268747470733a2f2f657468657265616c2d636f6c6c6563746976652e6865726f6b756170702e636f6d2f6170692f6661652f0000000000000000000000000000

Deployed Bytecode

0x60806040526004361061025c5760003560e01c806370a0823111610144578063b4f149a4116100b6578063df03bd381161007a578063df03bd38146106e7578063e081b781146106fa578063e985e9c51461071b578063f16c3c6514610764578063f2fde38b14610779578063fdffbc711461079957600080fd5b8063b4f149a41461065f578063b88d4fde14610672578063c87b56dd14610692578063cbce4c97146106b2578063d3c3baab146106d257600080fd5b806383a9e0491161010857806383a9e04914610591578063842a77d3146105b25780638da5cb5b146105df57806395d89b41146105fd5780639bf8031614610612578063a22cb4651461063f57600080fd5b806370a082311461050b578063715018a61461052b57806374b77cf714610540578063770bba6a146105605780637bffb4ce1461057c57600080fd5b80631b57190e116101dd57806342842e0e116101a157806342842e0e1461044057806344f5b5cb1461046057806355f804b3146104805780635b70ea9f146104a05780635ce7af1f146104b55780636352211e146104eb57600080fd5b80631b57190e146103aa57806323b872dd146103c057806327db591e146103e05780632979b209146104105780633ccfd60b1461042b57600080fd5b8063095ea7b311610224578063095ea7b31461032a5780630a3acb3c1461034a5780630f7309e814610360578063109695231461037557806318160ddd1461039557600080fd5b806301ffc9a714610261578063049c5c491461029657806306fdde03146102ad578063081812fc146102cf57806308344b0314610307575b600080fd5b34801561026d57600080fd5b5061028161027c366004612440565b6107c6565b60405190151581526020015b60405180910390f35b3480156102a257600080fd5b506102ab610818565b005b3480156102b957600080fd5b506102c261086c565b60405161028d91906124bc565b3480156102db57600080fd5b506102ef6102ea3660046124cf565b6108fe565b6040516001600160a01b03909116815260200161028d565b34801561031357600080fd5b5061031c600581565b60405190815260200161028d565b34801561033657600080fd5b506102ab610345366004612504565b610986565b34801561035657600080fd5b5061031c6115b481565b34801561036c57600080fd5b506102c2610a9c565b34801561038157600080fd5b506102ab61039036600461252e565b610b2a565b3480156103a157600080fd5b5060035461031c565b3480156103b657600080fd5b5061031c60065481565b3480156103cc57600080fd5b506102ab6103db3660046125a0565b610b60565b3480156103ec57600080fd5b506102816103fb3660046125dc565b600c6020526000908152604090205460ff1681565b34801561041c57600080fd5b5061031c66d529ae9e86000081565b34801561043757600080fd5b506102ab610b91565b34801561044c57600080fd5b506102ab61045b3660046125a0565b610bc7565b34801561046c57600080fd5b506102ab61047b3660046125f7565b610be2565b34801561048c57600080fd5b506102ab61049b36600461252e565b610d17565b3480156104ac57600080fd5b506102ab610d4d565b3480156104c157600080fd5b5061031c6104d03660046125dc565b6001600160a01b03166000908152600a602052604090205490565b3480156104f757600080fd5b506102ef6105063660046124cf565b610e4d565b34801561051757600080fd5b5061031c6105263660046125dc565b610ed9565b34801561053757600080fd5b506102ab610fab565b34801561054c57600080fd5b506102ab61055b3660046125f7565b610fdf565b34801561056c57600080fd5b5061031c67016345785d8a000081565b34801561058857600080fd5b506102ab6110b5565b34801561059d57600080fd5b5060095461028190600160a01b900460ff1681565b3480156105be57600080fd5b5061031c6105cd3660046125dc565b600b6020526000908152604090205481565b3480156105eb57600080fd5b506000546001600160a01b03166102ef565b34801561060957600080fd5b506102c2611100565b34801561061e57600080fd5b5061031c61062d3660046125dc565b600a6020526000908152604090205481565b34801561064b57600080fd5b506102ab61065a36600461265a565b61110f565b6102ab61066d366004612739565b6111d4565b34801561067e57600080fd5b506102ab61068d366004612789565b61140f565b34801561069e57600080fd5b506102c26106ad3660046124cf565b611441565b3480156106be57600080fd5b506102ab6106cd366004612504565b6114e2565b3480156106de57600080fd5b5061031c606481565b6102ab6106f5366004612739565b6115ef565b34801561070657600080fd5b5060095461028190600160a81b900460ff1681565b34801561072757600080fd5b506102816107363660046127f1565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561077057600080fd5b5061031c600a81565b34801561078557600080fd5b506102ab6107943660046125dc565b6117d5565b3480156107a557600080fd5b5061031c6107b43660046125dc565b600d6020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b14806107f757506001600160e01b03198216635b5e139f60e01b145b8061081257506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b0316331461084b5760405162461bcd60e51b815260040161084290612824565b60405180910390fd5b6009805460ff60a81b198116600160a81b9182900460ff1615909102179055565b60606001805461087b90612859565b80601f01602080910402602001604051908101604052809291908181526020018280546108a790612859565b80156108f45780601f106108c9576101008083540402835291602001916108f4565b820191906000526020600020905b8154815290600101906020018083116108d757829003601f168201915b5050505050905090565b60006109098261186d565b61096a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610842565b506000908152600460205260409020546001600160a01b031690565b600061099182610e4d565b9050806001600160a01b0316836001600160a01b031614156109ff5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610842565b336001600160a01b0382161480610a1b5750610a1b8133610736565b610a8d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610842565b610a9783836118b7565b505050565b60078054610aa990612859565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad590612859565b8015610b225780601f10610af757610100808354040283529160200191610b22565b820191906000526020600020905b815481529060010190602001808311610b0557829003601f168201915b505050505081565b6000546001600160a01b03163314610b545760405162461bcd60e51b815260040161084290612824565b610a9760078383612391565b610b6a3382611925565b610b865760405162461bcd60e51b815260040161084290612894565b610a97838383611a0f565b6000546001600160a01b03163314610bbb5760405162461bcd60e51b815260040161084290612824565b610bc53347611b65565b565b610a978383836040518060200160405280600081525061140f565b6000546001600160a01b03163314610c0c5760405162461bcd60e51b815260040161084290612824565b60005b81811015610a97576000838383818110610c2b57610c2b6128e5565b9050602002016020810190610c4091906125dc565b90506001600160a01b038116610c875760405162461bcd60e51b815260206004820152600c60248201526b4e554c4c5f4144445245535360a01b6044820152606401610842565b6001600160a01b0381166000908152600c602052604090205460ff1615610ce35760405162461bcd60e51b815260206004820152601060248201526f4455504c4943415445445f454e54525960801b6044820152606401610842565b6001600160a01b03166000908152600c60205260409020805460ff1916600117905580610d0f81612911565b915050610c0f565b6000546001600160a01b03163314610d415760405162461bcd60e51b815260040161084290612824565b610a9760088383612391565b336000908152600c602052604090205460ff16610d9c5760405162461bcd60e51b815260206004820152600d60248201526c1393d517d45550531251925151609a1b6044820152606401610842565b336000908152600d6020526040902054600211610de95760405162461bcd60e51b815260206004820152600b60248201526a13505617d4915050d2115160aa1b6044820152606401610842565b6115b4610df560035490565b1115610e135760405162461bcd60e51b81526004016108429061292c565b336000908152600d60205260408120805491610e2e83612911565b91905055506000610e3e60035490565b9050610e4a3382611bfb565b50565b60008060038381548110610e6357610e636128e5565b6000918252602090912001546001600160a01b03169050806108125760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610842565b60006001600160a01b038216610f445760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610842565b600354600090815b81811015610fa25760038181548110610f6757610f676128e5565b6000918252602090912001546001600160a01b0386811691161415610f9257610f8f83612911565b92505b610f9b81612911565b9050610f4c565b50909392505050565b6000546001600160a01b03163314610fd55760405162461bcd60e51b815260040161084290612824565b610bc56000611d23565b6000546001600160a01b031633146110095760405162461bcd60e51b815260040161084290612824565b60005b81811015610a97576000838383818110611028576110286128e5565b905060200201602081019061103d91906125dc565b90506001600160a01b0381166110845760405162461bcd60e51b815260206004820152600c60248201526b4e554c4c5f4144445245535360a01b6044820152606401610842565b6001600160a01b03166000908152600c60205260409020805460ff19169055806110ad81612911565b91505061100c565b6000546001600160a01b031633146110df5760405162461bcd60e51b815260040161084290612824565b6009805460ff60a01b198116600160a01b9182900460ff1615909102179055565b60606002805461087b90612859565b6001600160a01b0382163314156111685760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610842565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600954600160a81b900460ff161580156111f75750600954600160a01b900460ff165b6112345760405162461bcd60e51b815260206004820152600e60248201526d14149154d0531157d0d313d4d15160921b6044820152606401610842565b336000908152600a602052604090205460059061125290839061295c565b111561128f5760405162461bcd60e51b815260206004820152600c60248201526b4558434545445f414c4c4f4360a01b6044820152606401610842565b600a8111156112e05760405162461bcd60e51b815260206004820152601b60248201527f4558434545445f434f4c4c45435449424c455f5045525f4d494e5400000000006044820152606401610842565b346112f28266d529ae9e860000612974565b11156113335760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b6044820152606401610842565b6115b48161134060035490565b61134a919061295c565b11156113685760405162461bcd60e51b81526004016108429061292c565b6113728383611d73565b6113af5760405162461bcd60e51b815260206004820152600e60248201526d1393d7d112549150d517d352539560921b6044820152606401610842565b336000908152600a6020526040812080548392906113ce90849061295c565b90915550600090505b818110156114095760006113ea60035490565b90506113f63382611bfb565b508061140181612911565b9150506113d7565b50505050565b6114193383611925565b6114355760405162461bcd60e51b815260040161084290612894565b61140984848484611d97565b606061144c8261186d565b6114b05760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610842565b60086114bb83611dca565b6040516020016114cc9291906129af565b6040516020818303038152906040529050919050565b6000546001600160a01b0316331461150c5760405162461bcd60e51b815260040161084290612824565b6115b48161151960035490565b611523919061295c565b111561155c5760405162461bcd60e51b815260206004820152600860248201526713505617d352539560c21b6044820152606401610842565b60648160065461156c919061295c565b11156115a55760405162461bcd60e51b81526020600482015260086024820152674e4f5f474946545360c01b6044820152606401610842565b60005b81811015610a975760006115bb60035490565b6006805491925060006115cd83612911565b91905055506115dc8482611ec8565b50806115e781612911565b9150506115a8565b600954600160a81b900460ff166116365760405162461bcd60e51b815260206004820152600b60248201526a14d0531157d0d313d4d15160aa1b6044820152606401610842565b600954600160a01b900460ff161561167f5760405162461bcd60e51b815260206004820152600c60248201526b4f4e4c595f50524553414c4560a01b6044820152606401610842565b600a8111156116d05760405162461bcd60e51b815260206004820152601b60248201527f4558434545445f434f4c4c45435449424c455f5045525f4d494e5400000000006044820152606401610842565b346116e38267016345785d8a0000612974565b11156117245760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b6044820152606401610842565b6115b48161173160035490565b61173b919061295c565b11156117595760405162461bcd60e51b81526004016108429061292c565b6117638383611d73565b6117a05760405162461bcd60e51b815260206004820152600e60248201526d1393d7d112549150d517d352539560921b6044820152606401610842565b60005b818110156114095760006117b660035490565b90506117c23382611bfb565b50806117cd81612911565b9150506117a3565b6000546001600160a01b031633146117ff5760405162461bcd60e51b815260040161084290612824565b6001600160a01b0381166118645760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610842565b610e4a81611d23565b60035460009082108015610812575060006001600160a01b03166003838154811061189a5761189a6128e5565b6000918252602090912001546001600160a01b0316141592915050565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118ec82610e4d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006119308261186d565b6119915760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610842565b600061199c83610e4d565b9050806001600160a01b0316846001600160a01b031614806119d75750836001600160a01b03166119cc846108fe565b6001600160a01b0316145b80611a0757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611a2282610e4d565b6001600160a01b031614611a8a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610842565b6001600160a01b038216611aec5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610842565b611af76000826118b7565b8160038281548110611b0b57611b0b6128e5565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611bb2576040519150601f19603f3d011682016040523d82523d6000602084013e611bb7565b606091505b5050905080610a975760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610842565b6001600160a01b038216611c515760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610842565b611c5a8161186d565b15611ca75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610842565b6003805460018101825560009182527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000611d7f8383611ee6565b6009546001600160a01b039182169116149392505050565b611da2848484611a0f565b611dae84848484611f0a565b6114095760405162461bcd60e51b815260040161084290612a56565b606081611dee5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e185780611e0281612911565b9150611e119050600a83612abe565b9150611df2565b60008167ffffffffffffffff811115611e3357611e33612696565b6040519080825280601f01601f191660200182016040528015611e5d576020820181803683370190505b5090505b8415611a0757611e72600183612ad2565b9150611e7f600a86612ae9565b611e8a90603061295c565b60f81b818381518110611e9f57611e9f6128e5565b60200101906001600160f81b031916908160001a905350611ec1600a86612abe565b9450611e61565b611ee2828260405180602001604052806000815250612017565b5050565b6000806000611ef5858561204a565b91509150611f02816120ba565b509392505050565b60006001600160a01b0384163b1561200c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611f4e903390899088908890600401612afd565b602060405180830381600087803b158015611f6857600080fd5b505af1925050508015611f98575060408051601f3d908101601f19168201909252611f9591810190612b3a565b60015b611ff2573d808015611fc6576040519150601f19603f3d011682016040523d82523d6000602084013e611fcb565b606091505b508051611fea5760405162461bcd60e51b815260040161084290612a56565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a07565b506001949350505050565b6120218383611bfb565b61202e6000848484611f0a565b610a975760405162461bcd60e51b815260040161084290612a56565b6000808251604114156120815760208301516040840151606085015160001a61207587828585612275565b945094505050506120b3565b8251604014156120ab57602083015160408401516120a0868383612362565b9350935050506120b3565b506000905060025b9250929050565b60008160048111156120ce576120ce612b57565b14156120d75750565b60018160048111156120eb576120eb612b57565b14156121395760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610842565b600281600481111561214d5761214d612b57565b141561219b5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610842565b60038160048111156121af576121af612b57565b14156122085760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610842565b600481600481111561221c5761221c612b57565b1415610e4a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610842565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156122ac5750600090506003612359565b8460ff16601b141580156122c457508460ff16601c14155b156122d55750600090506004612359565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612329573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661235257600060019250925050612359565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161238387828885612275565b935093505050935093915050565b82805461239d90612859565b90600052602060002090601f0160209004810192826123bf5760008555612405565b82601f106123d85782800160ff19823516178555612405565b82800160010185558215612405579182015b828111156124055782358255916020019190600101906123ea565b50612411929150612415565b5090565b5b808211156124115760008155600101612416565b6001600160e01b031981168114610e4a57600080fd5b60006020828403121561245257600080fd5b813561245d8161242a565b9392505050565b60005b8381101561247f578181015183820152602001612467565b838111156114095750506000910152565b600081518084526124a8816020860160208601612464565b601f01601f19169290920160200192915050565b60208152600061245d6020830184612490565b6000602082840312156124e157600080fd5b5035919050565b80356001600160a01b03811681146124ff57600080fd5b919050565b6000806040838503121561251757600080fd5b612520836124e8565b946020939093013593505050565b6000806020838503121561254157600080fd5b823567ffffffffffffffff8082111561255957600080fd5b818501915085601f83011261256d57600080fd5b81358181111561257c57600080fd5b86602082850101111561258e57600080fd5b60209290920196919550909350505050565b6000806000606084860312156125b557600080fd5b6125be846124e8565b92506125cc602085016124e8565b9150604084013590509250925092565b6000602082840312156125ee57600080fd5b61245d826124e8565b6000806020838503121561260a57600080fd5b823567ffffffffffffffff8082111561262257600080fd5b818501915085601f83011261263657600080fd5b81358181111561264557600080fd5b8660208260051b850101111561258e57600080fd5b6000806040838503121561266d57600080fd5b612676836124e8565b91506020830135801515811461268b57600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126126bd57600080fd5b813567ffffffffffffffff808211156126d8576126d8612696565b604051601f8301601f19908116603f0116810190828211818310171561270057612700612696565b8160405283815286602085880101111561271957600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561274e57600080fd5b83359250602084013567ffffffffffffffff81111561276c57600080fd5b612778868287016126ac565b925050604084013590509250925092565b6000806000806080858703121561279f57600080fd5b6127a8856124e8565b93506127b6602086016124e8565b925060408501359150606085013567ffffffffffffffff8111156127d957600080fd5b6127e5878288016126ac565b91505092959194509250565b6000806040838503121561280457600080fd5b61280d836124e8565b915061281b602084016124e8565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061286d57607f821691505b6020821081141561288e57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612925576129256128fb565b5060010190565b6020808252601690820152754558434545445f4d41585f53414c455f535550504c5960501b604082015260600190565b6000821982111561296f5761296f6128fb565b500190565b600081600019048311821515161561298e5761298e6128fb565b500290565b600081516129a5818560208601612464565b9290920192915050565b600080845481600182811c9150808316806129cb57607f831692505b60208084108214156129eb57634e487b7160e01b86526022600452602486fd5b8180156129ff5760018114612a1057612a3d565b60ff19861689528489019650612a3d565b60008b81526020902060005b86811015612a355781548b820152908501908301612a1c565b505084890196505b505050505050612a4d8185612993565b95945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612acd57612acd612aa8565b500490565b600082821015612ae457612ae46128fb565b500390565b600082612af857612af8612aa8565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b3090830184612490565b9695505050505050565b600060208284031215612b4c57600080fd5b815161245d8161242a565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220fed00dea3a5d6f50f47cfab7cf1f52e513ae31951f37e2cb4917f8bc9e2623eb64736f6c63430008090033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003268747470733a2f2f657468657265616c2d636f6c6c6563746976652e6865726f6b756170702e636f6d2f6170692f6661652f0000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseUri (string): https://ethereal-collective.herokuapp.com/api/fae/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [2] : 68747470733a2f2f657468657265616c2d636f6c6c6563746976652e6865726f
Arg [3] : 6b756170702e636f6d2f6170692f6661652f0000000000000000000000000000


Deployed Bytecode Sourcemap

41355:5522:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18709:305;;;;;;;;;;-1:-1:-1;18709:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;18709:305:0;;;;;;;;45988:86;;;;;;;;;;;;;:::i;:::-;;19864:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;20677:221::-;;;;;;;;;;-1:-1:-1;20677:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1714:32:1;;;1696:51;;1684:2;1669:18;20677:221:0;1550:203:1;41756:62:0;;;;;;;;;;;;41817:1;41756:62;;;;;1904:25:1;;;1892:2;1877:18;41756:62:0;1758:177:1;20199:412:0;;;;;;;;;;-1:-1:-1;20199:412:0;;;;;:::i;:::-;;:::i;41465:46::-;;;;;;;;;;;;41507:4;41465:46;;41861:24;;;;;;;;;;;;;:::i;46192:104::-;;;;;;;;;;-1:-1:-1;46192:104:0;;;;;:::i;:::-;;:::i;43471:101::-;;;;;;;;;;-1:-1:-1;43550:7:0;:14;43471:101;;41825:27;;;;;;;;;;;;;;;;21569:339;;;;;;;;;;-1:-1:-1;21569:339:0;;;;;:::i;:::-;;:::i;42187:40::-;;;;;;;;;;-1:-1:-1;42187:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;41631:62;;;;;;;;;;;;41683:10;41631:62;;45146:102;;;;;;;;;;;;;:::i;21979:185::-;;;;;;;;;;-1:-1:-1;21979:185:0;;;;;:::i;:::-;;:::i;42456:344::-;;;;;;;;;;-1:-1:-1;42456:344:0;;;;;:::i;:::-;;:::i;46082:98::-;;;;;;;;;;-1:-1:-1;46082:98:0;;;;;:::i;:::-;;:::i;43103:360::-;;;;;;;;;;;;;:::i;46576:130::-;;;;;;;;;;-1:-1:-1;46576:130:0;;;;;:::i;:::-;-1:-1:-1;;;;;46671:27:0;46644:7;46671:27;;;:21;:27;;;;;;;46576:130;19558:239;;;;;;;;;;-1:-1:-1;19558:239:0;;;;;:::i;:::-;;:::i;19078:418::-;;;;;;;;;;-1:-1:-1;19078:418:0;;;;;:::i;:::-;;:::i;33939:94::-;;;;;;;;;;;;;:::i;42808:287::-;;;;;;;;;;-1:-1:-1;42808:287:0;;;;;:::i;:::-;;:::i;41571:53::-;;;;;;;;;;;;41615:9;41571:53;;45884:95;;;;;;;;;;;;;:::i;42012:23::-;;;;;;;;;;-1:-1:-1;42012:23:0;;;;-1:-1:-1;;;42012:23:0;;;;;;42134:44;;;;;;;;;;-1:-1:-1;42134:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;33288:87;;;;;;;;;;-1:-1:-1;33334:7:0;33361:6;-1:-1:-1;;;;;33361:6:0;33288:87;;20033:104;;;;;;;;;;;;;:::i;42071:56::-;;;;;;;;;;-1:-1:-1;42071:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;20970:295;;;;;;;;;;-1:-1:-1;20970:295:0;;;;;:::i;:::-;;:::i;44276:861::-;;;;;;:::i;:::-;;:::i;22235:328::-;;;;;;;;;;-1:-1:-1;22235:328:0;;;;;:::i;:::-;;:::i;46305:262::-;;;;;;;;;;-1:-1:-1;46305:262:0;;;;;:::i;:::-;;:::i;45444:432::-;;;;;;;;;;-1:-1:-1;45444:432:0;;;;;:::i;:::-;;:::i;41518:46::-;;;;;;;;;;;;41561:3;41518:46;;43580:687;;;;;;:::i;:::-;;:::i;42042:20::-;;;;;;;;;;-1:-1:-1;42042:20:0;;;;-1:-1:-1;;;42042:20:0;;;;;;21336:164;;;;;;;;;;-1:-1:-1;21336:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;21457:25:0;;;21433:4;21457:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;21336:164;41700:49;;;;;;;;;;;;41747:2;41700:49;;34188:192;;;;;;;;;;-1:-1:-1;34188:192:0;;;;;:::i;:::-;;:::i;42234:48::-;;;;;;;;;;-1:-1:-1;42234:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;18709:305;18811:4;-1:-1:-1;;;;;;18848:40:0;;-1:-1:-1;;;18848:40:0;;:105;;-1:-1:-1;;;;;;;18905:48:0;;-1:-1:-1;;;18905:48:0;18848:105;:158;;;-1:-1:-1;;;;;;;;;;17675:40:0;;;18970:36;18828:178;18709:305;-1:-1:-1;;18709:305:0:o;45988:86::-;33334:7;33361:6;-1:-1:-1;;;;;33361:6:0;16628:10;33508:23;33500:68;;;;-1:-1:-1;;;33500:68:0;;;;;;;:::i;:::-;;;;;;;;;46058:8:::1;::::0;;-1:-1:-1;;;;46046:20:0;::::1;-1:-1:-1::0;;;46058:8:0;;;::::1;;;46057:9;46046:20:::0;;::::1;;::::0;;45988:86::o;19864:100::-;19918:13;19951:5;19944:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19864:100;:::o;20677:221::-;20753:7;20781:16;20789:7;20781;:16::i;:::-;20773:73;;;;-1:-1:-1;;;20773:73:0;;7541:2:1;20773:73:0;;;7523:21:1;7580:2;7560:18;;;7553:30;7619:34;7599:18;;;7592:62;-1:-1:-1;;;7670:18:1;;;7663:42;7722:19;;20773:73:0;7339:408:1;20773:73:0;-1:-1:-1;20866:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;20866:24:0;;20677:221::o;20199:412::-;20280:13;20296:24;20312:7;20296:15;:24::i;:::-;20280:40;;20345:5;-1:-1:-1;;;;;20339:11:0;:2;-1:-1:-1;;;;;20339:11:0;;;20331:57;;;;-1:-1:-1;;;20331:57:0;;7954:2:1;20331:57:0;;;7936:21:1;7993:2;7973:18;;;7966:30;8032:34;8012:18;;;8005:62;-1:-1:-1;;;8083:18:1;;;8076:31;8124:19;;20331:57:0;7752:397:1;20331:57:0;16628:10;-1:-1:-1;;;;;20423:21:0;;;;:62;;-1:-1:-1;20448:37:0;20465:5;16628:10;21336:164;:::i;20448:37::-;20401:168;;;;-1:-1:-1;;;20401:168:0;;8356:2:1;20401:168:0;;;8338:21:1;8395:2;8375:18;;;8368:30;8434:34;8414:18;;;8407:62;8505:26;8485:18;;;8478:54;8549:19;;20401:168:0;8154:420:1;20401:168:0;20582:21;20591:2;20595:7;20582:8;:21::i;:::-;20269:342;20199:412;;:::o;41861:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46192:104::-;33334:7;33361:6;-1:-1:-1;;;;;33361:6:0;16628:10;33508:23;33500:68;;;;-1:-1:-1;;;33500:68:0;;;;;;;:::i;:::-;46271:17:::1;:10;46284:4:::0;;46271:17:::1;:::i;21569:339::-:0;21764:41;16628:10;21797:7;21764:18;:41::i;:::-;21756:103;;;;-1:-1:-1;;;21756:103:0;;;;;;;:::i;:::-;21872:28;21882:4;21888:2;21892:7;21872:9;:28::i;45146:102::-;33334:7;33361:6;-1:-1:-1;;;;;33361:6:0;16628:10;33508:23;33500:68;;;;-1:-1:-1;;;33500:68:0;;;;;;;:::i;:::-;45196:44:::1;45206:10;45218:21;45196:9;:44::i;:::-;45146:102::o:0;21979:185::-;22117:39;22134:4;22140:2;22144:7;22117:39;;;;;;;;;;;;:16;:39::i;42456:344::-;33334:7;33361:6;-1:-1:-1;;;;;33361:6:0;16628:10;33508:23;33500:68;;;;-1:-1:-1;;;33500:68:0;;;;;;;:::i;:::-;42541:9:::1;42537:253;42556:18:::0;;::::1;42537:253;;;42596:13;42612:7;;42620:1;42612:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;42596:26:::0;-1:-1:-1;;;;;;42645:19:0;::::1;42637:44;;;::::0;-1:-1:-1;;;42637:44:0;;9331:2:1;42637:44:0::1;::::0;::::1;9313:21:1::0;9370:2;9350:18;;;9343:30;-1:-1:-1;;;9389:18:1;;;9382:42;9441:18;;42637:44:0::1;9129:336:1::0;42637:44:0::1;-1:-1:-1::0;;;;;42705:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;;::::1;;42704:16;42696:45;;;::::0;-1:-1:-1;;;42696:45:0;;9672:2:1;42696:45:0::1;::::0;::::1;9654:21:1::0;9711:2;9691:18;;;9684:30;-1:-1:-1;;;9730:18:1;;;9723:46;9786:18;;42696:45:0::1;9470:340:1::0;42696:45:0::1;-1:-1:-1::0;;;;;42756:15:0::1;;::::0;;;:8:::1;:15;::::0;;;;:22;;-1:-1:-1;;42756:22:0::1;42774:4;42756:22;::::0;;42576:3;::::1;::::0;::::1;:::i;:::-;;;;42537:253;;46082:98:::0;33334:7;33361:6;-1:-1:-1;;;;;33361:6:0;16628:10;33508:23;33500:68;;;;-1:-1:-1;;;33500:68:0;;;;;;;:::i;:::-;46153:19:::1;:13;46169:3:::0;;46153:19:::1;:::i;43103:360::-:0;43160:10;43151:20;;;;:8;:20;;;;;;;;43143:46;;;;-1:-1:-1;;;43143:46:0;;10289:2:1;43143:46:0;;;10271:21:1;10328:2;10308:18;;;10301:30;-1:-1:-1;;;10347:18:1;;;10340:43;10400:18;;43143:46:0;10087:337:1;43143:46:0;43222:10;43208:25;;;;:13;:25;;;;;;43236:1;-1:-1:-1;43200:53:0;;;;-1:-1:-1;;;43200:53:0;;10631:2:1;43200:53:0;;;10613:21:1;10670:2;10650:18;;;10643:30;-1:-1:-1;;;10689:18:1;;;10682:41;10740:18;;43200:53:0;10429:335:1;43200:53:0;41507:4;43272:13;43550:7;:14;;43471:101;43272:13;:32;;43264:67;;;;-1:-1:-1;;;43264:67:0;;;;;;;:::i;:::-;43358:10;43344:25;;;;:13;:25;;;;;:27;;;;;;:::i;:::-;;;;;;43384:14;43401:13;43550:7;:14;;43471:101;43401:13;43384:30;;43425;43432:10;43444:9;43425:5;:30::i;:::-;43132:331;43103:360::o;19558:239::-;19630:7;19650:13;19666:7;19674;19666:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;19666:16:0;;-1:-1:-1;19701:19:0;19693:73;;;;-1:-1:-1;;;19693:73:0;;11322:2:1;19693:73:0;;;11304:21:1;11361:2;11341:18;;;11334:30;11400:34;11380:18;;;11373:62;-1:-1:-1;;;11451:18:1;;;11444:39;11500:19;;19693:73:0;11120:405:1;19078:418:0;19150:7;-1:-1:-1;;;;;19178:19:0;;19170:74;;;;-1:-1:-1;;;19170:74:0;;11732:2:1;19170:74:0;;;11714:21:1;11771:2;11751:18;;;11744:30;11810:34;11790:18;;;11783:62;-1:-1:-1;;;11861:18:1;;;11854:40;11911:19;;19170:74:0;11530:406:1;19170:74:0;19296:7;:14;19257:10;;;19321:119;19342:6;19338:1;:10;19321:119;;;19381:7;19389:1;19381:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;19372:19:0;;;19381:10;;19372:19;19368:61;;;19408:7;;;:::i;:::-;;;19368:61;19350:3;;;:::i;:::-;;;19321:119;;;-1:-1:-1;19483:5:0;;19078:418;-1:-1:-1;;;19078:418:0:o;33939:94::-;33334:7;33361:6;-1:-1:-1;;;;;33361:6:0;16628:10;33508:23;33500:68;;;;-1:-1:-1;;;33500:68:0;;;;;;;:::i;:::-;34004:21:::1;34022:1;34004:9;:21::i;42808:287::-:0;33334:7;33361:6;-1:-1:-1;;;;;33361:6:0;16628:10;33508:23;33500:68;;;;-1:-1:-1;;;33500:68:0;;;;;;;:::i;:::-;42898:9:::1;42894:194;42913:18:::0;;::::1;42894:194;;;42953:13;42969:7;;42977:1;42969:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;42953:26:::0;-1:-1:-1;;;;;;43002:19:0;::::1;42994:44;;;::::0;-1:-1:-1;;;42994:44:0;;9331:2:1;42994:44:0::1;::::0;::::1;9313:21:1::0;9370:2;9350:18;;;9343:30;-1:-1:-1;;;9389:18:1;;;9382:42;9441:18;;42994:44:0::1;9129:336:1::0;42994:44:0::1;-1:-1:-1::0;;;;;43053:15:0::1;43071:5;43053:15:::0;;;:8:::1;:15;::::0;;;;:23;;-1:-1:-1;;43053:23:0::1;::::0;;42933:3;::::1;::::0;::::1;:::i;:::-;;;;42894:194;;45884:95:::0;33334:7;33361:6;-1:-1:-1;;;;;33361:6:0;16628:10;33508:23;33500:68;;;;-1:-1:-1;;;33500:68:0;;;;;;;:::i;:::-;45960:11:::1;::::0;;-1:-1:-1;;;;45945:26:0;::::1;-1:-1:-1::0;;;45960:11:0;;;::::1;;;45959:12;45945:26:::0;;::::1;;::::0;;45884:95::o;20033:104::-;20089:13;20122:7;20115:14;;;;;:::i;20970:295::-;-1:-1:-1;;;;;21073:24:0;;16628:10;21073:24;;21065:62;;;;-1:-1:-1;;;21065:62:0;;12143:2:1;21065:62:0;;;12125:21:1;12182:2;12162:18;;;12155:30;12221:27;12201:18;;;12194:55;12266:18;;21065:62:0;11941:349:1;21065:62:0;16628:10;21140:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;21140:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;21140:53:0;;;;;;;;;;21209:48;;540:41:1;;;21140:42:0;;16628:10;21209:48;;513:18:1;21209:48:0;;;;;;;20970:295;;:::o;44276:861::-;44394:8;;-1:-1:-1;;;44394:8:0;;;;44393:9;:24;;;;-1:-1:-1;44406:11:0;;-1:-1:-1;;;44406:11:0;;;;44393:24;44385:51;;;;-1:-1:-1;;;44385:51:0;;12497:2:1;44385:51:0;;;12479:21:1;12536:2;12516:18;;;12509:30;-1:-1:-1;;;12555:18:1;;;12548:44;12609:18;;44385:51:0;12295:338:1;44385:51:0;44477:10;44455:33;;;;:21;:33;;;;;;41817:1;;44455:49;;44491:13;;44455:49;:::i;:::-;:87;;44447:112;;;;-1:-1:-1;;;44447:112:0;;12973:2:1;44447:112:0;;;12955:21:1;13012:2;12992:18;;;12985:30;-1:-1:-1;;;13031:18:1;;;13024:42;13083:18;;44447:112:0;12771:336:1;44447:112:0;41747:2;44578:13;:37;;44570:77;;;;-1:-1:-1;;;44570:77:0;;13314:2:1;44570:77:0;;;13296:21:1;13353:2;13333:18;;;13326:30;13392:29;13372:18;;;13365:57;13439:18;;44570:77:0;13112:351:1;44570:77:0;44711:9;44666:41;44694:13;41683:10;44666:41;:::i;:::-;:54;;44658:83;;;;-1:-1:-1;;;44658:83:0;;13843:2:1;44658:83:0;;;13825:21:1;13882:2;13862:18;;;13855:30;-1:-1:-1;;;13901:18:1;;;13894:46;13957:18;;44658:83:0;13641:340:1;44658:83:0;41507:4;44776:13;44760;43550:7;:14;;43471:101;44760:13;:29;;;;:::i;:::-;:48;;44752:83;;;;-1:-1:-1;;;44752:83:0;;;;;;;:::i;:::-;44854:35;44873:4;44879:9;44854:18;:35::i;:::-;44846:62;;;;-1:-1:-1;;;44846:62:0;;14188:2:1;44846:62:0;;;14170:21:1;14227:2;14207:18;;;14200:30;-1:-1:-1;;;14246:18:1;;;14239:44;14300:18;;44846:62:0;13986:338:1;44846:62:0;44943:10;44921:33;;;;:21;:33;;;;;:50;;44958:13;;44921:33;:50;;44958:13;;44921:50;:::i;:::-;;;;-1:-1:-1;44989:9:0;;-1:-1:-1;44984:146:0;45008:13;45004:1;:17;44984:146;;;45043:14;45060:13;43550:7;:14;;43471:101;45060:13;45043:30;;45088;45095:10;45107:9;45088:5;:30::i;:::-;-1:-1:-1;45023:3:0;;;;:::i;:::-;;;;44984:146;;;;44276:861;;;:::o;22235:328::-;22410:41;16628:10;22443:7;22410:18;:41::i;:::-;22402:103;;;;-1:-1:-1;;;22402:103:0;;;;;;;:::i;:::-;22516:39;22530:4;22536:2;22540:7;22549:5;22516:13;:39::i;46305:262::-;46380:13;46414:16;46422:7;46414;:16::i;:::-;46406:76;;;;-1:-1:-1;;;46406:76:0;;14531:2:1;46406:76:0;;;14513:21:1;14570:2;14550:18;;;14543:30;14609:34;14589:18;;;14582:62;-1:-1:-1;;;14660:18:1;;;14653:45;14715:19;;46406:76:0;14329:411:1;46406:76:0;46524:13;46539:18;:7;:16;:18::i;:::-;46507:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46493:66;;46305:262;;;:::o;45444:432::-;33334:7;33361:6;-1:-1:-1;;;;;33361:6:0;16628:10;33508:23;33500:68;;;;-1:-1:-1;;;33500:68:0;;;;;;;:::i;:::-;41507:4:::1;45549:14;45533:13;43550:7:::0;:14;;43471:101;45533:13:::1;:30;;;;:::i;:::-;:49;;45525:70;;;::::0;-1:-1:-1;;;45525:70:0;;16442:2:1;45525:70:0::1;::::0;::::1;16424:21:1::0;16481:1;16461:18;;;16454:29;-1:-1:-1;;;16499:18:1;;;16492:38;16547:18;;45525:70:0::1;16240:331:1::0;45525:70:0::1;41561:3;45629:14;45614:12;;:29;;;;:::i;:::-;:49;;45606:70;;;::::0;-1:-1:-1;;;45606:70:0;;16778:2:1;45606:70:0::1;::::0;::::1;16760:21:1::0;16817:1;16797:18;;;16790:29;-1:-1:-1;;;16835:18:1;;;16828:38;16883:18;;45606:70:0::1;16576:331:1::0;45606:70:0::1;45702:9;45697:172;45721:14;45717:1;:18;45697:172;;;45757:14;45774:13;43550:7:::0;:14;;43471:101;45774:13:::1;45802:12;:14:::0;;45757:30;;-1:-1:-1;45802:12:0::1;:14;::::0;::::1;:::i;:::-;;;;;;45831:26;45841:3;45846:9;45831;:26::i;:::-;-1:-1:-1::0;45737:3:0;::::1;::::0;::::1;:::i;:::-;;;;45697:172;;43580:687:::0;43690:8;;-1:-1:-1;;;43690:8:0;;;;43682:32;;;;-1:-1:-1;;;43682:32:0;;17114:2:1;43682:32:0;;;17096:21:1;17153:2;17133:18;;;17126:30;-1:-1:-1;;;17172:18:1;;;17165:41;17223:18;;43682:32:0;16912:335:1;43682:32:0;43734:11;;-1:-1:-1;;;43734:11:0;;;;43733:12;43725:37;;;;-1:-1:-1;;;43725:37:0;;17454:2:1;43725:37:0;;;17436:21:1;17493:2;17473:18;;;17466:30;-1:-1:-1;;;17512:18:1;;;17505:42;17564:18;;43725:37:0;17252:336:1;43725:37:0;41747:2;43781:13;:37;;43773:77;;;;-1:-1:-1;;;43773:77:0;;13314:2:1;43773:77:0;;;13296:21:1;13353:2;13333:18;;;13326:30;13392:29;13372:18;;;13365:57;13439:18;;43773:77:0;13112:351:1;43773:77:0;43906:9;43869:33;43889:13;41615:9;43869:33;:::i;:::-;:46;;43861:75;;;;-1:-1:-1;;;43861:75:0;;13843:2:1;43861:75:0;;;13825:21:1;13882:2;13862:18;;;13855:30;-1:-1:-1;;;13901:18:1;;;13894:46;13957:18;;43861:75:0;13641:340:1;43861:75:0;41507:4;43971:13;43955;43550:7;:14;;43471:101;43955:13;:29;;;;:::i;:::-;:48;;43947:83;;;;-1:-1:-1;;;43947:83:0;;;;;;;:::i;:::-;44049:35;44068:4;44074:9;44049:18;:35::i;:::-;44041:62;;;;-1:-1:-1;;;44041:62:0;;14188:2:1;44041:62:0;;;14170:21:1;14227:2;14207:18;;;14200:30;-1:-1:-1;;;14246:18:1;;;14239:44;14300:18;;44041:62:0;13986:338:1;44041:62:0;44120:9;44116:144;44139:13;44135:1;:17;44116:144;;;44174:14;44191:13;43550:7;:14;;43471:101;44191:13;44174:30;;44218;44225:10;44237:9;44218:5;:30::i;:::-;-1:-1:-1;44154:3:0;;;;:::i;:::-;;;;44116:144;;34188:192;33334:7;33361:6;-1:-1:-1;;;;;33361:6:0;16628:10;33508:23;33500:68;;;;-1:-1:-1;;;33500:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34277:22:0;::::1;34269:73;;;::::0;-1:-1:-1;;;34269:73:0;;17795:2:1;34269:73:0::1;::::0;::::1;17777:21:1::0;17834:2;17814:18;;;17807:30;17873:34;17853:18;;;17846:62;-1:-1:-1;;;17924:18:1;;;17917:36;17970:19;;34269:73:0::1;17593:402:1::0;34269:73:0::1;34353:19;34363:8;34353:9;:19::i;24073:155::-:0;24172:7;:14;24138:4;;24162:24;;:58;;;;;24218:1;-1:-1:-1;;;;;24190:30:0;:7;24198;24190:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;24190:16:0;:30;;24155:65;24073:155;-1:-1:-1;;24073:155:0:o;27962:175::-;28037:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;28037:29:0;-1:-1:-1;;;;;28037:29:0;;;;;;;;:24;;28091;28037;28091:15;:24::i;:::-;-1:-1:-1;;;;;28082:47:0;;;;;;;;;;;27962:175;;:::o;24395:349::-;24488:4;24513:16;24521:7;24513;:16::i;:::-;24505:73;;;;-1:-1:-1;;;24505:73:0;;18202:2:1;24505:73:0;;;18184:21:1;18241:2;18221:18;;;18214:30;18280:34;18260:18;;;18253:62;-1:-1:-1;;;18331:18:1;;;18324:42;18383:19;;24505:73:0;18000:408:1;24505:73:0;24589:13;24605:24;24621:7;24605:15;:24::i;:::-;24589:40;;24659:5;-1:-1:-1;;;;;24648:16:0;:7;-1:-1:-1;;;;;24648:16:0;;:51;;;;24692:7;-1:-1:-1;;;;;24668:31:0;:20;24680:7;24668:11;:20::i;:::-;-1:-1:-1;;;;;24668:31:0;;24648:51;:87;;;-1:-1:-1;;;;;;21457:25:0;;;21433:4;21457:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;24703:32;24640:96;24395:349;-1:-1:-1;;;;24395:349:0:o;27327:517::-;27487:4;-1:-1:-1;;;;;27459:32:0;:24;27475:7;27459:15;:24::i;:::-;-1:-1:-1;;;;;27459:32:0;;27451:86;;;;-1:-1:-1;;;27451:86:0;;18615:2:1;27451:86:0;;;18597:21:1;18654:2;18634:18;;;18627:30;18693:34;18673:18;;;18666:62;-1:-1:-1;;;18744:18:1;;;18737:39;18793:19;;27451:86:0;18413:405:1;27451:86:0;-1:-1:-1;;;;;27556:16:0;;27548:65;;;;-1:-1:-1;;;27548:65:0;;19025:2:1;27548:65:0;;;19007:21:1;19064:2;19044:18;;;19037:30;19103:34;19083:18;;;19076:62;-1:-1:-1;;;19154:18:1;;;19147:34;19198:19;;27548:65:0;18823:400:1;27548:65:0;27730:29;27747:1;27751:7;27730:8;:29::i;:::-;27789:2;27770:7;27778;27770:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;-1:-1:-1;;;;;;27770:21:0;-1:-1:-1;;;;;27770:21:0;;;;;;27809:27;;27828:7;;27809:27;;;;;;;;;;27770:16;27809:27;27327:517;;;:::o;45256:180::-;45330:12;45348:8;-1:-1:-1;;;;;45348:13:0;45369:7;45348:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45329:52;;;45400:7;45392:36;;;;-1:-1:-1;;;45392:36:0;;19640:2:1;45392:36:0;;;19622:21:1;19679:2;19659:18;;;19652:30;-1:-1:-1;;;19698:18:1;;;19691:46;19754:18;;45392:36:0;19438:340:1;26082:346:0;-1:-1:-1;;;;;26162:16:0;;26154:61;;;;-1:-1:-1;;;26154:61:0;;19985:2:1;26154:61:0;;;19967:21:1;;;20004:18;;;19997:30;20063:34;20043:18;;;20036:62;20115:18;;26154:61:0;19783:356:1;26154:61:0;26235:16;26243:7;26235;:16::i;:::-;26234:17;26226:58;;;;-1:-1:-1;;;26226:58:0;;20346:2:1;26226:58:0;;;20328:21:1;20385:2;20365:18;;;20358:30;20424;20404:18;;;20397:58;20472:18;;26226:58:0;20144:352:1;26226:58:0;26353:7;:16;;;;;;;-1:-1:-1;26353:16:0;;;;;;;-1:-1:-1;;;;;;26353:16:0;-1:-1:-1;;;;;26353:16:0;;;;;;;;26387:33;;26412:7;;-1:-1:-1;26387:33:0;;-1:-1:-1;;26387:33:0;26082:346;;:::o;34388:173::-;34444:16;34463:6;;-1:-1:-1;;;;;34480:17:0;;;-1:-1:-1;;;;;;34480:17:0;;;;;;34513:40;;34463:6;;;;;;;34513:40;;34444:16;34513:40;34433:128;34388:173;:::o;46715:159::-;46802:4;46843:23;:4;46856:9;46843:12;:23::i;:::-;46826:13;;-1:-1:-1;;;;;46826:40:0;;;:13;;:40;;46715:159;-1:-1:-1;;;46715:159:0:o;23445:315::-;23602:28;23612:4;23618:2;23622:7;23602:9;:28::i;:::-;23649:48;23672:4;23678:2;23682:7;23691:5;23649:22;:48::i;:::-;23641:111;;;;-1:-1:-1;;;23641:111:0;;;;;;;:::i;30525:723::-;30581:13;30802:10;30798:53;;-1:-1:-1;;30829:10:0;;;;;;;;;;;;-1:-1:-1;;;30829:10:0;;;;;30525:723::o;30798:53::-;30876:5;30861:12;30917:78;30924:9;;30917:78;;30950:8;;;;:::i;:::-;;-1:-1:-1;30973:10:0;;-1:-1:-1;30981:2:0;30973:10;;:::i;:::-;;;30917:78;;;31005:19;31037:6;31027:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31027:17:0;;31005:39;;31055:154;31062:10;;31055:154;;31089:11;31099:1;31089:11;;:::i;:::-;;-1:-1:-1;31158:10:0;31166:2;31158:5;:10;:::i;:::-;31145:24;;:2;:24;:::i;:::-;31132:39;;31115:6;31122;31115:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;31115:56:0;;;;;;;;-1:-1:-1;31186:11:0;31195:2;31186:11;;:::i;:::-;;;31055:154;;25086:110;25162:26;25172:2;25176:7;25162:26;;;;;;;;;;;;:9;:26::i;:::-;25086:110;;:::o;38622:231::-;38700:7;38721:17;38740:18;38762:27;38773:4;38779:9;38762:10;:27::i;:::-;38720:69;;;;38800:18;38812:5;38800:11;:18::i;:::-;-1:-1:-1;38836:9:0;38622:231;-1:-1:-1;;;38622:231:0:o;28704:799::-;28859:4;-1:-1:-1;;;;;28880:13:0;;8907:20;8955:8;28876:620;;28916:72;;-1:-1:-1;;;28916:72:0;;-1:-1:-1;;;;;28916:36:0;;;;;:72;;16628:10;;28967:4;;28973:7;;28982:5;;28916:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28916:72:0;;;;;;;;-1:-1:-1;;28916:72:0;;;;;;;;;;;;:::i;:::-;;;28912:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29158:13:0;;29154:272;;29201:60;;-1:-1:-1;;;29201:60:0;;;;;;;:::i;29154:272::-;29376:6;29370:13;29361:6;29357:2;29353:15;29346:38;28912:529;-1:-1:-1;;;;;;29039:51:0;-1:-1:-1;;;29039:51:0;;-1:-1:-1;29032:58:0;;28876:620;-1:-1:-1;29480:4:0;28704:799;;;;;;:::o;25425:321::-;25555:18;25561:2;25565:7;25555:5;:18::i;:::-;25606:54;25637:1;25641:2;25645:7;25654:5;25606:22;:54::i;:::-;25584:154;;;;-1:-1:-1;;;25584:154:0;;;;;;;:::i;36512:1308::-;36593:7;36602:12;36827:9;:16;36847:2;36827:22;36823:990;;;37123:4;37108:20;;37102:27;37173:4;37158:20;;37152:27;37231:4;37216:20;;37210:27;36866:9;37202:36;37274:25;37285:4;37202:36;37102:27;37152;37274:10;:25::i;:::-;37267:32;;;;;;;;;36823:990;37321:9;:16;37341:2;37321:22;37317:496;;;37596:4;37581:20;;37575:27;37647:4;37632:20;;37626:27;37689:23;37700:4;37575:27;37626;37689:10;:23::i;:::-;37682:30;;;;;;;;37317:496;-1:-1:-1;37761:1:0;;-1:-1:-1;37765:35:0;37317:496;36512:1308;;;;;:::o;34783:643::-;34861:20;34852:5;:29;;;;;;;;:::i;:::-;;34848:571;;;34783:643;:::o;34848:571::-;34959:29;34950:5;:38;;;;;;;;:::i;:::-;;34946:473;;;35005:34;;-1:-1:-1;;;35005:34:0;;22517:2:1;35005:34:0;;;22499:21:1;22556:2;22536:18;;;22529:30;22595:26;22575:18;;;22568:54;22639:18;;35005:34:0;22315:348:1;34946:473:0;35070:35;35061:5;:44;;;;;;;;:::i;:::-;;35057:362;;;35122:41;;-1:-1:-1;;;35122:41:0;;22870:2:1;35122:41:0;;;22852:21:1;22909:2;22889:18;;;22882:30;22948:33;22928:18;;;22921:61;22999:18;;35122:41:0;22668:355:1;35057:362:0;35194:30;35185:5;:39;;;;;;;;:::i;:::-;;35181:238;;;35241:44;;-1:-1:-1;;;35241:44:0;;23230:2:1;35241:44:0;;;23212:21:1;23269:2;23249:18;;;23242:30;23308:34;23288:18;;;23281:62;-1:-1:-1;;;23359:18:1;;;23352:32;23401:19;;35241:44:0;23028:398:1;35181:238:0;35316:30;35307:5;:39;;;;;;;;:::i;:::-;;35303:116;;;35363:44;;-1:-1:-1;;;35363:44:0;;23633:2:1;35363:44:0;;;23615:21:1;23672:2;23652:18;;;23645:30;23711:34;23691:18;;;23684:62;-1:-1:-1;;;23762:18:1;;;23755:32;23804:19;;35363:44:0;23431:398:1;39689:1632:0;39820:7;;40754:66;40741:79;;40737:163;;;-1:-1:-1;40853:1:0;;-1:-1:-1;40857:30:0;40837:51;;40737:163;40914:1;:7;;40919:2;40914:7;;:18;;;;;40925:1;:7;;40930:2;40925:7;;40914:18;40910:102;;;-1:-1:-1;40965:1:0;;-1:-1:-1;40969:30:0;40949:51;;40910:102;41126:24;;;41109:14;41126:24;;;;;;;;;24061:25:1;;;24134:4;24122:17;;24102:18;;;24095:45;;;;24156:18;;;24149:34;;;24199:18;;;24192:34;;;41126:24:0;;24033:19:1;;41126:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41126:24:0;;-1:-1:-1;;41126:24:0;;;-1:-1:-1;;;;;;;41165:20:0;;41161:103;;41218:1;41222:29;41202:50;;;;;;;41161:103;41284:6;-1:-1:-1;41292:20:0;;-1:-1:-1;39689:1632:0;;;;;;;;:::o;39116:391::-;39230:7;;-1:-1:-1;;;;;39331:75:0;;39433:3;39429:12;;;39443:2;39425:21;39474:25;39485:4;39425:21;39494:1;39331:75;39474:10;:25::i;:::-;39467:32;;;;;;39116:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:269::-;908:3;946:5;940:12;973:6;968:3;961:19;989:63;1045:6;1038:4;1033:3;1029:14;1022:4;1015:5;1011:16;989:63;:::i;:::-;1106:2;1085:15;-1:-1:-1;;1081:29:1;1072:39;;;;1113:4;1068:50;;855:269;-1:-1:-1;;855:269:1:o;1129:231::-;1278:2;1267:9;1260:21;1241:4;1298:56;1350:2;1339:9;1335:18;1327:6;1298:56;:::i;1365:180::-;1424:6;1477:2;1465:9;1456:7;1452:23;1448:32;1445:52;;;1493:1;1490;1483:12;1445:52;-1:-1:-1;1516:23:1;;1365:180;-1:-1:-1;1365:180:1:o;1940:173::-;2008:20;;-1:-1:-1;;;;;2057:31:1;;2047:42;;2037:70;;2103:1;2100;2093:12;2037:70;1940:173;;;:::o;2118:254::-;2186:6;2194;2247:2;2235:9;2226:7;2222:23;2218:32;2215:52;;;2263:1;2260;2253:12;2215:52;2286:29;2305:9;2286:29;:::i;:::-;2276:39;2362:2;2347:18;;;;2334:32;;-1:-1:-1;;;2118:254:1:o;2377:592::-;2448:6;2456;2509:2;2497:9;2488:7;2484:23;2480:32;2477:52;;;2525:1;2522;2515:12;2477:52;2565:9;2552:23;2594:18;2635:2;2627:6;2624:14;2621:34;;;2651:1;2648;2641:12;2621:34;2689:6;2678:9;2674:22;2664:32;;2734:7;2727:4;2723:2;2719:13;2715:27;2705:55;;2756:1;2753;2746:12;2705:55;2796:2;2783:16;2822:2;2814:6;2811:14;2808:34;;;2838:1;2835;2828:12;2808:34;2883:7;2878:2;2869:6;2865:2;2861:15;2857:24;2854:37;2851:57;;;2904:1;2901;2894:12;2851:57;2935:2;2927:11;;;;;2957:6;;-1:-1:-1;2377:592:1;;-1:-1:-1;;;;2377:592:1:o;2974:328::-;3051:6;3059;3067;3120:2;3108:9;3099:7;3095:23;3091:32;3088:52;;;3136:1;3133;3126:12;3088:52;3159:29;3178:9;3159:29;:::i;:::-;3149:39;;3207:38;3241:2;3230:9;3226:18;3207:38;:::i;:::-;3197:48;;3292:2;3281:9;3277:18;3264:32;3254:42;;2974:328;;;;;:::o;3307:186::-;3366:6;3419:2;3407:9;3398:7;3394:23;3390:32;3387:52;;;3435:1;3432;3425:12;3387:52;3458:29;3477:9;3458:29;:::i;3498:615::-;3584:6;3592;3645:2;3633:9;3624:7;3620:23;3616:32;3613:52;;;3661:1;3658;3651:12;3613:52;3701:9;3688:23;3730:18;3771:2;3763:6;3760:14;3757:34;;;3787:1;3784;3777:12;3757:34;3825:6;3814:9;3810:22;3800:32;;3870:7;3863:4;3859:2;3855:13;3851:27;3841:55;;3892:1;3889;3882:12;3841:55;3932:2;3919:16;3958:2;3950:6;3947:14;3944:34;;;3974:1;3971;3964:12;3944:34;4027:7;4022:2;4012:6;4009:1;4005:14;4001:2;3997:23;3993:32;3990:45;3987:65;;;4048:1;4045;4038:12;4118:347;4183:6;4191;4244:2;4232:9;4223:7;4219:23;4215:32;4212:52;;;4260:1;4257;4250:12;4212:52;4283:29;4302:9;4283:29;:::i;:::-;4273:39;;4362:2;4351:9;4347:18;4334:32;4409:5;4402:13;4395:21;4388:5;4385:32;4375:60;;4431:1;4428;4421:12;4375:60;4454:5;4444:15;;;4118:347;;;;;:::o;4470:127::-;4531:10;4526:3;4522:20;4519:1;4512:31;4562:4;4559:1;4552:15;4586:4;4583:1;4576:15;4602:718;4644:5;4697:3;4690:4;4682:6;4678:17;4674:27;4664:55;;4715:1;4712;4705:12;4664:55;4751:6;4738:20;4777:18;4814:2;4810;4807:10;4804:36;;;4820:18;;:::i;:::-;4895:2;4889:9;4863:2;4949:13;;-1:-1:-1;;4945:22:1;;;4969:2;4941:31;4937:40;4925:53;;;4993:18;;;5013:22;;;4990:46;4987:72;;;5039:18;;:::i;:::-;5079:10;5075:2;5068:22;5114:2;5106:6;5099:18;5160:3;5153:4;5148:2;5140:6;5136:15;5132:26;5129:35;5126:55;;;5177:1;5174;5167:12;5126:55;5241:2;5234:4;5226:6;5222:17;5215:4;5207:6;5203:17;5190:54;5288:1;5281:4;5276:2;5268:6;5264:15;5260:26;5253:37;5308:6;5299:15;;;;;;4602:718;;;;:::o;5325:456::-;5411:6;5419;5427;5480:2;5468:9;5459:7;5455:23;5451:32;5448:52;;;5496:1;5493;5486:12;5448:52;5532:9;5519:23;5509:33;;5593:2;5582:9;5578:18;5565:32;5620:18;5612:6;5609:30;5606:50;;;5652:1;5649;5642:12;5606:50;5675:49;5716:7;5707:6;5696:9;5692:22;5675:49;:::i;:::-;5665:59;;;5771:2;5760:9;5756:18;5743:32;5733:42;;5325:456;;;;;:::o;5786:537::-;5881:6;5889;5897;5905;5958:3;5946:9;5937:7;5933:23;5929:33;5926:53;;;5975:1;5972;5965:12;5926:53;5998:29;6017:9;5998:29;:::i;:::-;5988:39;;6046:38;6080:2;6069:9;6065:18;6046:38;:::i;:::-;6036:48;;6131:2;6120:9;6116:18;6103:32;6093:42;;6186:2;6175:9;6171:18;6158:32;6213:18;6205:6;6202:30;6199:50;;;6245:1;6242;6235:12;6199:50;6268:49;6309:7;6300:6;6289:9;6285:22;6268:49;:::i;:::-;6258:59;;;5786:537;;;;;;;:::o;6328:260::-;6396:6;6404;6457:2;6445:9;6436:7;6432:23;6428:32;6425:52;;;6473:1;6470;6463:12;6425:52;6496:29;6515:9;6496:29;:::i;:::-;6486:39;;6544:38;6578:2;6567:9;6563:18;6544:38;:::i;:::-;6534:48;;6328:260;;;;;:::o;6593:356::-;6795:2;6777:21;;;6814:18;;;6807:30;6873:34;6868:2;6853:18;;6846:62;6940:2;6925:18;;6593:356::o;6954:380::-;7033:1;7029:12;;;;7076;;;7097:61;;7151:4;7143:6;7139:17;7129:27;;7097:61;7204:2;7196:6;7193:14;7173:18;7170:38;7167:161;;;7250:10;7245:3;7241:20;7238:1;7231:31;7285:4;7282:1;7275:15;7313:4;7310:1;7303:15;7167:161;;6954:380;;;:::o;8579:413::-;8781:2;8763:21;;;8820:2;8800:18;;;8793:30;8859:34;8854:2;8839:18;;8832:62;-1:-1:-1;;;8925:2:1;8910:18;;8903:47;8982:3;8967:19;;8579:413::o;8997:127::-;9058:10;9053:3;9049:20;9046:1;9039:31;9089:4;9086:1;9079:15;9113:4;9110:1;9103:15;9815:127;9876:10;9871:3;9867:20;9864:1;9857:31;9907:4;9904:1;9897:15;9931:4;9928:1;9921:15;9947:135;9986:3;-1:-1:-1;;10007:17:1;;10004:43;;;10027:18;;:::i;:::-;-1:-1:-1;10074:1:1;10063:13;;9947:135::o;10769:346::-;10971:2;10953:21;;;11010:2;10990:18;;;10983:30;-1:-1:-1;;;11044:2:1;11029:18;;11022:52;11106:2;11091:18;;10769:346::o;12638:128::-;12678:3;12709:1;12705:6;12702:1;12699:13;12696:39;;;12715:18;;:::i;:::-;-1:-1:-1;12751:9:1;;12638:128::o;13468:168::-;13508:7;13574:1;13570;13566:6;13562:14;13559:1;13556:21;13551:1;13544:9;13537:17;13533:45;13530:71;;;13581:18;;:::i;:::-;-1:-1:-1;13621:9:1;;13468:168::o;14871:185::-;14913:3;14951:5;14945:12;14966:52;15011:6;15006:3;14999:4;14992:5;14988:16;14966:52;:::i;:::-;15034:16;;;;;14871:185;-1:-1:-1;;14871:185:1:o;15061:1174::-;15237:3;15266:1;15299:6;15293:13;15329:3;15351:1;15379:9;15375:2;15371:18;15361:28;;15439:2;15428:9;15424:18;15461;15451:61;;15505:4;15497:6;15493:17;15483:27;;15451:61;15531:2;15579;15571:6;15568:14;15548:18;15545:38;15542:165;;;-1:-1:-1;;;15606:33:1;;15662:4;15659:1;15652:15;15692:4;15613:3;15680:17;15542:165;15723:18;15750:104;;;;15868:1;15863:320;;;;15716:467;;15750:104;-1:-1:-1;;15783:24:1;;15771:37;;15828:16;;;;-1:-1:-1;15750:104:1;;15863:320;14818:1;14811:14;;;14855:4;14842:18;;15958:1;15972:165;15986:6;15983:1;15980:13;15972:165;;;16064:14;;16051:11;;;16044:35;16107:16;;;;16001:10;;15972:165;;;15976:3;;16166:6;16161:3;16157:16;16150:23;;15716:467;;;;;;;16199:30;16225:3;16217:6;16199:30;:::i;:::-;16192:37;15061:1174;-1:-1:-1;;;;;15061:1174:1:o;20501:414::-;20703:2;20685:21;;;20742:2;20722:18;;;20715:30;20781:34;20776:2;20761:18;;20754:62;-1:-1:-1;;;20847:2:1;20832:18;;20825:48;20905:3;20890:19;;20501:414::o;20920:127::-;20981:10;20976:3;20972:20;20969:1;20962:31;21012:4;21009:1;21002:15;21036:4;21033:1;21026:15;21052:120;21092:1;21118;21108:35;;21123:18;;:::i;:::-;-1:-1:-1;21157:9:1;;21052:120::o;21177:125::-;21217:4;21245:1;21242;21239:8;21236:34;;;21250:18;;:::i;:::-;-1:-1:-1;21287:9:1;;21177:125::o;21307:112::-;21339:1;21365;21355:35;;21370:18;;:::i;:::-;-1:-1:-1;21404:9:1;;21307:112::o;21424:500::-;-1:-1:-1;;;;;21693:15:1;;;21675:34;;21745:15;;21740:2;21725:18;;21718:43;21792:2;21777:18;;21770:34;;;21840:3;21835:2;21820:18;;21813:31;;;21618:4;;21861:57;;21898:19;;21890:6;21861:57;:::i;:::-;21853:65;21424:500;-1:-1:-1;;;;;;21424:500:1:o;21929:249::-;21998:6;22051:2;22039:9;22030:7;22026:23;22022:32;22019:52;;;22067:1;22064;22057:12;22019:52;22099:9;22093:16;22118:30;22142:5;22118:30;:::i;22183:127::-;22244:10;22239:3;22235:20;22232:1;22225:31;22275:4;22272:1;22265:15;22299:4;22296:1;22289:15

Swarm Source

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