ETH Price: $2,966.87 (+2.28%)
Gas: 1 Gwei

Token

Rare Shoe Capsules (RSHOEC)
 

Overview

Max Total Supply

700 RSHOEC

Holders

223

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
covemedic.eth
Balance
34 RSHOEC
0x7DF76FDEedE91d3cB80e4a86158dD9f6D206c98E
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:
RareShoeCapsules

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT
// 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 (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @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/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;

/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally checks to see if a
     * token-specific URI was set for the token, and if so, it deletes the token URI from
     * the storage mapping.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// 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/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

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

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

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

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

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

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

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

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// File: @openzeppelin/contracts/utils/cryptography/draft-EIP712.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)

pragma solidity ^0.8.0;

/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;
    address private immutable _CACHED_THIS;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

// File: RareShoeCapsules.sol


pragma solidity ^0.8.2;






contract RareShoeCapsules is ERC721URIStorage, IERC1155Receiver, IERC721Receiver, EIP712, Ownable {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;

    string _baseUri;

    uint public constant MAX_SUPPLY = 3000;

    uint public price = 0.08 ether;

    mapping(address => uint) public _addressToMintedFreeTokens;

    constructor() ERC721("Rare Shoe Capsules", "RSHOEC") EIP712("RSHOEC", "1.0.0") {}

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

   function burnMint(address receiver,  string memory tokenURI) external payable returns (uint256) {
        require(totalSupply() <= MAX_SUPPLY, "not enough supply remaining");
        require(_addressToMintedFreeTokens[receiver] > 0, "not enough burned tokens");

        _addressToMintedFreeTokens[receiver] -= 1;

        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _safeMint(receiver, tokenId);
        _setTokenURI(tokenId, tokenURI);
        return tokenId;
    }

    function mint(address receiver,  string memory tokenURI) external payable returns (uint256) {
        require(totalSupply() <= MAX_SUPPLY, "not enough supply remaining");
        require(msg.value >= price, "ether sent is under price");

        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _safeMint(receiver, tokenId);
        _setTokenURI(tokenId, tokenURI);
        return tokenId;
    }

    function totalSupply() public view returns (uint) {
        return _tokenIdCounter.current();
    }

    function addFreeMint(address wallet, uint quantity) external onlyOwner {
        _addressToMintedFreeTokens[wallet] += quantity;
    }

    function setBaseURI(string memory newBaseURI) external onlyOwner {
        _baseUri = newBaseURI;
    }

    function setPrice(uint newPrice) external onlyOwner {
        price = newPrice;
    }

    function withdrawAll(address payable to) external onlyOwner {
        to.transfer(address(this).balance);
    }

    function onERC721Received(address, address from, uint256, bytes memory) public virtual override returns (bytes4) {
        _addressToMintedFreeTokens[from] += 1;
        return this.onERC721Received.selector;
    }

    function onERC1155Received(address, address from, uint256, uint256, bytes memory) public virtual override returns (bytes4) {
        _addressToMintedFreeTokens[from] += 1;
        return this.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(address, address, uint256[] memory, uint256[] memory, bytes memory) public virtual override returns (bytes4) {
        return this.onERC1155BatchReceived.selector;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_addressToMintedFreeTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"addFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"burnMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

61014060405267011c37937e080000600a553480156200001e57600080fd5b506040518060400160405280600681526020017f5253484f454300000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f312e302e300000000000000000000000000000000000000000000000000000008152506040518060400160405280601281526020017f526172652053686f652043617073756c657300000000000000000000000000008152506040518060400160405280600681526020017f5253484f45430000000000000000000000000000000000000000000000000000815250816000908162000108919062000579565b5080600190816200011a919062000579565b50505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a0818152505062000186818484620001f560201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508061012081815250505050505050620001ef620001e36200023160201b60201c565b6200023960201b60201c565b6200072e565b6000838383463060405160200162000212959493929190620006d1565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200038157607f821691505b60208210810362000397576200039662000339565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003c2565b6200040d8683620003c2565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200045a620004546200044e8462000425565b6200042f565b62000425565b9050919050565b6000819050919050565b620004768362000439565b6200048e620004858262000461565b848454620003cf565b825550505050565b600090565b620004a562000496565b620004b28184846200046b565b505050565b5b81811015620004da57620004ce6000826200049b565b600181019050620004b8565b5050565b601f8211156200052957620004f3816200039d565b620004fe84620003b2565b810160208510156200050e578190505b620005266200051d85620003b2565b830182620004b7565b50505b505050565b600082821c905092915050565b60006200054e600019846008026200052e565b1980831691505092915050565b60006200056983836200053b565b9150826002028217905092915050565b6200058482620002ff565b67ffffffffffffffff811115620005a0576200059f6200030a565b5b620005ac825462000368565b620005b9828285620004de565b600060209050601f831160018114620005f15760008415620005dc578287015190505b620005e885826200055b565b86555062000658565b601f19841662000601866200039d565b60005b828110156200062b5784890151825560018201915060208501945060208101905062000604565b868310156200064b578489015162000647601f8916826200053b565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b620006758162000660565b82525050565b620006868162000425565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006b9826200068c565b9050919050565b620006cb81620006ac565b82525050565b600060a082019050620006e860008301886200066a565b620006f760208301876200066a565b6200070660408301866200066a565b6200071560608301856200067b565b620007246080830184620006c0565b9695505050505050565b60805160a05160c05160e0516101005161012051613ace6200076c600039600050506000505060005050600050506000505060005050613ace6000f3fe6080604052600436106101c25760003560e01c80638cbabefc116100f7578063bc197c8111610095578063e985e9c511610064578063e985e9c514610670578063f23a6e61146106ad578063f2fde38b146106ea578063fa09e63014610713576101c2565b8063bc197c811461059d578063bd4ec2b2146105da578063c87b56dd14610603578063d0def52114610640576101c2565b806395d89b41116100d157806395d89b41146104f5578063a035b1fe14610520578063a22cb4651461054b578063b88d4fde14610574576101c2565b80638cbabefc146104715780638da5cb5b146104a157806391b7f5ed146104cc576101c2565b806323b872dd1161016457806355f804b31161013e57806355f804b3146103b75780636352211e146103e057806370a082311461041d578063715018a61461045a576101c2565b806323b872dd1461033a57806332cb6b0c1461036357806342842e0e1461038e576101c2565b8063095ea7b3116101a0578063095ea7b31461026c5780631352918014610295578063150b7a02146102d257806318160ddd1461030f576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e991906122d4565b61073c565b6040516101fb919061231c565b60405180910390f35b34801561021057600080fd5b5061021961081e565b60405161022691906123d0565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612428565b6108b0565b6040516102639190612496565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e91906124dd565b6108f6565b005b3480156102a157600080fd5b506102bc60048036038101906102b7919061251d565b610a0d565b6040516102c99190612559565b60405180910390f35b3480156102de57600080fd5b506102f960048036038101906102f491906126a9565b610a25565b604051610306919061273b565b60405180910390f35b34801561031b57600080fd5b50610324610a90565b6040516103319190612559565b60405180910390f35b34801561034657600080fd5b50610361600480360381019061035c9190612756565b610aa1565b005b34801561036f57600080fd5b50610378610b01565b6040516103859190612559565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190612756565b610b07565b005b3480156103c357600080fd5b506103de60048036038101906103d9919061284a565b610b27565b005b3480156103ec57600080fd5b5061040760048036038101906104029190612428565b610b42565b6040516104149190612496565b60405180910390f35b34801561042957600080fd5b50610444600480360381019061043f919061251d565b610bf3565b6040516104519190612559565b60405180910390f35b34801561046657600080fd5b5061046f610caa565b005b61048b60048036038101906104869190612893565b610cbe565b6040516104989190612559565b60405180910390f35b3480156104ad57600080fd5b506104b6610e1b565b6040516104c39190612496565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee9190612428565b610e45565b005b34801561050157600080fd5b5061050a610e57565b60405161051791906123d0565b60405180910390f35b34801561052c57600080fd5b50610535610ee9565b6040516105429190612559565b60405180910390f35b34801561055757600080fd5b50610572600480360381019061056d919061291b565b610eef565b005b34801561058057600080fd5b5061059b600480360381019061059691906126a9565b610f05565b005b3480156105a957600080fd5b506105c460048036038101906105bf9190612a23565b610f67565b6040516105d1919061273b565b60405180910390f35b3480156105e657600080fd5b5061060160048036038101906105fc91906124dd565b610f7c565b005b34801561060f57600080fd5b5061062a60048036038101906106259190612428565b610fde565b60405161063791906123d0565b60405180910390f35b61065a60048036038101906106559190612893565b6110f0565b6040516106679190612559565b60405180910390f35b34801561067c57600080fd5b5061069760048036038101906106929190612af2565b6111b9565b6040516106a4919061231c565b60405180910390f35b3480156106b957600080fd5b506106d460048036038101906106cf9190612b32565b61124d565b6040516106e1919061273b565b60405180910390f35b3480156106f657600080fd5b50610711600480360381019061070c919061251d565b6112b9565b005b34801561071f57600080fd5b5061073a60048036038101906107359190612c07565b61133c565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061080757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061081757506108168261138e565b5b9050919050565b60606000805461082d90612c63565b80601f016020809104026020016040519081016040528092919081815260200182805461085990612c63565b80156108a65780601f1061087b576101008083540402835291602001916108a6565b820191906000526020600020905b81548152906001019060200180831161088957829003601f168201915b5050505050905090565b60006108bb826113f8565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061090182610b42565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610971576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096890612d06565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610990611443565b73ffffffffffffffffffffffffffffffffffffffff1614806109bf57506109be816109b9611443565b6111b9565b5b6109fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f590612d98565b60405180910390fd5b610a08838361144b565b505050565b600b6020528060005260406000206000915090505481565b60006001600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610a779190612de7565b9250508190555063150b7a0260e01b9050949350505050565b6000610a9c6008611504565b905090565b610ab2610aac611443565b82611512565b610af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae890612eaf565b60405180910390fd5b610afc8383836115a7565b505050565b610bb881565b610b2283838360405180602001604052806000815250610f05565b505050565b610b2f61180d565b8060099081610b3e919061307b565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be190613199565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5a9061322b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610cb261180d565b610cbc600061188b565b565b6000610bb8610ccb610a90565b1115610d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0390613297565b60405180910390fd5b6000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8590613303565b60405180910390fd5b6001600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610dde9190613323565b925050819055506000610df16008611504565b9050610dfd6008611951565b610e078482611967565b610e118184611985565b8091505092915050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610e4d61180d565b80600a8190555050565b606060018054610e6690612c63565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9290612c63565b8015610edf5780601f10610eb457610100808354040283529160200191610edf565b820191906000526020600020905b815481529060010190602001808311610ec257829003601f168201915b5050505050905090565b600a5481565b610f01610efa611443565b83836119f2565b5050565b610f16610f10611443565b83611512565b610f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4c90612eaf565b60405180910390fd5b610f6184848484611b5e565b50505050565b600063bc197c8160e01b905095945050505050565b610f8461180d565b80600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fd39190612de7565b925050819055505050565b6060610fe9826113f8565b600060066000848152602001908152602001600020805461100990612c63565b80601f016020809104026020016040519081016040528092919081815260200182805461103590612c63565b80156110825780601f1061105757610100808354040283529160200191611082565b820191906000526020600020905b81548152906001019060200180831161106557829003601f168201915b505050505090506000611093611bba565b905060008151036110a85781925050506110eb565b6000825111156110dd5780826040516020016110c5929190613393565b604051602081830303815290604052925050506110eb565b6110e684611c4c565b925050505b919050565b6000610bb86110fd610a90565b111561113e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113590613297565b60405180910390fd5b600a54341015611183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117a90613403565b60405180910390fd5b600061118f6008611504565b905061119b6008611951565b6111a58482611967565b6111af8184611985565b8091505092915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006001600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461129f9190612de7565b9250508190555063f23a6e6160e01b905095945050505050565b6112c161180d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132790613495565b60405180910390fd5b6113398161188b565b50565b61134461180d565b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561138a573d6000803e3d6000fd5b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61140181611cb4565b611440576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143790613199565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166114be83610b42565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60008061151e83610b42565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611560575061155f81856111b9565b5b8061159e57508373ffffffffffffffffffffffffffffffffffffffff16611586846108b0565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166115c782610b42565b73ffffffffffffffffffffffffffffffffffffffff161461161d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161490613527565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361168c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611683906135b9565b60405180910390fd5b611697838383611d20565b6116a260008261144b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116f29190613323565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117499190612de7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611808838383611d25565b505050565b611815611443565b73ffffffffffffffffffffffffffffffffffffffff16611833610e1b565b73ffffffffffffffffffffffffffffffffffffffff1614611889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188090613625565b60405180910390fd5b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b611981828260405180602001604052806000815250611d2a565b5050565b61198e82611cb4565b6119cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c4906136b7565b60405180910390fd5b806006600084815260200190815260200160002090816119ed919061307b565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5790613723565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b51919061231c565b60405180910390a3505050565b611b698484846115a7565b611b7584848484611d85565b611bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bab906137b5565b60405180910390fd5b50505050565b606060098054611bc990612c63565b80601f0160208091040260200160405190810160405280929190818152602001828054611bf590612c63565b8015611c425780601f10611c1757610100808354040283529160200191611c42565b820191906000526020600020905b815481529060010190602001808311611c2557829003601f168201915b5050505050905090565b6060611c57826113f8565b6000611c61611bba565b90506000815111611c815760405180602001604052806000815250611cac565b80611c8b84611f0c565b604051602001611c9c929190613393565b6040516020818303038152906040525b915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b611d34838361206c565b611d416000848484611d85565b611d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d77906137b5565b60405180910390fd5b505050565b6000611da68473ffffffffffffffffffffffffffffffffffffffff16612245565b15611eff578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611dcf611443565b8786866040518563ffffffff1660e01b8152600401611df1949392919061382a565b6020604051808303816000875af1925050508015611e2d57506040513d601f19601f82011682018060405250810190611e2a919061388b565b60015b611eaf573d8060008114611e5d576040519150601f19603f3d011682016040523d82523d6000602084013e611e62565b606091505b506000815103611ea7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9e906137b5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611f04565b600190505b949350505050565b606060008203611f53576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612067565b600082905060005b60008214611f85578080611f6e906138b8565b915050600a82611f7e919061392f565b9150611f5b565b60008167ffffffffffffffff811115611fa157611fa061257e565b5b6040519080825280601f01601f191660200182016040528015611fd35781602001600182028036833780820191505090505b5090505b6000851461206057600182611fec9190613323565b9150600a85611ffb9190613960565b60306120079190612de7565b60f81b81838151811061201d5761201c613991565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612059919061392f565b9450611fd7565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036120db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d290613a0c565b60405180910390fd5b6120e481611cb4565b15612124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211b90613a78565b60405180910390fd5b61213060008383611d20565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121809190612de7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461224160008383611d25565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6122b18161227c565b81146122bc57600080fd5b50565b6000813590506122ce816122a8565b92915050565b6000602082840312156122ea576122e9612272565b5b60006122f8848285016122bf565b91505092915050565b60008115159050919050565b61231681612301565b82525050565b6000602082019050612331600083018461230d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612371578082015181840152602081019050612356565b83811115612380576000848401525b50505050565b6000601f19601f8301169050919050565b60006123a282612337565b6123ac8185612342565b93506123bc818560208601612353565b6123c581612386565b840191505092915050565b600060208201905081810360008301526123ea8184612397565b905092915050565b6000819050919050565b612405816123f2565b811461241057600080fd5b50565b600081359050612422816123fc565b92915050565b60006020828403121561243e5761243d612272565b5b600061244c84828501612413565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061248082612455565b9050919050565b61249081612475565b82525050565b60006020820190506124ab6000830184612487565b92915050565b6124ba81612475565b81146124c557600080fd5b50565b6000813590506124d7816124b1565b92915050565b600080604083850312156124f4576124f3612272565b5b6000612502858286016124c8565b925050602061251385828601612413565b9150509250929050565b60006020828403121561253357612532612272565b5b6000612541848285016124c8565b91505092915050565b612553816123f2565b82525050565b600060208201905061256e600083018461254a565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6125b682612386565b810181811067ffffffffffffffff821117156125d5576125d461257e565b5b80604052505050565b60006125e8612268565b90506125f482826125ad565b919050565b600067ffffffffffffffff8211156126145761261361257e565b5b61261d82612386565b9050602081019050919050565b82818337600083830152505050565b600061264c612647846125f9565b6125de565b90508281526020810184848401111561266857612667612579565b5b61267384828561262a565b509392505050565b600082601f8301126126905761268f612574565b5b81356126a0848260208601612639565b91505092915050565b600080600080608085870312156126c3576126c2612272565b5b60006126d1878288016124c8565b94505060206126e2878288016124c8565b93505060406126f387828801612413565b925050606085013567ffffffffffffffff81111561271457612713612277565b5b6127208782880161267b565b91505092959194509250565b6127358161227c565b82525050565b6000602082019050612750600083018461272c565b92915050565b60008060006060848603121561276f5761276e612272565b5b600061277d868287016124c8565b935050602061278e868287016124c8565b925050604061279f86828701612413565b9150509250925092565b600067ffffffffffffffff8211156127c4576127c361257e565b5b6127cd82612386565b9050602081019050919050565b60006127ed6127e8846127a9565b6125de565b90508281526020810184848401111561280957612808612579565b5b61281484828561262a565b509392505050565b600082601f83011261283157612830612574565b5b81356128418482602086016127da565b91505092915050565b6000602082840312156128605761285f612272565b5b600082013567ffffffffffffffff81111561287e5761287d612277565b5b61288a8482850161281c565b91505092915050565b600080604083850312156128aa576128a9612272565b5b60006128b8858286016124c8565b925050602083013567ffffffffffffffff8111156128d9576128d8612277565b5b6128e58582860161281c565b9150509250929050565b6128f881612301565b811461290357600080fd5b50565b600081359050612915816128ef565b92915050565b6000806040838503121561293257612931612272565b5b6000612940858286016124c8565b925050602061295185828601612906565b9150509250929050565b600067ffffffffffffffff8211156129765761297561257e565b5b602082029050602081019050919050565b600080fd5b600061299f61299a8461295b565b6125de565b905080838252602082019050602084028301858111156129c2576129c1612987565b5b835b818110156129eb57806129d78882612413565b8452602084019350506020810190506129c4565b5050509392505050565b600082601f830112612a0a57612a09612574565b5b8135612a1a84826020860161298c565b91505092915050565b600080600080600060a08688031215612a3f57612a3e612272565b5b6000612a4d888289016124c8565b9550506020612a5e888289016124c8565b945050604086013567ffffffffffffffff811115612a7f57612a7e612277565b5b612a8b888289016129f5565b935050606086013567ffffffffffffffff811115612aac57612aab612277565b5b612ab8888289016129f5565b925050608086013567ffffffffffffffff811115612ad957612ad8612277565b5b612ae58882890161267b565b9150509295509295909350565b60008060408385031215612b0957612b08612272565b5b6000612b17858286016124c8565b9250506020612b28858286016124c8565b9150509250929050565b600080600080600060a08688031215612b4e57612b4d612272565b5b6000612b5c888289016124c8565b9550506020612b6d888289016124c8565b9450506040612b7e88828901612413565b9350506060612b8f88828901612413565b925050608086013567ffffffffffffffff811115612bb057612baf612277565b5b612bbc8882890161267b565b9150509295509295909350565b6000612bd482612455565b9050919050565b612be481612bc9565b8114612bef57600080fd5b50565b600081359050612c0181612bdb565b92915050565b600060208284031215612c1d57612c1c612272565b5b6000612c2b84828501612bf2565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c7b57607f821691505b602082108103612c8e57612c8d612c34565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612cf0602183612342565b9150612cfb82612c94565b604082019050919050565b60006020820190508181036000830152612d1f81612ce3565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000612d82603e83612342565b9150612d8d82612d26565b604082019050919050565b60006020820190508181036000830152612db181612d75565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612df2826123f2565b9150612dfd836123f2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e3257612e31612db8565b5b828201905092915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000612e99602e83612342565b9150612ea482612e3d565b604082019050919050565b60006020820190508181036000830152612ec881612e8c565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612f317fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612ef4565b612f3b8683612ef4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612f78612f73612f6e846123f2565b612f53565b6123f2565b9050919050565b6000819050919050565b612f9283612f5d565b612fa6612f9e82612f7f565b848454612f01565b825550505050565b600090565b612fbb612fae565b612fc6818484612f89565b505050565b5b81811015612fea57612fdf600082612fb3565b600181019050612fcc565b5050565b601f82111561302f5761300081612ecf565b61300984612ee4565b81016020851015613018578190505b61302c61302485612ee4565b830182612fcb565b50505b505050565b600082821c905092915050565b600061305260001984600802613034565b1980831691505092915050565b600061306b8383613041565b9150826002028217905092915050565b61308482612337565b67ffffffffffffffff81111561309d5761309c61257e565b5b6130a78254612c63565b6130b2828285612fee565b600060209050601f8311600181146130e557600084156130d3578287015190505b6130dd858261305f565b865550613145565b601f1984166130f386612ecf565b60005b8281101561311b578489015182556001820191506020850194506020810190506130f6565b868310156131385784890151613134601f891682613041565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613183601883612342565b915061318e8261314d565b602082019050919050565b600060208201905081810360008301526131b281613176565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613215602983612342565b9150613220826131b9565b604082019050919050565b6000602082019050818103600083015261324481613208565b9050919050565b7f6e6f7420656e6f75676820737570706c792072656d61696e696e670000000000600082015250565b6000613281601b83612342565b915061328c8261324b565b602082019050919050565b600060208201905081810360008301526132b081613274565b9050919050565b7f6e6f7420656e6f756768206275726e656420746f6b656e730000000000000000600082015250565b60006132ed601883612342565b91506132f8826132b7565b602082019050919050565b6000602082019050818103600083015261331c816132e0565b9050919050565b600061332e826123f2565b9150613339836123f2565b92508282101561334c5761334b612db8565b5b828203905092915050565b600081905092915050565b600061336d82612337565b6133778185613357565b9350613387818560208601612353565b80840191505092915050565b600061339f8285613362565b91506133ab8284613362565b91508190509392505050565b7f65746865722073656e7420697320756e64657220707269636500000000000000600082015250565b60006133ed601983612342565b91506133f8826133b7565b602082019050919050565b6000602082019050818103600083015261341c816133e0565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061347f602683612342565b915061348a82613423565b604082019050919050565b600060208201905081810360008301526134ae81613472565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613511602583612342565b915061351c826134b5565b604082019050919050565b6000602082019050818103600083015261354081613504565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006135a3602483612342565b91506135ae82613547565b604082019050919050565b600060208201905081810360008301526135d281613596565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061360f602083612342565b915061361a826135d9565b602082019050919050565b6000602082019050818103600083015261363e81613602565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b60006136a1602e83612342565b91506136ac82613645565b604082019050919050565b600060208201905081810360008301526136d081613694565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061370d601983612342565b9150613718826136d7565b602082019050919050565b6000602082019050818103600083015261373c81613700565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061379f603283612342565b91506137aa82613743565b604082019050919050565b600060208201905081810360008301526137ce81613792565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006137fc826137d5565b61380681856137e0565b9350613816818560208601612353565b61381f81612386565b840191505092915050565b600060808201905061383f6000830187612487565b61384c6020830186612487565b613859604083018561254a565b818103606083015261386b81846137f1565b905095945050505050565b600081519050613885816122a8565b92915050565b6000602082840312156138a1576138a0612272565b5b60006138af84828501613876565b91505092915050565b60006138c3826123f2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036138f5576138f4612db8565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061393a826123f2565b9150613945836123f2565b92508261395557613954613900565b5b828204905092915050565b600061396b826123f2565b9150613976836123f2565b92508261398657613985613900565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006139f6602083612342565b9150613a01826139c0565b602082019050919050565b60006020820190508181036000830152613a25816139e9565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613a62601c83612342565b9150613a6d82613a2c565b602082019050919050565b60006020820190508181036000830152613a9181613a55565b905091905056fea2646970667358221220bc9314989be66b8725e9e6889ce86a4118b7303ede28a4d3125d5078ac9f536564736f6c634300080f0033

Deployed Bytecode

0x6080604052600436106101c25760003560e01c80638cbabefc116100f7578063bc197c8111610095578063e985e9c511610064578063e985e9c514610670578063f23a6e61146106ad578063f2fde38b146106ea578063fa09e63014610713576101c2565b8063bc197c811461059d578063bd4ec2b2146105da578063c87b56dd14610603578063d0def52114610640576101c2565b806395d89b41116100d157806395d89b41146104f5578063a035b1fe14610520578063a22cb4651461054b578063b88d4fde14610574576101c2565b80638cbabefc146104715780638da5cb5b146104a157806391b7f5ed146104cc576101c2565b806323b872dd1161016457806355f804b31161013e57806355f804b3146103b75780636352211e146103e057806370a082311461041d578063715018a61461045a576101c2565b806323b872dd1461033a57806332cb6b0c1461036357806342842e0e1461038e576101c2565b8063095ea7b3116101a0578063095ea7b31461026c5780631352918014610295578063150b7a02146102d257806318160ddd1461030f576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e991906122d4565b61073c565b6040516101fb919061231c565b60405180910390f35b34801561021057600080fd5b5061021961081e565b60405161022691906123d0565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612428565b6108b0565b6040516102639190612496565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e91906124dd565b6108f6565b005b3480156102a157600080fd5b506102bc60048036038101906102b7919061251d565b610a0d565b6040516102c99190612559565b60405180910390f35b3480156102de57600080fd5b506102f960048036038101906102f491906126a9565b610a25565b604051610306919061273b565b60405180910390f35b34801561031b57600080fd5b50610324610a90565b6040516103319190612559565b60405180910390f35b34801561034657600080fd5b50610361600480360381019061035c9190612756565b610aa1565b005b34801561036f57600080fd5b50610378610b01565b6040516103859190612559565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190612756565b610b07565b005b3480156103c357600080fd5b506103de60048036038101906103d9919061284a565b610b27565b005b3480156103ec57600080fd5b5061040760048036038101906104029190612428565b610b42565b6040516104149190612496565b60405180910390f35b34801561042957600080fd5b50610444600480360381019061043f919061251d565b610bf3565b6040516104519190612559565b60405180910390f35b34801561046657600080fd5b5061046f610caa565b005b61048b60048036038101906104869190612893565b610cbe565b6040516104989190612559565b60405180910390f35b3480156104ad57600080fd5b506104b6610e1b565b6040516104c39190612496565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee9190612428565b610e45565b005b34801561050157600080fd5b5061050a610e57565b60405161051791906123d0565b60405180910390f35b34801561052c57600080fd5b50610535610ee9565b6040516105429190612559565b60405180910390f35b34801561055757600080fd5b50610572600480360381019061056d919061291b565b610eef565b005b34801561058057600080fd5b5061059b600480360381019061059691906126a9565b610f05565b005b3480156105a957600080fd5b506105c460048036038101906105bf9190612a23565b610f67565b6040516105d1919061273b565b60405180910390f35b3480156105e657600080fd5b5061060160048036038101906105fc91906124dd565b610f7c565b005b34801561060f57600080fd5b5061062a60048036038101906106259190612428565b610fde565b60405161063791906123d0565b60405180910390f35b61065a60048036038101906106559190612893565b6110f0565b6040516106679190612559565b60405180910390f35b34801561067c57600080fd5b5061069760048036038101906106929190612af2565b6111b9565b6040516106a4919061231c565b60405180910390f35b3480156106b957600080fd5b506106d460048036038101906106cf9190612b32565b61124d565b6040516106e1919061273b565b60405180910390f35b3480156106f657600080fd5b50610711600480360381019061070c919061251d565b6112b9565b005b34801561071f57600080fd5b5061073a60048036038101906107359190612c07565b61133c565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061080757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061081757506108168261138e565b5b9050919050565b60606000805461082d90612c63565b80601f016020809104026020016040519081016040528092919081815260200182805461085990612c63565b80156108a65780601f1061087b576101008083540402835291602001916108a6565b820191906000526020600020905b81548152906001019060200180831161088957829003601f168201915b5050505050905090565b60006108bb826113f8565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061090182610b42565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610971576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096890612d06565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610990611443565b73ffffffffffffffffffffffffffffffffffffffff1614806109bf57506109be816109b9611443565b6111b9565b5b6109fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f590612d98565b60405180910390fd5b610a08838361144b565b505050565b600b6020528060005260406000206000915090505481565b60006001600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610a779190612de7565b9250508190555063150b7a0260e01b9050949350505050565b6000610a9c6008611504565b905090565b610ab2610aac611443565b82611512565b610af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae890612eaf565b60405180910390fd5b610afc8383836115a7565b505050565b610bb881565b610b2283838360405180602001604052806000815250610f05565b505050565b610b2f61180d565b8060099081610b3e919061307b565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be190613199565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5a9061322b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610cb261180d565b610cbc600061188b565b565b6000610bb8610ccb610a90565b1115610d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0390613297565b60405180910390fd5b6000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8590613303565b60405180910390fd5b6001600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610dde9190613323565b925050819055506000610df16008611504565b9050610dfd6008611951565b610e078482611967565b610e118184611985565b8091505092915050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610e4d61180d565b80600a8190555050565b606060018054610e6690612c63565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9290612c63565b8015610edf5780601f10610eb457610100808354040283529160200191610edf565b820191906000526020600020905b815481529060010190602001808311610ec257829003601f168201915b5050505050905090565b600a5481565b610f01610efa611443565b83836119f2565b5050565b610f16610f10611443565b83611512565b610f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4c90612eaf565b60405180910390fd5b610f6184848484611b5e565b50505050565b600063bc197c8160e01b905095945050505050565b610f8461180d565b80600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fd39190612de7565b925050819055505050565b6060610fe9826113f8565b600060066000848152602001908152602001600020805461100990612c63565b80601f016020809104026020016040519081016040528092919081815260200182805461103590612c63565b80156110825780601f1061105757610100808354040283529160200191611082565b820191906000526020600020905b81548152906001019060200180831161106557829003601f168201915b505050505090506000611093611bba565b905060008151036110a85781925050506110eb565b6000825111156110dd5780826040516020016110c5929190613393565b604051602081830303815290604052925050506110eb565b6110e684611c4c565b925050505b919050565b6000610bb86110fd610a90565b111561113e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113590613297565b60405180910390fd5b600a54341015611183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117a90613403565b60405180910390fd5b600061118f6008611504565b905061119b6008611951565b6111a58482611967565b6111af8184611985565b8091505092915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006001600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461129f9190612de7565b9250508190555063f23a6e6160e01b905095945050505050565b6112c161180d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132790613495565b60405180910390fd5b6113398161188b565b50565b61134461180d565b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561138a573d6000803e3d6000fd5b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61140181611cb4565b611440576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143790613199565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166114be83610b42565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60008061151e83610b42565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611560575061155f81856111b9565b5b8061159e57508373ffffffffffffffffffffffffffffffffffffffff16611586846108b0565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166115c782610b42565b73ffffffffffffffffffffffffffffffffffffffff161461161d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161490613527565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361168c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611683906135b9565b60405180910390fd5b611697838383611d20565b6116a260008261144b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116f29190613323565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117499190612de7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611808838383611d25565b505050565b611815611443565b73ffffffffffffffffffffffffffffffffffffffff16611833610e1b565b73ffffffffffffffffffffffffffffffffffffffff1614611889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188090613625565b60405180910390fd5b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b611981828260405180602001604052806000815250611d2a565b5050565b61198e82611cb4565b6119cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c4906136b7565b60405180910390fd5b806006600084815260200190815260200160002090816119ed919061307b565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5790613723565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b51919061231c565b60405180910390a3505050565b611b698484846115a7565b611b7584848484611d85565b611bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bab906137b5565b60405180910390fd5b50505050565b606060098054611bc990612c63565b80601f0160208091040260200160405190810160405280929190818152602001828054611bf590612c63565b8015611c425780601f10611c1757610100808354040283529160200191611c42565b820191906000526020600020905b815481529060010190602001808311611c2557829003601f168201915b5050505050905090565b6060611c57826113f8565b6000611c61611bba565b90506000815111611c815760405180602001604052806000815250611cac565b80611c8b84611f0c565b604051602001611c9c929190613393565b6040516020818303038152906040525b915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b611d34838361206c565b611d416000848484611d85565b611d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d77906137b5565b60405180910390fd5b505050565b6000611da68473ffffffffffffffffffffffffffffffffffffffff16612245565b15611eff578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611dcf611443565b8786866040518563ffffffff1660e01b8152600401611df1949392919061382a565b6020604051808303816000875af1925050508015611e2d57506040513d601f19601f82011682018060405250810190611e2a919061388b565b60015b611eaf573d8060008114611e5d576040519150601f19603f3d011682016040523d82523d6000602084013e611e62565b606091505b506000815103611ea7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9e906137b5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611f04565b600190505b949350505050565b606060008203611f53576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612067565b600082905060005b60008214611f85578080611f6e906138b8565b915050600a82611f7e919061392f565b9150611f5b565b60008167ffffffffffffffff811115611fa157611fa061257e565b5b6040519080825280601f01601f191660200182016040528015611fd35781602001600182028036833780820191505090505b5090505b6000851461206057600182611fec9190613323565b9150600a85611ffb9190613960565b60306120079190612de7565b60f81b81838151811061201d5761201c613991565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612059919061392f565b9450611fd7565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036120db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d290613a0c565b60405180910390fd5b6120e481611cb4565b15612124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211b90613a78565b60405180910390fd5b61213060008383611d20565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121809190612de7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461224160008383611d25565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6122b18161227c565b81146122bc57600080fd5b50565b6000813590506122ce816122a8565b92915050565b6000602082840312156122ea576122e9612272565b5b60006122f8848285016122bf565b91505092915050565b60008115159050919050565b61231681612301565b82525050565b6000602082019050612331600083018461230d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612371578082015181840152602081019050612356565b83811115612380576000848401525b50505050565b6000601f19601f8301169050919050565b60006123a282612337565b6123ac8185612342565b93506123bc818560208601612353565b6123c581612386565b840191505092915050565b600060208201905081810360008301526123ea8184612397565b905092915050565b6000819050919050565b612405816123f2565b811461241057600080fd5b50565b600081359050612422816123fc565b92915050565b60006020828403121561243e5761243d612272565b5b600061244c84828501612413565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061248082612455565b9050919050565b61249081612475565b82525050565b60006020820190506124ab6000830184612487565b92915050565b6124ba81612475565b81146124c557600080fd5b50565b6000813590506124d7816124b1565b92915050565b600080604083850312156124f4576124f3612272565b5b6000612502858286016124c8565b925050602061251385828601612413565b9150509250929050565b60006020828403121561253357612532612272565b5b6000612541848285016124c8565b91505092915050565b612553816123f2565b82525050565b600060208201905061256e600083018461254a565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6125b682612386565b810181811067ffffffffffffffff821117156125d5576125d461257e565b5b80604052505050565b60006125e8612268565b90506125f482826125ad565b919050565b600067ffffffffffffffff8211156126145761261361257e565b5b61261d82612386565b9050602081019050919050565b82818337600083830152505050565b600061264c612647846125f9565b6125de565b90508281526020810184848401111561266857612667612579565b5b61267384828561262a565b509392505050565b600082601f8301126126905761268f612574565b5b81356126a0848260208601612639565b91505092915050565b600080600080608085870312156126c3576126c2612272565b5b60006126d1878288016124c8565b94505060206126e2878288016124c8565b93505060406126f387828801612413565b925050606085013567ffffffffffffffff81111561271457612713612277565b5b6127208782880161267b565b91505092959194509250565b6127358161227c565b82525050565b6000602082019050612750600083018461272c565b92915050565b60008060006060848603121561276f5761276e612272565b5b600061277d868287016124c8565b935050602061278e868287016124c8565b925050604061279f86828701612413565b9150509250925092565b600067ffffffffffffffff8211156127c4576127c361257e565b5b6127cd82612386565b9050602081019050919050565b60006127ed6127e8846127a9565b6125de565b90508281526020810184848401111561280957612808612579565b5b61281484828561262a565b509392505050565b600082601f83011261283157612830612574565b5b81356128418482602086016127da565b91505092915050565b6000602082840312156128605761285f612272565b5b600082013567ffffffffffffffff81111561287e5761287d612277565b5b61288a8482850161281c565b91505092915050565b600080604083850312156128aa576128a9612272565b5b60006128b8858286016124c8565b925050602083013567ffffffffffffffff8111156128d9576128d8612277565b5b6128e58582860161281c565b9150509250929050565b6128f881612301565b811461290357600080fd5b50565b600081359050612915816128ef565b92915050565b6000806040838503121561293257612931612272565b5b6000612940858286016124c8565b925050602061295185828601612906565b9150509250929050565b600067ffffffffffffffff8211156129765761297561257e565b5b602082029050602081019050919050565b600080fd5b600061299f61299a8461295b565b6125de565b905080838252602082019050602084028301858111156129c2576129c1612987565b5b835b818110156129eb57806129d78882612413565b8452602084019350506020810190506129c4565b5050509392505050565b600082601f830112612a0a57612a09612574565b5b8135612a1a84826020860161298c565b91505092915050565b600080600080600060a08688031215612a3f57612a3e612272565b5b6000612a4d888289016124c8565b9550506020612a5e888289016124c8565b945050604086013567ffffffffffffffff811115612a7f57612a7e612277565b5b612a8b888289016129f5565b935050606086013567ffffffffffffffff811115612aac57612aab612277565b5b612ab8888289016129f5565b925050608086013567ffffffffffffffff811115612ad957612ad8612277565b5b612ae58882890161267b565b9150509295509295909350565b60008060408385031215612b0957612b08612272565b5b6000612b17858286016124c8565b9250506020612b28858286016124c8565b9150509250929050565b600080600080600060a08688031215612b4e57612b4d612272565b5b6000612b5c888289016124c8565b9550506020612b6d888289016124c8565b9450506040612b7e88828901612413565b9350506060612b8f88828901612413565b925050608086013567ffffffffffffffff811115612bb057612baf612277565b5b612bbc8882890161267b565b9150509295509295909350565b6000612bd482612455565b9050919050565b612be481612bc9565b8114612bef57600080fd5b50565b600081359050612c0181612bdb565b92915050565b600060208284031215612c1d57612c1c612272565b5b6000612c2b84828501612bf2565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c7b57607f821691505b602082108103612c8e57612c8d612c34565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612cf0602183612342565b9150612cfb82612c94565b604082019050919050565b60006020820190508181036000830152612d1f81612ce3565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000612d82603e83612342565b9150612d8d82612d26565b604082019050919050565b60006020820190508181036000830152612db181612d75565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612df2826123f2565b9150612dfd836123f2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e3257612e31612db8565b5b828201905092915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000612e99602e83612342565b9150612ea482612e3d565b604082019050919050565b60006020820190508181036000830152612ec881612e8c565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612f317fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612ef4565b612f3b8683612ef4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612f78612f73612f6e846123f2565b612f53565b6123f2565b9050919050565b6000819050919050565b612f9283612f5d565b612fa6612f9e82612f7f565b848454612f01565b825550505050565b600090565b612fbb612fae565b612fc6818484612f89565b505050565b5b81811015612fea57612fdf600082612fb3565b600181019050612fcc565b5050565b601f82111561302f5761300081612ecf565b61300984612ee4565b81016020851015613018578190505b61302c61302485612ee4565b830182612fcb565b50505b505050565b600082821c905092915050565b600061305260001984600802613034565b1980831691505092915050565b600061306b8383613041565b9150826002028217905092915050565b61308482612337565b67ffffffffffffffff81111561309d5761309c61257e565b5b6130a78254612c63565b6130b2828285612fee565b600060209050601f8311600181146130e557600084156130d3578287015190505b6130dd858261305f565b865550613145565b601f1984166130f386612ecf565b60005b8281101561311b578489015182556001820191506020850194506020810190506130f6565b868310156131385784890151613134601f891682613041565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613183601883612342565b915061318e8261314d565b602082019050919050565b600060208201905081810360008301526131b281613176565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613215602983612342565b9150613220826131b9565b604082019050919050565b6000602082019050818103600083015261324481613208565b9050919050565b7f6e6f7420656e6f75676820737570706c792072656d61696e696e670000000000600082015250565b6000613281601b83612342565b915061328c8261324b565b602082019050919050565b600060208201905081810360008301526132b081613274565b9050919050565b7f6e6f7420656e6f756768206275726e656420746f6b656e730000000000000000600082015250565b60006132ed601883612342565b91506132f8826132b7565b602082019050919050565b6000602082019050818103600083015261331c816132e0565b9050919050565b600061332e826123f2565b9150613339836123f2565b92508282101561334c5761334b612db8565b5b828203905092915050565b600081905092915050565b600061336d82612337565b6133778185613357565b9350613387818560208601612353565b80840191505092915050565b600061339f8285613362565b91506133ab8284613362565b91508190509392505050565b7f65746865722073656e7420697320756e64657220707269636500000000000000600082015250565b60006133ed601983612342565b91506133f8826133b7565b602082019050919050565b6000602082019050818103600083015261341c816133e0565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061347f602683612342565b915061348a82613423565b604082019050919050565b600060208201905081810360008301526134ae81613472565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613511602583612342565b915061351c826134b5565b604082019050919050565b6000602082019050818103600083015261354081613504565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006135a3602483612342565b91506135ae82613547565b604082019050919050565b600060208201905081810360008301526135d281613596565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061360f602083612342565b915061361a826135d9565b602082019050919050565b6000602082019050818103600083015261363e81613602565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b60006136a1602e83612342565b91506136ac82613645565b604082019050919050565b600060208201905081810360008301526136d081613694565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061370d601983612342565b9150613718826136d7565b602082019050919050565b6000602082019050818103600083015261373c81613700565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061379f603283612342565b91506137aa82613743565b604082019050919050565b600060208201905081810360008301526137ce81613792565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006137fc826137d5565b61380681856137e0565b9350613816818560208601612353565b61381f81612386565b840191505092915050565b600060808201905061383f6000830187612487565b61384c6020830186612487565b613859604083018561254a565b818103606083015261386b81846137f1565b905095945050505050565b600081519050613885816122a8565b92915050565b6000602082840312156138a1576138a0612272565b5b60006138af84828501613876565b91505092915050565b60006138c3826123f2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036138f5576138f4612db8565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061393a826123f2565b9150613945836123f2565b92508261395557613954613900565b5b828204905092915050565b600061396b826123f2565b9150613976836123f2565b92508261398657613985613900565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006139f6602083612342565b9150613a01826139c0565b602082019050919050565b60006020820190508181036000830152613a25816139e9565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613a62601c83612342565b9150613a6d82613a2c565b602082019050919050565b60006020820190508181036000830152613a9181613a55565b905091905056fea2646970667358221220bc9314989be66b8725e9e6889ce86a4118b7303ede28a4d3125d5078ac9f536564736f6c634300080f0033

Deployed Bytecode Sourcemap

58244:2806:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22060:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22987:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24500:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24017:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58552:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60383:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59801:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25200:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58466:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25607:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60054:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22698:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22429:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41633:103;;;;;;;;;;;;;:::i;:::-;;58816:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40985:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23156:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58513:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24743:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25863:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60844:203;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59910:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35766:624;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59348:445;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24969:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60608:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41891:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60262:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22060:305;22162:4;22214:25;22199:40;;;:11;:40;;;;:105;;;;22271:33;22256:48;;;:11;:48;;;;22199:105;:158;;;;22321:36;22345:11;22321:23;:36::i;:::-;22199:158;22179:178;;22060:305;;;:::o;22987:100::-;23041:13;23074:5;23067:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22987:100;:::o;24500:171::-;24576:7;24596:23;24611:7;24596:14;:23::i;:::-;24639:15;:24;24655:7;24639:24;;;;;;;;;;;;;;;;;;;;;24632:31;;24500:171;;;:::o;24017:417::-;24098:13;24114:23;24129:7;24114:14;:23::i;:::-;24098:39;;24162:5;24156:11;;:2;:11;;;24148:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24256:5;24240:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24265:37;24282:5;24289:12;:10;:12::i;:::-;24265:16;:37::i;:::-;24240:62;24218:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;24405:21;24414:2;24418:7;24405:8;:21::i;:::-;24087:347;24017:417;;:::o;58552:58::-;;;;;;;;;;;;;;;;;:::o;60383:217::-;60488:6;60543:1;60507:26;:32;60534:4;60507:32;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;60562:30;;;60555:37;;60383:217;;;;;;:::o;59801:101::-;59845:4;59869:25;:15;:23;:25::i;:::-;59862:32;;59801:101;:::o;25200:336::-;25395:41;25414:12;:10;:12::i;:::-;25428:7;25395:18;:41::i;:::-;25387:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;25500:28;25510:4;25516:2;25520:7;25500:9;:28::i;:::-;25200:336;;;:::o;58466:38::-;58500:4;58466:38;:::o;25607:185::-;25745:39;25762:4;25768:2;25772:7;25745:39;;;;;;;;;;;;:16;:39::i;:::-;25607:185;;;:::o;60054:105::-;40871:13;:11;:13::i;:::-;60141:10:::1;60130:8;:21;;;;;;:::i;:::-;;60054:105:::0;:::o;22698:222::-;22770:7;22790:13;22806:7;:16;22814:7;22806:16;;;;;;;;;;;;;;;;;;;;;22790:32;;22858:1;22841:19;;:5;:19;;;22833:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;22907:5;22900:12;;;22698:222;;;:::o;22429:207::-;22501:7;22546:1;22529:19;;:5;:19;;;22521:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22612:9;:16;22622:5;22612:16;;;;;;;;;;;;;;;;22605:23;;22429:207;;;:::o;41633:103::-;40871:13;:11;:13::i;:::-;41698:30:::1;41725:1;41698:18;:30::i;:::-;41633:103::o:0;58816:524::-;58903:7;58500:4;58931:13;:11;:13::i;:::-;:27;;58923:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;59048:1;59009:26;:36;59036:8;59009:36;;;;;;;;;;;;;;;;:40;59001:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;59131:1;59091:26;:36;59118:8;59091:36;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;59145:15;59163:25;:15;:23;:25::i;:::-;59145:43;;59199:27;:15;:25;:27::i;:::-;59237:28;59247:8;59257:7;59237:9;:28::i;:::-;59276:31;59289:7;59298:8;59276:12;:31::i;:::-;59325:7;59318:14;;;58816:524;;;;:::o;40985:87::-;41031:7;41058:6;;;;;;;;;;;41051:13;;40985:87;:::o;60167:::-;40871:13;:11;:13::i;:::-;60238:8:::1;60230:5;:16;;;;60167:87:::0;:::o;23156:104::-;23212:13;23245:7;23238:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23156:104;:::o;58513:30::-;;;;:::o;24743:155::-;24838:52;24857:12;:10;:12::i;:::-;24871:8;24881;24838:18;:52::i;:::-;24743:155;;:::o;25863:323::-;26037:41;26056:12;:10;:12::i;:::-;26070:7;26037:18;:41::i;:::-;26029:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;26140:38;26154:4;26160:2;26164:7;26173:4;26140:13;:38::i;:::-;25863:323;;;;:::o;60844:203::-;60977:6;61003:36;;;60996:43;;60844:203;;;;;;;:::o;59910:136::-;40871:13;:11;:13::i;:::-;60030:8:::1;59992:26;:34;60019:6;59992:34;;;;;;;;;;;;;;;;:46;;;;;;;:::i;:::-;;;;;;;;59910:136:::0;;:::o;35766:624::-;35839:13;35865:23;35880:7;35865:14;:23::i;:::-;35901;35927:10;:19;35938:7;35927:19;;;;;;;;;;;35901:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35957:18;35978:10;:8;:10::i;:::-;35957:31;;36086:1;36070:4;36064:18;:23;36060:72;;36111:9;36104:16;;;;;;36060:72;36262:1;36242:9;36236:23;:27;36232:108;;;36311:4;36317:9;36294:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36280:48;;;;;;36232:108;36359:23;36374:7;36359:14;:23::i;:::-;36352:30;;;;35766:624;;;;:::o;59348:445::-;59431:7;58500:4;59459:13;:11;:13::i;:::-;:27;;59451:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;59550:5;;59537:9;:18;;59529:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;59598:15;59616:25;:15;:23;:25::i;:::-;59598:43;;59652:27;:15;:25;:27::i;:::-;59690:28;59700:8;59710:7;59690:9;:28::i;:::-;59729:31;59742:7;59751:8;59729:12;:31::i;:::-;59778:7;59771:14;;;59348:445;;;;:::o;24969:164::-;25066:4;25090:18;:25;25109:5;25090:25;;;;;;;;;;;;;;;:35;25116:8;25090:35;;;;;;;;;;;;;;;;;;;;;;;;;25083:42;;24969:164;;;;:::o;60608:228::-;60723:6;60778:1;60742:26;:32;60769:4;60742:32;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;60797:31;;;60790:38;;60608:228;;;;;;;:::o;41891:201::-;40871:13;:11;:13::i;:::-;42000:1:::1;41980:22;;:8;:22;;::::0;41972:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;42056:28;42075:8;42056:18;:28::i;:::-;41891:201:::0;:::o;60262:113::-;40871:13;:11;:13::i;:::-;60333:2:::1;:11;;:34;60345:21;60333:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;60262:113:::0;:::o;20491:157::-;20576:4;20615:25;20600:40;;;:11;:40;;;;20593:47;;20491:157;;;:::o;32475:135::-;32557:16;32565:7;32557;:16::i;:::-;32549:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;32475:135;:::o;16917:98::-;16970:7;16997:10;16990:17;;16917:98;:::o;31754:174::-;31856:2;31829:15;:24;31845:7;31829:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31912:7;31908:2;31874:46;;31883:23;31898:7;31883:14;:23::i;:::-;31874:46;;;;;;;;;;;;31754:174;;:::o;43322:114::-;43387:7;43414;:14;;;43407:21;;43322:114;;;:::o;27987:264::-;28080:4;28097:13;28113:23;28128:7;28113:14;:23::i;:::-;28097:39;;28166:5;28155:16;;:7;:16;;;:52;;;;28175:32;28192:5;28199:7;28175:16;:32::i;:::-;28155:52;:87;;;;28235:7;28211:31;;:20;28223:7;28211:11;:20::i;:::-;:31;;;28155:87;28147:96;;;27987:264;;;;:::o;31010:625::-;31169:4;31142:31;;:23;31157:7;31142:14;:23::i;:::-;:31;;;31134:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31248:1;31234:16;;:2;:16;;;31226:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31304:39;31325:4;31331:2;31335:7;31304:20;:39::i;:::-;31408:29;31425:1;31429:7;31408:8;:29::i;:::-;31469:1;31450:9;:15;31460:4;31450:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31498:1;31481:9;:13;31491:2;31481:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31529:2;31510:7;:16;31518:7;31510:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31568:7;31564:2;31549:27;;31558:4;31549:27;;;;;;;;;;;;31589:38;31609:4;31615:2;31619:7;31589:19;:38::i;:::-;31010:625;;;:::o;41150:132::-;41225:12;:10;:12::i;:::-;41214:23;;:7;:5;:7::i;:::-;:23;;;41206:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41150:132::o;42252:191::-;42326:16;42345:6;;;;;;;;;;;42326:25;;42371:8;42362:6;;:17;;;;;;;;;;;;;;;;;;42426:8;42395:40;;42416:8;42395:40;;;;;;;;;;;;42315:128;42252:191;:::o;43444:127::-;43551:1;43533:7;:14;;;:19;;;;;;;;;;;43444:127;:::o;28593:110::-;28669:26;28679:2;28683:7;28669:26;;;;;;;;;;;;:9;:26::i;:::-;28593:110;;:::o;36546:217::-;36646:16;36654:7;36646;:16::i;:::-;36638:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;36746:9;36724:10;:19;36735:7;36724:19;;;;;;;;;;;:31;;;;;;:::i;:::-;;36546:217;;:::o;32071:315::-;32226:8;32217:17;;:5;:17;;;32209:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32313:8;32275:18;:25;32294:5;32275:25;;;;;;;;;;;;;;;:35;32301:8;32275:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32359:8;32337:41;;32352:5;32337:41;;;32369:8;32337:41;;;;;;:::i;:::-;;;;;;;;32071:315;;;:::o;27067:313::-;27223:28;27233:4;27239:2;27243:7;27223:9;:28::i;:::-;27270:47;27293:4;27299:2;27303:7;27312:4;27270:22;:47::i;:::-;27262:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;27067:313;;;;:::o;58708:101::-;58760:13;58793:8;58786:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58708:101;:::o;23331:281::-;23404:13;23430:23;23445:7;23430:14;:23::i;:::-;23466:21;23490:10;:8;:10::i;:::-;23466:34;;23542:1;23524:7;23518:21;:25;:86;;;;;;;;;;;;;;;;;23570:7;23579:18;:7;:16;:18::i;:::-;23553:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23518:86;23511:93;;;23331:281;;;:::o;27693:127::-;27758:4;27810:1;27782:30;;:7;:16;27790:7;27782:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27775:37;;27693:127;;;:::o;34599:126::-;;;;:::o;35110:125::-;;;;:::o;28930:319::-;29059:18;29065:2;29069:7;29059:5;:18::i;:::-;29110:53;29141:1;29145:2;29149:7;29158:4;29110:22;:53::i;:::-;29088:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;28930:319;;;:::o;33174:853::-;33328:4;33349:15;:2;:13;;;:15::i;:::-;33345:675;;;33401:2;33385:36;;;33422:12;:10;:12::i;:::-;33436:4;33442:7;33451:4;33385:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33381:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33643:1;33626:6;:13;:18;33622:328;;33669:60;;;;;;;;;;:::i;:::-;;;;;;;;33622:328;33900:6;33894:13;33885:6;33881:2;33877:15;33870:38;33381:584;33517:41;;;33507:51;;;:6;:51;;;;33500:58;;;;;33345:675;34004:4;33997:11;;33174:853;;;;;;;:::o;17561:723::-;17617:13;17847:1;17838:5;:10;17834:53;;17865:10;;;;;;;;;;;;;;;;;;;;;17834:53;17897:12;17912:5;17897:20;;17928:14;17953:78;17968:1;17960:4;:9;17953:78;;17986:8;;;;;:::i;:::-;;;;18017:2;18009:10;;;;;:::i;:::-;;;17953:78;;;18041:19;18073:6;18063:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18041:39;;18091:154;18107:1;18098:5;:10;18091:154;;18135:1;18125:11;;;;;:::i;:::-;;;18202:2;18194:5;:10;;;;:::i;:::-;18181:2;:24;;;;:::i;:::-;18168:39;;18151:6;18158;18151:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18231:2;18222:11;;;;;:::i;:::-;;;18091:154;;;18269:6;18255:21;;;;;17561:723;;;;:::o;29585:439::-;29679:1;29665:16;;:2;:16;;;29657:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29738:16;29746:7;29738;:16::i;:::-;29737:17;29729:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29800:45;29829:1;29833:2;29837:7;29800:20;:45::i;:::-;29875:1;29858:9;:13;29868:2;29858:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29906:2;29887:7;:16;29895:7;29887:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29951:7;29947:2;29926:33;;29943:1;29926:33;;;;;;;;;;;;29972:44;30000:1;30004:2;30008:7;29972:19;:44::i;:::-;29585:439;;:::o;8918:326::-;8978:4;9235:1;9213:7;:19;;;:23;9206:30;;8918:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:329::-;4997:6;5046:2;5034:9;5025:7;5021:23;5017:32;5014:119;;;5052:79;;:::i;:::-;5014:119;5172:1;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5143:117;4938:329;;;;:::o;5273:118::-;5360:24;5378:5;5360:24;:::i;:::-;5355:3;5348:37;5273:118;;:::o;5397:222::-;5490:4;5528:2;5517:9;5513:18;5505:26;;5541:71;5609:1;5598:9;5594:17;5585:6;5541:71;:::i;:::-;5397:222;;;;:::o;5625:117::-;5734:1;5731;5724:12;5748:117;5857:1;5854;5847:12;5871:180;5919:77;5916:1;5909:88;6016:4;6013:1;6006:15;6040:4;6037:1;6030:15;6057:281;6140:27;6162:4;6140:27;:::i;:::-;6132:6;6128:40;6270:6;6258:10;6255:22;6234:18;6222:10;6219:34;6216:62;6213:88;;;6281:18;;:::i;:::-;6213:88;6321:10;6317:2;6310:22;6100:238;6057:281;;:::o;6344:129::-;6378:6;6405:20;;:::i;:::-;6395:30;;6434:33;6462:4;6454:6;6434:33;:::i;:::-;6344:129;;;:::o;6479:307::-;6540:4;6630:18;6622:6;6619:30;6616:56;;;6652:18;;:::i;:::-;6616:56;6690:29;6712:6;6690:29;:::i;:::-;6682:37;;6774:4;6768;6764:15;6756:23;;6479:307;;;:::o;6792:154::-;6876:6;6871:3;6866;6853:30;6938:1;6929:6;6924:3;6920:16;6913:27;6792:154;;;:::o;6952:410::-;7029:5;7054:65;7070:48;7111:6;7070:48;:::i;:::-;7054:65;:::i;:::-;7045:74;;7142:6;7135:5;7128:21;7180:4;7173:5;7169:16;7218:3;7209:6;7204:3;7200:16;7197:25;7194:112;;;7225:79;;:::i;:::-;7194:112;7315:41;7349:6;7344:3;7339;7315:41;:::i;:::-;7035:327;6952:410;;;;;:::o;7381:338::-;7436:5;7485:3;7478:4;7470:6;7466:17;7462:27;7452:122;;7493:79;;:::i;:::-;7452:122;7610:6;7597:20;7635:78;7709:3;7701:6;7694:4;7686:6;7682:17;7635:78;:::i;:::-;7626:87;;7442:277;7381:338;;;;:::o;7725:943::-;7820:6;7828;7836;7844;7893:3;7881:9;7872:7;7868:23;7864:33;7861:120;;;7900:79;;:::i;:::-;7861:120;8020:1;8045:53;8090:7;8081:6;8070:9;8066:22;8045:53;:::i;:::-;8035:63;;7991:117;8147:2;8173:53;8218:7;8209:6;8198:9;8194:22;8173:53;:::i;:::-;8163:63;;8118:118;8275:2;8301:53;8346:7;8337:6;8326:9;8322:22;8301:53;:::i;:::-;8291:63;;8246:118;8431:2;8420:9;8416:18;8403:32;8462:18;8454:6;8451:30;8448:117;;;8484:79;;:::i;:::-;8448:117;8589:62;8643:7;8634:6;8623:9;8619:22;8589:62;:::i;:::-;8579:72;;8374:287;7725:943;;;;;;;:::o;8674:115::-;8759:23;8776:5;8759:23;:::i;:::-;8754:3;8747:36;8674:115;;:::o;8795:218::-;8886:4;8924:2;8913:9;8909:18;8901:26;;8937:69;9003:1;8992:9;8988:17;8979:6;8937:69;:::i;:::-;8795:218;;;;:::o;9019:619::-;9096:6;9104;9112;9161:2;9149:9;9140:7;9136:23;9132:32;9129:119;;;9167:79;;:::i;:::-;9129:119;9287:1;9312:53;9357:7;9348:6;9337:9;9333:22;9312:53;:::i;:::-;9302:63;;9258:117;9414:2;9440:53;9485:7;9476:6;9465:9;9461:22;9440:53;:::i;:::-;9430:63;;9385:118;9542:2;9568:53;9613:7;9604:6;9593:9;9589:22;9568:53;:::i;:::-;9558:63;;9513:118;9019:619;;;;;:::o;9644:308::-;9706:4;9796:18;9788:6;9785:30;9782:56;;;9818:18;;:::i;:::-;9782:56;9856:29;9878:6;9856:29;:::i;:::-;9848:37;;9940:4;9934;9930:15;9922:23;;9644:308;;;:::o;9958:412::-;10036:5;10061:66;10077:49;10119:6;10077:49;:::i;:::-;10061:66;:::i;:::-;10052:75;;10150:6;10143:5;10136:21;10188:4;10181:5;10177:16;10226:3;10217:6;10212:3;10208:16;10205:25;10202:112;;;10233:79;;:::i;:::-;10202:112;10323:41;10357:6;10352:3;10347;10323:41;:::i;:::-;10042:328;9958:412;;;;;:::o;10390:340::-;10446:5;10495:3;10488:4;10480:6;10476:17;10472:27;10462:122;;10503:79;;:::i;:::-;10462:122;10620:6;10607:20;10645:79;10720:3;10712:6;10705:4;10697:6;10693:17;10645:79;:::i;:::-;10636:88;;10452:278;10390:340;;;;:::o;10736:509::-;10805:6;10854:2;10842:9;10833:7;10829:23;10825:32;10822:119;;;10860:79;;:::i;:::-;10822:119;11008:1;10997:9;10993:17;10980:31;11038:18;11030:6;11027:30;11024:117;;;11060:79;;:::i;:::-;11024:117;11165:63;11220:7;11211:6;11200:9;11196:22;11165:63;:::i;:::-;11155:73;;10951:287;10736:509;;;;:::o;11251:654::-;11329:6;11337;11386:2;11374:9;11365:7;11361:23;11357:32;11354:119;;;11392:79;;:::i;:::-;11354:119;11512:1;11537:53;11582:7;11573:6;11562:9;11558:22;11537:53;:::i;:::-;11527:63;;11483:117;11667:2;11656:9;11652:18;11639:32;11698:18;11690:6;11687:30;11684:117;;;11720:79;;:::i;:::-;11684:117;11825:63;11880:7;11871:6;11860:9;11856:22;11825:63;:::i;:::-;11815:73;;11610:288;11251:654;;;;;:::o;11911:116::-;11981:21;11996:5;11981:21;:::i;:::-;11974:5;11971:32;11961:60;;12017:1;12014;12007:12;11961:60;11911:116;:::o;12033:133::-;12076:5;12114:6;12101:20;12092:29;;12130:30;12154:5;12130:30;:::i;:::-;12033:133;;;;:::o;12172:468::-;12237:6;12245;12294:2;12282:9;12273:7;12269:23;12265:32;12262:119;;;12300:79;;:::i;:::-;12262:119;12420:1;12445:53;12490:7;12481:6;12470:9;12466:22;12445:53;:::i;:::-;12435:63;;12391:117;12547:2;12573:50;12615:7;12606:6;12595:9;12591:22;12573:50;:::i;:::-;12563:60;;12518:115;12172:468;;;;;:::o;12646:311::-;12723:4;12813:18;12805:6;12802:30;12799:56;;;12835:18;;:::i;:::-;12799:56;12885:4;12877:6;12873:17;12865:25;;12945:4;12939;12935:15;12927:23;;12646:311;;;:::o;12963:117::-;13072:1;13069;13062:12;13103:710;13199:5;13224:81;13240:64;13297:6;13240:64;:::i;:::-;13224:81;:::i;:::-;13215:90;;13325:5;13354:6;13347:5;13340:21;13388:4;13381:5;13377:16;13370:23;;13441:4;13433:6;13429:17;13421:6;13417:30;13470:3;13462:6;13459:15;13456:122;;;13489:79;;:::i;:::-;13456:122;13604:6;13587:220;13621:6;13616:3;13613:15;13587:220;;;13696:3;13725:37;13758:3;13746:10;13725:37;:::i;:::-;13720:3;13713:50;13792:4;13787:3;13783:14;13776:21;;13663:144;13647:4;13642:3;13638:14;13631:21;;13587:220;;;13591:21;13205:608;;13103:710;;;;;:::o;13836:370::-;13907:5;13956:3;13949:4;13941:6;13937:17;13933:27;13923:122;;13964:79;;:::i;:::-;13923:122;14081:6;14068:20;14106:94;14196:3;14188:6;14181:4;14173:6;14169:17;14106:94;:::i;:::-;14097:103;;13913:293;13836:370;;;;:::o;14212:1509::-;14366:6;14374;14382;14390;14398;14447:3;14435:9;14426:7;14422:23;14418:33;14415:120;;;14454:79;;:::i;:::-;14415:120;14574:1;14599:53;14644:7;14635:6;14624:9;14620:22;14599:53;:::i;:::-;14589:63;;14545:117;14701:2;14727:53;14772:7;14763:6;14752:9;14748:22;14727:53;:::i;:::-;14717:63;;14672:118;14857:2;14846:9;14842:18;14829:32;14888:18;14880:6;14877:30;14874:117;;;14910:79;;:::i;:::-;14874:117;15015:78;15085:7;15076:6;15065:9;15061:22;15015:78;:::i;:::-;15005:88;;14800:303;15170:2;15159:9;15155:18;15142:32;15201:18;15193:6;15190:30;15187:117;;;15223:79;;:::i;:::-;15187:117;15328:78;15398:7;15389:6;15378:9;15374:22;15328:78;:::i;:::-;15318:88;;15113:303;15483:3;15472:9;15468:19;15455:33;15515:18;15507:6;15504:30;15501:117;;;15537:79;;:::i;:::-;15501:117;15642:62;15696:7;15687:6;15676:9;15672:22;15642:62;:::i;:::-;15632:72;;15426:288;14212:1509;;;;;;;;:::o;15727:474::-;15795:6;15803;15852:2;15840:9;15831:7;15827:23;15823:32;15820:119;;;15858:79;;:::i;:::-;15820:119;15978:1;16003:53;16048:7;16039:6;16028:9;16024:22;16003:53;:::i;:::-;15993:63;;15949:117;16105:2;16131:53;16176:7;16167:6;16156:9;16152:22;16131:53;:::i;:::-;16121:63;;16076:118;15727:474;;;;;:::o;16207:1089::-;16311:6;16319;16327;16335;16343;16392:3;16380:9;16371:7;16367:23;16363:33;16360:120;;;16399:79;;:::i;:::-;16360:120;16519:1;16544:53;16589:7;16580:6;16569:9;16565:22;16544:53;:::i;:::-;16534:63;;16490:117;16646:2;16672:53;16717:7;16708:6;16697:9;16693:22;16672:53;:::i;:::-;16662:63;;16617:118;16774:2;16800:53;16845:7;16836:6;16825:9;16821:22;16800:53;:::i;:::-;16790:63;;16745:118;16902:2;16928:53;16973:7;16964:6;16953:9;16949:22;16928:53;:::i;:::-;16918:63;;16873:118;17058:3;17047:9;17043:19;17030:33;17090:18;17082:6;17079:30;17076:117;;;17112:79;;:::i;:::-;17076:117;17217:62;17271:7;17262:6;17251:9;17247:22;17217:62;:::i;:::-;17207:72;;17001:288;16207:1089;;;;;;;;:::o;17302:104::-;17347:7;17376:24;17394:5;17376:24;:::i;:::-;17365:35;;17302:104;;;:::o;17412:138::-;17493:32;17519:5;17493:32;:::i;:::-;17486:5;17483:43;17473:71;;17540:1;17537;17530:12;17473:71;17412:138;:::o;17556:155::-;17610:5;17648:6;17635:20;17626:29;;17664:41;17699:5;17664:41;:::i;:::-;17556:155;;;;:::o;17717:345::-;17784:6;17833:2;17821:9;17812:7;17808:23;17804:32;17801:119;;;17839:79;;:::i;:::-;17801:119;17959:1;17984:61;18037:7;18028:6;18017:9;18013:22;17984:61;:::i;:::-;17974:71;;17930:125;17717:345;;;;:::o;18068:180::-;18116:77;18113:1;18106:88;18213:4;18210:1;18203:15;18237:4;18234:1;18227:15;18254:320;18298:6;18335:1;18329:4;18325:12;18315:22;;18382:1;18376:4;18372:12;18403:18;18393:81;;18459:4;18451:6;18447:17;18437:27;;18393:81;18521:2;18513:6;18510:14;18490:18;18487:38;18484:84;;18540:18;;:::i;:::-;18484:84;18305:269;18254:320;;;:::o;18580:220::-;18720:34;18716:1;18708:6;18704:14;18697:58;18789:3;18784:2;18776:6;18772:15;18765:28;18580:220;:::o;18806:366::-;18948:3;18969:67;19033:2;19028:3;18969:67;:::i;:::-;18962:74;;19045:93;19134:3;19045:93;:::i;:::-;19163:2;19158:3;19154:12;19147:19;;18806:366;;;:::o;19178:419::-;19344:4;19382:2;19371:9;19367:18;19359:26;;19431:9;19425:4;19421:20;19417:1;19406:9;19402:17;19395:47;19459:131;19585:4;19459:131;:::i;:::-;19451:139;;19178:419;;;:::o;19603:249::-;19743:34;19739:1;19731:6;19727:14;19720:58;19812:32;19807:2;19799:6;19795:15;19788:57;19603:249;:::o;19858:366::-;20000:3;20021:67;20085:2;20080:3;20021:67;:::i;:::-;20014:74;;20097:93;20186:3;20097:93;:::i;:::-;20215:2;20210:3;20206:12;20199:19;;19858:366;;;:::o;20230:419::-;20396:4;20434:2;20423:9;20419:18;20411:26;;20483:9;20477:4;20473:20;20469:1;20458:9;20454:17;20447:47;20511:131;20637:4;20511:131;:::i;:::-;20503:139;;20230:419;;;:::o;20655:180::-;20703:77;20700:1;20693:88;20800:4;20797:1;20790:15;20824:4;20821:1;20814:15;20841:305;20881:3;20900:20;20918:1;20900:20;:::i;:::-;20895:25;;20934:20;20952:1;20934:20;:::i;:::-;20929:25;;21088:1;21020:66;21016:74;21013:1;21010:81;21007:107;;;21094:18;;:::i;:::-;21007:107;21138:1;21135;21131:9;21124:16;;20841:305;;;;:::o;21152:233::-;21292:34;21288:1;21280:6;21276:14;21269:58;21361:16;21356:2;21348:6;21344:15;21337:41;21152:233;:::o;21391:366::-;21533:3;21554:67;21618:2;21613:3;21554:67;:::i;:::-;21547:74;;21630:93;21719:3;21630:93;:::i;:::-;21748:2;21743:3;21739:12;21732:19;;21391:366;;;:::o;21763:419::-;21929:4;21967:2;21956:9;21952:18;21944:26;;22016:9;22010:4;22006:20;22002:1;21991:9;21987:17;21980:47;22044:131;22170:4;22044:131;:::i;:::-;22036:139;;21763:419;;;:::o;22188:141::-;22237:4;22260:3;22252:11;;22283:3;22280:1;22273:14;22317:4;22314:1;22304:18;22296:26;;22188:141;;;:::o;22335:93::-;22372:6;22419:2;22414;22407:5;22403:14;22399:23;22389:33;;22335:93;;;:::o;22434:107::-;22478:8;22528:5;22522:4;22518:16;22497:37;;22434:107;;;;:::o;22547:393::-;22616:6;22666:1;22654:10;22650:18;22689:97;22719:66;22708:9;22689:97;:::i;:::-;22807:39;22837:8;22826:9;22807:39;:::i;:::-;22795:51;;22879:4;22875:9;22868:5;22864:21;22855:30;;22928:4;22918:8;22914:19;22907:5;22904:30;22894:40;;22623:317;;22547:393;;;;;:::o;22946:60::-;22974:3;22995:5;22988:12;;22946:60;;;:::o;23012:142::-;23062:9;23095:53;23113:34;23122:24;23140:5;23122:24;:::i;:::-;23113:34;:::i;:::-;23095:53;:::i;:::-;23082:66;;23012:142;;;:::o;23160:75::-;23203:3;23224:5;23217:12;;23160:75;;;:::o;23241:269::-;23351:39;23382:7;23351:39;:::i;:::-;23412:91;23461:41;23485:16;23461:41;:::i;:::-;23453:6;23446:4;23440:11;23412:91;:::i;:::-;23406:4;23399:105;23317:193;23241:269;;;:::o;23516:73::-;23561:3;23516:73;:::o;23595:189::-;23672:32;;:::i;:::-;23713:65;23771:6;23763;23757:4;23713:65;:::i;:::-;23648:136;23595:189;;:::o;23790:186::-;23850:120;23867:3;23860:5;23857:14;23850:120;;;23921:39;23958:1;23951:5;23921:39;:::i;:::-;23894:1;23887:5;23883:13;23874:22;;23850:120;;;23790:186;;:::o;23982:543::-;24083:2;24078:3;24075:11;24072:446;;;24117:38;24149:5;24117:38;:::i;:::-;24201:29;24219:10;24201:29;:::i;:::-;24191:8;24187:44;24384:2;24372:10;24369:18;24366:49;;;24405:8;24390:23;;24366:49;24428:80;24484:22;24502:3;24484:22;:::i;:::-;24474:8;24470:37;24457:11;24428:80;:::i;:::-;24087:431;;24072:446;23982:543;;;:::o;24531:117::-;24585:8;24635:5;24629:4;24625:16;24604:37;;24531:117;;;;:::o;24654:169::-;24698:6;24731:51;24779:1;24775:6;24767:5;24764:1;24760:13;24731:51;:::i;:::-;24727:56;24812:4;24806;24802:15;24792:25;;24705:118;24654:169;;;;:::o;24828:295::-;24904:4;25050:29;25075:3;25069:4;25050:29;:::i;:::-;25042:37;;25112:3;25109:1;25105:11;25099:4;25096:21;25088:29;;24828:295;;;;:::o;25128:1395::-;25245:37;25278:3;25245:37;:::i;:::-;25347:18;25339:6;25336:30;25333:56;;;25369:18;;:::i;:::-;25333:56;25413:38;25445:4;25439:11;25413:38;:::i;:::-;25498:67;25558:6;25550;25544:4;25498:67;:::i;:::-;25592:1;25616:4;25603:17;;25648:2;25640:6;25637:14;25665:1;25660:618;;;;26322:1;26339:6;26336:77;;;26388:9;26383:3;26379:19;26373:26;26364:35;;26336:77;26439:67;26499:6;26492:5;26439:67;:::i;:::-;26433:4;26426:81;26295:222;25630:887;;25660:618;25712:4;25708:9;25700:6;25696:22;25746:37;25778:4;25746:37;:::i;:::-;25805:1;25819:208;25833:7;25830:1;25827:14;25819:208;;;25912:9;25907:3;25903:19;25897:26;25889:6;25882:42;25963:1;25955:6;25951:14;25941:24;;26010:2;25999:9;25995:18;25982:31;;25856:4;25853:1;25849:12;25844:17;;25819:208;;;26055:6;26046:7;26043:19;26040:179;;;26113:9;26108:3;26104:19;26098:26;26156:48;26198:4;26190:6;26186:17;26175:9;26156:48;:::i;:::-;26148:6;26141:64;26063:156;26040:179;26265:1;26261;26253:6;26249:14;26245:22;26239:4;26232:36;25667:611;;;25630:887;;25220:1303;;;25128:1395;;:::o;26529:174::-;26669:26;26665:1;26657:6;26653:14;26646:50;26529:174;:::o;26709:366::-;26851:3;26872:67;26936:2;26931:3;26872:67;:::i;:::-;26865:74;;26948:93;27037:3;26948:93;:::i;:::-;27066:2;27061:3;27057:12;27050:19;;26709:366;;;:::o;27081:419::-;27247:4;27285:2;27274:9;27270:18;27262:26;;27334:9;27328:4;27324:20;27320:1;27309:9;27305:17;27298:47;27362:131;27488:4;27362:131;:::i;:::-;27354:139;;27081:419;;;:::o;27506:228::-;27646:34;27642:1;27634:6;27630:14;27623:58;27715:11;27710:2;27702:6;27698:15;27691:36;27506:228;:::o;27740:366::-;27882:3;27903:67;27967:2;27962:3;27903:67;:::i;:::-;27896:74;;27979:93;28068:3;27979:93;:::i;:::-;28097:2;28092:3;28088:12;28081:19;;27740:366;;;:::o;28112:419::-;28278:4;28316:2;28305:9;28301:18;28293:26;;28365:9;28359:4;28355:20;28351:1;28340:9;28336:17;28329:47;28393:131;28519:4;28393:131;:::i;:::-;28385:139;;28112:419;;;:::o;28537:177::-;28677:29;28673:1;28665:6;28661:14;28654:53;28537:177;:::o;28720:366::-;28862:3;28883:67;28947:2;28942:3;28883:67;:::i;:::-;28876:74;;28959:93;29048:3;28959:93;:::i;:::-;29077:2;29072:3;29068:12;29061:19;;28720:366;;;:::o;29092:419::-;29258:4;29296:2;29285:9;29281:18;29273:26;;29345:9;29339:4;29335:20;29331:1;29320:9;29316:17;29309:47;29373:131;29499:4;29373:131;:::i;:::-;29365:139;;29092:419;;;:::o;29517:174::-;29657:26;29653:1;29645:6;29641:14;29634:50;29517:174;:::o;29697:366::-;29839:3;29860:67;29924:2;29919:3;29860:67;:::i;:::-;29853:74;;29936:93;30025:3;29936:93;:::i;:::-;30054:2;30049:3;30045:12;30038:19;;29697:366;;;:::o;30069:419::-;30235:4;30273:2;30262:9;30258:18;30250:26;;30322:9;30316:4;30312:20;30308:1;30297:9;30293:17;30286:47;30350:131;30476:4;30350:131;:::i;:::-;30342:139;;30069:419;;;:::o;30494:191::-;30534:4;30554:20;30572:1;30554:20;:::i;:::-;30549:25;;30588:20;30606:1;30588:20;:::i;:::-;30583:25;;30627:1;30624;30621:8;30618:34;;;30632:18;;:::i;:::-;30618:34;30677:1;30674;30670:9;30662:17;;30494:191;;;;:::o;30691:148::-;30793:11;30830:3;30815:18;;30691:148;;;;:::o;30845:377::-;30951:3;30979:39;31012:5;30979:39;:::i;:::-;31034:89;31116:6;31111:3;31034:89;:::i;:::-;31027:96;;31132:52;31177:6;31172:3;31165:4;31158:5;31154:16;31132:52;:::i;:::-;31209:6;31204:3;31200:16;31193:23;;30955:267;30845:377;;;;:::o;31228:435::-;31408:3;31430:95;31521:3;31512:6;31430:95;:::i;:::-;31423:102;;31542:95;31633:3;31624:6;31542:95;:::i;:::-;31535:102;;31654:3;31647:10;;31228:435;;;;;:::o;31669:175::-;31809:27;31805:1;31797:6;31793:14;31786:51;31669:175;:::o;31850:366::-;31992:3;32013:67;32077:2;32072:3;32013:67;:::i;:::-;32006:74;;32089:93;32178:3;32089:93;:::i;:::-;32207:2;32202:3;32198:12;32191:19;;31850:366;;;:::o;32222:419::-;32388:4;32426:2;32415:9;32411:18;32403:26;;32475:9;32469:4;32465:20;32461:1;32450:9;32446:17;32439:47;32503:131;32629:4;32503:131;:::i;:::-;32495:139;;32222:419;;;:::o;32647:225::-;32787:34;32783:1;32775:6;32771:14;32764:58;32856:8;32851:2;32843:6;32839:15;32832:33;32647:225;:::o;32878:366::-;33020:3;33041:67;33105:2;33100:3;33041:67;:::i;:::-;33034:74;;33117:93;33206:3;33117:93;:::i;:::-;33235:2;33230:3;33226:12;33219:19;;32878:366;;;:::o;33250:419::-;33416:4;33454:2;33443:9;33439:18;33431:26;;33503:9;33497:4;33493:20;33489:1;33478:9;33474:17;33467:47;33531:131;33657:4;33531:131;:::i;:::-;33523:139;;33250:419;;;:::o;33675:224::-;33815:34;33811:1;33803:6;33799:14;33792:58;33884:7;33879:2;33871:6;33867:15;33860:32;33675:224;:::o;33905:366::-;34047:3;34068:67;34132:2;34127:3;34068:67;:::i;:::-;34061:74;;34144:93;34233:3;34144:93;:::i;:::-;34262:2;34257:3;34253:12;34246:19;;33905:366;;;:::o;34277:419::-;34443:4;34481:2;34470:9;34466:18;34458:26;;34530:9;34524:4;34520:20;34516:1;34505:9;34501:17;34494:47;34558:131;34684:4;34558:131;:::i;:::-;34550:139;;34277:419;;;:::o;34702:223::-;34842:34;34838:1;34830:6;34826:14;34819:58;34911:6;34906:2;34898:6;34894:15;34887:31;34702:223;:::o;34931:366::-;35073:3;35094:67;35158:2;35153:3;35094:67;:::i;:::-;35087:74;;35170:93;35259:3;35170:93;:::i;:::-;35288:2;35283:3;35279:12;35272:19;;34931:366;;;:::o;35303:419::-;35469:4;35507:2;35496:9;35492:18;35484:26;;35556:9;35550:4;35546:20;35542:1;35531:9;35527:17;35520:47;35584:131;35710:4;35584:131;:::i;:::-;35576:139;;35303:419;;;:::o;35728:182::-;35868:34;35864:1;35856:6;35852:14;35845:58;35728:182;:::o;35916:366::-;36058:3;36079:67;36143:2;36138:3;36079:67;:::i;:::-;36072:74;;36155:93;36244:3;36155:93;:::i;:::-;36273:2;36268:3;36264:12;36257:19;;35916:366;;;:::o;36288:419::-;36454:4;36492:2;36481:9;36477:18;36469:26;;36541:9;36535:4;36531:20;36527:1;36516:9;36512:17;36505:47;36569:131;36695:4;36569:131;:::i;:::-;36561:139;;36288:419;;;:::o;36713:233::-;36853:34;36849:1;36841:6;36837:14;36830:58;36922:16;36917:2;36909:6;36905:15;36898:41;36713:233;:::o;36952:366::-;37094:3;37115:67;37179:2;37174:3;37115:67;:::i;:::-;37108:74;;37191:93;37280:3;37191:93;:::i;:::-;37309:2;37304:3;37300:12;37293:19;;36952:366;;;:::o;37324:419::-;37490:4;37528:2;37517:9;37513:18;37505:26;;37577:9;37571:4;37567:20;37563:1;37552:9;37548:17;37541:47;37605:131;37731:4;37605:131;:::i;:::-;37597:139;;37324:419;;;:::o;37749:175::-;37889:27;37885:1;37877:6;37873:14;37866:51;37749:175;:::o;37930:366::-;38072:3;38093:67;38157:2;38152:3;38093:67;:::i;:::-;38086:74;;38169:93;38258:3;38169:93;:::i;:::-;38287:2;38282:3;38278:12;38271:19;;37930:366;;;:::o;38302:419::-;38468:4;38506:2;38495:9;38491:18;38483:26;;38555:9;38549:4;38545:20;38541:1;38530:9;38526:17;38519:47;38583:131;38709:4;38583:131;:::i;:::-;38575:139;;38302:419;;;:::o;38727:237::-;38867:34;38863:1;38855:6;38851:14;38844:58;38936:20;38931:2;38923:6;38919:15;38912:45;38727:237;:::o;38970:366::-;39112:3;39133:67;39197:2;39192:3;39133:67;:::i;:::-;39126:74;;39209:93;39298:3;39209:93;:::i;:::-;39327:2;39322:3;39318:12;39311:19;;38970:366;;;:::o;39342:419::-;39508:4;39546:2;39535:9;39531:18;39523:26;;39595:9;39589:4;39585:20;39581:1;39570:9;39566:17;39559:47;39623:131;39749:4;39623:131;:::i;:::-;39615:139;;39342:419;;;:::o;39767:98::-;39818:6;39852:5;39846:12;39836:22;;39767:98;;;:::o;39871:168::-;39954:11;39988:6;39983:3;39976:19;40028:4;40023:3;40019:14;40004:29;;39871:168;;;;:::o;40045:360::-;40131:3;40159:38;40191:5;40159:38;:::i;:::-;40213:70;40276:6;40271:3;40213:70;:::i;:::-;40206:77;;40292:52;40337:6;40332:3;40325:4;40318:5;40314:16;40292:52;:::i;:::-;40369:29;40391:6;40369:29;:::i;:::-;40364:3;40360:39;40353:46;;40135:270;40045:360;;;;:::o;40411:640::-;40606:4;40644:3;40633:9;40629:19;40621:27;;40658:71;40726:1;40715:9;40711:17;40702:6;40658:71;:::i;:::-;40739:72;40807:2;40796:9;40792:18;40783:6;40739:72;:::i;:::-;40821;40889:2;40878:9;40874:18;40865:6;40821:72;:::i;:::-;40940:9;40934:4;40930:20;40925:2;40914:9;40910:18;40903:48;40968:76;41039:4;41030:6;40968:76;:::i;:::-;40960:84;;40411:640;;;;;;;:::o;41057:141::-;41113:5;41144:6;41138:13;41129:22;;41160:32;41186:5;41160:32;:::i;:::-;41057:141;;;;:::o;41204:349::-;41273:6;41322:2;41310:9;41301:7;41297:23;41293:32;41290:119;;;41328:79;;:::i;:::-;41290:119;41448:1;41473:63;41528:7;41519:6;41508:9;41504:22;41473:63;:::i;:::-;41463:73;;41419:127;41204:349;;;;:::o;41559:233::-;41598:3;41621:24;41639:5;41621:24;:::i;:::-;41612:33;;41667:66;41660:5;41657:77;41654:103;;41737:18;;:::i;:::-;41654:103;41784:1;41777:5;41773:13;41766:20;;41559:233;;;:::o;41798:180::-;41846:77;41843:1;41836:88;41943:4;41940:1;41933:15;41967:4;41964:1;41957:15;41984:185;42024:1;42041:20;42059:1;42041:20;:::i;:::-;42036:25;;42075:20;42093:1;42075:20;:::i;:::-;42070:25;;42114:1;42104:35;;42119:18;;:::i;:::-;42104:35;42161:1;42158;42154:9;42149:14;;41984:185;;;;:::o;42175:176::-;42207:1;42224:20;42242:1;42224:20;:::i;:::-;42219:25;;42258:20;42276:1;42258:20;:::i;:::-;42253:25;;42297:1;42287:35;;42302:18;;:::i;:::-;42287:35;42343:1;42340;42336:9;42331:14;;42175:176;;;;:::o;42357:180::-;42405:77;42402:1;42395:88;42502:4;42499:1;42492:15;42526:4;42523:1;42516:15;42543:182;42683:34;42679:1;42671:6;42667:14;42660:58;42543:182;:::o;42731:366::-;42873:3;42894:67;42958:2;42953:3;42894:67;:::i;:::-;42887:74;;42970:93;43059:3;42970:93;:::i;:::-;43088:2;43083:3;43079:12;43072:19;;42731:366;;;:::o;43103:419::-;43269:4;43307:2;43296:9;43292:18;43284:26;;43356:9;43350:4;43346:20;43342:1;43331:9;43327:17;43320:47;43384:131;43510:4;43384:131;:::i;:::-;43376:139;;43103:419;;;:::o;43528:178::-;43668:30;43664:1;43656:6;43652:14;43645:54;43528:178;:::o;43712:366::-;43854:3;43875:67;43939:2;43934:3;43875:67;:::i;:::-;43868:74;;43951:93;44040:3;43951:93;:::i;:::-;44069:2;44064:3;44060:12;44053:19;;43712:366;;;:::o;44084:419::-;44250:4;44288:2;44277:9;44273:18;44265:26;;44337:9;44331:4;44327:20;44323:1;44312:9;44308:17;44301:47;44365:131;44491:4;44365:131;:::i;:::-;44357:139;;44084:419;;;:::o

Swarm Source

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