ETH Price: $2,966.43 (-0.80%)
Gas: 8 Gwei

Token

 

Overview

Max Total Supply

212

Holders

203

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
teemojoshi.eth
0xc32438f7e4d3444acb88c23ecdadbc9989acc344
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:
GCCExclusive

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/GCCInterface.sol


pragma solidity ^0.8.0;


interface GCCInterface is IERC721{
    function walletOfOwner(address _owner) external view returns (uint256[] memory);
}
// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;







/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;


/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] -= amounts[i];
            }
        }
    }
}

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: contracts/GCCExclusive.sol



pragma solidity ^0.8.7;







contract GCCExclusive is ERC1155, Ownable, ReentrancyGuard {
    GCCInterface private gcc;

    string public baseURI;
    string public baseExtension = ".json";

    struct GCCCollection {
        bool mintPaused;
        uint256 mintMode;
        uint256 maxSupply;
        uint256 mintPrice;
        uint256 maxPerWallet;
        uint256 maxPerTx;
        uint256 tokensRequired;
        address interfaceAddress;
    }

    mapping(uint256 => GCCCollection) public collections;
    mapping(uint256 => uint256) public collectionSupply;

    uint256 public collectionIndex;

    mapping(uint256 => mapping(uint256 => bool)) public tokenIsClaimed;
    mapping(uint256 => mapping(address => uint256)) public walletCount;
    mapping(uint256 => mapping(address => bool)) public whitelist;

    bool public paused = false;

    constructor(string memory _baseURI) ERC1155(_baseURI) {
        setURI(_baseURI);
    }


    function addCollection(GCCCollection memory _c) external onlyOwner {
        collectionIndex += 1;
        collections[collectionIndex] = _c;
    }

    function editCollection(uint256 _cId, GCCCollection memory _c) external onlyOwner {
        require(collectionIndex >= _cId, "Invalid Collection");
        collections[_cId] = _c;
    }

    function toggleCollectionState(uint256 _cId) external onlyOwner {
        require(collectionIndex >= _cId, "Invalid Collection");
        collections[_cId].mintPaused = !collections[_cId].mintPaused;
    }

    function checkCollectionPaused(uint256 _cId) public view returns (bool){
        return collections[_cId].mintPaused;
    }

    function setCollectionMintMode(uint256 _cId, uint256 _mode) external onlyOwner {
        require(collectionIndex >= _cId, "Invalid Collection");
        collections[_cId].mintMode = _mode;
    }

    function setCollectionSupply(uint256 _cId, uint256 _supply) external onlyOwner {
        require(collectionIndex >= _cId, "Invalid Collection");
        collections[_cId].maxSupply = _supply;
    }

    function setCollectionMintPrice(uint256 _cId, uint256 _price) external onlyOwner {
        require(collectionIndex >= _cId, "Invalid Collection");
        collections[_cId].mintPrice = _price;
    }

    function setCollectionMintMech(uint256 _cId, uint256 _mode, uint256 _price, uint256 _wallet, uint256 _tx) external onlyOwner {
        require(collectionIndex >= _cId, "Invalid Collection");
        collections[_cId].mintMode = _mode;
        collections[_cId].mintPrice = _price;
        collections[_cId].maxPerWallet = _wallet;
        collections[_cId].maxPerTx = _tx;
    }

    function setCollectionInterface(uint256 _cId, address _gcc) external onlyOwner {
        require(collectionIndex >= _cId, "Invalid Collection");
        collections[_cId].interfaceAddress = _gcc;
    }

    function setCollectionTokenStates(uint256 _cId, uint256[] memory _tokenIds, bool _claimed) external onlyOwner {
        require(collectionIndex >= _cId, "Invalid Collection");
        for (uint256 i = 0; i < _tokenIds.length; i++) {
            uint256 _tokenId = _tokenIds[i];
            tokenIsClaimed[_cId][_tokenId] = _claimed;
        }
    }

    function addWhitelist(uint256 _cId, address[] memory _addresses) external onlyOwner {
        for (uint256 i; i < _addresses.length; i++) {
            whitelist[_cId][_addresses[i]] = true;
        }
    }

    function removeWhitelist(uint256 _cId, address[] memory _addresses) external onlyOwner {
        for (uint256 i; i < _addresses.length; i++) {
            whitelist[_cId][_addresses[i]] = false;
        }
    }


    modifier collectionIsOpen(uint256 _cId) {
        require(!checkCollectionPaused(_cId) && !paused, "Collection Paused");
        require(collectionIndex >= _cId, "Invalid Collection");
        _;
    }

    function gccMint(uint256 _cId, uint256 _numOfTokens) public onlyOwner {
        if (collections[_cId].maxSupply > 0) {
            require(collectionSupply[_cId] + _numOfTokens <= collections[_cId].maxSupply, "Exceeds Collection Max Supply");    
        }

        _mintToken(msg.sender, _cId, _numOfTokens);
    }

    function gccGift(address _to, uint256 _cId, uint256 _numOfTokens) public onlyOwner {
        if (collections[_cId].maxSupply > 0) {
            require(collectionSupply[_cId] + _numOfTokens <= collections[_cId].maxSupply, "Exceeds Collection Max Supply");    
        }

        _mintToken(_to, _cId, _numOfTokens);
    }

    function claim(uint256 _cId, uint256[] memory _tokenIds, uint256 _numOfTokens) public payable nonReentrant collectionIsOpen(_cId) {
        require(collections[_cId].mintMode == 1, "Collection not Claimable");
        if (collections[_cId].maxSupply > 0) {
            require(collectionSupply[_cId] + _numOfTokens <= collections[_cId].maxSupply, "Exceeds Collection Max Supply");    
        }
        require(msg.value >= collections[_cId].mintPrice * _numOfTokens, "Wrong Ether value");
        if (collections[_cId].maxPerWallet > 0) {
            require(walletCount[_cId][msg.sender] + _numOfTokens <= collections[_cId].maxPerWallet, "Exceeds Max Per Wallet");
        }
        if (collections[_cId].maxPerTx > 0) {
            require(_numOfTokens <= collections[_cId].maxPerTx, "Exceeds Max Per Transaction");
        }
        if (collections[_cId].tokensRequired > 0) {
            require(_tokenIds.length == collections[_cId].tokensRequired * _numOfTokens, "Wrong amount of Tokens");
        }

        for (uint256 i = 0; i < _tokenIds.length; i++) {
            uint256 _tokenId = _tokenIds[i];
            require(!tokenIsClaimed[_cId][_tokenId], "Token already Claimed");
            gcc = GCCInterface(collections[_cId].interfaceAddress);
            require(gcc.ownerOf(_tokenId) == msg.sender, "Invalid Token Owner!");
        }

        for (uint256 i = 0; i < _tokenIds.length; i++) {
            uint256 _tokenId = _tokenIds[i];
            tokenIsClaimed[_cId][_tokenId] = true;
        }

        _mintToken(msg.sender, _cId, _numOfTokens);
    }

    function whitelistMint(uint256 _cId, uint256 _numOfTokens) public payable nonReentrant collectionIsOpen(_cId) {
        require(collections[_cId].mintMode == 2, "Whitelist Mint not Active");
        require(whitelist[_cId][msg.sender], "Address is not whitelisted");
        if (collections[_cId].maxSupply > 0) {
            require(collectionSupply[_cId] + _numOfTokens <= collections[_cId].maxSupply, "Exceeds Collection Max Supply");    
        }
        require(msg.value >= collections[_cId].mintPrice * _numOfTokens, "Wrong Ether value");
        if (collections[_cId].maxPerWallet > 0) {
            require(walletCount[_cId][msg.sender] + _numOfTokens <= collections[_cId].maxPerWallet, "Exceeds Max Per Wallet");
        }
        if (collections[_cId].maxPerTx > 0) {
            require(_numOfTokens <= collections[_cId].maxPerTx, "Exceeds Max Per Transaction");
        }

        _mintToken(msg.sender, _cId, _numOfTokens);
    }

    function publicMint(uint256 _cId, uint256 _numOfTokens) public payable nonReentrant collectionIsOpen(_cId) {
        require(collections[_cId].mintMode == 3, "Public Mint not Active");
        if (collections[_cId].maxSupply > 0) {
            require(collectionSupply[_cId] + _numOfTokens <= collections[_cId].maxSupply, "Exceeds Collection Max Supply");    
        }
        require(msg.value >= collections[_cId].mintPrice * _numOfTokens, "Wrong Ether value");
        if (collections[_cId].maxPerWallet > 0) {
            require(walletCount[_cId][msg.sender] + _numOfTokens <= collections[_cId].maxPerWallet, "Exceeds Max Per Wallet");
        }
        if (collections[_cId].maxPerTx > 0) {
            require(_numOfTokens <= collections[_cId].maxPerTx, "Exceeds Max Per Transaction");
        }

        _mintToken(msg.sender, _cId, _numOfTokens);
    }

    function _mintToken(address _to, uint256 _cId, uint256 _numOfTokens) private {
        _mint(_to, _cId, _numOfTokens, "");
        walletCount[_cId][_to] += _numOfTokens;
        collectionSupply[_cId] += _numOfTokens;
    }


    function setURI(string memory _baseURI) public onlyOwner {
        baseURI = _baseURI;
        _setURI(_baseURI);
    }

    function uri(uint256 _cId) override public view returns (string memory) {
        return(
            string(abi.encodePacked(
                baseURI, 
                Strings.toString(_cId), 
                baseExtension
            ))
        );
    }

    function toggleState() public onlyOwner {
        paused = !paused;
    }


    function totalMint() public view returns (uint256) {
        uint256 total = 0;
        for (uint256 i = 1; i <= collectionIndex; i++) {
            total += collectionSupply[i];
        }

        return total;
    }

    function walletOfOwner(address _owner) external view returns (uint256[] memory) {
        uint256[] memory tokensId = new uint256[](collectionIndex + 1);
        for (uint256 i = 1; i <= collectionIndex; i++) {
            tokensId[i] = balanceOf(_owner, i);
        }

        return tokensId;
    }


    function withdraw() public onlyOwner {
        require(
            payable(owner()).send(address(this).balance),
            "Withdraw failed"
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"components":[{"internalType":"bool","name":"mintPaused","type":"bool"},{"internalType":"uint256","name":"mintMode","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"mintPrice","type":"uint256"},{"internalType":"uint256","name":"maxPerWallet","type":"uint256"},{"internalType":"uint256","name":"maxPerTx","type":"uint256"},{"internalType":"uint256","name":"tokensRequired","type":"uint256"},{"internalType":"address","name":"interfaceAddress","type":"address"}],"internalType":"struct GCCExclusive.GCCCollection","name":"_c","type":"tuple"}],"name":"addCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cId","type":"uint256"},{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cId","type":"uint256"}],"name":"checkCollectionPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cId","type":"uint256"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"_numOfTokens","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"collectionIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"collectionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"collections","outputs":[{"internalType":"bool","name":"mintPaused","type":"bool"},{"internalType":"uint256","name":"mintMode","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"mintPrice","type":"uint256"},{"internalType":"uint256","name":"maxPerWallet","type":"uint256"},{"internalType":"uint256","name":"maxPerTx","type":"uint256"},{"internalType":"uint256","name":"tokensRequired","type":"uint256"},{"internalType":"address","name":"interfaceAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cId","type":"uint256"},{"components":[{"internalType":"bool","name":"mintPaused","type":"bool"},{"internalType":"uint256","name":"mintMode","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"mintPrice","type":"uint256"},{"internalType":"uint256","name":"maxPerWallet","type":"uint256"},{"internalType":"uint256","name":"maxPerTx","type":"uint256"},{"internalType":"uint256","name":"tokensRequired","type":"uint256"},{"internalType":"address","name":"interfaceAddress","type":"address"}],"internalType":"struct GCCExclusive.GCCCollection","name":"_c","type":"tuple"}],"name":"editCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_cId","type":"uint256"},{"internalType":"uint256","name":"_numOfTokens","type":"uint256"}],"name":"gccGift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cId","type":"uint256"},{"internalType":"uint256","name":"_numOfTokens","type":"uint256"}],"name":"gccMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cId","type":"uint256"},{"internalType":"uint256","name":"_numOfTokens","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cId","type":"uint256"},{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"removeWhitelist","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":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cId","type":"uint256"},{"internalType":"address","name":"_gcc","type":"address"}],"name":"setCollectionInterface","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cId","type":"uint256"},{"internalType":"uint256","name":"_mode","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_wallet","type":"uint256"},{"internalType":"uint256","name":"_tx","type":"uint256"}],"name":"setCollectionMintMech","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cId","type":"uint256"},{"internalType":"uint256","name":"_mode","type":"uint256"}],"name":"setCollectionMintMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cId","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setCollectionMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cId","type":"uint256"},{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"setCollectionSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cId","type":"uint256"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"bool","name":"_claimed","type":"bool"}],"name":"setCollectionTokenStates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setURI","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":[{"internalType":"uint256","name":"_cId","type":"uint256"}],"name":"toggleCollectionState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIsClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"walletCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cId","type":"uint256"},{"internalType":"uint256","name":"_numOfTokens","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526005608081905264173539b7b760d91b60a090815262000028916007919062000180565b50600e805460ff191690553480156200004057600080fd5b5060405162003aa438038062003aa4833981016040819052620000639162000226565b806200006f8162000092565b506200007b33620000ab565b60016004556200008b81620000fd565b5062000355565b8051620000a790600290602084019062000180565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6003546001600160a01b031633146200015c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b80516200017190600690602084019062000180565b506200017d8162000092565b50565b8280546200018e9062000302565b90600052602060002090601f016020900481019282620001b25760008555620001fd565b82601f10620001cd57805160ff1916838001178555620001fd565b82800160010185558215620001fd579182015b82811115620001fd578251825591602001919060010190620001e0565b506200020b9291506200020f565b5090565b5b808211156200020b576000815560010162000210565b600060208083850312156200023a57600080fd5b82516001600160401b03808211156200025257600080fd5b818501915085601f8301126200026757600080fd5b8151818111156200027c576200027c6200033f565b604051601f8201601f19908116603f01168101908382118183101715620002a757620002a76200033f565b816040528281528886848701011115620002c057600080fd5b600093505b82841015620002e45784840186015181850187015292850192620002c5565b82841115620002f65760008684830101525b98975050505050505050565b600181811c908216806200031757607f821691505b602082108114156200033957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61373f80620003656000396000f3fe6080604052600436106102505760003560e01c80637589461b11610139578063d37e5104116100b6578063e985e9c51161007a578063e985e9c51461071b578063f13f762514610764578063f242432a14610784578063f2fde38b146107a4578063fad3b037146107c4578063fdbda0ec146107d757600080fd5b8063d37e510414610660578063d41b7ef214610675578063d5e89fcf146106ad578063d926d371146106e8578063dd3ace2e1461070857600080fd5b8063a22cb465116100fd578063a22cb465146105cb578063b070bb71146105eb578063b72aa47b1461060b578063c0cdfb251461062b578063c66828621461064b57600080fd5b80637589461b146105305780637e7fdadd146105505780638aa1e44e146105705780638da5cb5b1461059057806398ae99a8146105b857600080fd5b80633ccfd60b116101d25780635be98067116101965780635be98067146104865780635c975abb1461049c5780636c0360eb146104b65780636c221098146104cb578063715018a6146104eb578063736108801461050057600080fd5b80633ccfd60b146103d4578063438b6300146103e95780634b25bfce146104165780634e1273f41461045157806359a7715a1461047157600080fd5b8063192c445011610219578063192c4450146103275780631ad9c206146103475780631ae21c74146103675780632eb2c2d614610394578063391e4dc7146103b457600080fd5b8062fdd58e1461025557806301ffc9a71461028857806302fe5305146102b85780630e0e6e4e146102da5780630e89341c146102fa575b600080fd5b34801561026157600080fd5b50610275610270366004612dab565b610888565b6040519081526020015b60405180910390f35b34801561029457600080fd5b506102a86102a3366004612e6f565b61091f565b604051901515815260200161027f565b3480156102c457600080fd5b506102d86102d3366004612ea9565b610971565b005b3480156102e657600080fd5b506102d86102f5366004613052565b6109bb565b34801561030657600080fd5b5061031a610315366004612f0e565b610a1c565b60405161027f91906132bc565b34801561033357600080fd5b506102d8610342366004612f27565b610a53565b34801561035357600080fd5b506102d861036236600461302d565b610ad0565b34801561037357600080fd5b50610275610382366004612f0e565b60096020526000908152604090205481565b3480156103a057600080fd5b506102d86103af366004612c61565b610b9e565b3480156103c057600080fd5b506102d86103cf366004613052565b610c35565b3480156103e057600080fd5b506102d8610ccc565b3480156103f557600080fd5b50610409610404366004612bee565b610d5e565b60405161027f919061327b565b34801561042257600080fd5b506102a8610431366004612f27565b600d60209081526000928352604080842090915290825290205460ff1681565b34801561045d57600080fd5b5061040961046c366004612e0c565b610e00565b34801561047d57600080fd5b50610275610f29565b34801561049257600080fd5b50610275600a5481565b3480156104a857600080fd5b50600e546102a89060ff1681565b3480156104c257600080fd5b5061031a610f6b565b3480156104d757600080fd5b506102d86104e6366004612f4c565b610ff9565b3480156104f757600080fd5b506102d861109c565b34801561050c57600080fd5b506102a861051b366004612f0e565b60009081526008602052604090205460ff1690565b34801561053c57600080fd5b506102d861054b366004612dd7565b6110d0565b34801561055c57600080fd5b506102d861056b366004613052565b611163565b34801561057c57600080fd5b506102d861058b366004612f4c565b6111c4565b34801561059c57600080fd5b506003546040516001600160a01b03909116815260200161027f565b6102d86105c6366004613052565b611264565b3480156105d757600080fd5b506102d86105e6366004612d76565b611522565b3480156105f757600080fd5b506102d8610606366004613074565b61152d565b34801561061757600080fd5b506102d8610626366004613052565b6115a3565b34801561063757600080fd5b506102d8610646366004612f0e565b611604565b34801561065757600080fd5b5061031a611670565b34801561066c57600080fd5b506102d861167d565b34801561068157600080fd5b50610275610690366004612f27565b600c60209081526000928352604080842090915290825290205481565b3480156106b957600080fd5b506102a86106c8366004613052565b600b60209081526000928352604080842090915290825290205460ff1681565b3480156106f457600080fd5b506102d8610703366004612f88565b6116bb565b6102d8610716366004613052565b61176f565b34801561072757600080fd5b506102a8610736366004612c28565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561077057600080fd5b506102d861077f366004612ef1565b6118c3565b34801561079057600080fd5b506102d861079f366004612d0e565b61198c565b3480156107b057600080fd5b506102d86107bf366004612bee565b611a13565b6102d86107d2366004612fde565b611aab565b3480156107e357600080fd5b506108426107f2366004612f0e565b6008602052600090815260409020805460018201546002830154600384015460048501546005860154600687015460079097015460ff90961696949593949293919290916001600160a01b031688565b6040805198151589526020890197909752958701949094526060860192909252608085015260a084015260c08301526001600160a01b031660e08201526101000161027f565b60006001600160a01b0383166108f95760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061095057506001600160e01b031982166303a24d0760e21b145b8061096b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6003546001600160a01b0316331461099b5760405162461bcd60e51b81526004016108f0906133d1565b80516109ae90600690602084019061292a565b506109b881611fe1565b50565b6003546001600160a01b031633146109e55760405162461bcd60e51b81526004016108f0906133d1565b81600a541015610a075760405162461bcd60e51b81526004016108f090613406565b60009182526008602052604090912060030155565b60606006610a2983611ff4565b6007604051602001610a3d939291906131b0565b6040516020818303038152906040529050919050565b6003546001600160a01b03163314610a7d5760405162461bcd60e51b81526004016108f0906133d1565b81600a541015610a9f5760405162461bcd60e51b81526004016108f090613406565b60009182526008602052604090912060070180546001600160a01b0319166001600160a01b03909216919091179055565b6003546001600160a01b03163314610afa5760405162461bcd60e51b81526004016108f0906133d1565b81600a541015610b1c5760405162461bcd60e51b81526004016108f090613406565b6000918252600860209081526040928390208251815460ff1916901515178155908201516001820155918101516002830155606081015160038301556080810151600483015560a0810151600583015560c0810151600683015560e00151600790910180546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b038516331480610bba5750610bba8533610736565b610c215760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016108f0565b610c2e85858585856120f9565b5050505050565b6003546001600160a01b03163314610c5f5760405162461bcd60e51b81526004016108f0906133d1565b60008281526008602052604090206002015415610cbd57600082815260086020908152604080832060020154600990925290912054610c9f9083906134c3565b1115610cbd5760405162461bcd60e51b81526004016108f090613469565b610cc83383836122d6565b5050565b6003546001600160a01b03163314610cf65760405162461bcd60e51b81526004016108f0906133d1565b6003546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050610d5c5760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a191c985dc819985a5b1959608a1b60448201526064016108f0565b565b60606000600a546001610d7191906134c3565b6001600160401b03811115610d8857610d88613623565b604051908082528060200260200182016040528015610db1578160200160208202803683370190505b50905060015b600a548111610df957610dca8482610888565b828281518110610ddc57610ddc61360d565b602090810291909101015280610df1816135b2565b915050610db7565b5092915050565b60608151835114610e655760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016108f0565b600083516001600160401b03811115610e8057610e80613623565b604051908082528060200260200182016040528015610ea9578160200160208202803683370190505b50905060005b8451811015610f2157610ef4858281518110610ecd57610ecd61360d565b6020026020010151858381518110610ee757610ee761360d565b6020026020010151610888565b828281518110610f0657610f0661360d565b6020908102919091010152610f1a816135b2565b9050610eaf565b509392505050565b60008060015b600a548111610f6557600081815260096020526040902054610f5190836134c3565b915080610f5d816135b2565b915050610f2f565b50919050565b60068054610f7890613551565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa490613551565b8015610ff15780601f10610fc657610100808354040283529160200191610ff1565b820191906000526020600020905b815481529060010190602001808311610fd457829003601f168201915b505050505081565b6003546001600160a01b031633146110235760405162461bcd60e51b81526004016108f0906133d1565b60005b8151811015611097576000838152600d60205260408120835182908590859081106110535761105361360d565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061108f816135b2565b915050611026565b505050565b6003546001600160a01b031633146110c65760405162461bcd60e51b81526004016108f0906133d1565b610d5c6000612350565b6003546001600160a01b031633146110fa5760405162461bcd60e51b81526004016108f0906133d1565b600082815260086020526040902060020154156111585760008281526008602090815260408083206002015460099092529091205461113a9083906134c3565b11156111585760405162461bcd60e51b81526004016108f090613469565b6110978383836122d6565b6003546001600160a01b0316331461118d5760405162461bcd60e51b81526004016108f0906133d1565b81600a5410156111af5760405162461bcd60e51b81526004016108f090613406565b60009182526008602052604090912060010155565b6003546001600160a01b031633146111ee5760405162461bcd60e51b81526004016108f0906133d1565b60005b8151811015611097576000838152600d602052604081208351600192908590859081106112205761122061360d565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061125c816135b2565b9150506111f1565b600260045414156112875760405162461bcd60e51b81526004016108f090613432565b6002600455600082815260086020526040902054829060ff161580156112b05750600e5460ff16155b6112cc5760405162461bcd60e51b81526004016108f090613317565b80600a5410156112ee5760405162461bcd60e51b81526004016108f090613406565b6000838152600860205260409020600101546003146113485760405162461bcd60e51b81526020600482015260166024820152755075626c6963204d696e74206e6f742041637469766560501b60448201526064016108f0565b600083815260086020526040902060020154156113a6576000838152600860209081526040808320600201546009909252909120546113889084906134c3565b11156113a65760405162461bcd60e51b81526004016108f090613469565b6000838152600860205260409020600301546113c39083906134ef565b3410156114065760405162461bcd60e51b815260206004820152601160248201527057726f6e672045746865722076616c756560781b60448201526064016108f0565b6000838152600860205260409020600401541561149557600083815260086020908152604080832060040154600c83528184203385529092529091205461144e9084906134c3565b11156114955760405162461bcd60e51b8152602060048201526016602482015275115e18d959591cc813585e0814195c8815d85b1b195d60521b60448201526064016108f0565b6000838152600860205260409020600501541561150d5760008381526008602052604090206005015482111561150d5760405162461bcd60e51b815260206004820152601b60248201527f45786365656473204d617820506572205472616e73616374696f6e000000000060448201526064016108f0565b6115183384846122d6565b5050600160045550565b610cc83383836123a2565b6003546001600160a01b031633146115575760405162461bcd60e51b81526004016108f0906133d1565b84600a5410156115795760405162461bcd60e51b81526004016108f090613406565b60009485526008602052604090942060018101939093556003830191909155600482015560050155565b6003546001600160a01b031633146115cd5760405162461bcd60e51b81526004016108f0906133d1565b81600a5410156115ef5760405162461bcd60e51b81526004016108f090613406565b60009182526008602052604090912060020155565b6003546001600160a01b0316331461162e5760405162461bcd60e51b81526004016108f0906133d1565b80600a5410156116505760405162461bcd60e51b81526004016108f090613406565b6000908152600860205260409020805460ff19811660ff90911615179055565b60078054610f7890613551565b6003546001600160a01b031633146116a75760405162461bcd60e51b81526004016108f0906133d1565b600e805460ff19811660ff90911615179055565b6003546001600160a01b031633146116e55760405162461bcd60e51b81526004016108f0906133d1565b82600a5410156117075760405162461bcd60e51b81526004016108f090613406565b60005b82518110156117695760008382815181106117275761172761360d565b6020908102919091018101516000878152600b83526040808220928252919092529020805460ff19168415151790555080611761816135b2565b91505061170a565b50505050565b600260045414156117925760405162461bcd60e51b81526004016108f090613432565b6002600455600082815260086020526040902054829060ff161580156117bb5750600e5460ff16155b6117d75760405162461bcd60e51b81526004016108f090613317565b80600a5410156117f95760405162461bcd60e51b81526004016108f090613406565b60008381526008602052604090206001015460021461185a5760405162461bcd60e51b815260206004820152601960248201527f57686974656c697374204d696e74206e6f74204163746976650000000000000060448201526064016108f0565b6000838152600d6020908152604080832033845290915290205460ff166113485760405162461bcd60e51b815260206004820152601a60248201527f41646472657373206973206e6f742077686974656c697374656400000000000060448201526064016108f0565b6003546001600160a01b031633146118ed5760405162461bcd60e51b81526004016108f0906133d1565b6001600a600082825461190091906134c3565b9091555050600a546000908152600860209081526040918290208351815460ff1916901515178155908301516001820155908201516002820155606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e090910151600790910180546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b0385163314806119a857506119a88533610736565b611a065760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b60648201526084016108f0565b610c2e8585858585612483565b6003546001600160a01b03163314611a3d5760405162461bcd60e51b81526004016108f0906133d1565b6001600160a01b038116611aa25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108f0565b6109b881612350565b60026004541415611ace5760405162461bcd60e51b81526004016108f090613432565b6002600455600083815260086020526040902054839060ff16158015611af75750600e5460ff16155b611b135760405162461bcd60e51b81526004016108f090613317565b80600a541015611b355760405162461bcd60e51b81526004016108f090613406565b600084815260086020526040902060019081015414611b965760405162461bcd60e51b815260206004820152601860248201527f436f6c6c656374696f6e206e6f7420436c61696d61626c65000000000000000060448201526064016108f0565b60008481526008602052604090206002015415611bf457600084815260086020908152604080832060020154600990925290912054611bd69084906134c3565b1115611bf45760405162461bcd60e51b81526004016108f090613469565b600084815260086020526040902060030154611c119083906134ef565b341015611c545760405162461bcd60e51b815260206004820152601160248201527057726f6e672045746865722076616c756560781b60448201526064016108f0565b60008481526008602052604090206004015415611ce357600084815260086020908152604080832060040154600c835281842033855290925290912054611c9c9084906134c3565b1115611ce35760405162461bcd60e51b8152602060048201526016602482015275115e18d959591cc813585e0814195c8815d85b1b195d60521b60448201526064016108f0565b60008481526008602052604090206005015415611d5b57600084815260086020526040902060050154821115611d5b5760405162461bcd60e51b815260206004820152601b60248201527f45786365656473204d617820506572205472616e73616374696f6e000000000060448201526064016108f0565b60008481526008602052604090206006015415611dd757600084815260086020526040902060060154611d8f9083906134ef565b835114611dd75760405162461bcd60e51b815260206004820152601660248201527557726f6e6720616d6f756e74206f6620546f6b656e7360501b60448201526064016108f0565b60005b8351811015611f68576000848281518110611df757611df761360d565b6020908102919091018101516000888152600b83526040808220838352909352919091205490915060ff1615611e675760405162461bcd60e51b8152602060048201526015602482015274151bdad95b88185b1c9958591e4810db185a5b5959605a1b60448201526064016108f0565b6000868152600860205260409081902060070154600580546001600160a01b0319166001600160a01b03909216918217905590516331a9108f60e11b815260048101839052339190636352211e9060240160206040518083038186803b158015611ed057600080fd5b505afa158015611ee4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f089190612c0b565b6001600160a01b031614611f555760405162461bcd60e51b8152602060048201526014602482015273496e76616c696420546f6b656e204f776e65722160601b60448201526064016108f0565b5080611f60816135b2565b915050611dda565b5060005b8351811015611fca576000848281518110611f8957611f8961360d565b6020908102919091018101516000888152600b83526040808220928252919092529020805460ff191660011790555080611fc2816135b2565b915050611f6c565b50611fd63385846122d6565b505060016004555050565b8051610cc890600290602084019061292a565b6060816120185750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612042578061202c816135b2565b915061203b9050600a836134db565b915061201c565b6000816001600160401b0381111561205c5761205c613623565b6040519080825280601f01601f191660200182016040528015612086576020820181803683370190505b5090505b84156120f15761209b60018361350e565b91506120a8600a866135cd565b6120b39060306134c3565b60f81b8183815181106120c8576120c861360d565b60200101906001600160f81b031916908160001a9053506120ea600a866134db565b945061208a565b949350505050565b815183511461215b5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016108f0565b6001600160a01b0384166121815760405162461bcd60e51b81526004016108f090613342565b3360005b84518110156122685760008582815181106121a2576121a261360d565b6020026020010151905060008583815181106121c0576121c061360d565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156122105760405162461bcd60e51b81526004016108f090613387565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061224d9084906134c3565b9250508190555050505080612261906135b2565b9050612185565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516122b892919061328e565b60405180910390a46122ce8187878787876125a9565b505050505050565b6122f183838360405180602001604052806000815250612714565b6000828152600c602090815260408083206001600160a01b0387168452909152812080548392906123239084906134c3565b9091555050600082815260096020526040812080548392906123469084906134c3565b9091555050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156124165760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016108f0565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166124a95760405162461bcd60e51b81526004016108f090613342565b336124c28187876124b988612815565b610c2e88612815565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156125035760405162461bcd60e51b81526004016108f090613387565b6000858152602081815260408083206001600160a01b038b81168552925280832087850390559088168252812080548692906125409084906134c3565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46125a0828888888888612860565b50505050505050565b6001600160a01b0384163b156122ce5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906125ed90899089908890889088906004016131e3565b602060405180830381600087803b15801561260757600080fd5b505af1925050508015612637575060408051601f3d908101601f1916820190925261263491810190612e8c565b60015b6126e457612643613639565b806308c379a0141561267d5750612658613655565b80612663575061267f565b8060405162461bcd60e51b81526004016108f091906132bc565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016108f0565b6001600160e01b0319811663bc197c8160e01b146125a05760405162461bcd60e51b81526004016108f0906132cf565b6001600160a01b0384166127745760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016108f0565b33612785816000876124b988612815565b6000848152602081815260408083206001600160a01b0389168452909152812080548592906127b59084906134c3565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610c2e81600087878787612860565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061284f5761284f61360d565b602090810291909101015292915050565b6001600160a01b0384163b156122ce5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906128a49089908990889088908890600401613241565b602060405180830381600087803b1580156128be57600080fd5b505af19250505080156128ee575060408051601f3d908101601f191682019092526128eb91810190612e8c565b60015b6128fa57612643613639565b6001600160e01b0319811663f23a6e6160e01b146125a05760405162461bcd60e51b81526004016108f0906132cf565b82805461293690613551565b90600052602060002090601f016020900481019282612958576000855561299e565b82601f1061297157805160ff191683800117855561299e565b8280016001018555821561299e579182015b8281111561299e578251825591602001919060010190612983565b506129aa9291506129ae565b5090565b5b808211156129aa57600081556001016129af565b60006001600160401b038311156129dc576129dc613623565b6040516129f3601f8501601f191660200182613586565b809150838152848484011115612a0857600080fd5b83836020830137600060208583010152509392505050565b8035612a2b816136de565b919050565b600082601f830112612a4157600080fd5b81356020612a4e826134a0565b604051612a5b8282613586565b8381528281019150858301600585901b87018401881015612a7b57600080fd5b60005b85811015612aa3578135612a91816136de565b84529284019290840190600101612a7e565b5090979650505050505050565b600082601f830112612ac157600080fd5b81356020612ace826134a0565b604051612adb8282613586565b8381528281019150858301600585901b87018401881015612afb57600080fd5b60005b85811015612aa357813584529284019290840190600101612afe565b80358015158114612a2b57600080fd5b600082601f830112612b3b57600080fd5b612b4a838335602085016129c3565b9392505050565b6000610100808385031215612b6557600080fd5b604051908101906001600160401b0382118183101715612b8757612b87613623565b81604052809250612b9784612b1a565b81526020840135602082015260408401356040820152606084013560608201526080840135608082015260a084013560a082015260c084013560c0820152612be160e08501612a20565b60e0820152505092915050565b600060208284031215612c0057600080fd5b8135612b4a816136de565b600060208284031215612c1d57600080fd5b8151612b4a816136de565b60008060408385031215612c3b57600080fd5b8235612c46816136de565b91506020830135612c56816136de565b809150509250929050565b600080600080600060a08688031215612c7957600080fd5b8535612c84816136de565b94506020860135612c94816136de565b935060408601356001600160401b0380821115612cb057600080fd5b612cbc89838a01612ab0565b94506060880135915080821115612cd257600080fd5b612cde89838a01612ab0565b93506080880135915080821115612cf457600080fd5b50612d0188828901612b2a565b9150509295509295909350565b600080600080600060a08688031215612d2657600080fd5b8535612d31816136de565b94506020860135612d41816136de565b9350604086013592506060860135915060808601356001600160401b03811115612d6a57600080fd5b612d0188828901612b2a565b60008060408385031215612d8957600080fd5b8235612d94816136de565b9150612da260208401612b1a565b90509250929050565b60008060408385031215612dbe57600080fd5b8235612dc9816136de565b946020939093013593505050565b600080600060608486031215612dec57600080fd5b8335612df7816136de565b95602085013595506040909401359392505050565b60008060408385031215612e1f57600080fd5b82356001600160401b0380821115612e3657600080fd5b612e4286838701612a30565b93506020850135915080821115612e5857600080fd5b50612e6585828601612ab0565b9150509250929050565b600060208284031215612e8157600080fd5b8135612b4a816136f3565b600060208284031215612e9e57600080fd5b8151612b4a816136f3565b600060208284031215612ebb57600080fd5b81356001600160401b03811115612ed157600080fd5b8201601f81018413612ee257600080fd5b6120f1848235602084016129c3565b60006101008284031215612f0457600080fd5b612b4a8383612b51565b600060208284031215612f2057600080fd5b5035919050565b60008060408385031215612f3a57600080fd5b823591506020830135612c56816136de565b60008060408385031215612f5f57600080fd5b8235915060208301356001600160401b03811115612f7c57600080fd5b612e6585828601612a30565b600080600060608486031215612f9d57600080fd5b8335925060208401356001600160401b03811115612fba57600080fd5b612fc686828701612ab0565b925050612fd560408501612b1a565b90509250925092565b600080600060608486031215612ff357600080fd5b8335925060208401356001600160401b0381111561301057600080fd5b61301c86828701612ab0565b925050604084013590509250925092565b600080610120838503121561304157600080fd5b82359150612da28460208501612b51565b6000806040838503121561306557600080fd5b50508035926020909101359150565b600080600080600060a0868803121561308c57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b600081518084526020808501945080840160005b838110156130df578151875295820195908201906001016130c3565b509495945050505050565b60008151808452613102816020860160208601613525565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061313057607f831692505b602080841082141561315257634e487b7160e01b600052602260045260246000fd5b8180156131665760018114613177576131a4565b60ff198616895284890196506131a4565b60008881526020902060005b8681101561319c5781548b820152908501908301613183565b505084890196505b50505050505092915050565b60006131bc8286613116565b84516131cc818360208901613525565b6131d881830186613116565b979650505050505050565b6001600160a01b0386811682528516602082015260a06040820181905260009061320f908301866130af565b828103606084015261322181866130af565b9050828103608084015261323581856130ea565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906131d8908301846130ea565b602081526000612b4a60208301846130af565b6040815260006132a160408301856130af565b82810360208401526132b381856130af565b95945050505050565b602081526000612b4a60208301846130ea565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526011908201527010dbdb1b1958dd1a5bdb8814185d5cd959607a1b604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526012908201527124b73b30b634b21021b7b63632b1ba34b7b760711b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601d908201527f4578636565647320436f6c6c656374696f6e204d617820537570706c79000000604082015260600190565b60006001600160401b038211156134b9576134b9613623565b5060051b60200190565b600082198211156134d6576134d66135e1565b500190565b6000826134ea576134ea6135f7565b500490565b6000816000190483118215151615613509576135096135e1565b500290565b600082821015613520576135206135e1565b500390565b60005b83811015613540578181015183820152602001613528565b838111156117695750506000910152565b600181811c9082168061356557607f821691505b60208210811415610f6557634e487b7160e01b600052602260045260246000fd5b601f8201601f191681016001600160401b03811182821017156135ab576135ab613623565b6040525050565b60006000198214156135c6576135c66135e1565b5060010190565b6000826135dc576135dc6135f7565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d11156136525760046000803e5060005160e01c5b90565b600060443d10156136635790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561369257505050505090565b82850191508151818111156136aa5750505050505090565b843d87010160208285010111156136c45750505050505090565b6136d360208286010187613586565b509095945050505050565b6001600160a01b03811681146109b857600080fd5b6001600160e01b0319811681146109b857600080fdfea2646970667358221220fd3200507d512286f03762c291e734414a5c0ac510759323319b2dc9785c67aa64736f6c634300080700330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d646a7334455756536e587a736d746a633875417176474162526a66624d31666e4d6758655a566a41597965612f00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102505760003560e01c80637589461b11610139578063d37e5104116100b6578063e985e9c51161007a578063e985e9c51461071b578063f13f762514610764578063f242432a14610784578063f2fde38b146107a4578063fad3b037146107c4578063fdbda0ec146107d757600080fd5b8063d37e510414610660578063d41b7ef214610675578063d5e89fcf146106ad578063d926d371146106e8578063dd3ace2e1461070857600080fd5b8063a22cb465116100fd578063a22cb465146105cb578063b070bb71146105eb578063b72aa47b1461060b578063c0cdfb251461062b578063c66828621461064b57600080fd5b80637589461b146105305780637e7fdadd146105505780638aa1e44e146105705780638da5cb5b1461059057806398ae99a8146105b857600080fd5b80633ccfd60b116101d25780635be98067116101965780635be98067146104865780635c975abb1461049c5780636c0360eb146104b65780636c221098146104cb578063715018a6146104eb578063736108801461050057600080fd5b80633ccfd60b146103d4578063438b6300146103e95780634b25bfce146104165780634e1273f41461045157806359a7715a1461047157600080fd5b8063192c445011610219578063192c4450146103275780631ad9c206146103475780631ae21c74146103675780632eb2c2d614610394578063391e4dc7146103b457600080fd5b8062fdd58e1461025557806301ffc9a71461028857806302fe5305146102b85780630e0e6e4e146102da5780630e89341c146102fa575b600080fd5b34801561026157600080fd5b50610275610270366004612dab565b610888565b6040519081526020015b60405180910390f35b34801561029457600080fd5b506102a86102a3366004612e6f565b61091f565b604051901515815260200161027f565b3480156102c457600080fd5b506102d86102d3366004612ea9565b610971565b005b3480156102e657600080fd5b506102d86102f5366004613052565b6109bb565b34801561030657600080fd5b5061031a610315366004612f0e565b610a1c565b60405161027f91906132bc565b34801561033357600080fd5b506102d8610342366004612f27565b610a53565b34801561035357600080fd5b506102d861036236600461302d565b610ad0565b34801561037357600080fd5b50610275610382366004612f0e565b60096020526000908152604090205481565b3480156103a057600080fd5b506102d86103af366004612c61565b610b9e565b3480156103c057600080fd5b506102d86103cf366004613052565b610c35565b3480156103e057600080fd5b506102d8610ccc565b3480156103f557600080fd5b50610409610404366004612bee565b610d5e565b60405161027f919061327b565b34801561042257600080fd5b506102a8610431366004612f27565b600d60209081526000928352604080842090915290825290205460ff1681565b34801561045d57600080fd5b5061040961046c366004612e0c565b610e00565b34801561047d57600080fd5b50610275610f29565b34801561049257600080fd5b50610275600a5481565b3480156104a857600080fd5b50600e546102a89060ff1681565b3480156104c257600080fd5b5061031a610f6b565b3480156104d757600080fd5b506102d86104e6366004612f4c565b610ff9565b3480156104f757600080fd5b506102d861109c565b34801561050c57600080fd5b506102a861051b366004612f0e565b60009081526008602052604090205460ff1690565b34801561053c57600080fd5b506102d861054b366004612dd7565b6110d0565b34801561055c57600080fd5b506102d861056b366004613052565b611163565b34801561057c57600080fd5b506102d861058b366004612f4c565b6111c4565b34801561059c57600080fd5b506003546040516001600160a01b03909116815260200161027f565b6102d86105c6366004613052565b611264565b3480156105d757600080fd5b506102d86105e6366004612d76565b611522565b3480156105f757600080fd5b506102d8610606366004613074565b61152d565b34801561061757600080fd5b506102d8610626366004613052565b6115a3565b34801561063757600080fd5b506102d8610646366004612f0e565b611604565b34801561065757600080fd5b5061031a611670565b34801561066c57600080fd5b506102d861167d565b34801561068157600080fd5b50610275610690366004612f27565b600c60209081526000928352604080842090915290825290205481565b3480156106b957600080fd5b506102a86106c8366004613052565b600b60209081526000928352604080842090915290825290205460ff1681565b3480156106f457600080fd5b506102d8610703366004612f88565b6116bb565b6102d8610716366004613052565b61176f565b34801561072757600080fd5b506102a8610736366004612c28565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561077057600080fd5b506102d861077f366004612ef1565b6118c3565b34801561079057600080fd5b506102d861079f366004612d0e565b61198c565b3480156107b057600080fd5b506102d86107bf366004612bee565b611a13565b6102d86107d2366004612fde565b611aab565b3480156107e357600080fd5b506108426107f2366004612f0e565b6008602052600090815260409020805460018201546002830154600384015460048501546005860154600687015460079097015460ff90961696949593949293919290916001600160a01b031688565b6040805198151589526020890197909752958701949094526060860192909252608085015260a084015260c08301526001600160a01b031660e08201526101000161027f565b60006001600160a01b0383166108f95760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061095057506001600160e01b031982166303a24d0760e21b145b8061096b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6003546001600160a01b0316331461099b5760405162461bcd60e51b81526004016108f0906133d1565b80516109ae90600690602084019061292a565b506109b881611fe1565b50565b6003546001600160a01b031633146109e55760405162461bcd60e51b81526004016108f0906133d1565b81600a541015610a075760405162461bcd60e51b81526004016108f090613406565b60009182526008602052604090912060030155565b60606006610a2983611ff4565b6007604051602001610a3d939291906131b0565b6040516020818303038152906040529050919050565b6003546001600160a01b03163314610a7d5760405162461bcd60e51b81526004016108f0906133d1565b81600a541015610a9f5760405162461bcd60e51b81526004016108f090613406565b60009182526008602052604090912060070180546001600160a01b0319166001600160a01b03909216919091179055565b6003546001600160a01b03163314610afa5760405162461bcd60e51b81526004016108f0906133d1565b81600a541015610b1c5760405162461bcd60e51b81526004016108f090613406565b6000918252600860209081526040928390208251815460ff1916901515178155908201516001820155918101516002830155606081015160038301556080810151600483015560a0810151600583015560c0810151600683015560e00151600790910180546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b038516331480610bba5750610bba8533610736565b610c215760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016108f0565b610c2e85858585856120f9565b5050505050565b6003546001600160a01b03163314610c5f5760405162461bcd60e51b81526004016108f0906133d1565b60008281526008602052604090206002015415610cbd57600082815260086020908152604080832060020154600990925290912054610c9f9083906134c3565b1115610cbd5760405162461bcd60e51b81526004016108f090613469565b610cc83383836122d6565b5050565b6003546001600160a01b03163314610cf65760405162461bcd60e51b81526004016108f0906133d1565b6003546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050610d5c5760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a191c985dc819985a5b1959608a1b60448201526064016108f0565b565b60606000600a546001610d7191906134c3565b6001600160401b03811115610d8857610d88613623565b604051908082528060200260200182016040528015610db1578160200160208202803683370190505b50905060015b600a548111610df957610dca8482610888565b828281518110610ddc57610ddc61360d565b602090810291909101015280610df1816135b2565b915050610db7565b5092915050565b60608151835114610e655760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016108f0565b600083516001600160401b03811115610e8057610e80613623565b604051908082528060200260200182016040528015610ea9578160200160208202803683370190505b50905060005b8451811015610f2157610ef4858281518110610ecd57610ecd61360d565b6020026020010151858381518110610ee757610ee761360d565b6020026020010151610888565b828281518110610f0657610f0661360d565b6020908102919091010152610f1a816135b2565b9050610eaf565b509392505050565b60008060015b600a548111610f6557600081815260096020526040902054610f5190836134c3565b915080610f5d816135b2565b915050610f2f565b50919050565b60068054610f7890613551565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa490613551565b8015610ff15780601f10610fc657610100808354040283529160200191610ff1565b820191906000526020600020905b815481529060010190602001808311610fd457829003601f168201915b505050505081565b6003546001600160a01b031633146110235760405162461bcd60e51b81526004016108f0906133d1565b60005b8151811015611097576000838152600d60205260408120835182908590859081106110535761105361360d565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061108f816135b2565b915050611026565b505050565b6003546001600160a01b031633146110c65760405162461bcd60e51b81526004016108f0906133d1565b610d5c6000612350565b6003546001600160a01b031633146110fa5760405162461bcd60e51b81526004016108f0906133d1565b600082815260086020526040902060020154156111585760008281526008602090815260408083206002015460099092529091205461113a9083906134c3565b11156111585760405162461bcd60e51b81526004016108f090613469565b6110978383836122d6565b6003546001600160a01b0316331461118d5760405162461bcd60e51b81526004016108f0906133d1565b81600a5410156111af5760405162461bcd60e51b81526004016108f090613406565b60009182526008602052604090912060010155565b6003546001600160a01b031633146111ee5760405162461bcd60e51b81526004016108f0906133d1565b60005b8151811015611097576000838152600d602052604081208351600192908590859081106112205761122061360d565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061125c816135b2565b9150506111f1565b600260045414156112875760405162461bcd60e51b81526004016108f090613432565b6002600455600082815260086020526040902054829060ff161580156112b05750600e5460ff16155b6112cc5760405162461bcd60e51b81526004016108f090613317565b80600a5410156112ee5760405162461bcd60e51b81526004016108f090613406565b6000838152600860205260409020600101546003146113485760405162461bcd60e51b81526020600482015260166024820152755075626c6963204d696e74206e6f742041637469766560501b60448201526064016108f0565b600083815260086020526040902060020154156113a6576000838152600860209081526040808320600201546009909252909120546113889084906134c3565b11156113a65760405162461bcd60e51b81526004016108f090613469565b6000838152600860205260409020600301546113c39083906134ef565b3410156114065760405162461bcd60e51b815260206004820152601160248201527057726f6e672045746865722076616c756560781b60448201526064016108f0565b6000838152600860205260409020600401541561149557600083815260086020908152604080832060040154600c83528184203385529092529091205461144e9084906134c3565b11156114955760405162461bcd60e51b8152602060048201526016602482015275115e18d959591cc813585e0814195c8815d85b1b195d60521b60448201526064016108f0565b6000838152600860205260409020600501541561150d5760008381526008602052604090206005015482111561150d5760405162461bcd60e51b815260206004820152601b60248201527f45786365656473204d617820506572205472616e73616374696f6e000000000060448201526064016108f0565b6115183384846122d6565b5050600160045550565b610cc83383836123a2565b6003546001600160a01b031633146115575760405162461bcd60e51b81526004016108f0906133d1565b84600a5410156115795760405162461bcd60e51b81526004016108f090613406565b60009485526008602052604090942060018101939093556003830191909155600482015560050155565b6003546001600160a01b031633146115cd5760405162461bcd60e51b81526004016108f0906133d1565b81600a5410156115ef5760405162461bcd60e51b81526004016108f090613406565b60009182526008602052604090912060020155565b6003546001600160a01b0316331461162e5760405162461bcd60e51b81526004016108f0906133d1565b80600a5410156116505760405162461bcd60e51b81526004016108f090613406565b6000908152600860205260409020805460ff19811660ff90911615179055565b60078054610f7890613551565b6003546001600160a01b031633146116a75760405162461bcd60e51b81526004016108f0906133d1565b600e805460ff19811660ff90911615179055565b6003546001600160a01b031633146116e55760405162461bcd60e51b81526004016108f0906133d1565b82600a5410156117075760405162461bcd60e51b81526004016108f090613406565b60005b82518110156117695760008382815181106117275761172761360d565b6020908102919091018101516000878152600b83526040808220928252919092529020805460ff19168415151790555080611761816135b2565b91505061170a565b50505050565b600260045414156117925760405162461bcd60e51b81526004016108f090613432565b6002600455600082815260086020526040902054829060ff161580156117bb5750600e5460ff16155b6117d75760405162461bcd60e51b81526004016108f090613317565b80600a5410156117f95760405162461bcd60e51b81526004016108f090613406565b60008381526008602052604090206001015460021461185a5760405162461bcd60e51b815260206004820152601960248201527f57686974656c697374204d696e74206e6f74204163746976650000000000000060448201526064016108f0565b6000838152600d6020908152604080832033845290915290205460ff166113485760405162461bcd60e51b815260206004820152601a60248201527f41646472657373206973206e6f742077686974656c697374656400000000000060448201526064016108f0565b6003546001600160a01b031633146118ed5760405162461bcd60e51b81526004016108f0906133d1565b6001600a600082825461190091906134c3565b9091555050600a546000908152600860209081526040918290208351815460ff1916901515178155908301516001820155908201516002820155606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e090910151600790910180546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b0385163314806119a857506119a88533610736565b611a065760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b60648201526084016108f0565b610c2e8585858585612483565b6003546001600160a01b03163314611a3d5760405162461bcd60e51b81526004016108f0906133d1565b6001600160a01b038116611aa25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108f0565b6109b881612350565b60026004541415611ace5760405162461bcd60e51b81526004016108f090613432565b6002600455600083815260086020526040902054839060ff16158015611af75750600e5460ff16155b611b135760405162461bcd60e51b81526004016108f090613317565b80600a541015611b355760405162461bcd60e51b81526004016108f090613406565b600084815260086020526040902060019081015414611b965760405162461bcd60e51b815260206004820152601860248201527f436f6c6c656374696f6e206e6f7420436c61696d61626c65000000000000000060448201526064016108f0565b60008481526008602052604090206002015415611bf457600084815260086020908152604080832060020154600990925290912054611bd69084906134c3565b1115611bf45760405162461bcd60e51b81526004016108f090613469565b600084815260086020526040902060030154611c119083906134ef565b341015611c545760405162461bcd60e51b815260206004820152601160248201527057726f6e672045746865722076616c756560781b60448201526064016108f0565b60008481526008602052604090206004015415611ce357600084815260086020908152604080832060040154600c835281842033855290925290912054611c9c9084906134c3565b1115611ce35760405162461bcd60e51b8152602060048201526016602482015275115e18d959591cc813585e0814195c8815d85b1b195d60521b60448201526064016108f0565b60008481526008602052604090206005015415611d5b57600084815260086020526040902060050154821115611d5b5760405162461bcd60e51b815260206004820152601b60248201527f45786365656473204d617820506572205472616e73616374696f6e000000000060448201526064016108f0565b60008481526008602052604090206006015415611dd757600084815260086020526040902060060154611d8f9083906134ef565b835114611dd75760405162461bcd60e51b815260206004820152601660248201527557726f6e6720616d6f756e74206f6620546f6b656e7360501b60448201526064016108f0565b60005b8351811015611f68576000848281518110611df757611df761360d565b6020908102919091018101516000888152600b83526040808220838352909352919091205490915060ff1615611e675760405162461bcd60e51b8152602060048201526015602482015274151bdad95b88185b1c9958591e4810db185a5b5959605a1b60448201526064016108f0565b6000868152600860205260409081902060070154600580546001600160a01b0319166001600160a01b03909216918217905590516331a9108f60e11b815260048101839052339190636352211e9060240160206040518083038186803b158015611ed057600080fd5b505afa158015611ee4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f089190612c0b565b6001600160a01b031614611f555760405162461bcd60e51b8152602060048201526014602482015273496e76616c696420546f6b656e204f776e65722160601b60448201526064016108f0565b5080611f60816135b2565b915050611dda565b5060005b8351811015611fca576000848281518110611f8957611f8961360d565b6020908102919091018101516000888152600b83526040808220928252919092529020805460ff191660011790555080611fc2816135b2565b915050611f6c565b50611fd63385846122d6565b505060016004555050565b8051610cc890600290602084019061292a565b6060816120185750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612042578061202c816135b2565b915061203b9050600a836134db565b915061201c565b6000816001600160401b0381111561205c5761205c613623565b6040519080825280601f01601f191660200182016040528015612086576020820181803683370190505b5090505b84156120f15761209b60018361350e565b91506120a8600a866135cd565b6120b39060306134c3565b60f81b8183815181106120c8576120c861360d565b60200101906001600160f81b031916908160001a9053506120ea600a866134db565b945061208a565b949350505050565b815183511461215b5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016108f0565b6001600160a01b0384166121815760405162461bcd60e51b81526004016108f090613342565b3360005b84518110156122685760008582815181106121a2576121a261360d565b6020026020010151905060008583815181106121c0576121c061360d565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156122105760405162461bcd60e51b81526004016108f090613387565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061224d9084906134c3565b9250508190555050505080612261906135b2565b9050612185565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516122b892919061328e565b60405180910390a46122ce8187878787876125a9565b505050505050565b6122f183838360405180602001604052806000815250612714565b6000828152600c602090815260408083206001600160a01b0387168452909152812080548392906123239084906134c3565b9091555050600082815260096020526040812080548392906123469084906134c3565b9091555050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156124165760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016108f0565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166124a95760405162461bcd60e51b81526004016108f090613342565b336124c28187876124b988612815565b610c2e88612815565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156125035760405162461bcd60e51b81526004016108f090613387565b6000858152602081815260408083206001600160a01b038b81168552925280832087850390559088168252812080548692906125409084906134c3565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46125a0828888888888612860565b50505050505050565b6001600160a01b0384163b156122ce5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906125ed90899089908890889088906004016131e3565b602060405180830381600087803b15801561260757600080fd5b505af1925050508015612637575060408051601f3d908101601f1916820190925261263491810190612e8c565b60015b6126e457612643613639565b806308c379a0141561267d5750612658613655565b80612663575061267f565b8060405162461bcd60e51b81526004016108f091906132bc565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016108f0565b6001600160e01b0319811663bc197c8160e01b146125a05760405162461bcd60e51b81526004016108f0906132cf565b6001600160a01b0384166127745760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016108f0565b33612785816000876124b988612815565b6000848152602081815260408083206001600160a01b0389168452909152812080548592906127b59084906134c3565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610c2e81600087878787612860565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061284f5761284f61360d565b602090810291909101015292915050565b6001600160a01b0384163b156122ce5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906128a49089908990889088908890600401613241565b602060405180830381600087803b1580156128be57600080fd5b505af19250505080156128ee575060408051601f3d908101601f191682019092526128eb91810190612e8c565b60015b6128fa57612643613639565b6001600160e01b0319811663f23a6e6160e01b146125a05760405162461bcd60e51b81526004016108f0906132cf565b82805461293690613551565b90600052602060002090601f016020900481019282612958576000855561299e565b82601f1061297157805160ff191683800117855561299e565b8280016001018555821561299e579182015b8281111561299e578251825591602001919060010190612983565b506129aa9291506129ae565b5090565b5b808211156129aa57600081556001016129af565b60006001600160401b038311156129dc576129dc613623565b6040516129f3601f8501601f191660200182613586565b809150838152848484011115612a0857600080fd5b83836020830137600060208583010152509392505050565b8035612a2b816136de565b919050565b600082601f830112612a4157600080fd5b81356020612a4e826134a0565b604051612a5b8282613586565b8381528281019150858301600585901b87018401881015612a7b57600080fd5b60005b85811015612aa3578135612a91816136de565b84529284019290840190600101612a7e565b5090979650505050505050565b600082601f830112612ac157600080fd5b81356020612ace826134a0565b604051612adb8282613586565b8381528281019150858301600585901b87018401881015612afb57600080fd5b60005b85811015612aa357813584529284019290840190600101612afe565b80358015158114612a2b57600080fd5b600082601f830112612b3b57600080fd5b612b4a838335602085016129c3565b9392505050565b6000610100808385031215612b6557600080fd5b604051908101906001600160401b0382118183101715612b8757612b87613623565b81604052809250612b9784612b1a565b81526020840135602082015260408401356040820152606084013560608201526080840135608082015260a084013560a082015260c084013560c0820152612be160e08501612a20565b60e0820152505092915050565b600060208284031215612c0057600080fd5b8135612b4a816136de565b600060208284031215612c1d57600080fd5b8151612b4a816136de565b60008060408385031215612c3b57600080fd5b8235612c46816136de565b91506020830135612c56816136de565b809150509250929050565b600080600080600060a08688031215612c7957600080fd5b8535612c84816136de565b94506020860135612c94816136de565b935060408601356001600160401b0380821115612cb057600080fd5b612cbc89838a01612ab0565b94506060880135915080821115612cd257600080fd5b612cde89838a01612ab0565b93506080880135915080821115612cf457600080fd5b50612d0188828901612b2a565b9150509295509295909350565b600080600080600060a08688031215612d2657600080fd5b8535612d31816136de565b94506020860135612d41816136de565b9350604086013592506060860135915060808601356001600160401b03811115612d6a57600080fd5b612d0188828901612b2a565b60008060408385031215612d8957600080fd5b8235612d94816136de565b9150612da260208401612b1a565b90509250929050565b60008060408385031215612dbe57600080fd5b8235612dc9816136de565b946020939093013593505050565b600080600060608486031215612dec57600080fd5b8335612df7816136de565b95602085013595506040909401359392505050565b60008060408385031215612e1f57600080fd5b82356001600160401b0380821115612e3657600080fd5b612e4286838701612a30565b93506020850135915080821115612e5857600080fd5b50612e6585828601612ab0565b9150509250929050565b600060208284031215612e8157600080fd5b8135612b4a816136f3565b600060208284031215612e9e57600080fd5b8151612b4a816136f3565b600060208284031215612ebb57600080fd5b81356001600160401b03811115612ed157600080fd5b8201601f81018413612ee257600080fd5b6120f1848235602084016129c3565b60006101008284031215612f0457600080fd5b612b4a8383612b51565b600060208284031215612f2057600080fd5b5035919050565b60008060408385031215612f3a57600080fd5b823591506020830135612c56816136de565b60008060408385031215612f5f57600080fd5b8235915060208301356001600160401b03811115612f7c57600080fd5b612e6585828601612a30565b600080600060608486031215612f9d57600080fd5b8335925060208401356001600160401b03811115612fba57600080fd5b612fc686828701612ab0565b925050612fd560408501612b1a565b90509250925092565b600080600060608486031215612ff357600080fd5b8335925060208401356001600160401b0381111561301057600080fd5b61301c86828701612ab0565b925050604084013590509250925092565b600080610120838503121561304157600080fd5b82359150612da28460208501612b51565b6000806040838503121561306557600080fd5b50508035926020909101359150565b600080600080600060a0868803121561308c57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b600081518084526020808501945080840160005b838110156130df578151875295820195908201906001016130c3565b509495945050505050565b60008151808452613102816020860160208601613525565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061313057607f831692505b602080841082141561315257634e487b7160e01b600052602260045260246000fd5b8180156131665760018114613177576131a4565b60ff198616895284890196506131a4565b60008881526020902060005b8681101561319c5781548b820152908501908301613183565b505084890196505b50505050505092915050565b60006131bc8286613116565b84516131cc818360208901613525565b6131d881830186613116565b979650505050505050565b6001600160a01b0386811682528516602082015260a06040820181905260009061320f908301866130af565b828103606084015261322181866130af565b9050828103608084015261323581856130ea565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906131d8908301846130ea565b602081526000612b4a60208301846130af565b6040815260006132a160408301856130af565b82810360208401526132b381856130af565b95945050505050565b602081526000612b4a60208301846130ea565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526011908201527010dbdb1b1958dd1a5bdb8814185d5cd959607a1b604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526012908201527124b73b30b634b21021b7b63632b1ba34b7b760711b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601d908201527f4578636565647320436f6c6c656374696f6e204d617820537570706c79000000604082015260600190565b60006001600160401b038211156134b9576134b9613623565b5060051b60200190565b600082198211156134d6576134d66135e1565b500190565b6000826134ea576134ea6135f7565b500490565b6000816000190483118215151615613509576135096135e1565b500290565b600082821015613520576135206135e1565b500390565b60005b83811015613540578181015183820152602001613528565b838111156117695750506000910152565b600181811c9082168061356557607f821691505b60208210811415610f6557634e487b7160e01b600052602260045260246000fd5b601f8201601f191681016001600160401b03811182821017156135ab576135ab613623565b6040525050565b60006000198214156135c6576135c66135e1565b5060010190565b6000826135dc576135dc6135f7565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d11156136525760046000803e5060005160e01c5b90565b600060443d10156136635790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561369257505050505090565b82850191508151818111156136aa5750505050505090565b843d87010160208285010111156136c45750505050505090565b6136d360208286010187613586565b509095945050505050565b6001600160a01b03811681146109b857600080fd5b6001600160e01b0319811681146109b857600080fdfea2646970667358221220fd3200507d512286f03762c291e734414a5c0ac510759323319b2dc9785c67aa64736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d646a7334455756536e587a736d746a633875417176474162526a66624d31666e4d6758655a566a41597965612f00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseURI (string): https://ipfs.io/ipfs/Qmdjs4EWVSnXzsmtjc8uAqvGAbRjfbM1fnMgXeZVjAYyea/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000044
Arg [2] : 68747470733a2f2f697066732e696f2f697066732f516d646a7334455756536e
Arg [3] : 587a736d746a633875417176474162526a66624d31666e4d6758655a566a4159
Arg [4] : 7965612f00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

48732:9463:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28063:231;;;;;;;;;;-1:-1:-1;28063:231:0;;;;;:::i;:::-;;:::i;:::-;;;28286:25:1;;;28274:2;28259:18;28063:231:0;;;;;;;;27086:310;;;;;;;;;;-1:-1:-1;27086:310:0;;;;;:::i;:::-;;:::i;:::-;;;16611:14:1;;16604:22;16586:41;;16574:2;16559:18;27086:310:0;16446:187:1;56992:122:0;;;;;;;;;;-1:-1:-1;56992:122:0;;;;;:::i;:::-;;:::i;:::-;;50801:201;;;;;;;;;;-1:-1:-1;50801:201:0;;;;;:::i;:::-;;:::i;57122:263::-;;;;;;;;;;-1:-1:-1;57122:263:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;51402:204::-;;;;;;;;;;-1:-1:-1;51402:204:0;;;;;:::i;:::-;;:::i;49843:188::-;;;;;;;;;;-1:-1:-1;49843:188:0;;;;;:::i;:::-;;:::i;49236:51::-;;;;;;;;;;-1:-1:-1;49236:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;30002:442;;;;;;;;;;-1:-1:-1;30002:442:0;;;;;:::i;:::-;;:::i;52631:321::-;;;;;;;;;;-1:-1:-1;52631:321:0;;;;;:::i;:::-;;:::i;58027:165::-;;;;;;;;;;;;;:::i;57710:307::-;;;;;;;;;;-1:-1:-1;57710:307:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;49481:61::-;;;;;;;;;;-1:-1:-1;49481:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;28460:524;;;;;;;;;;-1:-1:-1;28460:524:0;;;;;:::i;:::-;;:::i;57478:224::-;;;;;;;;;;;;;:::i;49296:30::-;;;;;;;;;;;;;;;;49551:26;;;;;;;;;;-1:-1:-1;49551:26:0;;;;;;;;48831:21;;;;;;;;;;;;;:::i;52194:214::-;;;;;;;;;;-1:-1:-1;52194:214:0;;;;;:::i;:::-;;:::i;45074:103::-;;;;;;;;;;;;;:::i;50255:125::-;;;;;;;;;;-1:-1:-1;50255:125:0;;;;;:::i;:::-;50321:4;50344:17;;;:11;:17;;;;;:28;;;;50255:125;52960:327;;;;;;;;;;-1:-1:-1;52960:327:0;;;;;:::i;:::-;;:::i;50388:197::-;;;;;;;;;;-1:-1:-1;50388:197:0;;;;;:::i;:::-;;:::i;51976:210::-;;;;;;;;;;-1:-1:-1;51976:210:0;;;;;:::i;:::-;;:::i;44423:87::-;;;;;;;;;;-1:-1:-1;44496:6:0;;44423:87;;-1:-1:-1;;;;;44496:6:0;;;14252:51:1;;14240:2;14225:18;44423:87:0;14106:203:1;55870:876:0;;;;;;:::i;:::-;;:::i;29057:155::-;;;;;;;;;;-1:-1:-1;29057:155:0;;;;;:::i;:::-;;:::i;51010:384::-;;;;;;;;;;-1:-1:-1;51010:384:0;;;;;:::i;:::-;;:::i;50593:200::-;;;;;;;;;;-1:-1:-1;50593:200:0;;;;;:::i;:::-;;:::i;50039:208::-;;;;;;;;;;-1:-1:-1;50039:208:0;;;;;:::i;:::-;;:::i;48859:37::-;;;;;;;;;;;;;:::i;57393:75::-;;;;;;;;;;;;;:::i;49408:66::-;;;;;;;;;;-1:-1:-1;49408:66:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;49335;;;;;;;;;;-1:-1:-1;49335:66:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;51614:354;;;;;;;;;;-1:-1:-1;51614:354:0;;;;;:::i;:::-;;:::i;54903:959::-;;;;;;:::i;:::-;;:::i;29284:168::-;;;;;;;;;;-1:-1:-1;29284:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;29407:27:0;;;29383:4;29407:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;29284:168;49685:150;;;;;;;;;;-1:-1:-1;49685:150:0;;;;;:::i;:::-;;:::i;29524:401::-;;;;;;;;;;-1:-1:-1;29524:401:0;;;;;:::i;:::-;;:::i;45332:201::-;;;;;;;;;;-1:-1:-1;45332:201:0;;;;;:::i;:::-;;:::i;53295:1600::-;;;;;;:::i;:::-;;:::i;49177:52::-;;;;;;;;;;-1:-1:-1;49177:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49177:52:0;;;;;;;17000:14:1;;16993:22;16975:41;;17047:2;17032:18;;17025:34;;;;17075:18;;;17068:34;;;;17133:2;17118:18;;17111:34;;;;17176:3;17161:19;;17154:35;17220:3;17205:19;;17198:35;17264:3;17249:19;;17242:35;-1:-1:-1;;;;;17314:32:1;17308:3;17293:19;;17286:61;16962:3;16947:19;49177:52:0;16638:715:1;28063:231:0;28149:7;-1:-1:-1;;;;;28177:21:0;;28169:77;;;;-1:-1:-1;;;28169:77:0;;18960:2:1;28169:77:0;;;18942:21:1;18999:2;18979:18;;;18972:30;19038:34;19018:18;;;19011:62;-1:-1:-1;;;19089:18:1;;;19082:41;19140:19;;28169:77:0;;;;;;;;;-1:-1:-1;28264:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;28264:22:0;;;;;;;;;;;;28063:231::o;27086:310::-;27188:4;-1:-1:-1;;;;;;27225:41:0;;-1:-1:-1;;;27225:41:0;;:110;;-1:-1:-1;;;;;;;27283:52:0;;-1:-1:-1;;;27283:52:0;27225:110;:163;;;-1:-1:-1;;;;;;;;;;15486:40:0;;;27352:36;27205:183;27086:310;-1:-1:-1;;27086:310:0:o;56992:122::-;44496:6;;-1:-1:-1;;;;;44496:6:0;25875:10;44643:23;44635:68;;;;-1:-1:-1;;;44635:68:0;;;;;;;:::i;:::-;57060:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;57089:17;57097:8;57089:7;:17::i;:::-;56992:122:::0;:::o;50801:201::-;44496:6;;-1:-1:-1;;;;;44496:6:0;25875:10;44643:23;44635:68;;;;-1:-1:-1;;;44635:68:0;;;;;;;:::i;:::-;50920:4:::1;50901:15;;:23;;50893:54;;;;-1:-1:-1::0;;;50893:54:0::1;;;;;;;:::i;:::-;50958:17;::::0;;;:11:::1;:17;::::0;;;;;:27:::1;;:36:::0;50801:201::o;57122:263::-;57179:13;57268:7;57295:22;57312:4;57295:16;:22::i;:::-;57337:13;57233:132;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57205:172;;57122:263;;;:::o;51402:204::-;44496:6;;-1:-1:-1;;;;;44496:6:0;25875:10;44643:23;44635:68;;;;-1:-1:-1;;;44635:68:0;;;;;;;:::i;:::-;51519:4:::1;51500:15;;:23;;51492:54;;;;-1:-1:-1::0;;;51492:54:0::1;;;;;;;:::i;:::-;51557:17;::::0;;;:11:::1;:17;::::0;;;;;:34:::1;;:41:::0;;-1:-1:-1;;;;;;51557:41:0::1;-1:-1:-1::0;;;;;51557:41:0;;::::1;::::0;;;::::1;::::0;;51402:204::o;49843:188::-;44496:6;;-1:-1:-1;;;;;44496:6:0;25875:10;44643:23;44635:68;;;;-1:-1:-1;;;44635:68:0;;;;;;;:::i;:::-;49963:4:::1;49944:15;;:23;;49936:54;;;;-1:-1:-1::0;;;49936:54:0::1;;;;;;;:::i;:::-;50001:17;::::0;;;:11:::1;:17;::::0;;;;;;;;:22;;;;-1:-1:-1;;50001:22:0::1;::::0;::::1;;;::::0;;;;::::1;::::0;-1:-1:-1;50001:22:0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;50001:22:0::1;-1:-1:-1::0;;;;;50001:22:0;;::::1;::::0;;;::::1;::::0;;49843:188::o;30002:442::-;-1:-1:-1;;;;;30235:20:0;;25875:10;30235:20;;:60;;-1:-1:-1;30259:36:0;30276:4;25875:10;29284:168;:::i;30259:36::-;30213:160;;;;-1:-1:-1;;;30213:160:0;;21645:2:1;30213:160:0;;;21627:21:1;21684:2;21664:18;;;21657:30;21723:34;21703:18;;;21696:62;-1:-1:-1;;;21774:18:1;;;21767:48;21832:19;;30213:160:0;21443:414:1;30213:160:0;30384:52;30407:4;30413:2;30417:3;30422:7;30431:4;30384:22;:52::i;:::-;30002:442;;;;;:::o;52631:321::-;44496:6;;-1:-1:-1;;;;;44496:6:0;25875:10;44643:23;44635:68;;;;-1:-1:-1;;;44635:68:0;;;;;;;:::i;:::-;52746:1:::1;52716:17:::0;;;:11:::1;:17;::::0;;;;:27:::1;;::::0;:31;52712:178:::1;;52813:17;::::0;;;:11:::1;:17;::::0;;;;;;;:27:::1;;::::0;52772:16:::1;:22:::0;;;;;;;:37:::1;::::0;52797:12;;52772:37:::1;:::i;:::-;:68;;52764:110;;;;-1:-1:-1::0;;;52764:110:0::1;;;;;;;:::i;:::-;52902:42;52913:10;52925:4;52931:12;52902:10;:42::i;:::-;52631:321:::0;;:::o;58027:165::-;44496:6;;-1:-1:-1;;;;;44496:6:0;25875:10;44643:23;44635:68;;;;-1:-1:-1;;;44635:68:0;;;;;;;:::i;:::-;44496:6;;58097:44:::1;::::0;-1:-1:-1;;;;;44496:6:0;;;;58119:21:::1;58097:44:::0;::::1;;;::::0;::::1;::::0;;;58119:21;44496:6;58097:44;::::1;;;;;;58075:109;;;::::0;-1:-1:-1;;;58075:109:0;;19779:2:1;58075:109:0::1;::::0;::::1;19761:21:1::0;19818:2;19798:18;;;19791:30;-1:-1:-1;;;19837:18:1;;;19830:45;19892:18;;58075:109:0::1;19577:339:1::0;58075:109:0::1;58027:165::o:0;57710:307::-;57772:16;57801:25;57843:15;;57861:1;57843:19;;;;:::i;:::-;-1:-1:-1;;;;;57829:34:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57829:34:0;-1:-1:-1;57801:62:0;-1:-1:-1;57891:1:0;57874:108;57899:15;;57894:1;:20;57874:108;;57950:20;57960:6;57968:1;57950:9;:20::i;:::-;57936:8;57945:1;57936:11;;;;;;;;:::i;:::-;;;;;;;;;;:34;57916:3;;;;:::i;:::-;;;;57874:108;;;-1:-1:-1;58001:8:0;57710:307;-1:-1:-1;;57710:307:0:o;28460:524::-;28616:16;28677:3;:10;28658:8;:15;:29;28650:83;;;;-1:-1:-1;;;28650:83:0;;26053:2:1;28650:83:0;;;26035:21:1;26092:2;26072:18;;;26065:30;26131:34;26111:18;;;26104:62;-1:-1:-1;;;26182:18:1;;;26175:39;26231:19;;28650:83:0;25851:405:1;28650:83:0;28746:30;28793:8;:15;-1:-1:-1;;;;;28779:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28779:30:0;;28746:63;;28827:9;28822:122;28846:8;:15;28842:1;:19;28822:122;;;28902:30;28912:8;28921:1;28912:11;;;;;;;;:::i;:::-;;;;;;;28925:3;28929:1;28925:6;;;;;;;;:::i;:::-;;;;;;;28902:9;:30::i;:::-;28883:13;28897:1;28883:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;28863:3;;;:::i;:::-;;;28822:122;;;-1:-1:-1;28963:13:0;28460:524;-1:-1:-1;;;28460:524:0:o;57478:224::-;57520:7;;57585:1;57568:102;57593:15;;57588:1;:20;57568:102;;57639:19;;;;:16;:19;;;;;;57630:28;;;;:::i;:::-;;-1:-1:-1;57610:3:0;;;;:::i;:::-;;;;57568:102;;;-1:-1:-1;57689:5:0;57478:224;-1:-1:-1;57478:224:0:o;48831:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52194:214::-;44496:6;;-1:-1:-1;;;;;44496:6:0;25875:10;44643:23;44635:68;;;;-1:-1:-1;;;44635:68:0;;;;;;;:::i;:::-;52297:9:::1;52292:109;52312:10;:17;52308:1;:21;52292:109;;;52384:5;52351:15:::0;;;:9:::1;:15;::::0;;;;52367:13;;52384:5;;52367:10;;52378:1;;52367:13;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;52351:30:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;52351:30:0;:38;;-1:-1:-1;;52351:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52331:3;::::1;::::0;::::1;:::i;:::-;;;;52292:109;;;;52194:214:::0;;:::o;45074:103::-;44496:6;;-1:-1:-1;;;;;44496:6:0;25875:10;44643:23;44635:68;;;;-1:-1:-1;;;44635:68:0;;;;;;;:::i;:::-;45139:30:::1;45166:1;45139:18;:30::i;52960:327::-:0;44496:6;;-1:-1:-1;;;;;44496:6:0;25875:10;44643:23;44635:68;;;;-1:-1:-1;;;44635:68:0;;;;;;;:::i;:::-;53088:1:::1;53058:17:::0;;;:11:::1;:17;::::0;;;;:27:::1;;::::0;:31;53054:178:::1;;53155:17;::::0;;;:11:::1;:17;::::0;;;;;;;:27:::1;;::::0;53114:16:::1;:22:::0;;;;;;;:37:::1;::::0;53139:12;;53114:37:::1;:::i;:::-;:68;;53106:110;;;;-1:-1:-1::0;;;53106:110:0::1;;;;;;;:::i;:::-;53244:35;53255:3;53260:4;53266:12;53244:10;:35::i;50388:197::-:0;44496:6;;-1:-1:-1;;;;;44496:6:0;25875:10;44643:23;44635:68;;;;-1:-1:-1;;;44635:68:0;;;;;;;:::i;:::-;50505:4:::1;50486:15;;:23;;50478:54;;;;-1:-1:-1::0;;;50478:54:0::1;;;;;;;:::i;:::-;50543:17;::::0;;;:11:::1;:17;::::0;;;;;:26:::1;;:34:::0;50388:197::o;51976:210::-;44496:6;;-1:-1:-1;;;;;44496:6:0;25875:10;44643:23;44635:68;;;;-1:-1:-1;;;44635:68:0;;;;;;;:::i;:::-;52076:9:::1;52071:108;52091:10;:17;52087:1;:21;52071:108;;;52130:15;::::0;;;:9:::1;:15;::::0;;;;52146:13;;52163:4:::1;::::0;52130:15;52146:10;;52157:1;;52146:13;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;52130:30:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;52130:30:0;:37;;-1:-1:-1;;52130:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52110:3;::::1;::::0;::::1;:::i;:::-;;;;52071:108;;55870:876:::0;47703:1;48301:7;;:19;;48293:63;;;;-1:-1:-1;;;48293:63:0;;;;;;;:::i;:::-;47703:1;48434:7;:18;50321:4;50344:17;;;:11;:17;;;;;:28;55971:4;;50344:28;;52477::::1;:39;;;;-1:-1:-1::0;52510:6:0::1;::::0;::::1;;52509:7;52477:39;52469:69;;;;-1:-1:-1::0;;;52469:69:0::1;;;;;;;:::i;:::-;52576:4;52557:15;;:23;;52549:54;;;;-1:-1:-1::0;;;52549:54:0::1;;;;;;;:::i;:::-;55996:17:::2;::::0;;;:11:::2;:17;::::0;;;;:26:::2;;::::0;56026:1:::2;55996:31;55988:66;;;::::0;-1:-1:-1;;;55988:66:0;;20888:2:1;55988:66:0::2;::::0;::::2;20870:21:1::0;20927:2;20907:18;;;20900:30;-1:-1:-1;;;20946:18:1;;;20939:52;21008:18;;55988:66:0::2;20686:346:1::0;55988:66:0::2;56099:1;56069:17:::0;;;:11:::2;:17;::::0;;;;:27:::2;;::::0;:31;56065:178:::2;;56166:17;::::0;;;:11:::2;:17;::::0;;;;;;;:27:::2;;::::0;56125:16:::2;:22:::0;;;;;;;:37:::2;::::0;56150:12;;56125:37:::2;:::i;:::-;:68;;56117:110;;;;-1:-1:-1::0;;;56117:110:0::2;;;;;;;:::i;:::-;56274:17;::::0;;;:11:::2;:17;::::0;;;;:27:::2;;::::0;:42:::2;::::0;56304:12;;56274:42:::2;:::i;:::-;56261:9;:55;;56253:85;;;::::0;-1:-1:-1;;;56253:85:0;;25297:2:1;56253:85:0::2;::::0;::::2;25279:21:1::0;25336:2;25316:18;;;25309:30;-1:-1:-1;;;25355:18:1;;;25348:47;25412:18;;56253:85:0::2;25095:341:1::0;56253:85:0::2;56386:1;56353:17:::0;;;:11:::2;:17;::::0;;;;:30:::2;;::::0;:34;56349:180:::2;;56460:17;::::0;;;:11:::2;:17;::::0;;;;;;;:30:::2;;::::0;56412:11:::2;:17:::0;;;;;56430:10:::2;56412:29:::0;;;;;;;;;:44:::2;::::0;56444:12;;56412:44:::2;:::i;:::-;:78;;56404:113;;;::::0;-1:-1:-1;;;56404:113:0;;24946:2:1;56404:113:0::2;::::0;::::2;24928:21:1::0;24985:2;24965:18;;;24958:30;-1:-1:-1;;;25004:18:1;;;24997:52;25066:18;;56404:113:0::2;24744:346:1::0;56404:113:0::2;56572:1;56543:17:::0;;;:11:::2;:17;::::0;;;;:26:::2;;::::0;:30;56539:145:::2;;56614:17;::::0;;;:11:::2;:17;::::0;;;;:26:::2;;::::0;56598:42;::::2;;56590:82;;;::::0;-1:-1:-1;;;56590:82:0;;22064:2:1;56590:82:0::2;::::0;::::2;22046:21:1::0;22103:2;22083:18;;;22076:30;22142:29;22122:18;;;22115:57;22189:18;;56590:82:0::2;21862:351:1::0;56590:82:0::2;56696:42;56707:10;56719:4;56725:12;56696:10;:42::i;:::-;-1:-1:-1::0;;47659:1:0;48613:7;:22;-1:-1:-1;55870:876:0:o;29057:155::-;29152:52;25875:10;29185:8;29195;29152:18;:52::i;51010:384::-;44496:6;;-1:-1:-1;;;;;44496:6:0;25875:10;44643:23;44635:68;;;;-1:-1:-1;;;44635:68:0;;;;;;;:::i;:::-;51173:4:::1;51154:15;;:23;;51146:54;;;;-1:-1:-1::0;;;51146:54:0::1;;;;;;;:::i;:::-;51211:17;::::0;;;:11:::1;:17;::::0;;;;;:26:::1;::::0;::::1;:34:::0;;;;51256:27:::1;::::0;::::1;:36:::0;;;;51303:30:::1;::::0;::::1;:40:::0;51354:26:::1;;:32:::0;51010:384::o;50593:200::-;44496:6;;-1:-1:-1;;;;;44496:6:0;25875:10;44643:23;44635:68;;;;-1:-1:-1;;;44635:68:0;;;;;;;:::i;:::-;50710:4:::1;50691:15;;:23;;50683:54;;;;-1:-1:-1::0;;;50683:54:0::1;;;;;;;:::i;:::-;50748:17;::::0;;;:11:::1;:17;::::0;;;;;:27:::1;;:37:::0;50593:200::o;50039:208::-;44496:6;;-1:-1:-1;;;;;44496:6:0;25875:10;44643:23;44635:68;;;;-1:-1:-1;;;44635:68:0;;;;;;;:::i;:::-;50141:4:::1;50122:15;;:23;;50114:54;;;;-1:-1:-1::0;;;50114:54:0::1;;;;;;;:::i;:::-;50211:17;::::0;;;:11:::1;:17;::::0;;;;:28;;-1:-1:-1;;50179:60:0;::::1;50211:28;::::0;;::::1;50210:29;50179:60;::::0;;50039:208::o;48859:37::-;;;;;;;:::i;57393:75::-;44496:6;;-1:-1:-1;;;;;44496:6:0;25875:10;44643:23;44635:68;;;;-1:-1:-1;;;44635:68:0;;;;;;;:::i;:::-;57454:6:::1;::::0;;-1:-1:-1;;57444:16:0;::::1;57454:6;::::0;;::::1;57453:7;57444:16;::::0;;57393:75::o;51614:354::-;44496:6;;-1:-1:-1;;;;;44496:6:0;25875:10;44643:23;44635:68;;;;-1:-1:-1;;;44635:68:0;;;;;;;:::i;:::-;51762:4:::1;51743:15;;:23;;51735:54;;;;-1:-1:-1::0;;;51735:54:0::1;;;;;;;:::i;:::-;51805:9;51800:161;51824:9;:16;51820:1;:20;51800:161;;;51862:16;51881:9;51891:1;51881:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;51908:20:::1;::::0;;;:14:::1;:20:::0;;;;;;:30;;;;;;;;;:41;;-1:-1:-1;;51908:41:0::1;::::0;::::1;;;::::0;;-1:-1:-1;51842:3:0;::::1;::::0;::::1;:::i;:::-;;;;51800:161;;;;51614:354:::0;;;:::o;54903:959::-;47703:1;48301:7;;:19;;48293:63;;;;-1:-1:-1;;;48293:63:0;;;;;;;:::i;:::-;47703:1;48434:7;:18;50321:4;50344:17;;;:11;:17;;;;;:28;55007:4;;50344:28;;52477::::1;:39;;;;-1:-1:-1::0;52510:6:0::1;::::0;::::1;;52509:7;52477:39;52469:69;;;;-1:-1:-1::0;;;52469:69:0::1;;;;;;;:::i;:::-;52576:4;52557:15;;:23;;52549:54;;;;-1:-1:-1::0;;;52549:54:0::1;;;;;;;:::i;:::-;55032:17:::2;::::0;;;:11:::2;:17;::::0;;;;:26:::2;;::::0;55062:1:::2;55032:31;55024:69;;;::::0;-1:-1:-1;;;55024:69:0;;24245:2:1;55024:69:0::2;::::0;::::2;24227:21:1::0;24284:2;24264:18;;;24257:30;24323:27;24303:18;;;24296:55;24368:18;;55024:69:0::2;24043:349:1::0;55024:69:0::2;55112:15;::::0;;;:9:::2;:15;::::0;;;;;;;55128:10:::2;55112:27:::0;;;;;;;;::::2;;55104:66;;;::::0;-1:-1:-1;;;55104:66:0;;20533:2:1;55104:66:0::2;::::0;::::2;20515:21:1::0;20572:2;20552:18;;;20545:30;20611:28;20591:18;;;20584:56;20657:18;;55104:66:0::2;20331:350:1::0;49685:150:0;44496:6;;-1:-1:-1;;;;;44496:6:0;25875:10;44643:23;44635:68;;;;-1:-1:-1;;;44635:68:0;;;;;;;:::i;:::-;49782:1:::1;49763:15;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;49806:15:0::1;::::0;49794:28:::1;::::0;;;:11:::1;:28;::::0;;;;;;;;:33;;;;-1:-1:-1;;49794:33:0::1;::::0;::::1;;;::::0;;;;::::1;::::0;-1:-1:-1;49794:33:0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;49794:33:0::1;-1:-1:-1::0;;;;;49794:33:0;;::::1;::::0;;;::::1;::::0;;49685:150::o;29524:401::-;-1:-1:-1;;;;;29732:20:0;;25875:10;29732:20;;:60;;-1:-1:-1;29756:36:0;29773:4;25875:10;29284:168;:::i;29756:36::-;29710:151;;;;-1:-1:-1;;;29710:151:0;;20123:2:1;29710:151:0;;;20105:21:1;20162:2;20142:18;;;20135:30;20201:34;20181:18;;;20174:62;-1:-1:-1;;;20252:18:1;;;20245:39;20301:19;;29710:151:0;19921:405:1;29710:151:0;29872:45;29890:4;29896:2;29900;29904:6;29912:4;29872:17;:45::i;45332:201::-;44496:6;;-1:-1:-1;;;;;44496:6:0;25875:10;44643:23;44635:68;;;;-1:-1:-1;;;44635:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45421:22:0;::::1;45413:73;;;::::0;-1:-1:-1;;;45413:73:0;;19372:2:1;45413:73:0::1;::::0;::::1;19354:21:1::0;19411:2;19391:18;;;19384:30;19450:34;19430:18;;;19423:62;-1:-1:-1;;;19501:18:1;;;19494:36;19547:19;;45413:73:0::1;19170:402:1::0;45413:73:0::1;45497:28;45516:8;45497:18;:28::i;53295:1600::-:0;47703:1;48301:7;;:19;;48293:63;;;;-1:-1:-1;;;48293:63:0;;;;;;;:::i;:::-;47703:1;48434:7;:18;50321:4;50344:17;;;:11;:17;;;;;:28;53419:4;;50344:28;;52477::::1;:39;;;;-1:-1:-1::0;52510:6:0::1;::::0;::::1;;52509:7;52477:39;52469:69;;;;-1:-1:-1::0;;;52469:69:0::1;;;;;;;:::i;:::-;52576:4;52557:15;;:23;;52549:54;;;;-1:-1:-1::0;;;52549:54:0::1;;;;;;;:::i;:::-;53444:17:::2;::::0;;;:11:::2;:17;::::0;;;;:26:::2;::::0;;::::2;::::0;:31:::2;53436:68;;;::::0;-1:-1:-1;;;53436:68:0;;22420:2:1;53436:68:0::2;::::0;::::2;22402:21:1::0;22459:2;22439:18;;;22432:30;22498:26;22478:18;;;22471:54;22542:18;;53436:68:0::2;22218:348:1::0;53436:68:0::2;53549:1;53519:17:::0;;;:11:::2;:17;::::0;;;;:27:::2;;::::0;:31;53515:178:::2;;53616:17;::::0;;;:11:::2;:17;::::0;;;;;;;:27:::2;;::::0;53575:16:::2;:22:::0;;;;;;;:37:::2;::::0;53600:12;;53575:37:::2;:::i;:::-;:68;;53567:110;;;;-1:-1:-1::0;;;53567:110:0::2;;;;;;;:::i;:::-;53724:17;::::0;;;:11:::2;:17;::::0;;;;:27:::2;;::::0;:42:::2;::::0;53754:12;;53724:42:::2;:::i;:::-;53711:9;:55;;53703:85;;;::::0;-1:-1:-1;;;53703:85:0;;25297:2:1;53703:85:0::2;::::0;::::2;25279:21:1::0;25336:2;25316:18;;;25309:30;-1:-1:-1;;;25355:18:1;;;25348:47;25412:18;;53703:85:0::2;25095:341:1::0;53703:85:0::2;53836:1;53803:17:::0;;;:11:::2;:17;::::0;;;;:30:::2;;::::0;:34;53799:180:::2;;53910:17;::::0;;;:11:::2;:17;::::0;;;;;;;:30:::2;;::::0;53862:11:::2;:17:::0;;;;;53880:10:::2;53862:29:::0;;;;;;;;;:44:::2;::::0;53894:12;;53862:44:::2;:::i;:::-;:78;;53854:113;;;::::0;-1:-1:-1;;;53854:113:0;;24946:2:1;53854:113:0::2;::::0;::::2;24928:21:1::0;24985:2;24965:18;;;24958:30;-1:-1:-1;;;25004:18:1;;;24997:52;25066:18;;53854:113:0::2;24744:346:1::0;53854:113:0::2;54022:1;53993:17:::0;;;:11:::2;:17;::::0;;;;:26:::2;;::::0;:30;53989:145:::2;;54064:17;::::0;;;:11:::2;:17;::::0;;;;:26:::2;;::::0;54048:42;::::2;;54040:82;;;::::0;-1:-1:-1;;;54040:82:0;;22064:2:1;54040:82:0::2;::::0;::::2;22046:21:1::0;22103:2;22083:18;;;22076:30;22142:29;22122:18;;;22115:57;22189:18;;54040:82:0::2;21862:351:1::0;54040:82:0::2;54183:1;54148:17:::0;;;:11:::2;:17;::::0;;;;:32:::2;;::::0;:36;54144:171:::2;;54229:17;::::0;;;:11:::2;:17;::::0;;;;:32:::2;;::::0;:47:::2;::::0;54264:12;;54229:47:::2;:::i;:::-;54209:9;:16;:67;54201:102;;;::::0;-1:-1:-1;;;54201:102:0;;23533:2:1;54201:102:0::2;::::0;::::2;23515:21:1::0;23572:2;23552:18;;;23545:30;-1:-1:-1;;;23591:18:1;;;23584:52;23653:18;;54201:102:0::2;23331:346:1::0;54201:102:0::2;54332:9;54327:337;54351:9;:16;54347:1;:20;54327:337;;;54389:16;54408:9;54418:1;54408:12;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;;54444:20:::2;::::0;;;:14:::2;:20:::0;;;;;;:30;;;;;;;;;;;54408:12;;-1:-1:-1;54444:30:0::2;;54443:31;54435:65;;;::::0;-1:-1:-1;;;54435:65:0;;27992:2:1;54435:65:0::2;::::0;::::2;27974:21:1::0;28031:2;28011:18;;;28004:30;-1:-1:-1;;;28050:18:1;;;28043:51;28111:18;;54435:65:0::2;27790:345:1::0;54435:65:0::2;54534:17;::::0;;;:11:::2;:17;::::0;;;;;;:34:::2;;::::0;54515:3:::2;:54:::0;;-1:-1:-1;;;;;;54515:54:0::2;-1:-1:-1::0;;;;;54534:34:0;;::::2;54515:54:::0;;::::2;::::0;;54592:21;;-1:-1:-1;;;54592:21:0;;::::2;::::0;::::2;28286:25:1::0;;;54617:10:0::2;::::0;54534:34;54592:11:::2;::::0;28259:18:1;;54592:21:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;54592:35:0::2;;54584:68;;;::::0;-1:-1:-1;;;54584:68:0;;23184:2:1;54584:68:0::2;::::0;::::2;23166:21:1::0;23223:2;23203:18;;;23196:30;-1:-1:-1;;;23242:18:1;;;23235:50;23302:18;;54584:68:0::2;22982:344:1::0;54584:68:0::2;-1:-1:-1::0;54369:3:0;::::2;::::0;::::2;:::i;:::-;;;;54327:337;;;;54681:9;54676:157;54700:9;:16;54696:1;:20;54676:157;;;54738:16;54757:9;54767:1;54757:12;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;;54784:20:::2;::::0;;;:14:::2;:20:::0;;;;;;:30;;;;;;;;;:37;;-1:-1:-1;;54784:37:0::2;54817:4;54784:37;::::0;;-1:-1:-1;54718:3:0;::::2;::::0;::::2;:::i;:::-;;;;54676:157;;;;54845:42;54856:10;54868:4;54874:12;54845:10;:42::i;:::-;-1:-1:-1::0;;47659:1:0;48613:7;:22;-1:-1:-1;;53295:1600:0:o;34004:88::-;34071:13;;;;:4;;:13;;;;;:::i;23357:723::-;23413:13;23634:10;23630:53;;-1:-1:-1;;23661:10:0;;;;;;;;;;;;-1:-1:-1;;;23661:10:0;;;;;23357:723::o;23630:53::-;23708:5;23693:12;23749:78;23756:9;;23749:78;;23782:8;;;;:::i;:::-;;-1:-1:-1;23805:10:0;;-1:-1:-1;23813:2:0;23805:10;;:::i;:::-;;;23749:78;;;23837:19;23869:6;-1:-1:-1;;;;;23859:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23859:17:0;;23837:39;;23887:154;23894:10;;23887:154;;23921:11;23931:1;23921:11;;:::i;:::-;;-1:-1:-1;23990:10:0;23998:2;23990:5;:10;:::i;:::-;23977:24;;:2;:24;:::i;:::-;23964:39;;23947:6;23954;23947:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;23947:56:0;;;;;;;;-1:-1:-1;24018:11:0;24027:2;24018:11;;:::i;:::-;;;23887:154;;;24065:6;23357:723;-1:-1:-1;;;;23357:723:0:o;32086:1074::-;32313:7;:14;32299:3;:10;:28;32291:81;;;;-1:-1:-1;;;32291:81:0;;26463:2:1;32291:81:0;;;26445:21:1;26502:2;26482:18;;;26475:30;26541:34;26521:18;;;26514:62;-1:-1:-1;;;26592:18:1;;;26585:38;26640:19;;32291:81:0;26261:404:1;32291:81:0;-1:-1:-1;;;;;32391:16:0;;32383:66;;;;-1:-1:-1;;;32383:66:0;;;;;;;:::i;:::-;25875:10;32462:16;32579:421;32603:3;:10;32599:1;:14;32579:421;;;32635:10;32648:3;32652:1;32648:6;;;;;;;;:::i;:::-;;;;;;;32635:19;;32669:14;32686:7;32694:1;32686:10;;;;;;;;:::i;:::-;;;;;;;;;;;;32713:19;32735:13;;;;;;;;;;-1:-1:-1;;;;;32735:19:0;;;;;;;;;;;;32686:10;;-1:-1:-1;32777:21:0;;;;32769:76;;;;-1:-1:-1;;;32769:76:0;;;;;;;:::i;:::-;32889:9;:13;;;;;;;;;;;-1:-1:-1;;;;;32889:19:0;;;;;;;;;;32911:20;;;32889:42;;32961:17;;;;;;;:27;;32911:20;;32889:9;32961:27;;32911:20;;32961:27;:::i;:::-;;;;;;;;32620:380;;;32615:3;;;;:::i;:::-;;;32579:421;;;;33047:2;-1:-1:-1;;;;;33017:47:0;33041:4;-1:-1:-1;;;;;33017:47:0;33031:8;-1:-1:-1;;;;;33017:47:0;;33051:3;33056:7;33017:47;;;;;;;:::i;:::-;;;;;;;;33077:75;33113:8;33123:4;33129:2;33133:3;33138:7;33147:4;33077:35;:75::i;:::-;32280:880;32086:1074;;;;;:::o;56754:228::-;56842:34;56848:3;56853:4;56859:12;56842:34;;;;;;;;;;;;:5;:34::i;:::-;56887:17;;;;:11;:17;;;;;;;;-1:-1:-1;;;;;56887:22:0;;;;;;;;;:38;;56913:12;;56887:17;:38;;56913:12;;56887:38;:::i;:::-;;;;-1:-1:-1;;56936:22:0;;;;:16;:22;;;;;:38;;56962:12;;56936:22;:38;;56962:12;;56936:38;:::i;:::-;;;;-1:-1:-1;;;;;56754:228:0:o;45693:191::-;45786:6;;;-1:-1:-1;;;;;45803:17:0;;;-1:-1:-1;;;;;;45803:17:0;;;;;;;45836:40;;45786:6;;;45803:17;45786:6;;45836:40;;45767:16;;45836:40;45756:128;45693:191;:::o;38272:331::-;38427:8;-1:-1:-1;;;;;38418:17:0;:5;-1:-1:-1;;;;;38418:17:0;;;38410:71;;;;-1:-1:-1;;;38410:71:0;;25643:2:1;38410:71:0;;;25625:21:1;25682:2;25662:18;;;25655:30;25721:34;25701:18;;;25694:62;-1:-1:-1;;;25772:18:1;;;25765:39;25821:19;;38410:71:0;25441:405:1;38410:71:0;-1:-1:-1;;;;;38492:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;38492:46:0;;;;;;;;;;38554:41;;16586::1;;;38554::0;;16559:18:1;38554:41:0;;;;;;;38272:331;;;:::o;30908:820::-;-1:-1:-1;;;;;31096:16:0;;31088:66;;;;-1:-1:-1;;;31088:66:0;;;;;;;:::i;:::-;25875:10;31211:96;25875:10;31242:4;31248:2;31252:21;31270:2;31252:17;:21::i;:::-;31275:25;31293:6;31275:17;:25::i;31211:96::-;31320:19;31342:13;;;;;;;;;;;-1:-1:-1;;;;;31342:19:0;;;;;;;;;;31380:21;;;;31372:76;;;;-1:-1:-1;;;31372:76:0;;;;;;;:::i;:::-;31484:9;:13;;;;;;;;;;;-1:-1:-1;;;;;31484:19:0;;;;;;;;;;31506:20;;;31484:42;;31548:17;;;;;;;:27;;31506:20;;31484:9;31548:27;;31506:20;;31548:27;:::i;:::-;;;;-1:-1:-1;;31593:46:0;;;28496:25:1;;;28552:2;28537:18;;28530:34;;;-1:-1:-1;;;;;31593:46:0;;;;;;;;;;;;;;28469:18:1;31593:46:0;;;;;;;31652:68;31683:8;31693:4;31699:2;31703;31707:6;31715:4;31652:30;:68::i;:::-;31077:651;;30908:820;;;;;:::o;40540:813::-;-1:-1:-1;;;;;40780:13:0;;1563:19;:23;40776:570;;40816:79;;-1:-1:-1;;;40816:79:0;;-1:-1:-1;;;;;40816:43:0;;;;;:79;;40860:8;;40870:4;;40876:3;;40881:7;;40890:4;;40816:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40816:79:0;;;;;;;;-1:-1:-1;;40816:79:0;;;;;;;;;;;;:::i;:::-;;;40812:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;41208:6;41201:14;;-1:-1:-1;;;41201:14:0;;;;;;;;:::i;40812:523::-;;;41257:62;;-1:-1:-1;;;41257:62:0;;17784:2:1;41257:62:0;;;17766:21:1;17823:2;17803:18;;;17796:30;17862:34;17842:18;;;17835:62;-1:-1:-1;;;17913:18:1;;;17906:50;17973:19;;41257:62:0;17582:416:1;40812:523:0;-1:-1:-1;;;;;;40977:60:0;;-1:-1:-1;;;40977:60:0;40973:159;;41062:50;;-1:-1:-1;;;41062:50:0;;;;;;;:::i;34478:569::-;-1:-1:-1;;;;;34631:16:0;;34623:62;;;;-1:-1:-1;;;34623:62:0;;26872:2:1;34623:62:0;;;26854:21:1;26911:2;26891:18;;;26884:30;26950:34;26930:18;;;26923:62;-1:-1:-1;;;27001:18:1;;;26994:31;27042:19;;34623:62:0;26670:397:1;34623:62:0;25875:10;34742:102;25875:10;34698:16;34785:2;34789:21;34807:2;34789:17;:21::i;34742:102::-;34857:9;:13;;;;;;;;;;;-1:-1:-1;;;;;34857:17:0;;;;;;;;;:27;;34878:6;;34857:9;:27;;34878:6;;34857:27;:::i;:::-;;;;-1:-1:-1;;34900:52:0;;;28496:25:1;;;28552:2;28537:18;;28530:34;;;-1:-1:-1;;;;;34900:52:0;;;;34933:1;;34900:52;;;;;;28469:18:1;34900:52:0;;;;;;;34965:74;34996:8;35014:1;35018:2;35022;35026:6;35034:4;34965:30;:74::i;41361:198::-;41481:16;;;41495:1;41481:16;;;;;;;;;41427;;41456:22;;41481:16;;;;;;;;;;;;-1:-1:-1;41481:16:0;41456:41;;41519:7;41508:5;41514:1;41508:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;41546:5;41361:198;-1:-1:-1;;41361:198:0:o;39788:744::-;-1:-1:-1;;;;;40003:13:0;;1563:19;:23;39999:526;;40039:72;;-1:-1:-1;;;40039:72:0;;-1:-1:-1;;;;;40039:38:0;;;;;:72;;40078:8;;40088:4;;40094:2;;40098:6;;40106:4;;40039:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40039:72:0;;;;;;;;-1:-1:-1;;40039:72:0;;;;;;;;;;;;:::i;:::-;;;40035:479;;;;:::i;:::-;-1:-1:-1;;;;;;40161:55:0;;-1:-1:-1;;;40161:55:0;40157:154;;40241:50;;-1:-1:-1;;;40241:50:0;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:468:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;134:18;;:::i;:::-;183:2;177:9;195:69;252:2;231:15;;-1:-1:-1;;227:29:1;258:4;223:40;177:9;195:69;:::i;:::-;282:6;273:15;;312:6;304;297:22;352:3;343:6;338:3;334:16;331:25;328:45;;;369:1;366;359:12;328:45;419:6;414:3;407:4;399:6;395:17;382:44;474:1;467:4;458:6;450;446:19;442:30;435:41;;14:468;;;;;:::o;487:134::-;555:20;;584:31;555:20;584:31;:::i;:::-;487:134;;;:::o;626:810::-;680:5;733:3;726:4;718:6;714:17;710:27;700:55;;751:1;748;741:12;700:55;787:6;774:20;813:4;836:43;876:2;836:43;:::i;:::-;908:2;902:9;920:31;948:2;940:6;920:31;:::i;:::-;986:18;;;1020:15;;;;-1:-1:-1;1055:15:1;;;1105:1;1101:10;;;1089:23;;1085:32;;1082:41;-1:-1:-1;1079:61:1;;;1136:1;1133;1126:12;1079:61;1158:1;1168:238;1182:2;1179:1;1176:9;1168:238;;;1253:3;1240:17;1270:31;1295:5;1270:31;:::i;:::-;1314:18;;1352:12;;;;1384;;;;1200:1;1193:9;1168:238;;;-1:-1:-1;1424:6:1;;626:810;-1:-1:-1;;;;;;;626:810:1:o;1441:735::-;1495:5;1548:3;1541:4;1533:6;1529:17;1525:27;1515:55;;1566:1;1563;1556:12;1515:55;1602:6;1589:20;1628:4;1651:43;1691:2;1651:43;:::i;:::-;1723:2;1717:9;1735:31;1763:2;1755:6;1735:31;:::i;:::-;1801:18;;;1835:15;;;;-1:-1:-1;1870:15:1;;;1920:1;1916:10;;;1904:23;;1900:32;;1897:41;-1:-1:-1;1894:61:1;;;1951:1;1948;1941:12;1894:61;1973:1;1983:163;1997:2;1994:1;1991:9;1983:163;;;2054:17;;2042:30;;2092:12;;;;2124;;;;2015:1;2008:9;1983:163;;2181:160;2246:20;;2302:13;;2295:21;2285:32;;2275:60;;2331:1;2328;2321:12;2346:220;2388:5;2441:3;2434:4;2426:6;2422:17;2418:27;2408:55;;2459:1;2456;2449:12;2408:55;2481:79;2556:3;2547:6;2534:20;2527:4;2519:6;2515:17;2481:79;:::i;:::-;2472:88;2346:220;-1:-1:-1;;;2346:220:1:o;2571:912::-;2631:5;2661:6;2704:2;2692:9;2687:3;2683:19;2679:28;2676:48;;;2720:1;2717;2710:12;2676:48;2753:2;2747:9;2783:15;;;;-1:-1:-1;;;;;2813:34:1;;2849:22;;;2810:62;2807:88;;;2875:18;;:::i;:::-;2915:10;2911:2;2904:22;2944:6;2935:15;;2974:26;2990:9;2974:26;:::i;:::-;2966:6;2959:42;3062:2;3051:9;3047:18;3034:32;3029:2;3021:6;3017:15;3010:57;3128:2;3117:9;3113:18;3100:32;3095:2;3087:6;3083:15;3076:57;3194:2;3183:9;3179:18;3166:32;3161:2;3153:6;3149:15;3142:57;3261:3;3250:9;3246:19;3233:33;3227:3;3219:6;3215:16;3208:59;3329:3;3318:9;3314:19;3301:33;3295:3;3287:6;3283:16;3276:59;3397:3;3386:9;3382:19;3369:33;3363:3;3355:6;3351:16;3344:59;3437:39;3471:3;3460:9;3456:19;3437:39;:::i;:::-;3431:3;3423:6;3419:16;3412:65;;;2571:912;;;;:::o;3488:247::-;3547:6;3600:2;3588:9;3579:7;3575:23;3571:32;3568:52;;;3616:1;3613;3606:12;3568:52;3655:9;3642:23;3674:31;3699:5;3674:31;:::i;3740:251::-;3810:6;3863:2;3851:9;3842:7;3838:23;3834:32;3831:52;;;3879:1;3876;3869:12;3831:52;3911:9;3905:16;3930:31;3955:5;3930:31;:::i;3996:388::-;4064:6;4072;4125:2;4113:9;4104:7;4100:23;4096:32;4093:52;;;4141:1;4138;4131:12;4093:52;4180:9;4167:23;4199:31;4224:5;4199:31;:::i;:::-;4249:5;-1:-1:-1;4306:2:1;4291:18;;4278:32;4319:33;4278:32;4319:33;:::i;:::-;4371:7;4361:17;;;3996:388;;;;;:::o;4389:1071::-;4543:6;4551;4559;4567;4575;4628:3;4616:9;4607:7;4603:23;4599:33;4596:53;;;4645:1;4642;4635:12;4596:53;4684:9;4671:23;4703:31;4728:5;4703:31;:::i;:::-;4753:5;-1:-1:-1;4810:2:1;4795:18;;4782:32;4823:33;4782:32;4823:33;:::i;:::-;4875:7;-1:-1:-1;4933:2:1;4918:18;;4905:32;-1:-1:-1;;;;;4986:14:1;;;4983:34;;;5013:1;5010;5003:12;4983:34;5036:61;5089:7;5080:6;5069:9;5065:22;5036:61;:::i;:::-;5026:71;;5150:2;5139:9;5135:18;5122:32;5106:48;;5179:2;5169:8;5166:16;5163:36;;;5195:1;5192;5185:12;5163:36;5218:63;5273:7;5262:8;5251:9;5247:24;5218:63;:::i;:::-;5208:73;;5334:3;5323:9;5319:19;5306:33;5290:49;;5364:2;5354:8;5351:16;5348:36;;;5380:1;5377;5370:12;5348:36;;5403:51;5446:7;5435:8;5424:9;5420:24;5403:51;:::i;:::-;5393:61;;;4389:1071;;;;;;;;:::o;5465:734::-;5569:6;5577;5585;5593;5601;5654:3;5642:9;5633:7;5629:23;5625:33;5622:53;;;5671:1;5668;5661:12;5622:53;5710:9;5697:23;5729:31;5754:5;5729:31;:::i;:::-;5779:5;-1:-1:-1;5836:2:1;5821:18;;5808:32;5849:33;5808:32;5849:33;:::i;:::-;5901:7;-1:-1:-1;5955:2:1;5940:18;;5927:32;;-1:-1:-1;6006:2:1;5991:18;;5978:32;;-1:-1:-1;6061:3:1;6046:19;;6033:33;-1:-1:-1;;;;;6078:30:1;;6075:50;;;6121:1;6118;6111:12;6075:50;6144:49;6185:7;6176:6;6165:9;6161:22;6144:49;:::i;6204:315::-;6269:6;6277;6330:2;6318:9;6309:7;6305:23;6301:32;6298:52;;;6346:1;6343;6336:12;6298:52;6385:9;6372:23;6404:31;6429:5;6404:31;:::i;:::-;6454:5;-1:-1:-1;6478:35:1;6509:2;6494:18;;6478:35;:::i;:::-;6468:45;;6204:315;;;;;:::o;6524:::-;6592:6;6600;6653:2;6641:9;6632:7;6628:23;6624:32;6621:52;;;6669:1;6666;6659:12;6621:52;6708:9;6695:23;6727:31;6752:5;6727:31;:::i;:::-;6777:5;6829:2;6814:18;;;;6801:32;;-1:-1:-1;;;6524:315:1:o;6844:383::-;6921:6;6929;6937;6990:2;6978:9;6969:7;6965:23;6961:32;6958:52;;;7006:1;7003;6996:12;6958:52;7045:9;7032:23;7064:31;7089:5;7064:31;:::i;:::-;7114:5;7166:2;7151:18;;7138:32;;-1:-1:-1;7217:2:1;7202:18;;;7189:32;;6844:383;-1:-1:-1;;;6844:383:1:o;7232:595::-;7350:6;7358;7411:2;7399:9;7390:7;7386:23;7382:32;7379:52;;;7427:1;7424;7417:12;7379:52;7467:9;7454:23;-1:-1:-1;;;;;7537:2:1;7529:6;7526:14;7523:34;;;7553:1;7550;7543:12;7523:34;7576:61;7629:7;7620:6;7609:9;7605:22;7576:61;:::i;:::-;7566:71;;7690:2;7679:9;7675:18;7662:32;7646:48;;7719:2;7709:8;7706:16;7703:36;;;7735:1;7732;7725:12;7703:36;;7758:63;7813:7;7802:8;7791:9;7787:24;7758:63;:::i;:::-;7748:73;;;7232:595;;;;;:::o;7832:245::-;7890:6;7943:2;7931:9;7922:7;7918:23;7914:32;7911:52;;;7959:1;7956;7949:12;7911:52;7998:9;7985:23;8017:30;8041:5;8017:30;:::i;8082:249::-;8151:6;8204:2;8192:9;8183:7;8179:23;8175:32;8172:52;;;8220:1;8217;8210:12;8172:52;8252:9;8246:16;8271:30;8295:5;8271:30;:::i;8336:450::-;8405:6;8458:2;8446:9;8437:7;8433:23;8429:32;8426:52;;;8474:1;8471;8464:12;8426:52;8514:9;8501:23;-1:-1:-1;;;;;8539:6:1;8536:30;8533:50;;;8579:1;8576;8569:12;8533:50;8602:22;;8655:4;8647:13;;8643:27;-1:-1:-1;8633:55:1;;8684:1;8681;8674:12;8633:55;8707:73;8772:7;8767:2;8754:16;8749:2;8745;8741:11;8707:73;:::i;8791:240::-;8881:6;8934:3;8922:9;8913:7;8909:23;8905:33;8902:53;;;8951:1;8948;8941:12;8902:53;8974:51;9017:7;9006:9;8974:51;:::i;9036:180::-;9095:6;9148:2;9136:9;9127:7;9123:23;9119:32;9116:52;;;9164:1;9161;9154:12;9116:52;-1:-1:-1;9187:23:1;;9036:180;-1:-1:-1;9036:180:1:o;9221:315::-;9289:6;9297;9350:2;9338:9;9329:7;9325:23;9321:32;9318:52;;;9366:1;9363;9356:12;9318:52;9402:9;9389:23;9379:33;;9462:2;9451:9;9447:18;9434:32;9475:31;9500:5;9475:31;:::i;9541:416::-;9634:6;9642;9695:2;9683:9;9674:7;9670:23;9666:32;9663:52;;;9711:1;9708;9701:12;9663:52;9747:9;9734:23;9724:33;;9808:2;9797:9;9793:18;9780:32;-1:-1:-1;;;;;9827:6:1;9824:30;9821:50;;;9867:1;9864;9857:12;9821:50;9890:61;9943:7;9934:6;9923:9;9919:22;9890:61;:::i;9962:484::-;10061:6;10069;10077;10130:2;10118:9;10109:7;10105:23;10101:32;10098:52;;;10146:1;10143;10136:12;10098:52;10182:9;10169:23;10159:33;;10243:2;10232:9;10228:18;10215:32;-1:-1:-1;;;;;10262:6:1;10259:30;10256:50;;;10302:1;10299;10292:12;10256:50;10325:61;10378:7;10369:6;10358:9;10354:22;10325:61;:::i;:::-;10315:71;;;10405:35;10436:2;10425:9;10421:18;10405:35;:::i;:::-;10395:45;;9962:484;;;;;:::o;10451:::-;10553:6;10561;10569;10622:2;10610:9;10601:7;10597:23;10593:32;10590:52;;;10638:1;10635;10628:12;10590:52;10674:9;10661:23;10651:33;;10735:2;10724:9;10720:18;10707:32;-1:-1:-1;;;;;10754:6:1;10751:30;10748:50;;;10794:1;10791;10784:12;10748:50;10817:61;10870:7;10861:6;10850:9;10846:22;10817:61;:::i;:::-;10807:71;;;10925:2;10914:9;10910:18;10897:32;10887:42;;10451:484;;;;;:::o;10940:308::-;11039:6;11047;11100:3;11088:9;11079:7;11075:23;11071:33;11068:53;;;11117:1;11114;11107:12;11068:53;11153:9;11140:23;11130:33;;11182:60;11234:7;11229:2;11218:9;11214:18;11182:60;:::i;11253:248::-;11321:6;11329;11382:2;11370:9;11361:7;11357:23;11353:32;11350:52;;;11398:1;11395;11388:12;11350:52;-1:-1:-1;;11421:23:1;;;11491:2;11476:18;;;11463:32;;-1:-1:-1;11253:248:1:o;11506:454::-;11601:6;11609;11617;11625;11633;11686:3;11674:9;11665:7;11661:23;11657:33;11654:53;;;11703:1;11700;11693:12;11654:53;-1:-1:-1;;11726:23:1;;;11796:2;11781:18;;11768:32;;-1:-1:-1;11847:2:1;11832:18;;11819:32;;11898:2;11883:18;;11870:32;;-1:-1:-1;11949:3:1;11934:19;11921:33;;-1:-1:-1;11506:454:1;-1:-1:-1;11506:454:1:o;11965:435::-;12018:3;12056:5;12050:12;12083:6;12078:3;12071:19;12109:4;12138:2;12133:3;12129:12;12122:19;;12175:2;12168:5;12164:14;12196:1;12206:169;12220:6;12217:1;12214:13;12206:169;;;12281:13;;12269:26;;12315:12;;;;12350:15;;;;12242:1;12235:9;12206:169;;;-1:-1:-1;12391:3:1;;11965:435;-1:-1:-1;;;;;11965:435:1:o;12405:257::-;12446:3;12484:5;12478:12;12511:6;12506:3;12499:19;12527:63;12583:6;12576:4;12571:3;12567:14;12560:4;12553:5;12549:16;12527:63;:::i;:::-;12644:2;12623:15;-1:-1:-1;;12619:29:1;12610:39;;;;12651:4;12606:50;;12405:257;-1:-1:-1;;12405:257:1:o;12667:973::-;12752:12;;12717:3;;12807:1;12827:18;;;;12880;;;;12907:61;;12961:4;12953:6;12949:17;12939:27;;12907:61;12987:2;13035;13027:6;13024:14;13004:18;13001:38;12998:161;;;13081:10;13076:3;13072:20;13069:1;13062:31;13116:4;13113:1;13106:15;13144:4;13141:1;13134:15;12998:161;13175:18;13202:104;;;;13320:1;13315:319;;;;13168:466;;13202:104;-1:-1:-1;;13235:24:1;;13223:37;;13280:16;;;;-1:-1:-1;13202:104:1;;13315:319;28836:1;28829:14;;;28873:4;28860:18;;13409:1;13423:165;13437:6;13434:1;13431:13;13423:165;;;13515:14;;13502:11;;;13495:35;13558:16;;;;13452:10;;13423:165;;;13427:3;;13617:6;13612:3;13608:16;13601:23;;13168:466;;;;;;;12667:973;;;;:::o;13645:456::-;13866:3;13894:38;13928:3;13920:6;13894:38;:::i;:::-;13961:6;13955:13;13977:52;14022:6;14018:2;14011:4;14003:6;13999:17;13977:52;:::i;:::-;14045:50;14087:6;14083:2;14079:15;14071:6;14045:50;:::i;:::-;14038:57;13645:456;-1:-1:-1;;;;;;;13645:456:1:o;14314:826::-;-1:-1:-1;;;;;14711:15:1;;;14693:34;;14763:15;;14758:2;14743:18;;14736:43;14673:3;14810:2;14795:18;;14788:31;;;14636:4;;14842:57;;14879:19;;14871:6;14842:57;:::i;:::-;14947:9;14939:6;14935:22;14930:2;14919:9;14915:18;14908:50;14981:44;15018:6;15010;14981:44;:::i;:::-;14967:58;;15074:9;15066:6;15062:22;15056:3;15045:9;15041:19;15034:51;15102:32;15127:6;15119;15102:32;:::i;:::-;15094:40;14314:826;-1:-1:-1;;;;;;;;14314:826:1:o;15145:560::-;-1:-1:-1;;;;;15442:15:1;;;15424:34;;15494:15;;15489:2;15474:18;;15467:43;15541:2;15526:18;;15519:34;;;15584:2;15569:18;;15562:34;;;15404:3;15627;15612:19;;15605:32;;;15367:4;;15654:45;;15679:19;;15671:6;15654:45;:::i;15710:261::-;15889:2;15878:9;15871:21;15852:4;15909:56;15961:2;15950:9;15946:18;15938:6;15909:56;:::i;15976:465::-;16233:2;16222:9;16215:21;16196:4;16259:56;16311:2;16300:9;16296:18;16288:6;16259:56;:::i;:::-;16363:9;16355:6;16351:22;16346:2;16335:9;16331:18;16324:50;16391:44;16428:6;16420;16391:44;:::i;:::-;16383:52;15976:465;-1:-1:-1;;;;;15976:465:1:o;17358:219::-;17507:2;17496:9;17489:21;17470:4;17527:44;17567:2;17556:9;17552:18;17544:6;17527:44;:::i;18003:404::-;18205:2;18187:21;;;18244:2;18224:18;;;18217:30;18283:34;18278:2;18263:18;;18256:62;-1:-1:-1;;;18349:2:1;18334:18;;18327:38;18397:3;18382:19;;18003:404::o;18412:341::-;18614:2;18596:21;;;18653:2;18633:18;;;18626:30;-1:-1:-1;;;18687:2:1;18672:18;;18665:47;18744:2;18729:18;;18412:341::o;21037:401::-;21239:2;21221:21;;;21278:2;21258:18;;;21251:30;21317:34;21312:2;21297:18;;21290:62;-1:-1:-1;;;21383:2:1;21368:18;;21361:35;21428:3;21413:19;;21037:401::o;22571:406::-;22773:2;22755:21;;;22812:2;22792:18;;;22785:30;22851:34;22846:2;22831:18;;22824:62;-1:-1:-1;;;22917:2:1;22902:18;;22895:40;22967:3;22952:19;;22571:406::o;23682:356::-;23884:2;23866:21;;;23903:18;;;23896:30;23962:34;23957:2;23942:18;;23935:62;24029:2;24014:18;;23682:356::o;24397:342::-;24599:2;24581:21;;;24638:2;24618:18;;;24611:30;-1:-1:-1;;;24672:2:1;24657:18;;24650:48;24730:2;24715:18;;24397:342::o;27072:355::-;27274:2;27256:21;;;27313:2;27293:18;;;27286:30;27352:33;27347:2;27332:18;;27325:61;27418:2;27403:18;;27072:355::o;27432:353::-;27634:2;27616:21;;;27673:2;27653:18;;;27646:30;27712:31;27707:2;27692:18;;27685:59;27776:2;27761:18;;27432:353::o;28575:183::-;28635:4;-1:-1:-1;;;;;28660:6:1;28657:30;28654:56;;;28690:18;;:::i;:::-;-1:-1:-1;28735:1:1;28731:14;28747:4;28727:25;;28575:183::o;28889:128::-;28929:3;28960:1;28956:6;28953:1;28950:13;28947:39;;;28966:18;;:::i;:::-;-1:-1:-1;29002:9:1;;28889:128::o;29022:120::-;29062:1;29088;29078:35;;29093:18;;:::i;:::-;-1:-1:-1;29127:9:1;;29022:120::o;29147:168::-;29187:7;29253:1;29249;29245:6;29241:14;29238:1;29235:21;29230:1;29223:9;29216:17;29212:45;29209:71;;;29260:18;;:::i;:::-;-1:-1:-1;29300:9:1;;29147:168::o;29320:125::-;29360:4;29388:1;29385;29382:8;29379:34;;;29393:18;;:::i;:::-;-1:-1:-1;29430:9:1;;29320:125::o;29450:258::-;29522:1;29532:113;29546:6;29543:1;29540:13;29532:113;;;29622:11;;;29616:18;29603:11;;;29596:39;29568:2;29561:10;29532:113;;;29663:6;29660:1;29657:13;29654:48;;;-1:-1:-1;;29698:1:1;29680:16;;29673:27;29450:258::o;29713:380::-;29792:1;29788:12;;;;29835;;;29856:61;;29910:4;29902:6;29898:17;29888:27;;29856:61;29963:2;29955:6;29952:14;29932:18;29929:38;29926:161;;;30009:10;30004:3;30000:20;29997:1;29990:31;30044:4;30041:1;30034:15;30072:4;30069:1;30062:15;30098:249;30208:2;30189:13;;-1:-1:-1;;30185:27:1;30173:40;;-1:-1:-1;;;;;30228:34:1;;30264:22;;;30225:62;30222:88;;;30290:18;;:::i;:::-;30326:2;30319:22;-1:-1:-1;;30098:249:1:o;30352:135::-;30391:3;-1:-1:-1;;30412:17:1;;30409:43;;;30432:18;;:::i;:::-;-1:-1:-1;30479:1:1;30468:13;;30352:135::o;30492:112::-;30524:1;30550;30540:35;;30555:18;;:::i;:::-;-1:-1:-1;30589:9:1;;30492:112::o;30609:127::-;30670:10;30665:3;30661:20;30658:1;30651:31;30701:4;30698:1;30691:15;30725:4;30722:1;30715:15;30741:127;30802:10;30797:3;30793:20;30790:1;30783:31;30833:4;30830:1;30823:15;30857:4;30854:1;30847:15;30873:127;30934:10;30929:3;30925:20;30922:1;30915:31;30965:4;30962:1;30955:15;30989:4;30986:1;30979:15;31005:127;31066:10;31061:3;31057:20;31054:1;31047:31;31097:4;31094:1;31087:15;31121:4;31118:1;31111:15;31137:179;31172:3;31214:1;31196:16;31193:23;31190:120;;;31260:1;31257;31254;31239:23;-1:-1:-1;31297:1:1;31291:8;31286:3;31282:18;31190:120;31137:179;:::o;31321:671::-;31360:3;31402:4;31384:16;31381:26;31378:39;;;31321:671;:::o;31378:39::-;31444:2;31438:9;-1:-1:-1;;31509:16:1;31505:25;;31502:1;31438:9;31481:50;31560:4;31554:11;31584:16;-1:-1:-1;;;;;31690:2:1;31683:4;31675:6;31671:17;31668:25;31663:2;31655:6;31652:14;31649:45;31646:58;;;31697:5;;;;;31321:671;:::o;31646:58::-;31734:6;31728:4;31724:17;31713:28;;31770:3;31764:10;31797:2;31789:6;31786:14;31783:27;;;31803:5;;;;;;31321:671;:::o;31783:27::-;31887:2;31868:16;31862:4;31858:27;31854:36;31847:4;31838:6;31833:3;31829:16;31825:27;31822:69;31819:82;;;31894:5;;;;;;31321:671;:::o;31819:82::-;31910:57;31961:4;31952:6;31944;31940:19;31936:30;31930:4;31910:57;:::i;:::-;-1:-1:-1;31983:3:1;;31321:671;-1:-1:-1;;;;;31321:671:1:o;31997:131::-;-1:-1:-1;;;;;32072:31:1;;32062:42;;32052:70;;32118:1;32115;32108:12;32133:131;-1:-1:-1;;;;;;32207:32:1;;32197:43;;32187:71;;32254:1;32251;32244:12

Swarm Source

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