ETH Price: $3,386.62 (+0.77%)

Token

Cryptographers (CRYPTO)
 

Overview

Max Total Supply

100 CRYPTO

Holders

85

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
shiroi.eth
Balance
1 CRYPTO
0xa8defb2e1fe760f02f39e3d07a2ba0605fd8eb28
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:
CicadaCryptographersNFT

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-09
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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);
}

interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

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

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

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: balance query for the zero address");
        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: owner query for nonexistent token");
        return owner;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        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 overriden 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 owner nor approved for all"
        );

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @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 of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

contract CicadaCryptographersNFT is ERC721Enumerable, Ownable {

    string private constant INIT__NFT_NAME = 'Cryptographers';
    string private constant INIT__NFT_SYMBOL = 'CRYPTO';

    string private _tokenEvenBaseURI = 'ipfs://QmWr3ZmmJG9f8oww6W3TWq6qCkyQXqYW3cmqK6dAQwpdq1';
    string private _tokenOddBaseURI = 'ipfs://QmUgpLoRDLWFbKu7yEZniBn4sascmEwEMbbfiKVZypSMUe';

    constructor(
    ) ERC721(
        INIT__NFT_NAME,
        INIT__NFT_SYMBOL
    ) {
        for (uint256 i = 0; i < 100; i++) {
            _safeMint(_msgSender(), i);
        }
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        if(tokenId % 2 == 0) {
            return _tokenEvenBaseURI;
        }

        return _tokenOddBaseURI;
    }

}

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":[{"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":"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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052604051806060016040528060358152602001620040f160359139600b90805190602001906200003592919062000ca3565b50604051806060016040528060358152602001620040bc60359139600c90805190602001906200006792919062000ca3565b503480156200007557600080fd5b506040518060400160405280600e81526020017f43727970746f67726170686572730000000000000000000000000000000000008152506040518060400160405280600681526020017f43525950544f00000000000000000000000000000000000000000000000000008152508160009080519060200190620000fa92919062000ca3565b5080600190805190602001906200011392919062000ca3565b505050620001366200012a6200018160201b60201c565b6200018960201b60201c565b60005b60648110156200017a5762000164620001576200018160201b60201c565b826200024f60201b60201c565b808062000171906200110c565b91505062000139565b50620012d3565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002718282604051806020016040528060008152506200027560201b60201c565b5050565b620002878383620002e360201b60201c565b6200029c6000848484620004c960201b60201c565b620002de576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002d59062000ee9565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000356576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200034d9062000f4f565b60405180910390fd5b62000367816200068360201b60201c565b15620003aa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003a19062000f0b565b60405180910390fd5b620003be60008383620006ef60201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000410919062000f9e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620004f78473ffffffffffffffffffffffffffffffffffffffff166200083660201b62000fe31760201c565b1562000676578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620005296200018160201b60201c565b8786866040518563ffffffff1660e01b81526004016200054d949392919062000e95565b602060405180830381600087803b1580156200056857600080fd5b505af19250505080156200059c57506040513d601f19601f8201168201806040525081019062000599919062000d6a565b60015b62000625573d8060008114620005cf576040519150601f19603f3d011682016040523d82523d6000602084013e620005d4565b606091505b506000815114156200061d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006149062000ee9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506200067b565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b620007078383836200084960201b62000ff61760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000754576200074e816200084e60201b60201c565b6200079c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146200079b576200079a83826200089760201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620007e957620007e38162000a1460201b60201c565b62000831565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000830576200082f828262000b5c60201b60201c565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001620008b18462000be860201b620008f41760201c565b620008bd919062000ffb565b9050600060076000848152602001908152602001600020549050818114620009a3576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000a2a919062000ffb565b905060006009600084815260200190815260200160002054905060006008838154811062000a81577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811062000aca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062000b40577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600062000b748362000be860201b620008f41760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000c5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c539062000f2d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000cb190620010d6565b90600052602060002090601f01602090048101928262000cd5576000855562000d21565b82601f1062000cf057805160ff191683800117855562000d21565b8280016001018555821562000d21579182015b8281111562000d2057825182559160200191906001019062000d03565b5b50905062000d30919062000d34565b5090565b5b8082111562000d4f57600081600090555060010162000d35565b5090565b60008151905062000d6481620012b9565b92915050565b60006020828403121562000d7d57600080fd5b600062000d8d8482850162000d53565b91505092915050565b62000da18162001036565b82525050565b600062000db48262000f71565b62000dc0818562000f7c565b935062000dd2818560208601620010a0565b62000ddd81620011b8565b840191505092915050565b600062000df760328362000f8d565b915062000e0482620011c9565b604082019050919050565b600062000e1e601c8362000f8d565b915062000e2b8262001218565b602082019050919050565b600062000e45602a8362000f8d565b915062000e528262001241565b604082019050919050565b600062000e6c60208362000f8d565b915062000e798262001290565b602082019050919050565b62000e8f8162001096565b82525050565b600060808201905062000eac600083018762000d96565b62000ebb602083018662000d96565b62000eca604083018562000e84565b818103606083015262000ede818462000da7565b905095945050505050565b6000602082019050818103600083015262000f048162000de8565b9050919050565b6000602082019050818103600083015262000f268162000e0f565b9050919050565b6000602082019050818103600083015262000f488162000e36565b9050919050565b6000602082019050818103600083015262000f6a8162000e5d565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062000fab8262001096565b915062000fb88362001096565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000ff05762000fef6200115a565b5b828201905092915050565b6000620010088262001096565b9150620010158362001096565b9250828210156200102b576200102a6200115a565b5b828203905092915050565b6000620010438262001076565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620010c0578082015181840152602081019050620010a3565b83811115620010d0576000848401525b50505050565b60006002820490506001821680620010ef57607f821691505b6020821081141562001106576200110562001189565b5b50919050565b6000620011198262001096565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156200114f576200114e6200115a565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b620012c4816200104a565b8114620012d057600080fd5b50565b612dd980620012e36000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c80636352211e116100ad578063a22cb46511610071578063a22cb4651461031c578063b88d4fde14610338578063c87b56dd14610354578063e985e9c514610384578063f2fde38b146103b457610121565b80636352211e1461027657806370a08231146102a6578063715018a6146102d65780638da5cb5b146102e057806395d89b41146102fe57610121565b806318160ddd116100f457806318160ddd146101c057806323b872dd146101de5780632f745c59146101fa57806342842e0e1461022a5780634f6ccce71461024657610121565b806301ffc9a71461012657806306fdde0314610156578063081812fc14610174578063095ea7b3146101a4575b600080fd5b610140600480360381019061013b9190611f6b565b6103d0565b60405161014d919061231c565b60405180910390f35b61015e61044a565b60405161016b9190612337565b60405180910390f35b61018e60048036038101906101899190611fbd565b6104dc565b60405161019b91906122b5565b60405180910390f35b6101be60048036038101906101b99190611f2f565b610561565b005b6101c8610679565b6040516101d59190612559565b60405180910390f35b6101f860048036038101906101f39190611e29565b610686565b005b610214600480360381019061020f9190611f2f565b6106e6565b6040516102219190612559565b60405180910390f35b610244600480360381019061023f9190611e29565b61078b565b005b610260600480360381019061025b9190611fbd565b6107ab565b60405161026d9190612559565b60405180910390f35b610290600480360381019061028b9190611fbd565b610842565b60405161029d91906122b5565b60405180910390f35b6102c060048036038101906102bb9190611dc4565b6108f4565b6040516102cd9190612559565b60405180910390f35b6102de6109ac565b005b6102e8610a34565b6040516102f591906122b5565b60405180910390f35b610306610a5e565b6040516103139190612337565b60405180910390f35b61033660048036038101906103319190611ef3565b610af0565b005b610352600480360381019061034d9190611e78565b610c71565b005b61036e60048036038101906103699190611fbd565b610cd3565b60405161037b9190612337565b60405180910390f35b61039e60048036038101906103999190611ded565b610e57565b6040516103ab919061231c565b60405180910390f35b6103ce60048036038101906103c99190611dc4565b610eeb565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610443575061044282610ffb565b5b9050919050565b60606000805461045990612742565b80601f016020809104026020016040519081016040528092919081815260200182805461048590612742565b80156104d25780601f106104a7576101008083540402835291602001916104d2565b820191906000526020600020905b8154815290600101906020018083116104b557829003601f168201915b5050505050905090565b60006104e7826110dd565b610526576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051d90612479565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061056c82610842565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156105dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d4906124f9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166105fc611149565b73ffffffffffffffffffffffffffffffffffffffff16148061062b575061062a81610625611149565b610e57565b5b61066a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066190612419565b60405180910390fd5b6106748383611151565b505050565b6000600880549050905090565b610697610691611149565b8261120a565b6106d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cd90612519565b60405180910390fd5b6106e18383836112e8565b505050565b60006106f1836108f4565b8210610732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072990612359565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6107a683838360405180602001604052806000815250610c71565b505050565b60006107b5610679565b82106107f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ed90612539565b60405180910390fd5b60088281548110610830577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156108eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e290612459565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095c90612439565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6109b4611149565b73ffffffffffffffffffffffffffffffffffffffff166109d2610a34565b73ffffffffffffffffffffffffffffffffffffffff1614610a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1f90612499565b60405180910390fd5b610a326000611544565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610a6d90612742565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9990612742565b8015610ae65780601f10610abb57610100808354040283529160200191610ae6565b820191906000526020600020905b815481529060010190602001808311610ac957829003601f168201915b5050505050905090565b610af8611149565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5d906123d9565b60405180910390fd5b8060056000610b73611149565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610c20611149565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610c65919061231c565b60405180910390a35050565b610c82610c7c611149565b8361120a565b610cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb890612519565b60405180910390fd5b610ccd8484848461160a565b50505050565b6060610cde826110dd565b610d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d14906124d9565b60405180910390fd5b6000600283610d2c91906127a5565b1415610dc457600b8054610d3f90612742565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6b90612742565b8015610db85780601f10610d8d57610100808354040283529160200191610db8565b820191906000526020600020905b815481529060010190602001808311610d9b57829003601f168201915b50505050509050610e52565b600c8054610dd190612742565b80601f0160208091040260200160405190810160405280929190818152602001828054610dfd90612742565b8015610e4a5780601f10610e1f57610100808354040283529160200191610e4a565b820191906000526020600020905b815481529060010190602001808311610e2d57829003601f168201915b505050505090505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610ef3611149565b73ffffffffffffffffffffffffffffffffffffffff16610f11610a34565b73ffffffffffffffffffffffffffffffffffffffff1614610f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5e90612499565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fce90612399565b60405180910390fd5b610fe081611544565b50565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806110c657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806110d657506110d582611666565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166111c483610842565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611215826110dd565b611254576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124b906123f9565b60405180910390fd5b600061125f83610842565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806112ce57508373ffffffffffffffffffffffffffffffffffffffff166112b6846104dc565b73ffffffffffffffffffffffffffffffffffffffff16145b806112df57506112de8185610e57565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661130882610842565b73ffffffffffffffffffffffffffffffffffffffff161461135e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611355906124b9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c5906123b9565b60405180910390fd5b6113d98383836116d0565b6113e4600082611151565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114349190612658565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461148b9190612602565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6116158484846112e8565b611621848484846117e4565b611660576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165790612379565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6116db838383610ff6565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561171e576117198161197b565b61175d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461175c5761175b83826119c4565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117a05761179b81611b31565b6117df565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146117de576117dd8282611c74565b5b5b505050565b60006118058473ffffffffffffffffffffffffffffffffffffffff16610fe3565b1561196e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261182e611149565b8786866040518563ffffffff1660e01b815260040161185094939291906122d0565b602060405180830381600087803b15801561186a57600080fd5b505af192505050801561189b57506040513d601f19601f820116820180604052508101906118989190611f94565b60015b61191e573d80600081146118cb576040519150601f19603f3d011682016040523d82523d6000602084013e6118d0565b606091505b50600081511415611916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190d90612379565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611973565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016119d1846108f4565b6119db9190612658565b9050600060076000848152602001908152602001600020549050818114611ac0576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050611b459190612658565b9050600060096000848152602001908152602001600020549050600060088381548110611b9b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110611be3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480611c58577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000611c7f836108f4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000611d06611d0184612599565b612574565b905082815260208101848484011115611d1e57600080fd5b611d29848285612700565b509392505050565b600081359050611d4081612d47565b92915050565b600081359050611d5581612d5e565b92915050565b600081359050611d6a81612d75565b92915050565b600081519050611d7f81612d75565b92915050565b600082601f830112611d9657600080fd5b8135611da6848260208601611cf3565b91505092915050565b600081359050611dbe81612d8c565b92915050565b600060208284031215611dd657600080fd5b6000611de484828501611d31565b91505092915050565b60008060408385031215611e0057600080fd5b6000611e0e85828601611d31565b9250506020611e1f85828601611d31565b9150509250929050565b600080600060608486031215611e3e57600080fd5b6000611e4c86828701611d31565b9350506020611e5d86828701611d31565b9250506040611e6e86828701611daf565b9150509250925092565b60008060008060808587031215611e8e57600080fd5b6000611e9c87828801611d31565b9450506020611ead87828801611d31565b9350506040611ebe87828801611daf565b925050606085013567ffffffffffffffff811115611edb57600080fd5b611ee787828801611d85565b91505092959194509250565b60008060408385031215611f0657600080fd5b6000611f1485828601611d31565b9250506020611f2585828601611d46565b9150509250929050565b60008060408385031215611f4257600080fd5b6000611f5085828601611d31565b9250506020611f6185828601611daf565b9150509250929050565b600060208284031215611f7d57600080fd5b6000611f8b84828501611d5b565b91505092915050565b600060208284031215611fa657600080fd5b6000611fb484828501611d70565b91505092915050565b600060208284031215611fcf57600080fd5b6000611fdd84828501611daf565b91505092915050565b611fef8161268c565b82525050565b611ffe8161269e565b82525050565b600061200f826125ca565b61201981856125e0565b935061202981856020860161270f565b61203281612892565b840191505092915050565b6000612048826125d5565b61205281856125f1565b935061206281856020860161270f565b61206b81612892565b840191505092915050565b6000612083602b836125f1565b915061208e826128a3565b604082019050919050565b60006120a66032836125f1565b91506120b1826128f2565b604082019050919050565b60006120c96026836125f1565b91506120d482612941565b604082019050919050565b60006120ec6024836125f1565b91506120f782612990565b604082019050919050565b600061210f6019836125f1565b915061211a826129df565b602082019050919050565b6000612132602c836125f1565b915061213d82612a08565b604082019050919050565b60006121556038836125f1565b915061216082612a57565b604082019050919050565b6000612178602a836125f1565b915061218382612aa6565b604082019050919050565b600061219b6029836125f1565b91506121a682612af5565b604082019050919050565b60006121be602c836125f1565b91506121c982612b44565b604082019050919050565b60006121e16020836125f1565b91506121ec82612b93565b602082019050919050565b60006122046029836125f1565b915061220f82612bbc565b604082019050919050565b6000612227602f836125f1565b915061223282612c0b565b604082019050919050565b600061224a6021836125f1565b915061225582612c5a565b604082019050919050565b600061226d6031836125f1565b915061227882612ca9565b604082019050919050565b6000612290602c836125f1565b915061229b82612cf8565b604082019050919050565b6122af816126f6565b82525050565b60006020820190506122ca6000830184611fe6565b92915050565b60006080820190506122e56000830187611fe6565b6122f26020830186611fe6565b6122ff60408301856122a6565b81810360608301526123118184612004565b905095945050505050565b60006020820190506123316000830184611ff5565b92915050565b60006020820190508181036000830152612351818461203d565b905092915050565b6000602082019050818103600083015261237281612076565b9050919050565b6000602082019050818103600083015261239281612099565b9050919050565b600060208201905081810360008301526123b2816120bc565b9050919050565b600060208201905081810360008301526123d2816120df565b9050919050565b600060208201905081810360008301526123f281612102565b9050919050565b6000602082019050818103600083015261241281612125565b9050919050565b6000602082019050818103600083015261243281612148565b9050919050565b600060208201905081810360008301526124528161216b565b9050919050565b600060208201905081810360008301526124728161218e565b9050919050565b60006020820190508181036000830152612492816121b1565b9050919050565b600060208201905081810360008301526124b2816121d4565b9050919050565b600060208201905081810360008301526124d2816121f7565b9050919050565b600060208201905081810360008301526124f28161221a565b9050919050565b600060208201905081810360008301526125128161223d565b9050919050565b6000602082019050818103600083015261253281612260565b9050919050565b6000602082019050818103600083015261255281612283565b9050919050565b600060208201905061256e60008301846122a6565b92915050565b600061257e61258f565b905061258a8282612774565b919050565b6000604051905090565b600067ffffffffffffffff8211156125b4576125b3612863565b5b6125bd82612892565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600061260d826126f6565b9150612618836126f6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561264d5761264c6127d6565b5b828201905092915050565b6000612663826126f6565b915061266e836126f6565b925082821015612681576126806127d6565b5b828203905092915050565b6000612697826126d6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561272d578082015181840152602081019050612712565b8381111561273c576000848401525b50505050565b6000600282049050600182168061275a57607f821691505b6020821081141561276e5761276d612834565b5b50919050565b61277d82612892565b810181811067ffffffffffffffff8211171561279c5761279b612863565b5b80604052505050565b60006127b0826126f6565b91506127bb836126f6565b9250826127cb576127ca612805565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b612d508161268c565b8114612d5b57600080fd5b50565b612d678161269e565b8114612d7257600080fd5b50565b612d7e816126aa565b8114612d8957600080fd5b50565b612d95816126f6565b8114612da057600080fd5b5056fea2646970667358221220e16a23d83294af939ac49c3edecd4f4736875b43fb947eb74c08b8b07a03ec1464736f6c63430008040033697066733a2f2f516d5567704c6f52444c5746624b753779455a6e69426e34736173636d4577454d626266694b565a7970534d5565697066733a2f2f516d5772335a6d6d4a473966386f77773657335457713671436b79515871595733636d714b366441517770647131

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101215760003560e01c80636352211e116100ad578063a22cb46511610071578063a22cb4651461031c578063b88d4fde14610338578063c87b56dd14610354578063e985e9c514610384578063f2fde38b146103b457610121565b80636352211e1461027657806370a08231146102a6578063715018a6146102d65780638da5cb5b146102e057806395d89b41146102fe57610121565b806318160ddd116100f457806318160ddd146101c057806323b872dd146101de5780632f745c59146101fa57806342842e0e1461022a5780634f6ccce71461024657610121565b806301ffc9a71461012657806306fdde0314610156578063081812fc14610174578063095ea7b3146101a4575b600080fd5b610140600480360381019061013b9190611f6b565b6103d0565b60405161014d919061231c565b60405180910390f35b61015e61044a565b60405161016b9190612337565b60405180910390f35b61018e60048036038101906101899190611fbd565b6104dc565b60405161019b91906122b5565b60405180910390f35b6101be60048036038101906101b99190611f2f565b610561565b005b6101c8610679565b6040516101d59190612559565b60405180910390f35b6101f860048036038101906101f39190611e29565b610686565b005b610214600480360381019061020f9190611f2f565b6106e6565b6040516102219190612559565b60405180910390f35b610244600480360381019061023f9190611e29565b61078b565b005b610260600480360381019061025b9190611fbd565b6107ab565b60405161026d9190612559565b60405180910390f35b610290600480360381019061028b9190611fbd565b610842565b60405161029d91906122b5565b60405180910390f35b6102c060048036038101906102bb9190611dc4565b6108f4565b6040516102cd9190612559565b60405180910390f35b6102de6109ac565b005b6102e8610a34565b6040516102f591906122b5565b60405180910390f35b610306610a5e565b6040516103139190612337565b60405180910390f35b61033660048036038101906103319190611ef3565b610af0565b005b610352600480360381019061034d9190611e78565b610c71565b005b61036e60048036038101906103699190611fbd565b610cd3565b60405161037b9190612337565b60405180910390f35b61039e60048036038101906103999190611ded565b610e57565b6040516103ab919061231c565b60405180910390f35b6103ce60048036038101906103c99190611dc4565b610eeb565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610443575061044282610ffb565b5b9050919050565b60606000805461045990612742565b80601f016020809104026020016040519081016040528092919081815260200182805461048590612742565b80156104d25780601f106104a7576101008083540402835291602001916104d2565b820191906000526020600020905b8154815290600101906020018083116104b557829003601f168201915b5050505050905090565b60006104e7826110dd565b610526576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051d90612479565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061056c82610842565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156105dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d4906124f9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166105fc611149565b73ffffffffffffffffffffffffffffffffffffffff16148061062b575061062a81610625611149565b610e57565b5b61066a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066190612419565b60405180910390fd5b6106748383611151565b505050565b6000600880549050905090565b610697610691611149565b8261120a565b6106d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cd90612519565b60405180910390fd5b6106e18383836112e8565b505050565b60006106f1836108f4565b8210610732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072990612359565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6107a683838360405180602001604052806000815250610c71565b505050565b60006107b5610679565b82106107f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ed90612539565b60405180910390fd5b60088281548110610830577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156108eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e290612459565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095c90612439565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6109b4611149565b73ffffffffffffffffffffffffffffffffffffffff166109d2610a34565b73ffffffffffffffffffffffffffffffffffffffff1614610a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1f90612499565b60405180910390fd5b610a326000611544565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610a6d90612742565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9990612742565b8015610ae65780601f10610abb57610100808354040283529160200191610ae6565b820191906000526020600020905b815481529060010190602001808311610ac957829003601f168201915b5050505050905090565b610af8611149565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5d906123d9565b60405180910390fd5b8060056000610b73611149565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610c20611149565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610c65919061231c565b60405180910390a35050565b610c82610c7c611149565b8361120a565b610cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb890612519565b60405180910390fd5b610ccd8484848461160a565b50505050565b6060610cde826110dd565b610d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d14906124d9565b60405180910390fd5b6000600283610d2c91906127a5565b1415610dc457600b8054610d3f90612742565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6b90612742565b8015610db85780601f10610d8d57610100808354040283529160200191610db8565b820191906000526020600020905b815481529060010190602001808311610d9b57829003601f168201915b50505050509050610e52565b600c8054610dd190612742565b80601f0160208091040260200160405190810160405280929190818152602001828054610dfd90612742565b8015610e4a5780601f10610e1f57610100808354040283529160200191610e4a565b820191906000526020600020905b815481529060010190602001808311610e2d57829003601f168201915b505050505090505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610ef3611149565b73ffffffffffffffffffffffffffffffffffffffff16610f11610a34565b73ffffffffffffffffffffffffffffffffffffffff1614610f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5e90612499565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fce90612399565b60405180910390fd5b610fe081611544565b50565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806110c657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806110d657506110d582611666565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166111c483610842565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611215826110dd565b611254576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124b906123f9565b60405180910390fd5b600061125f83610842565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806112ce57508373ffffffffffffffffffffffffffffffffffffffff166112b6846104dc565b73ffffffffffffffffffffffffffffffffffffffff16145b806112df57506112de8185610e57565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661130882610842565b73ffffffffffffffffffffffffffffffffffffffff161461135e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611355906124b9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c5906123b9565b60405180910390fd5b6113d98383836116d0565b6113e4600082611151565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114349190612658565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461148b9190612602565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6116158484846112e8565b611621848484846117e4565b611660576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165790612379565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6116db838383610ff6565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561171e576117198161197b565b61175d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461175c5761175b83826119c4565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117a05761179b81611b31565b6117df565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146117de576117dd8282611c74565b5b5b505050565b60006118058473ffffffffffffffffffffffffffffffffffffffff16610fe3565b1561196e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261182e611149565b8786866040518563ffffffff1660e01b815260040161185094939291906122d0565b602060405180830381600087803b15801561186a57600080fd5b505af192505050801561189b57506040513d601f19601f820116820180604052508101906118989190611f94565b60015b61191e573d80600081146118cb576040519150601f19603f3d011682016040523d82523d6000602084013e6118d0565b606091505b50600081511415611916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190d90612379565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611973565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016119d1846108f4565b6119db9190612658565b9050600060076000848152602001908152602001600020549050818114611ac0576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050611b459190612658565b9050600060096000848152602001908152602001600020549050600060088381548110611b9b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110611be3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480611c58577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000611c7f836108f4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000611d06611d0184612599565b612574565b905082815260208101848484011115611d1e57600080fd5b611d29848285612700565b509392505050565b600081359050611d4081612d47565b92915050565b600081359050611d5581612d5e565b92915050565b600081359050611d6a81612d75565b92915050565b600081519050611d7f81612d75565b92915050565b600082601f830112611d9657600080fd5b8135611da6848260208601611cf3565b91505092915050565b600081359050611dbe81612d8c565b92915050565b600060208284031215611dd657600080fd5b6000611de484828501611d31565b91505092915050565b60008060408385031215611e0057600080fd5b6000611e0e85828601611d31565b9250506020611e1f85828601611d31565b9150509250929050565b600080600060608486031215611e3e57600080fd5b6000611e4c86828701611d31565b9350506020611e5d86828701611d31565b9250506040611e6e86828701611daf565b9150509250925092565b60008060008060808587031215611e8e57600080fd5b6000611e9c87828801611d31565b9450506020611ead87828801611d31565b9350506040611ebe87828801611daf565b925050606085013567ffffffffffffffff811115611edb57600080fd5b611ee787828801611d85565b91505092959194509250565b60008060408385031215611f0657600080fd5b6000611f1485828601611d31565b9250506020611f2585828601611d46565b9150509250929050565b60008060408385031215611f4257600080fd5b6000611f5085828601611d31565b9250506020611f6185828601611daf565b9150509250929050565b600060208284031215611f7d57600080fd5b6000611f8b84828501611d5b565b91505092915050565b600060208284031215611fa657600080fd5b6000611fb484828501611d70565b91505092915050565b600060208284031215611fcf57600080fd5b6000611fdd84828501611daf565b91505092915050565b611fef8161268c565b82525050565b611ffe8161269e565b82525050565b600061200f826125ca565b61201981856125e0565b935061202981856020860161270f565b61203281612892565b840191505092915050565b6000612048826125d5565b61205281856125f1565b935061206281856020860161270f565b61206b81612892565b840191505092915050565b6000612083602b836125f1565b915061208e826128a3565b604082019050919050565b60006120a66032836125f1565b91506120b1826128f2565b604082019050919050565b60006120c96026836125f1565b91506120d482612941565b604082019050919050565b60006120ec6024836125f1565b91506120f782612990565b604082019050919050565b600061210f6019836125f1565b915061211a826129df565b602082019050919050565b6000612132602c836125f1565b915061213d82612a08565b604082019050919050565b60006121556038836125f1565b915061216082612a57565b604082019050919050565b6000612178602a836125f1565b915061218382612aa6565b604082019050919050565b600061219b6029836125f1565b91506121a682612af5565b604082019050919050565b60006121be602c836125f1565b91506121c982612b44565b604082019050919050565b60006121e16020836125f1565b91506121ec82612b93565b602082019050919050565b60006122046029836125f1565b915061220f82612bbc565b604082019050919050565b6000612227602f836125f1565b915061223282612c0b565b604082019050919050565b600061224a6021836125f1565b915061225582612c5a565b604082019050919050565b600061226d6031836125f1565b915061227882612ca9565b604082019050919050565b6000612290602c836125f1565b915061229b82612cf8565b604082019050919050565b6122af816126f6565b82525050565b60006020820190506122ca6000830184611fe6565b92915050565b60006080820190506122e56000830187611fe6565b6122f26020830186611fe6565b6122ff60408301856122a6565b81810360608301526123118184612004565b905095945050505050565b60006020820190506123316000830184611ff5565b92915050565b60006020820190508181036000830152612351818461203d565b905092915050565b6000602082019050818103600083015261237281612076565b9050919050565b6000602082019050818103600083015261239281612099565b9050919050565b600060208201905081810360008301526123b2816120bc565b9050919050565b600060208201905081810360008301526123d2816120df565b9050919050565b600060208201905081810360008301526123f281612102565b9050919050565b6000602082019050818103600083015261241281612125565b9050919050565b6000602082019050818103600083015261243281612148565b9050919050565b600060208201905081810360008301526124528161216b565b9050919050565b600060208201905081810360008301526124728161218e565b9050919050565b60006020820190508181036000830152612492816121b1565b9050919050565b600060208201905081810360008301526124b2816121d4565b9050919050565b600060208201905081810360008301526124d2816121f7565b9050919050565b600060208201905081810360008301526124f28161221a565b9050919050565b600060208201905081810360008301526125128161223d565b9050919050565b6000602082019050818103600083015261253281612260565b9050919050565b6000602082019050818103600083015261255281612283565b9050919050565b600060208201905061256e60008301846122a6565b92915050565b600061257e61258f565b905061258a8282612774565b919050565b6000604051905090565b600067ffffffffffffffff8211156125b4576125b3612863565b5b6125bd82612892565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600061260d826126f6565b9150612618836126f6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561264d5761264c6127d6565b5b828201905092915050565b6000612663826126f6565b915061266e836126f6565b925082821015612681576126806127d6565b5b828203905092915050565b6000612697826126d6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561272d578082015181840152602081019050612712565b8381111561273c576000848401525b50505050565b6000600282049050600182168061275a57607f821691505b6020821081141561276e5761276d612834565b5b50919050565b61277d82612892565b810181811067ffffffffffffffff8211171561279c5761279b612863565b5b80604052505050565b60006127b0826126f6565b91506127bb836126f6565b9250826127cb576127ca612805565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b612d508161268c565b8114612d5b57600080fd5b50565b612d678161269e565b8114612d7257600080fd5b50565b612d7e816126aa565b8114612d8957600080fd5b50565b612d95816126f6565b8114612da057600080fd5b5056fea2646970667358221220e16a23d83294af939ac49c3edecd4f4736875b43fb947eb74c08b8b07a03ec1464736f6c63430008040033

Deployed Bytecode Sourcemap

39012:960:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32864:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21077:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22636:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22159:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33504:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23526:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33172:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23936:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33694:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20771:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20501:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18540:94;;;:::i;:::-;;17889:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21246:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22929:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24192:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39664:303;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23295:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18789:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32864:224;32966:4;33005:35;32990:50;;;:11;:50;;;;:90;;;;33044:36;33068:11;33044:23;:36::i;:::-;32990:90;32983:97;;32864:224;;;:::o;21077:100::-;21131:13;21164:5;21157:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21077:100;:::o;22636:221::-;22712:7;22740:16;22748:7;22740;:16::i;:::-;22732:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22825:15;:24;22841:7;22825:24;;;;;;;;;;;;;;;;;;;;;22818:31;;22636:221;;;:::o;22159:411::-;22240:13;22256:23;22271:7;22256:14;:23::i;:::-;22240:39;;22304:5;22298:11;;:2;:11;;;;22290:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22398:5;22382:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22407:37;22424:5;22431:12;:10;:12::i;:::-;22407:16;:37::i;:::-;22382:62;22360:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22541:21;22550:2;22554:7;22541:8;:21::i;:::-;22159:411;;;:::o;33504:113::-;33565:7;33592:10;:17;;;;33585:24;;33504:113;:::o;23526:339::-;23721:41;23740:12;:10;:12::i;:::-;23754:7;23721:18;:41::i;:::-;23713:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23829:28;23839:4;23845:2;23849:7;23829:9;:28::i;:::-;23526:339;;;:::o;33172:256::-;33269:7;33305:23;33322:5;33305:16;:23::i;:::-;33297:5;:31;33289:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;33394:12;:19;33407:5;33394:19;;;;;;;;;;;;;;;:26;33414:5;33394:26;;;;;;;;;;;;33387:33;;33172:256;;;;:::o;23936:185::-;24074:39;24091:4;24097:2;24101:7;24074:39;;;;;;;;;;;;:16;:39::i;:::-;23936:185;;;:::o;33694:233::-;33769:7;33805:30;:28;:30::i;:::-;33797:5;:38;33789:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;33902:10;33913:5;33902:17;;;;;;;;;;;;;;;;;;;;;;;;33895:24;;33694:233;;;:::o;20771:239::-;20843:7;20863:13;20879:7;:16;20887:7;20879:16;;;;;;;;;;;;;;;;;;;;;20863:32;;20931:1;20914:19;;:5;:19;;;;20906:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20997:5;20990:12;;;20771:239;;;:::o;20501:208::-;20573:7;20618:1;20601:19;;:5;:19;;;;20593:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20685:9;:16;20695:5;20685:16;;;;;;;;;;;;;;;;20678:23;;20501:208;;;:::o;18540:94::-;18120:12;:10;:12::i;:::-;18109:23;;:7;:5;:7::i;:::-;:23;;;18101:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18605:21:::1;18623:1;18605:9;:21::i;:::-;18540:94::o:0;17889:87::-;17935:7;17962:6;;;;;;;;;;;17955:13;;17889:87;:::o;21246:104::-;21302:13;21335:7;21328:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21246:104;:::o;22929:295::-;23044:12;:10;:12::i;:::-;23032:24;;:8;:24;;;;23024:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23144:8;23099:18;:32;23118:12;:10;:12::i;:::-;23099:32;;;;;;;;;;;;;;;:42;23132:8;23099:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23197:8;23168:48;;23183:12;:10;:12::i;:::-;23168:48;;;23207:8;23168:48;;;;;;:::i;:::-;;;;;;;;22929:295;;:::o;24192:328::-;24367:41;24386:12;:10;:12::i;:::-;24400:7;24367:18;:41::i;:::-;24359:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24473:39;24487:4;24493:2;24497:7;24506:5;24473:13;:39::i;:::-;24192:328;;;;:::o;39664:303::-;39737:13;39771:16;39779:7;39771;:16::i;:::-;39763:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;39870:1;39865;39855:7;:11;;;;:::i;:::-;:16;39852:72;;;39895:17;39888:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39852:72;39943:16;39936:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39664:303;;;;:::o;23295:164::-;23392:4;23416:18;:25;23435:5;23416:25;;;;;;;;;;;;;;;:35;23442:8;23416:35;;;;;;;;;;;;;;;;;;;;;;;;;23409:42;;23295:164;;;;:::o;18789:192::-;18120:12;:10;:12::i;:::-;18109:23;;:7;:5;:7::i;:::-;:23;;;18101:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18898:1:::1;18878:22;;:8;:22;;;;18870:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;18954:19;18964:8;18954:9;:19::i;:::-;18789:192:::0;:::o;7690:387::-;7750:4;7958:12;8025:7;8013:20;8005:28;;8068:1;8061:4;:8;8054:15;;;7690:387;;;:::o;32122:126::-;;;;:::o;20144:293::-;20246:4;20294:25;20279:40;;;:11;:40;;;;:101;;;;20347:33;20332:48;;;:11;:48;;;;20279:101;:150;;;;20393:36;20417:11;20393:23;:36::i;:::-;20279:150;20263:166;;20144:293;;;:::o;26030:127::-;26095:4;26147:1;26119:30;;:7;:16;26127:7;26119:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26112:37;;26030:127;;;:::o;15054:98::-;15107:7;15134:10;15127:17;;15054:98;:::o;30012:174::-;30114:2;30087:15;:24;30103:7;30087:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30170:7;30166:2;30132:46;;30141:23;30156:7;30141:14;:23::i;:::-;30132:46;;;;;;;;;;;;30012:174;;:::o;26324:348::-;26417:4;26442:16;26450:7;26442;:16::i;:::-;26434:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26518:13;26534:23;26549:7;26534:14;:23::i;:::-;26518:39;;26587:5;26576:16;;:7;:16;;;:51;;;;26620:7;26596:31;;:20;26608:7;26596:11;:20::i;:::-;:31;;;26576:51;:87;;;;26631:32;26648:5;26655:7;26631:16;:32::i;:::-;26576:87;26568:96;;;26324:348;;;;:::o;29316:578::-;29475:4;29448:31;;:23;29463:7;29448:14;:23::i;:::-;:31;;;29440:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29558:1;29544:16;;:2;:16;;;;29536:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29614:39;29635:4;29641:2;29645:7;29614:20;:39::i;:::-;29718:29;29735:1;29739:7;29718:8;:29::i;:::-;29779:1;29760:9;:15;29770:4;29760:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29808:1;29791:9;:13;29801:2;29791:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29839:2;29820:7;:16;29828:7;29820:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29878:7;29874:2;29859:27;;29868:4;29859:27;;;;;;;;;;;;29316:578;;;:::o;18989:173::-;19045:16;19064:6;;;;;;;;;;;19045:25;;19090:8;19081:6;;:17;;;;;;;;;;;;;;;;;;19145:8;19114:40;;19135:8;19114:40;;;;;;;;;;;;18989:173;;:::o;25402:315::-;25559:28;25569:4;25575:2;25579:7;25559:9;:28::i;:::-;25606:48;25629:4;25635:2;25639:7;25648:5;25606:22;:48::i;:::-;25598:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25402:315;;;;:::o;17322:157::-;17407:4;17446:25;17431:40;;;:11;:40;;;;17424:47;;17322:157;;;:::o;34540:589::-;34684:45;34711:4;34717:2;34721:7;34684:26;:45::i;:::-;34762:1;34746:18;;:4;:18;;;34742:187;;;34781:40;34813:7;34781:31;:40::i;:::-;34742:187;;;34851:2;34843:10;;:4;:10;;;34839:90;;34870:47;34903:4;34909:7;34870:32;:47::i;:::-;34839:90;34742:187;34957:1;34943:16;;:2;:16;;;34939:183;;;34976:45;35013:7;34976:36;:45::i;:::-;34939:183;;;35049:4;35043:10;;:2;:10;;;35039:83;;35070:40;35098:2;35102:7;35070:27;:40::i;:::-;35039:83;34939:183;34540:589;;;:::o;30751:799::-;30906:4;30927:15;:2;:13;;;:15::i;:::-;30923:620;;;30979:2;30963:36;;;31000:12;:10;:12::i;:::-;31014:4;31020:7;31029:5;30963:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30959:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31222:1;31205:6;:13;:18;31201:272;;;31248:60;;;;;;;;;;:::i;:::-;;;;;;;;31201:272;31423:6;31417:13;31408:6;31404:2;31400:15;31393:38;30959:529;31096:41;;;31086:51;;;:6;:51;;;;31079:58;;;;;30923:620;31527:4;31520:11;;30751:799;;;;;;;:::o;35852:164::-;35956:10;:17;;;;35929:15;:24;35945:7;35929:24;;;;;;;;;;;:44;;;;35984:10;36000:7;35984:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35852:164;:::o;36643:988::-;36909:22;36959:1;36934:22;36951:4;36934:16;:22::i;:::-;:26;;;;:::i;:::-;36909:51;;36971:18;36992:17;:26;37010:7;36992:26;;;;;;;;;;;;36971:47;;37139:14;37125:10;:28;37121:328;;37170:19;37192:12;:18;37205:4;37192:18;;;;;;;;;;;;;;;:34;37211:14;37192:34;;;;;;;;;;;;37170:56;;37276:11;37243:12;:18;37256:4;37243:18;;;;;;;;;;;;;;;:30;37262:10;37243:30;;;;;;;;;;;:44;;;;37393:10;37360:17;:30;37378:11;37360:30;;;;;;;;;;;:43;;;;37121:328;;37545:17;:26;37563:7;37545:26;;;;;;;;;;;37538:33;;;37589:12;:18;37602:4;37589:18;;;;;;;;;;;;;;;:34;37608:14;37589:34;;;;;;;;;;;37582:41;;;36643:988;;;;:::o;37926:1079::-;38179:22;38224:1;38204:10;:17;;;;:21;;;;:::i;:::-;38179:46;;38236:18;38257:15;:24;38273:7;38257:24;;;;;;;;;;;;38236:45;;38608:19;38630:10;38641:14;38630:26;;;;;;;;;;;;;;;;;;;;;;;;38608:48;;38694:11;38669:10;38680;38669:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;38805:10;38774:15;:28;38790:11;38774:28;;;;;;;;;;;:41;;;;38946:15;:24;38962:7;38946:24;;;;;;;;;;;38939:31;;;38981:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37926:1079;;;;:::o;35430:221::-;35515:14;35532:20;35549:2;35532:16;:20::i;:::-;35515:37;;35590:7;35563:12;:16;35576:2;35563:16;;;;;;;;;;;;;;;:24;35580:6;35563:24;;;;;;;;;;;:34;;;;35637:6;35608:17;:26;35626:7;35608:26;;;;;;;;;;;:35;;;;35430:221;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:133::-;544:5;582:6;569:20;560:29;;598:30;622:5;598:30;:::i;:::-;550:84;;;;:::o;640:137::-;685:5;723:6;710:20;701:29;;739:32;765:5;739:32;:::i;:::-;691:86;;;;:::o;783:141::-;839:5;870:6;864:13;855:22;;886:32;912:5;886:32;:::i;:::-;845:79;;;;:::o;943:271::-;998:5;1047:3;1040:4;1032:6;1028:17;1024:27;1014:2;;1065:1;1062;1055:12;1014:2;1105:6;1092:20;1130:78;1204:3;1196:6;1189:4;1181:6;1177:17;1130:78;:::i;:::-;1121:87;;1004:210;;;;;:::o;1220:139::-;1266:5;1304:6;1291:20;1282:29;;1320:33;1347:5;1320:33;:::i;:::-;1272:87;;;;:::o;1365:262::-;1424:6;1473:2;1461:9;1452:7;1448:23;1444:32;1441:2;;;1489:1;1486;1479:12;1441:2;1532:1;1557:53;1602:7;1593:6;1582:9;1578:22;1557:53;:::i;:::-;1547:63;;1503:117;1431:196;;;;:::o;1633:407::-;1701:6;1709;1758:2;1746:9;1737:7;1733:23;1729:32;1726:2;;;1774:1;1771;1764:12;1726:2;1817:1;1842:53;1887:7;1878:6;1867:9;1863:22;1842:53;:::i;:::-;1832:63;;1788:117;1944:2;1970:53;2015:7;2006:6;1995:9;1991:22;1970:53;:::i;:::-;1960:63;;1915:118;1716:324;;;;;:::o;2046:552::-;2123:6;2131;2139;2188:2;2176:9;2167:7;2163:23;2159:32;2156:2;;;2204:1;2201;2194:12;2156:2;2247:1;2272:53;2317:7;2308:6;2297:9;2293:22;2272:53;:::i;:::-;2262:63;;2218:117;2374:2;2400:53;2445:7;2436:6;2425:9;2421:22;2400:53;:::i;:::-;2390:63;;2345:118;2502:2;2528:53;2573:7;2564:6;2553:9;2549:22;2528:53;:::i;:::-;2518:63;;2473:118;2146:452;;;;;:::o;2604:809::-;2699:6;2707;2715;2723;2772:3;2760:9;2751:7;2747:23;2743:33;2740:2;;;2789:1;2786;2779:12;2740:2;2832:1;2857:53;2902:7;2893:6;2882:9;2878:22;2857:53;:::i;:::-;2847:63;;2803:117;2959:2;2985:53;3030:7;3021:6;3010:9;3006:22;2985:53;:::i;:::-;2975:63;;2930:118;3087:2;3113:53;3158:7;3149:6;3138:9;3134:22;3113:53;:::i;:::-;3103:63;;3058:118;3243:2;3232:9;3228:18;3215:32;3274:18;3266:6;3263:30;3260:2;;;3306:1;3303;3296:12;3260:2;3334:62;3388:7;3379:6;3368:9;3364:22;3334:62;:::i;:::-;3324:72;;3186:220;2730:683;;;;;;;:::o;3419:401::-;3484:6;3492;3541:2;3529:9;3520:7;3516:23;3512:32;3509:2;;;3557:1;3554;3547:12;3509:2;3600:1;3625:53;3670:7;3661:6;3650:9;3646:22;3625:53;:::i;:::-;3615:63;;3571:117;3727:2;3753:50;3795:7;3786:6;3775:9;3771:22;3753:50;:::i;:::-;3743:60;;3698:115;3499:321;;;;;:::o;3826:407::-;3894:6;3902;3951:2;3939:9;3930:7;3926:23;3922:32;3919:2;;;3967:1;3964;3957:12;3919:2;4010:1;4035:53;4080:7;4071:6;4060:9;4056:22;4035:53;:::i;:::-;4025:63;;3981:117;4137:2;4163:53;4208:7;4199:6;4188:9;4184:22;4163:53;:::i;:::-;4153:63;;4108:118;3909:324;;;;;:::o;4239:260::-;4297:6;4346:2;4334:9;4325:7;4321:23;4317:32;4314:2;;;4362:1;4359;4352:12;4314:2;4405:1;4430:52;4474:7;4465:6;4454:9;4450:22;4430:52;:::i;:::-;4420:62;;4376:116;4304:195;;;;:::o;4505:282::-;4574:6;4623:2;4611:9;4602:7;4598:23;4594:32;4591:2;;;4639:1;4636;4629:12;4591:2;4682:1;4707:63;4762:7;4753:6;4742:9;4738:22;4707:63;:::i;:::-;4697:73;;4653:127;4581:206;;;;:::o;4793:262::-;4852:6;4901:2;4889:9;4880:7;4876:23;4872:32;4869:2;;;4917:1;4914;4907:12;4869:2;4960:1;4985:53;5030:7;5021:6;5010:9;5006:22;4985:53;:::i;:::-;4975:63;;4931:117;4859:196;;;;:::o;5061:118::-;5148:24;5166:5;5148:24;:::i;:::-;5143:3;5136:37;5126:53;;:::o;5185:109::-;5266:21;5281:5;5266:21;:::i;:::-;5261:3;5254:34;5244:50;;:::o;5300:360::-;5386:3;5414:38;5446:5;5414:38;:::i;:::-;5468:70;5531:6;5526:3;5468:70;:::i;:::-;5461:77;;5547:52;5592:6;5587:3;5580:4;5573:5;5569:16;5547:52;:::i;:::-;5624:29;5646:6;5624:29;:::i;:::-;5619:3;5615:39;5608:46;;5390:270;;;;;:::o;5666:364::-;5754:3;5782:39;5815:5;5782:39;:::i;:::-;5837:71;5901:6;5896:3;5837:71;:::i;:::-;5830:78;;5917:52;5962:6;5957:3;5950:4;5943:5;5939:16;5917:52;:::i;:::-;5994:29;6016:6;5994:29;:::i;:::-;5989:3;5985:39;5978:46;;5758:272;;;;;:::o;6036:366::-;6178:3;6199:67;6263:2;6258:3;6199:67;:::i;:::-;6192:74;;6275:93;6364:3;6275:93;:::i;:::-;6393:2;6388:3;6384:12;6377:19;;6182:220;;;:::o;6408:366::-;6550:3;6571:67;6635:2;6630:3;6571:67;:::i;:::-;6564:74;;6647:93;6736:3;6647:93;:::i;:::-;6765:2;6760:3;6756:12;6749:19;;6554:220;;;:::o;6780:366::-;6922:3;6943:67;7007:2;7002:3;6943:67;:::i;:::-;6936:74;;7019:93;7108:3;7019:93;:::i;:::-;7137:2;7132:3;7128:12;7121:19;;6926:220;;;:::o;7152:366::-;7294:3;7315:67;7379:2;7374:3;7315:67;:::i;:::-;7308:74;;7391:93;7480:3;7391:93;:::i;:::-;7509:2;7504:3;7500:12;7493:19;;7298:220;;;:::o;7524:366::-;7666:3;7687:67;7751:2;7746:3;7687:67;:::i;:::-;7680:74;;7763:93;7852:3;7763:93;:::i;:::-;7881:2;7876:3;7872:12;7865:19;;7670:220;;;:::o;7896:366::-;8038:3;8059:67;8123:2;8118:3;8059:67;:::i;:::-;8052:74;;8135:93;8224:3;8135:93;:::i;:::-;8253:2;8248:3;8244:12;8237:19;;8042:220;;;:::o;8268:366::-;8410:3;8431:67;8495:2;8490:3;8431:67;:::i;:::-;8424:74;;8507:93;8596:3;8507:93;:::i;:::-;8625:2;8620:3;8616:12;8609:19;;8414:220;;;:::o;8640:366::-;8782:3;8803:67;8867:2;8862:3;8803:67;:::i;:::-;8796:74;;8879:93;8968:3;8879:93;:::i;:::-;8997:2;8992:3;8988:12;8981:19;;8786:220;;;:::o;9012:366::-;9154:3;9175:67;9239:2;9234:3;9175:67;:::i;:::-;9168:74;;9251:93;9340:3;9251:93;:::i;:::-;9369:2;9364:3;9360:12;9353:19;;9158:220;;;:::o;9384:366::-;9526:3;9547:67;9611:2;9606:3;9547:67;:::i;:::-;9540:74;;9623:93;9712:3;9623:93;:::i;:::-;9741:2;9736:3;9732:12;9725:19;;9530:220;;;:::o;9756:366::-;9898:3;9919:67;9983:2;9978:3;9919:67;:::i;:::-;9912:74;;9995:93;10084:3;9995:93;:::i;:::-;10113:2;10108:3;10104:12;10097:19;;9902:220;;;:::o;10128:366::-;10270:3;10291:67;10355:2;10350:3;10291:67;:::i;:::-;10284:74;;10367:93;10456:3;10367:93;:::i;:::-;10485:2;10480:3;10476:12;10469:19;;10274:220;;;:::o;10500:366::-;10642:3;10663:67;10727:2;10722:3;10663:67;:::i;:::-;10656:74;;10739:93;10828:3;10739:93;:::i;:::-;10857:2;10852:3;10848:12;10841:19;;10646:220;;;:::o;10872:366::-;11014:3;11035:67;11099:2;11094:3;11035:67;:::i;:::-;11028:74;;11111:93;11200:3;11111:93;:::i;:::-;11229:2;11224:3;11220:12;11213:19;;11018:220;;;:::o;11244:366::-;11386:3;11407:67;11471:2;11466:3;11407:67;:::i;:::-;11400:74;;11483:93;11572:3;11483:93;:::i;:::-;11601:2;11596:3;11592:12;11585:19;;11390:220;;;:::o;11616:366::-;11758:3;11779:67;11843:2;11838:3;11779:67;:::i;:::-;11772:74;;11855:93;11944:3;11855:93;:::i;:::-;11973:2;11968:3;11964:12;11957:19;;11762:220;;;:::o;11988:118::-;12075:24;12093:5;12075:24;:::i;:::-;12070:3;12063:37;12053:53;;:::o;12112:222::-;12205:4;12243:2;12232:9;12228:18;12220:26;;12256:71;12324:1;12313:9;12309:17;12300:6;12256:71;:::i;:::-;12210:124;;;;:::o;12340:640::-;12535:4;12573:3;12562:9;12558:19;12550:27;;12587:71;12655:1;12644:9;12640:17;12631:6;12587:71;:::i;:::-;12668:72;12736:2;12725:9;12721:18;12712:6;12668:72;:::i;:::-;12750;12818:2;12807:9;12803:18;12794:6;12750:72;:::i;:::-;12869:9;12863:4;12859:20;12854:2;12843:9;12839:18;12832:48;12897:76;12968:4;12959:6;12897:76;:::i;:::-;12889:84;;12540:440;;;;;;;:::o;12986:210::-;13073:4;13111:2;13100:9;13096:18;13088:26;;13124:65;13186:1;13175:9;13171:17;13162:6;13124:65;:::i;:::-;13078:118;;;;:::o;13202:313::-;13315:4;13353:2;13342:9;13338:18;13330:26;;13402:9;13396:4;13392:20;13388:1;13377:9;13373:17;13366:47;13430:78;13503:4;13494:6;13430:78;:::i;:::-;13422:86;;13320:195;;;;:::o;13521:419::-;13687:4;13725:2;13714:9;13710:18;13702:26;;13774:9;13768:4;13764:20;13760:1;13749:9;13745:17;13738:47;13802:131;13928:4;13802:131;:::i;:::-;13794:139;;13692:248;;;:::o;13946:419::-;14112:4;14150:2;14139:9;14135:18;14127:26;;14199:9;14193:4;14189:20;14185:1;14174:9;14170:17;14163:47;14227:131;14353:4;14227:131;:::i;:::-;14219:139;;14117:248;;;:::o;14371:419::-;14537:4;14575:2;14564:9;14560:18;14552:26;;14624:9;14618:4;14614:20;14610:1;14599:9;14595:17;14588:47;14652:131;14778:4;14652:131;:::i;:::-;14644:139;;14542:248;;;:::o;14796:419::-;14962:4;15000:2;14989:9;14985:18;14977:26;;15049:9;15043:4;15039:20;15035:1;15024:9;15020:17;15013:47;15077:131;15203:4;15077:131;:::i;:::-;15069:139;;14967:248;;;:::o;15221:419::-;15387:4;15425:2;15414:9;15410:18;15402:26;;15474:9;15468:4;15464:20;15460:1;15449:9;15445:17;15438:47;15502:131;15628:4;15502:131;:::i;:::-;15494:139;;15392:248;;;:::o;15646:419::-;15812:4;15850:2;15839:9;15835:18;15827:26;;15899:9;15893:4;15889:20;15885:1;15874:9;15870:17;15863:47;15927:131;16053:4;15927:131;:::i;:::-;15919:139;;15817:248;;;:::o;16071:419::-;16237:4;16275:2;16264:9;16260:18;16252:26;;16324:9;16318:4;16314:20;16310:1;16299:9;16295:17;16288:47;16352:131;16478:4;16352:131;:::i;:::-;16344:139;;16242:248;;;:::o;16496:419::-;16662:4;16700:2;16689:9;16685:18;16677:26;;16749:9;16743:4;16739:20;16735:1;16724:9;16720:17;16713:47;16777:131;16903:4;16777:131;:::i;:::-;16769:139;;16667:248;;;:::o;16921:419::-;17087:4;17125:2;17114:9;17110:18;17102:26;;17174:9;17168:4;17164:20;17160:1;17149:9;17145:17;17138:47;17202:131;17328:4;17202:131;:::i;:::-;17194:139;;17092:248;;;:::o;17346:419::-;17512:4;17550:2;17539:9;17535:18;17527:26;;17599:9;17593:4;17589:20;17585:1;17574:9;17570:17;17563:47;17627:131;17753:4;17627:131;:::i;:::-;17619:139;;17517:248;;;:::o;17771:419::-;17937:4;17975:2;17964:9;17960:18;17952:26;;18024:9;18018:4;18014:20;18010:1;17999:9;17995:17;17988:47;18052:131;18178:4;18052:131;:::i;:::-;18044:139;;17942:248;;;:::o;18196:419::-;18362:4;18400:2;18389:9;18385:18;18377:26;;18449:9;18443:4;18439:20;18435:1;18424:9;18420:17;18413:47;18477:131;18603:4;18477:131;:::i;:::-;18469:139;;18367:248;;;:::o;18621:419::-;18787:4;18825:2;18814:9;18810:18;18802:26;;18874:9;18868:4;18864:20;18860:1;18849:9;18845:17;18838:47;18902:131;19028:4;18902:131;:::i;:::-;18894:139;;18792:248;;;:::o;19046:419::-;19212:4;19250:2;19239:9;19235:18;19227:26;;19299:9;19293:4;19289:20;19285:1;19274:9;19270:17;19263:47;19327:131;19453:4;19327:131;:::i;:::-;19319:139;;19217:248;;;:::o;19471:419::-;19637:4;19675:2;19664:9;19660:18;19652:26;;19724:9;19718:4;19714:20;19710:1;19699:9;19695:17;19688:47;19752:131;19878:4;19752:131;:::i;:::-;19744:139;;19642:248;;;:::o;19896:419::-;20062:4;20100:2;20089:9;20085:18;20077:26;;20149:9;20143:4;20139:20;20135:1;20124:9;20120:17;20113:47;20177:131;20303:4;20177:131;:::i;:::-;20169:139;;20067:248;;;:::o;20321:222::-;20414:4;20452:2;20441:9;20437:18;20429:26;;20465:71;20533:1;20522:9;20518:17;20509:6;20465:71;:::i;:::-;20419:124;;;;:::o;20549:129::-;20583:6;20610:20;;:::i;:::-;20600:30;;20639:33;20667:4;20659:6;20639:33;:::i;:::-;20590:88;;;:::o;20684:75::-;20717:6;20750:2;20744:9;20734:19;;20724:35;:::o;20765:307::-;20826:4;20916:18;20908:6;20905:30;20902:2;;;20938:18;;:::i;:::-;20902:2;20976:29;20998:6;20976:29;:::i;:::-;20968:37;;21060:4;21054;21050:15;21042:23;;20831:241;;;:::o;21078:98::-;21129:6;21163:5;21157:12;21147:22;;21136:40;;;:::o;21182:99::-;21234:6;21268:5;21262:12;21252:22;;21241:40;;;:::o;21287:168::-;21370:11;21404:6;21399:3;21392:19;21444:4;21439:3;21435:14;21420:29;;21382:73;;;;:::o;21461:169::-;21545:11;21579:6;21574:3;21567:19;21619:4;21614:3;21610:14;21595:29;;21557:73;;;;:::o;21636:305::-;21676:3;21695:20;21713:1;21695:20;:::i;:::-;21690:25;;21729:20;21747:1;21729:20;:::i;:::-;21724:25;;21883:1;21815:66;21811:74;21808:1;21805:81;21802:2;;;21889:18;;:::i;:::-;21802:2;21933:1;21930;21926:9;21919:16;;21680:261;;;;:::o;21947:191::-;21987:4;22007:20;22025:1;22007:20;:::i;:::-;22002:25;;22041:20;22059:1;22041:20;:::i;:::-;22036:25;;22080:1;22077;22074:8;22071:2;;;22085:18;;:::i;:::-;22071:2;22130:1;22127;22123:9;22115:17;;21992:146;;;;:::o;22144:96::-;22181:7;22210:24;22228:5;22210:24;:::i;:::-;22199:35;;22189:51;;;:::o;22246:90::-;22280:7;22323:5;22316:13;22309:21;22298:32;;22288:48;;;:::o;22342:149::-;22378:7;22418:66;22411:5;22407:78;22396:89;;22386:105;;;:::o;22497:126::-;22534:7;22574:42;22567:5;22563:54;22552:65;;22542:81;;;:::o;22629:77::-;22666:7;22695:5;22684:16;;22674:32;;;:::o;22712:154::-;22796:6;22791:3;22786;22773:30;22858:1;22849:6;22844:3;22840:16;22833:27;22763:103;;;:::o;22872:307::-;22940:1;22950:113;22964:6;22961:1;22958:13;22950:113;;;23049:1;23044:3;23040:11;23034:18;23030:1;23025:3;23021:11;23014:39;22986:2;22983:1;22979:10;22974:15;;22950:113;;;23081:6;23078:1;23075:13;23072:2;;;23161:1;23152:6;23147:3;23143:16;23136:27;23072:2;22921:258;;;;:::o;23185:320::-;23229:6;23266:1;23260:4;23256:12;23246:22;;23313:1;23307:4;23303:12;23334:18;23324:2;;23390:4;23382:6;23378:17;23368:27;;23324:2;23452;23444:6;23441:14;23421:18;23418:38;23415:2;;;23471:18;;:::i;:::-;23415:2;23236:269;;;;:::o;23511:281::-;23594:27;23616:4;23594:27;:::i;:::-;23586:6;23582:40;23724:6;23712:10;23709:22;23688:18;23676:10;23673:34;23670:62;23667:2;;;23735:18;;:::i;:::-;23667:2;23775:10;23771:2;23764:22;23554:238;;;:::o;23798:176::-;23830:1;23847:20;23865:1;23847:20;:::i;:::-;23842:25;;23881:20;23899:1;23881:20;:::i;:::-;23876:25;;23920:1;23910:2;;23925:18;;:::i;:::-;23910:2;23966:1;23963;23959:9;23954:14;;23832:142;;;;:::o;23980:180::-;24028:77;24025:1;24018:88;24125:4;24122:1;24115:15;24149:4;24146:1;24139:15;24166:180;24214:77;24211:1;24204:88;24311:4;24308:1;24301:15;24335:4;24332:1;24325:15;24352:180;24400:77;24397:1;24390:88;24497:4;24494:1;24487:15;24521:4;24518:1;24511:15;24538:180;24586:77;24583:1;24576:88;24683:4;24680:1;24673:15;24707:4;24704:1;24697:15;24724:102;24765:6;24816:2;24812:7;24807:2;24800:5;24796:14;24792:28;24782:38;;24772:54;;;:::o;24832:230::-;24972:34;24968:1;24960:6;24956:14;24949:58;25041:13;25036:2;25028:6;25024:15;25017:38;24938:124;:::o;25068:237::-;25208:34;25204:1;25196:6;25192:14;25185:58;25277:20;25272:2;25264:6;25260:15;25253:45;25174:131;:::o;25311:225::-;25451:34;25447:1;25439:6;25435:14;25428:58;25520:8;25515:2;25507:6;25503:15;25496:33;25417:119;:::o;25542:223::-;25682:34;25678:1;25670:6;25666:14;25659:58;25751:6;25746:2;25738:6;25734:15;25727:31;25648:117;:::o;25771:175::-;25911:27;25907:1;25899:6;25895:14;25888:51;25877:69;:::o;25952:231::-;26092:34;26088:1;26080:6;26076:14;26069:58;26161:14;26156:2;26148:6;26144:15;26137:39;26058:125;:::o;26189:243::-;26329:34;26325:1;26317:6;26313:14;26306:58;26398:26;26393:2;26385:6;26381:15;26374:51;26295:137;:::o;26438:229::-;26578:34;26574:1;26566:6;26562:14;26555:58;26647:12;26642:2;26634:6;26630:15;26623:37;26544:123;:::o;26673:228::-;26813:34;26809:1;26801:6;26797:14;26790:58;26882:11;26877:2;26869:6;26865:15;26858:36;26779:122;:::o;26907:231::-;27047:34;27043:1;27035:6;27031:14;27024:58;27116:14;27111:2;27103:6;27099:15;27092:39;27013:125;:::o;27144:182::-;27284:34;27280:1;27272:6;27268:14;27261:58;27250:76;:::o;27332:228::-;27472:34;27468:1;27460:6;27456:14;27449:58;27541:11;27536:2;27528:6;27524:15;27517:36;27438:122;:::o;27566:234::-;27706:34;27702:1;27694:6;27690:14;27683:58;27775:17;27770:2;27762:6;27758:15;27751:42;27672:128;:::o;27806:220::-;27946:34;27942:1;27934:6;27930:14;27923:58;28015:3;28010:2;28002:6;27998:15;27991:28;27912:114;:::o;28032:236::-;28172:34;28168:1;28160:6;28156:14;28149:58;28241:19;28236:2;28228:6;28224:15;28217:44;28138:130;:::o;28274:231::-;28414:34;28410:1;28402:6;28398:14;28391:58;28483:14;28478:2;28470:6;28466:15;28459:39;28380:125;:::o;28511:122::-;28584:24;28602:5;28584:24;:::i;:::-;28577:5;28574:35;28564:2;;28623:1;28620;28613:12;28564:2;28554:79;:::o;28639:116::-;28709:21;28724:5;28709:21;:::i;:::-;28702:5;28699:32;28689:2;;28745:1;28742;28735:12;28689:2;28679:76;:::o;28761:120::-;28833:23;28850:5;28833:23;:::i;:::-;28826:5;28823:34;28813:2;;28871:1;28868;28861:12;28813:2;28803:78;:::o;28887:122::-;28960:24;28978:5;28960:24;:::i;:::-;28953:5;28950:35;28940:2;;28999:1;28996;28989:12;28940:2;28930:79;:::o

Swarm Source

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