ETH Price: $3,934.47 (+0.74%)

Token

PLUTO (PLUTO)
 

Overview

Max Total Supply

10,000 PLUTO

Holders

2,513

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 PLUTO
0x3f198be39aa90e9984d27097a55f4f0bbaa67b10
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Welcome to the home of THE PLUTO ALLIANCE on OpenSea. Discover the best items in this collection.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Pluto

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

 


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

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

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

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

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

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

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

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

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

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

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

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

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

 


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

  

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

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

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

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

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

 

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

 

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: 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 {}
}
 


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

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

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

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

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

        return super.tokenURI(tokenId);
    }

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

    /**
     * @dev 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 override {
        super._burn(tokenId);

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

 


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

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

 


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

 
/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

 


/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}



contract Pluto is ERC721URIStorage, AccessControl, ERC721Enumerable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");


    mapping(uint256 => uint256) internal tokenIds_attributes;

    constructor() ERC721("PLUTO", "PLUTO") {
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _setupRole(MINTER_ROLE, msg.sender);
    }

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

    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, amount);
    }

    function _burn(uint256 tokenId) internal virtual override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId) public view virtual override(ERC721, ERC721URIStorage) returns (string memory) {
        return super.tokenURI(tokenId);
    }

    function getCurrentTokenId() public view returns (uint256) {
        return _tokenIds.current();
    }

    function mint(
        address _mintTo
        , string memory _tokenURI
        )
        public
        returns (uint256)
    {
        require(hasRole(MINTER_ROLE, msg.sender), "Caller is not a minter");

        _tokenIds.increment();

        uint256 newItemId = _tokenIds.current();
        _mint(_mintTo, newItemId);
        _setTokenURI(newItemId, _tokenURI );

        return newItemId;
    }

 


}

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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_mintTo","type":"address"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","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"}]

60806040523480156200001157600080fd5b506040518060400160405280600581526020017f504c55544f0000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f504c55544f0000000000000000000000000000000000000000000000000000008152508160009080519060200190620000969291906200027a565b508060019080519060200190620000af9291906200027a565b505050620000c76000801b33620000ff60201b60201c565b620000f97f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633620000ff60201b60201c565b6200038f565b6200011182826200011560201b60201c565b5050565b6200012782826200020760201b60201c565b620002035760016007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620001a86200027260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b82805462000288906200032a565b90600052602060002090601f016020900481019282620002ac5760008555620002f8565b82601f10620002c757805160ff1916838001178555620002f8565b82800160010185558215620002f8579182015b82811115620002f7578251825591602001919060010190620002da565b5b5090506200030791906200030b565b5090565b5b80821115620003265760008160009055506001016200030c565b5090565b600060028204905060018216806200034357607f821691505b602082108114156200035a576200035962000360565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613f9e806200039f6000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806356189236116100de578063a22cb46511610097578063d0def52111610071578063d0def52114610482578063d5391393146104b2578063d547741f146104d0578063e985e9c5146104ec57610173565b8063a22cb4651461041a578063b88d4fde14610436578063c87b56dd1461045257610173565b806356189236146103305780636352211e1461034e57806370a082311461037e57806391d14854146103ae57806395d89b41146103de578063a217fddf146103fc57610173565b8063248a9ca311610130578063248a9ca31461024c5780632f2ff15d1461027c5780632f745c591461029857806336568abe146102c857806342842e0e146102e45780634f6ccce71461030057610173565b806301ffc9a71461017857806306fdde03146101a8578063081812fc146101c6578063095ea7b3146101f657806318160ddd1461021257806323b872dd14610230575b600080fd5b610192600480360381019061018d9190612b9e565b61051c565b60405161019f91906130ee565b60405180910390f35b6101b061052e565b6040516101bd9190613124565b60405180910390f35b6101e060048036038101906101db9190612bf8565b6105c0565b6040516101ed9190613087565b60405180910390f35b610210600480360381019061020b9190612af1565b610645565b005b61021a61075d565b60405161022791906133e6565b60405180910390f35b61024a6004803603810190610245919061297f565b61076a565b005b61026660048036038101906102619190612b31565b6107ca565b6040516102739190613109565b60405180910390f35b61029660048036038101906102919190612b5e565b6107ea565b005b6102b260048036038101906102ad9190612af1565b610813565b6040516102bf91906133e6565b60405180910390f35b6102e260048036038101906102dd9190612b5e565b6108b8565b005b6102fe60048036038101906102f9919061297f565b61093b565b005b61031a60048036038101906103159190612bf8565b61095b565b60405161032791906133e6565b60405180910390f35b6103386109cc565b60405161034591906133e6565b60405180910390f35b61036860048036038101906103639190612bf8565b6109dd565b6040516103759190613087565b60405180910390f35b61039860048036038101906103939190612912565b610a8f565b6040516103a591906133e6565b60405180910390f35b6103c860048036038101906103c39190612b5e565b610b47565b6040516103d591906130ee565b60405180910390f35b6103e6610bb2565b6040516103f39190613124565b60405180910390f35b610404610c44565b6040516104119190613109565b60405180910390f35b610434600480360381019061042f9190612a55565b610c4b565b005b610450600480360381019061044b91906129d2565b610dcc565b005b61046c60048036038101906104679190612bf8565b610e2e565b6040516104799190613124565b60405180910390f35b61049c60048036038101906104979190612a95565b610e40565b6040516104a991906133e6565b60405180910390f35b6104ba610ee1565b6040516104c79190613109565b60405180910390f35b6104ea60048036038101906104e59190612b5e565b610f05565b005b6105066004803603810190610501919061293f565b610f2e565b60405161051391906130ee565b60405180910390f35b600061052782610fc2565b9050919050565b60606000805461053d906136ca565b80601f0160208091040260200160405190810160405280929190818152602001828054610569906136ca565b80156105b65780601f1061058b576101008083540402835291602001916105b6565b820191906000526020600020905b81548152906001019060200180831161059957829003601f168201915b5050505050905090565b60006105cb8261103c565b61060a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060190613306565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610650826109dd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b890613366565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106e06110a8565b73ffffffffffffffffffffffffffffffffffffffff16148061070f575061070e816107096110a8565b610f2e565b5b61074e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074590613226565b60405180910390fd5b61075883836110b0565b505050565b6000600a80549050905090565b61077b6107756110a8565b82611169565b6107ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b190613386565b60405180910390fd5b6107c5838383611247565b505050565b600060076000838152602001908152602001600020600101549050919050565b6107f3826107ca565b610804816107ff6110a8565b6114a3565b61080e8383611540565b505050565b600061081e83610a8f565b821061085f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085690613166565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6108c06110a8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461092d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610924906133c6565b60405180910390fd5b6109378282611621565b5050565b61095683838360405180602001604052806000815250610dcc565b505050565b600061096561075d565b82106109a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099d906133a6565b60405180910390fd5b600a82815481106109ba576109b9613863565b5b90600052602060002001549050919050565b60006109d8600c611703565b905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610a86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7d90613286565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af790613266565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060018054610bc1906136ca565b80601f0160208091040260200160405190810160405280929190818152602001828054610bed906136ca565b8015610c3a5780601f10610c0f57610100808354040283529160200191610c3a565b820191906000526020600020905b815481529060010190602001808311610c1d57829003601f168201915b5050505050905090565b6000801b81565b610c536110a8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb8906131e6565b60405180910390fd5b8060056000610cce6110a8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610d7b6110a8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610dc091906130ee565b60405180910390a35050565b610ddd610dd76110a8565b83611169565b610e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1390613386565b60405180910390fd5b610e2884848484611711565b50505050565b6060610e398261176d565b9050919050565b6000610e6c7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633610b47565b610eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea290613246565b60405180910390fd5b610eb5600c6118bf565b6000610ec1600c611703565b9050610ecd84826118d5565b610ed78184611aa3565b8091505092915050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610f0e826107ca565b610f1f81610f1a6110a8565b6114a3565b610f298383611621565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611035575061103482611b17565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611123836109dd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006111748261103c565b6111b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111aa90613206565b60405180910390fd5b60006111be836109dd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061122d57508373ffffffffffffffffffffffffffffffffffffffff16611215846105c0565b73ffffffffffffffffffffffffffffffffffffffff16145b8061123e575061123d8185610f2e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611267826109dd565b73ffffffffffffffffffffffffffffffffffffffff16146112bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b490613326565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561132d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611324906131c6565b60405180910390fd5b611338838383611b91565b6113436000826110b0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461139391906135ac565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113ea91906134cb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6114ad8282610b47565b61153c576114d28173ffffffffffffffffffffffffffffffffffffffff166014611ba1565b6114e08360001c6020611ba1565b6040516020016114f192919061304d565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115339190613124565b60405180910390fd5b5050565b61154a8282610b47565b61161d5760016007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506115c26110a8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61162b8282610b47565b156116ff5760006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506116a46110a8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600081600001549050919050565b61171c848484611247565b61172884848484611ddd565b611767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175e90613186565b60405180910390fd5b50505050565b60606117788261103c565b6117b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ae906132e6565b60405180910390fd5b60006006600084815260200190815260200160002080546117d7906136ca565b80601f0160208091040260200160405190810160405280929190818152602001828054611803906136ca565b80156118505780601f1061182557610100808354040283529160200191611850565b820191906000526020600020905b81548152906001019060200180831161183357829003601f168201915b505050505090506000611861611f74565b90506000815114156118775781925050506118ba565b6000825111156118ac578082604051602001611894929190613029565b604051602081830303815290604052925050506118ba565b6118b584611f8b565b925050505b919050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611945576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193c906132c6565b60405180910390fd5b61194e8161103c565b1561198e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611985906131a6565b60405180910390fd5b61199a60008383611b91565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119ea91906134cb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b611aac8261103c565b611aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae2906132a6565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190611b12929190612711565b505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b8a5750611b8982612032565b5b9050919050565b611b9c838383612114565b505050565b606060006002836002611bb49190613552565b611bbe91906134cb565b67ffffffffffffffff811115611bd757611bd6613892565b5b6040519080825280601f01601f191660200182016040528015611c095781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611c4157611c40613863565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611ca557611ca4613863565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611ce59190613552565b611cef91906134cb565b90505b6001811115611d8f577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d3157611d30613863565b5b1a60f81b828281518110611d4857611d47613863565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611d88906136a0565b9050611cf2565b5060008414611dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dca90613146565b60405180910390fd5b8091505092915050565b6000611dfe8473ffffffffffffffffffffffffffffffffffffffff16612228565b15611f67578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e276110a8565b8786866040518563ffffffff1660e01b8152600401611e4994939291906130a2565b602060405180830381600087803b158015611e6357600080fd5b505af1925050508015611e9457506040513d601f19601f82011682018060405250810190611e919190612bcb565b60015b611f17573d8060008114611ec4576040519150601f19603f3d011682016040523d82523d6000602084013e611ec9565b606091505b50600081511415611f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0690613186565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611f6c565b600190505b949350505050565b606060405180602001604052806000815250905090565b6060611f968261103c565b611fd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcc90613346565b60405180910390fd5b6000611fdf611f74565b90506000815111611fff576040518060200160405280600081525061202a565b806120098461223b565b60405160200161201a929190613029565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806120fd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061210d575061210c8261239c565b5b9050919050565b61211f838383612406565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121625761215d8161240b565b6121a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146121a05761219f8382612454565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121e4576121df816125c1565b612223565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612222576122218282612692565b5b5b505050565b600080823b905060008111915050919050565b60606000821415612283576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612397565b600082905060005b600082146122b557808061229e9061372d565b915050600a826122ae9190613521565b915061228b565b60008167ffffffffffffffff8111156122d1576122d0613892565b5b6040519080825280601f01601f1916602001820160405280156123035781602001600182028036833780820191505090505b5090505b600085146123905760018261231c91906135ac565b9150600a8561232b9190613776565b603061233791906134cb565b60f81b81838151811061234d5761234c613863565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123899190613521565b9450612307565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161246184610a8f565b61246b91906135ac565b9050600060096000848152602001908152602001600020549050818114612550576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a805490506125d591906135ac565b90506000600b60008481526020019081526020016000205490506000600a838154811061260557612604613863565b5b9060005260206000200154905080600a838154811061262757612626613863565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a80548061267657612675613834565b5b6001900381819060005260206000200160009055905550505050565b600061269d83610a8f565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b82805461271d906136ca565b90600052602060002090601f01602090048101928261273f5760008555612786565b82601f1061275857805160ff1916838001178555612786565b82800160010185558215612786579182015b8281111561278557825182559160200191906001019061276a565b5b5090506127939190612797565b5090565b5b808211156127b0576000816000905550600101612798565b5090565b60006127c76127c284613426565b613401565b9050828152602081018484840111156127e3576127e26138c6565b5b6127ee84828561365e565b509392505050565b600061280961280484613457565b613401565b905082815260208101848484011115612825576128246138c6565b5b61283084828561365e565b509392505050565b60008135905061284781613ef5565b92915050565b60008135905061285c81613f0c565b92915050565b60008135905061287181613f23565b92915050565b60008135905061288681613f3a565b92915050565b60008151905061289b81613f3a565b92915050565b600082601f8301126128b6576128b56138c1565b5b81356128c68482602086016127b4565b91505092915050565b600082601f8301126128e4576128e36138c1565b5b81356128f48482602086016127f6565b91505092915050565b60008135905061290c81613f51565b92915050565b600060208284031215612928576129276138d0565b5b600061293684828501612838565b91505092915050565b60008060408385031215612956576129556138d0565b5b600061296485828601612838565b925050602061297585828601612838565b9150509250929050565b600080600060608486031215612998576129976138d0565b5b60006129a686828701612838565b93505060206129b786828701612838565b92505060406129c8868287016128fd565b9150509250925092565b600080600080608085870312156129ec576129eb6138d0565b5b60006129fa87828801612838565b9450506020612a0b87828801612838565b9350506040612a1c878288016128fd565b925050606085013567ffffffffffffffff811115612a3d57612a3c6138cb565b5b612a49878288016128a1565b91505092959194509250565b60008060408385031215612a6c57612a6b6138d0565b5b6000612a7a85828601612838565b9250506020612a8b8582860161284d565b9150509250929050565b60008060408385031215612aac57612aab6138d0565b5b6000612aba85828601612838565b925050602083013567ffffffffffffffff811115612adb57612ada6138cb565b5b612ae7858286016128cf565b9150509250929050565b60008060408385031215612b0857612b076138d0565b5b6000612b1685828601612838565b9250506020612b27858286016128fd565b9150509250929050565b600060208284031215612b4757612b466138d0565b5b6000612b5584828501612862565b91505092915050565b60008060408385031215612b7557612b746138d0565b5b6000612b8385828601612862565b9250506020612b9485828601612838565b9150509250929050565b600060208284031215612bb457612bb36138d0565b5b6000612bc284828501612877565b91505092915050565b600060208284031215612be157612be06138d0565b5b6000612bef8482850161288c565b91505092915050565b600060208284031215612c0e57612c0d6138d0565b5b6000612c1c848285016128fd565b91505092915050565b612c2e816135e0565b82525050565b612c3d816135f2565b82525050565b612c4c816135fe565b82525050565b6000612c5d82613488565b612c67818561349e565b9350612c7781856020860161366d565b612c80816138d5565b840191505092915050565b6000612c9682613493565b612ca081856134af565b9350612cb081856020860161366d565b612cb9816138d5565b840191505092915050565b6000612ccf82613493565b612cd981856134c0565b9350612ce981856020860161366d565b80840191505092915050565b6000612d026020836134af565b9150612d0d826138e6565b602082019050919050565b6000612d25602b836134af565b9150612d308261390f565b604082019050919050565b6000612d486032836134af565b9150612d538261395e565b604082019050919050565b6000612d6b601c836134af565b9150612d76826139ad565b602082019050919050565b6000612d8e6024836134af565b9150612d99826139d6565b604082019050919050565b6000612db16019836134af565b9150612dbc82613a25565b602082019050919050565b6000612dd4602c836134af565b9150612ddf82613a4e565b604082019050919050565b6000612df76038836134af565b9150612e0282613a9d565b604082019050919050565b6000612e1a6016836134af565b9150612e2582613aec565b602082019050919050565b6000612e3d602a836134af565b9150612e4882613b15565b604082019050919050565b6000612e606029836134af565b9150612e6b82613b64565b604082019050919050565b6000612e83602e836134af565b9150612e8e82613bb3565b604082019050919050565b6000612ea66020836134af565b9150612eb182613c02565b602082019050919050565b6000612ec96031836134af565b9150612ed482613c2b565b604082019050919050565b6000612eec602c836134af565b9150612ef782613c7a565b604082019050919050565b6000612f0f6029836134af565b9150612f1a82613cc9565b604082019050919050565b6000612f32602f836134af565b9150612f3d82613d18565b604082019050919050565b6000612f556021836134af565b9150612f6082613d67565b604082019050919050565b6000612f786031836134af565b9150612f8382613db6565b604082019050919050565b6000612f9b602c836134af565b9150612fa682613e05565b604082019050919050565b6000612fbe6017836134c0565b9150612fc982613e54565b601782019050919050565b6000612fe16011836134c0565b9150612fec82613e7d565b601182019050919050565b6000613004602f836134af565b915061300f82613ea6565b604082019050919050565b61302381613654565b82525050565b60006130358285612cc4565b91506130418284612cc4565b91508190509392505050565b600061305882612fb1565b91506130648285612cc4565b915061306f82612fd4565b915061307b8284612cc4565b91508190509392505050565b600060208201905061309c6000830184612c25565b92915050565b60006080820190506130b76000830187612c25565b6130c46020830186612c25565b6130d1604083018561301a565b81810360608301526130e38184612c52565b905095945050505050565b60006020820190506131036000830184612c34565b92915050565b600060208201905061311e6000830184612c43565b92915050565b6000602082019050818103600083015261313e8184612c8b565b905092915050565b6000602082019050818103600083015261315f81612cf5565b9050919050565b6000602082019050818103600083015261317f81612d18565b9050919050565b6000602082019050818103600083015261319f81612d3b565b9050919050565b600060208201905081810360008301526131bf81612d5e565b9050919050565b600060208201905081810360008301526131df81612d81565b9050919050565b600060208201905081810360008301526131ff81612da4565b9050919050565b6000602082019050818103600083015261321f81612dc7565b9050919050565b6000602082019050818103600083015261323f81612dea565b9050919050565b6000602082019050818103600083015261325f81612e0d565b9050919050565b6000602082019050818103600083015261327f81612e30565b9050919050565b6000602082019050818103600083015261329f81612e53565b9050919050565b600060208201905081810360008301526132bf81612e76565b9050919050565b600060208201905081810360008301526132df81612e99565b9050919050565b600060208201905081810360008301526132ff81612ebc565b9050919050565b6000602082019050818103600083015261331f81612edf565b9050919050565b6000602082019050818103600083015261333f81612f02565b9050919050565b6000602082019050818103600083015261335f81612f25565b9050919050565b6000602082019050818103600083015261337f81612f48565b9050919050565b6000602082019050818103600083015261339f81612f6b565b9050919050565b600060208201905081810360008301526133bf81612f8e565b9050919050565b600060208201905081810360008301526133df81612ff7565b9050919050565b60006020820190506133fb600083018461301a565b92915050565b600061340b61341c565b905061341782826136fc565b919050565b6000604051905090565b600067ffffffffffffffff82111561344157613440613892565b5b61344a826138d5565b9050602081019050919050565b600067ffffffffffffffff82111561347257613471613892565b5b61347b826138d5565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006134d682613654565b91506134e183613654565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613516576135156137a7565b5b828201905092915050565b600061352c82613654565b915061353783613654565b925082613547576135466137d6565b5b828204905092915050565b600061355d82613654565b915061356883613654565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135a1576135a06137a7565b5b828202905092915050565b60006135b782613654565b91506135c283613654565b9250828210156135d5576135d46137a7565b5b828203905092915050565b60006135eb82613634565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561368b578082015181840152602081019050613670565b8381111561369a576000848401525b50505050565b60006136ab82613654565b915060008214156136bf576136be6137a7565b5b600182039050919050565b600060028204905060018216806136e257607f821691505b602082108114156136f6576136f5613805565b5b50919050565b613705826138d5565b810181811067ffffffffffffffff8211171561372457613723613892565b5b80604052505050565b600061373882613654565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561376b5761376a6137a7565b5b600182019050919050565b600061378182613654565b915061378c83613654565b92508261379c5761379b6137d6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f43616c6c6572206973206e6f742061206d696e74657200000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b613efe816135e0565b8114613f0957600080fd5b50565b613f15816135f2565b8114613f2057600080fd5b50565b613f2c816135fe565b8114613f3757600080fd5b50565b613f4381613608565b8114613f4e57600080fd5b50565b613f5a81613654565b8114613f6557600080fd5b5056fea2646970667358221220845c0ecc056ef43faa01d001f1cdfac8bf4437f411a6c0e23167ac52da2b8e6864736f6c63430008060033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101735760003560e01c806356189236116100de578063a22cb46511610097578063d0def52111610071578063d0def52114610482578063d5391393146104b2578063d547741f146104d0578063e985e9c5146104ec57610173565b8063a22cb4651461041a578063b88d4fde14610436578063c87b56dd1461045257610173565b806356189236146103305780636352211e1461034e57806370a082311461037e57806391d14854146103ae57806395d89b41146103de578063a217fddf146103fc57610173565b8063248a9ca311610130578063248a9ca31461024c5780632f2ff15d1461027c5780632f745c591461029857806336568abe146102c857806342842e0e146102e45780634f6ccce71461030057610173565b806301ffc9a71461017857806306fdde03146101a8578063081812fc146101c6578063095ea7b3146101f657806318160ddd1461021257806323b872dd14610230575b600080fd5b610192600480360381019061018d9190612b9e565b61051c565b60405161019f91906130ee565b60405180910390f35b6101b061052e565b6040516101bd9190613124565b60405180910390f35b6101e060048036038101906101db9190612bf8565b6105c0565b6040516101ed9190613087565b60405180910390f35b610210600480360381019061020b9190612af1565b610645565b005b61021a61075d565b60405161022791906133e6565b60405180910390f35b61024a6004803603810190610245919061297f565b61076a565b005b61026660048036038101906102619190612b31565b6107ca565b6040516102739190613109565b60405180910390f35b61029660048036038101906102919190612b5e565b6107ea565b005b6102b260048036038101906102ad9190612af1565b610813565b6040516102bf91906133e6565b60405180910390f35b6102e260048036038101906102dd9190612b5e565b6108b8565b005b6102fe60048036038101906102f9919061297f565b61093b565b005b61031a60048036038101906103159190612bf8565b61095b565b60405161032791906133e6565b60405180910390f35b6103386109cc565b60405161034591906133e6565b60405180910390f35b61036860048036038101906103639190612bf8565b6109dd565b6040516103759190613087565b60405180910390f35b61039860048036038101906103939190612912565b610a8f565b6040516103a591906133e6565b60405180910390f35b6103c860048036038101906103c39190612b5e565b610b47565b6040516103d591906130ee565b60405180910390f35b6103e6610bb2565b6040516103f39190613124565b60405180910390f35b610404610c44565b6040516104119190613109565b60405180910390f35b610434600480360381019061042f9190612a55565b610c4b565b005b610450600480360381019061044b91906129d2565b610dcc565b005b61046c60048036038101906104679190612bf8565b610e2e565b6040516104799190613124565b60405180910390f35b61049c60048036038101906104979190612a95565b610e40565b6040516104a991906133e6565b60405180910390f35b6104ba610ee1565b6040516104c79190613109565b60405180910390f35b6104ea60048036038101906104e59190612b5e565b610f05565b005b6105066004803603810190610501919061293f565b610f2e565b60405161051391906130ee565b60405180910390f35b600061052782610fc2565b9050919050565b60606000805461053d906136ca565b80601f0160208091040260200160405190810160405280929190818152602001828054610569906136ca565b80156105b65780601f1061058b576101008083540402835291602001916105b6565b820191906000526020600020905b81548152906001019060200180831161059957829003601f168201915b5050505050905090565b60006105cb8261103c565b61060a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060190613306565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610650826109dd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b890613366565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106e06110a8565b73ffffffffffffffffffffffffffffffffffffffff16148061070f575061070e816107096110a8565b610f2e565b5b61074e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074590613226565b60405180910390fd5b61075883836110b0565b505050565b6000600a80549050905090565b61077b6107756110a8565b82611169565b6107ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b190613386565b60405180910390fd5b6107c5838383611247565b505050565b600060076000838152602001908152602001600020600101549050919050565b6107f3826107ca565b610804816107ff6110a8565b6114a3565b61080e8383611540565b505050565b600061081e83610a8f565b821061085f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085690613166565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6108c06110a8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461092d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610924906133c6565b60405180910390fd5b6109378282611621565b5050565b61095683838360405180602001604052806000815250610dcc565b505050565b600061096561075d565b82106109a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099d906133a6565b60405180910390fd5b600a82815481106109ba576109b9613863565b5b90600052602060002001549050919050565b60006109d8600c611703565b905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610a86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7d90613286565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af790613266565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060018054610bc1906136ca565b80601f0160208091040260200160405190810160405280929190818152602001828054610bed906136ca565b8015610c3a5780601f10610c0f57610100808354040283529160200191610c3a565b820191906000526020600020905b815481529060010190602001808311610c1d57829003601f168201915b5050505050905090565b6000801b81565b610c536110a8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb8906131e6565b60405180910390fd5b8060056000610cce6110a8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610d7b6110a8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610dc091906130ee565b60405180910390a35050565b610ddd610dd76110a8565b83611169565b610e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1390613386565b60405180910390fd5b610e2884848484611711565b50505050565b6060610e398261176d565b9050919050565b6000610e6c7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633610b47565b610eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea290613246565b60405180910390fd5b610eb5600c6118bf565b6000610ec1600c611703565b9050610ecd84826118d5565b610ed78184611aa3565b8091505092915050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610f0e826107ca565b610f1f81610f1a6110a8565b6114a3565b610f298383611621565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611035575061103482611b17565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611123836109dd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006111748261103c565b6111b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111aa90613206565b60405180910390fd5b60006111be836109dd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061122d57508373ffffffffffffffffffffffffffffffffffffffff16611215846105c0565b73ffffffffffffffffffffffffffffffffffffffff16145b8061123e575061123d8185610f2e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611267826109dd565b73ffffffffffffffffffffffffffffffffffffffff16146112bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b490613326565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561132d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611324906131c6565b60405180910390fd5b611338838383611b91565b6113436000826110b0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461139391906135ac565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113ea91906134cb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6114ad8282610b47565b61153c576114d28173ffffffffffffffffffffffffffffffffffffffff166014611ba1565b6114e08360001c6020611ba1565b6040516020016114f192919061304d565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115339190613124565b60405180910390fd5b5050565b61154a8282610b47565b61161d5760016007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506115c26110a8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61162b8282610b47565b156116ff5760006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506116a46110a8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600081600001549050919050565b61171c848484611247565b61172884848484611ddd565b611767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175e90613186565b60405180910390fd5b50505050565b60606117788261103c565b6117b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ae906132e6565b60405180910390fd5b60006006600084815260200190815260200160002080546117d7906136ca565b80601f0160208091040260200160405190810160405280929190818152602001828054611803906136ca565b80156118505780601f1061182557610100808354040283529160200191611850565b820191906000526020600020905b81548152906001019060200180831161183357829003601f168201915b505050505090506000611861611f74565b90506000815114156118775781925050506118ba565b6000825111156118ac578082604051602001611894929190613029565b604051602081830303815290604052925050506118ba565b6118b584611f8b565b925050505b919050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611945576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193c906132c6565b60405180910390fd5b61194e8161103c565b1561198e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611985906131a6565b60405180910390fd5b61199a60008383611b91565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119ea91906134cb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b611aac8261103c565b611aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae2906132a6565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190611b12929190612711565b505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b8a5750611b8982612032565b5b9050919050565b611b9c838383612114565b505050565b606060006002836002611bb49190613552565b611bbe91906134cb565b67ffffffffffffffff811115611bd757611bd6613892565b5b6040519080825280601f01601f191660200182016040528015611c095781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611c4157611c40613863565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611ca557611ca4613863565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611ce59190613552565b611cef91906134cb565b90505b6001811115611d8f577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d3157611d30613863565b5b1a60f81b828281518110611d4857611d47613863565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611d88906136a0565b9050611cf2565b5060008414611dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dca90613146565b60405180910390fd5b8091505092915050565b6000611dfe8473ffffffffffffffffffffffffffffffffffffffff16612228565b15611f67578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e276110a8565b8786866040518563ffffffff1660e01b8152600401611e4994939291906130a2565b602060405180830381600087803b158015611e6357600080fd5b505af1925050508015611e9457506040513d601f19601f82011682018060405250810190611e919190612bcb565b60015b611f17573d8060008114611ec4576040519150601f19603f3d011682016040523d82523d6000602084013e611ec9565b606091505b50600081511415611f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0690613186565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611f6c565b600190505b949350505050565b606060405180602001604052806000815250905090565b6060611f968261103c565b611fd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcc90613346565b60405180910390fd5b6000611fdf611f74565b90506000815111611fff576040518060200160405280600081525061202a565b806120098461223b565b60405160200161201a929190613029565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806120fd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061210d575061210c8261239c565b5b9050919050565b61211f838383612406565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121625761215d8161240b565b6121a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146121a05761219f8382612454565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121e4576121df816125c1565b612223565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612222576122218282612692565b5b5b505050565b600080823b905060008111915050919050565b60606000821415612283576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612397565b600082905060005b600082146122b557808061229e9061372d565b915050600a826122ae9190613521565b915061228b565b60008167ffffffffffffffff8111156122d1576122d0613892565b5b6040519080825280601f01601f1916602001820160405280156123035781602001600182028036833780820191505090505b5090505b600085146123905760018261231c91906135ac565b9150600a8561232b9190613776565b603061233791906134cb565b60f81b81838151811061234d5761234c613863565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123899190613521565b9450612307565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161246184610a8f565b61246b91906135ac565b9050600060096000848152602001908152602001600020549050818114612550576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a805490506125d591906135ac565b90506000600b60008481526020019081526020016000205490506000600a838154811061260557612604613863565b5b9060005260206000200154905080600a838154811061262757612626613863565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a80548061267657612675613834565b5b6001900381819060005260206000200160009055905550505050565b600061269d83610a8f565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b82805461271d906136ca565b90600052602060002090601f01602090048101928261273f5760008555612786565b82601f1061275857805160ff1916838001178555612786565b82800160010185558215612786579182015b8281111561278557825182559160200191906001019061276a565b5b5090506127939190612797565b5090565b5b808211156127b0576000816000905550600101612798565b5090565b60006127c76127c284613426565b613401565b9050828152602081018484840111156127e3576127e26138c6565b5b6127ee84828561365e565b509392505050565b600061280961280484613457565b613401565b905082815260208101848484011115612825576128246138c6565b5b61283084828561365e565b509392505050565b60008135905061284781613ef5565b92915050565b60008135905061285c81613f0c565b92915050565b60008135905061287181613f23565b92915050565b60008135905061288681613f3a565b92915050565b60008151905061289b81613f3a565b92915050565b600082601f8301126128b6576128b56138c1565b5b81356128c68482602086016127b4565b91505092915050565b600082601f8301126128e4576128e36138c1565b5b81356128f48482602086016127f6565b91505092915050565b60008135905061290c81613f51565b92915050565b600060208284031215612928576129276138d0565b5b600061293684828501612838565b91505092915050565b60008060408385031215612956576129556138d0565b5b600061296485828601612838565b925050602061297585828601612838565b9150509250929050565b600080600060608486031215612998576129976138d0565b5b60006129a686828701612838565b93505060206129b786828701612838565b92505060406129c8868287016128fd565b9150509250925092565b600080600080608085870312156129ec576129eb6138d0565b5b60006129fa87828801612838565b9450506020612a0b87828801612838565b9350506040612a1c878288016128fd565b925050606085013567ffffffffffffffff811115612a3d57612a3c6138cb565b5b612a49878288016128a1565b91505092959194509250565b60008060408385031215612a6c57612a6b6138d0565b5b6000612a7a85828601612838565b9250506020612a8b8582860161284d565b9150509250929050565b60008060408385031215612aac57612aab6138d0565b5b6000612aba85828601612838565b925050602083013567ffffffffffffffff811115612adb57612ada6138cb565b5b612ae7858286016128cf565b9150509250929050565b60008060408385031215612b0857612b076138d0565b5b6000612b1685828601612838565b9250506020612b27858286016128fd565b9150509250929050565b600060208284031215612b4757612b466138d0565b5b6000612b5584828501612862565b91505092915050565b60008060408385031215612b7557612b746138d0565b5b6000612b8385828601612862565b9250506020612b9485828601612838565b9150509250929050565b600060208284031215612bb457612bb36138d0565b5b6000612bc284828501612877565b91505092915050565b600060208284031215612be157612be06138d0565b5b6000612bef8482850161288c565b91505092915050565b600060208284031215612c0e57612c0d6138d0565b5b6000612c1c848285016128fd565b91505092915050565b612c2e816135e0565b82525050565b612c3d816135f2565b82525050565b612c4c816135fe565b82525050565b6000612c5d82613488565b612c67818561349e565b9350612c7781856020860161366d565b612c80816138d5565b840191505092915050565b6000612c9682613493565b612ca081856134af565b9350612cb081856020860161366d565b612cb9816138d5565b840191505092915050565b6000612ccf82613493565b612cd981856134c0565b9350612ce981856020860161366d565b80840191505092915050565b6000612d026020836134af565b9150612d0d826138e6565b602082019050919050565b6000612d25602b836134af565b9150612d308261390f565b604082019050919050565b6000612d486032836134af565b9150612d538261395e565b604082019050919050565b6000612d6b601c836134af565b9150612d76826139ad565b602082019050919050565b6000612d8e6024836134af565b9150612d99826139d6565b604082019050919050565b6000612db16019836134af565b9150612dbc82613a25565b602082019050919050565b6000612dd4602c836134af565b9150612ddf82613a4e565b604082019050919050565b6000612df76038836134af565b9150612e0282613a9d565b604082019050919050565b6000612e1a6016836134af565b9150612e2582613aec565b602082019050919050565b6000612e3d602a836134af565b9150612e4882613b15565b604082019050919050565b6000612e606029836134af565b9150612e6b82613b64565b604082019050919050565b6000612e83602e836134af565b9150612e8e82613bb3565b604082019050919050565b6000612ea66020836134af565b9150612eb182613c02565b602082019050919050565b6000612ec96031836134af565b9150612ed482613c2b565b604082019050919050565b6000612eec602c836134af565b9150612ef782613c7a565b604082019050919050565b6000612f0f6029836134af565b9150612f1a82613cc9565b604082019050919050565b6000612f32602f836134af565b9150612f3d82613d18565b604082019050919050565b6000612f556021836134af565b9150612f6082613d67565b604082019050919050565b6000612f786031836134af565b9150612f8382613db6565b604082019050919050565b6000612f9b602c836134af565b9150612fa682613e05565b604082019050919050565b6000612fbe6017836134c0565b9150612fc982613e54565b601782019050919050565b6000612fe16011836134c0565b9150612fec82613e7d565b601182019050919050565b6000613004602f836134af565b915061300f82613ea6565b604082019050919050565b61302381613654565b82525050565b60006130358285612cc4565b91506130418284612cc4565b91508190509392505050565b600061305882612fb1565b91506130648285612cc4565b915061306f82612fd4565b915061307b8284612cc4565b91508190509392505050565b600060208201905061309c6000830184612c25565b92915050565b60006080820190506130b76000830187612c25565b6130c46020830186612c25565b6130d1604083018561301a565b81810360608301526130e38184612c52565b905095945050505050565b60006020820190506131036000830184612c34565b92915050565b600060208201905061311e6000830184612c43565b92915050565b6000602082019050818103600083015261313e8184612c8b565b905092915050565b6000602082019050818103600083015261315f81612cf5565b9050919050565b6000602082019050818103600083015261317f81612d18565b9050919050565b6000602082019050818103600083015261319f81612d3b565b9050919050565b600060208201905081810360008301526131bf81612d5e565b9050919050565b600060208201905081810360008301526131df81612d81565b9050919050565b600060208201905081810360008301526131ff81612da4565b9050919050565b6000602082019050818103600083015261321f81612dc7565b9050919050565b6000602082019050818103600083015261323f81612dea565b9050919050565b6000602082019050818103600083015261325f81612e0d565b9050919050565b6000602082019050818103600083015261327f81612e30565b9050919050565b6000602082019050818103600083015261329f81612e53565b9050919050565b600060208201905081810360008301526132bf81612e76565b9050919050565b600060208201905081810360008301526132df81612e99565b9050919050565b600060208201905081810360008301526132ff81612ebc565b9050919050565b6000602082019050818103600083015261331f81612edf565b9050919050565b6000602082019050818103600083015261333f81612f02565b9050919050565b6000602082019050818103600083015261335f81612f25565b9050919050565b6000602082019050818103600083015261337f81612f48565b9050919050565b6000602082019050818103600083015261339f81612f6b565b9050919050565b600060208201905081810360008301526133bf81612f8e565b9050919050565b600060208201905081810360008301526133df81612ff7565b9050919050565b60006020820190506133fb600083018461301a565b92915050565b600061340b61341c565b905061341782826136fc565b919050565b6000604051905090565b600067ffffffffffffffff82111561344157613440613892565b5b61344a826138d5565b9050602081019050919050565b600067ffffffffffffffff82111561347257613471613892565b5b61347b826138d5565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006134d682613654565b91506134e183613654565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613516576135156137a7565b5b828201905092915050565b600061352c82613654565b915061353783613654565b925082613547576135466137d6565b5b828204905092915050565b600061355d82613654565b915061356883613654565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135a1576135a06137a7565b5b828202905092915050565b60006135b782613654565b91506135c283613654565b9250828210156135d5576135d46137a7565b5b828203905092915050565b60006135eb82613634565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561368b578082015181840152602081019050613670565b8381111561369a576000848401525b50505050565b60006136ab82613654565b915060008214156136bf576136be6137a7565b5b600182039050919050565b600060028204905060018216806136e257607f821691505b602082108114156136f6576136f5613805565b5b50919050565b613705826138d5565b810181811067ffffffffffffffff8211171561372457613723613892565b5b80604052505050565b600061373882613654565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561376b5761376a6137a7565b5b600182019050919050565b600061378182613654565b915061378c83613654565b92508261379c5761379b6137d6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f43616c6c6572206973206e6f742061206d696e74657200000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b613efe816135e0565b8114613f0957600080fd5b50565b613f15816135f2565b8114613f2057600080fd5b50565b613f2c816135fe565b8114613f3757600080fd5b50565b613f4381613608565b8114613f4e57600080fd5b50565b613f5a81613654565b8114613f6557600080fd5b5056fea2646970667358221220845c0ecc056ef43faa01d001f1cdfac8bf4437f411a6c0e23167ac52da2b8e6864736f6c63430008060033

Deployed Bytecode Sourcemap

52938:1692:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53390:194;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20827:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22386:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21909:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36164:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23276:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49723:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50108:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35832:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51156:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23686:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36354:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54089:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20521:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20251:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48608:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20996:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47699:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22679:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23942:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53918:163;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54201:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53098:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50500:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23045:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53390:194;53516:4;53540:36;53564:11;53540:23;:36::i;:::-;53533:43;;53390:194;;;:::o;20827:100::-;20881:13;20914:5;20907:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20827:100;:::o;22386:221::-;22462:7;22490:16;22498:7;22490;:16::i;:::-;22482:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22575:15;:24;22591:7;22575:24;;;;;;;;;;;;;;;;;;;;;22568:31;;22386:221;;;:::o;21909:411::-;21990:13;22006:23;22021:7;22006:14;:23::i;:::-;21990:39;;22054:5;22048:11;;:2;:11;;;;22040:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22148:5;22132:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22157:37;22174:5;22181:12;:10;:12::i;:::-;22157:16;:37::i;:::-;22132:62;22110:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22291:21;22300:2;22304:7;22291:8;:21::i;:::-;21979:341;21909:411;;:::o;36164:113::-;36225:7;36252:10;:17;;;;36245:24;;36164:113;:::o;23276:339::-;23471:41;23490:12;:10;:12::i;:::-;23504:7;23471:18;:41::i;:::-;23463:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23579:28;23589:4;23595:2;23599:7;23579:9;:28::i;:::-;23276:339;;;:::o;49723:123::-;49789:7;49816:6;:12;49823:4;49816:12;;;;;;;;;;;:22;;;49809:29;;49723:123;;;:::o;50108:147::-;50191:18;50204:4;50191:12;:18::i;:::-;48190:30;48201:4;48207:12;:10;:12::i;:::-;48190:10;:30::i;:::-;50222:25:::1;50233:4;50239:7;50222:10;:25::i;:::-;50108:147:::0;;;:::o;35832:256::-;35929:7;35965:23;35982:5;35965:16;:23::i;:::-;35957:5;:31;35949:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;36054:12;:19;36067:5;36054:19;;;;;;;;;;;;;;;:26;36074:5;36054:26;;;;;;;;;;;;36047:33;;35832:256;;;;:::o;51156:218::-;51263:12;:10;:12::i;:::-;51252:23;;:7;:23;;;51244:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;51340:26;51352:4;51358:7;51340:11;:26::i;:::-;51156:218;;:::o;23686:185::-;23824:39;23841:4;23847:2;23851:7;23824:39;;;;;;;;;;;;:16;:39::i;:::-;23686:185;;;:::o;36354:233::-;36429:7;36465:30;:28;:30::i;:::-;36457:5;:38;36449:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;36562:10;36573:5;36562:17;;;;;;;;:::i;:::-;;;;;;;;;;36555:24;;36354:233;;;:::o;54089:104::-;54139:7;54166:19;:9;:17;:19::i;:::-;54159:26;;54089:104;:::o;20521:239::-;20593:7;20613:13;20629:7;:16;20637:7;20629:16;;;;;;;;;;;;;;;;;;;;;20613:32;;20681:1;20664:19;;:5;:19;;;;20656:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20747:5;20740:12;;;20521:239;;;:::o;20251:208::-;20323:7;20368:1;20351:19;;:5;:19;;;;20343:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20435:9;:16;20445:5;20435:16;;;;;;;;;;;;;;;;20428:23;;20251:208;;;:::o;48608:139::-;48686:4;48710:6;:12;48717:4;48710:12;;;;;;;;;;;:20;;:29;48731:7;48710:29;;;;;;;;;;;;;;;;;;;;;;;;;48703:36;;48608:139;;;;:::o;20996:104::-;21052:13;21085:7;21078:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20996:104;:::o;47699:49::-;47744:4;47699:49;;;:::o;22679:295::-;22794:12;:10;:12::i;:::-;22782:24;;:8;:24;;;;22774:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22894:8;22849:18;:32;22868:12;:10;:12::i;:::-;22849:32;;;;;;;;;;;;;;;:42;22882:8;22849:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;22947:8;22918:48;;22933:12;:10;:12::i;:::-;22918:48;;;22957:8;22918:48;;;;;;:::i;:::-;;;;;;;;22679:295;;:::o;23942:328::-;24117:41;24136:12;:10;:12::i;:::-;24150:7;24117:18;:41::i;:::-;24109:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24223:39;24237:4;24243:2;24247:7;24256:5;24223:13;:39::i;:::-;23942:328;;;;:::o;53918:163::-;54017:13;54050:23;54065:7;54050:14;:23::i;:::-;54043:30;;53918:163;;;:::o;54201:417::-;54321:7;54354:32;53136:24;54375:10;54354:7;:32::i;:::-;54346:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;54426:21;:9;:19;:21::i;:::-;54460:17;54480:19;:9;:17;:19::i;:::-;54460:39;;54510:25;54516:7;54525:9;54510:5;:25::i;:::-;54546:35;54559:9;54570;54546:12;:35::i;:::-;54601:9;54594:16;;;54201:417;;;;:::o;53098:62::-;53136:24;53098:62;:::o;50500:149::-;50584:18;50597:4;50584:12;:18::i;:::-;48190:30;48201:4;48207:12;:10;:12::i;:::-;48190:10;:30::i;:::-;50615:26:::1;50627:4;50633:7;50615:11;:26::i;:::-;50500:149:::0;;;:::o;23045:164::-;23142:4;23166:18;:25;23185:5;23166:25;;;;;;;;;;;;;;;:35;23192:8;23166:35;;;;;;;;;;;;;;;;;;;;;;;;;23159:42;;23045:164;;;;:::o;35524:224::-;35626:4;35665:35;35650:50;;;:11;:50;;;;:90;;;;35704:36;35728:11;35704:23;:36::i;:::-;35650:90;35643:97;;35524:224;;;:::o;25780:127::-;25845:4;25897:1;25869:30;;:7;:16;25877:7;25869:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25862:37;;25780:127;;;:::o;15578:98::-;15631:7;15658:10;15651:17;;15578:98;:::o;29762:174::-;29864:2;29837:15;:24;29853:7;29837:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29920:7;29916:2;29882:46;;29891:23;29906:7;29891:14;:23::i;:::-;29882:46;;;;;;;;;;;;29762:174;;:::o;26074:348::-;26167:4;26192:16;26200:7;26192;:16::i;:::-;26184:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26268:13;26284:23;26299:7;26284:14;:23::i;:::-;26268:39;;26337:5;26326:16;;:7;:16;;;:51;;;;26370:7;26346:31;;:20;26358:7;26346:11;:20::i;:::-;:31;;;26326:51;:87;;;;26381:32;26398:5;26405:7;26381:16;:32::i;:::-;26326:87;26318:96;;;26074:348;;;;:::o;29066:578::-;29225:4;29198:31;;:23;29213:7;29198:14;:23::i;:::-;:31;;;29190:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29308:1;29294:16;;:2;:16;;;;29286:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29364:39;29385:4;29391:2;29395:7;29364:20;:39::i;:::-;29468:29;29485:1;29489:7;29468:8;:29::i;:::-;29529:1;29510:9;:15;29520:4;29510:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29558:1;29541:9;:13;29551:2;29541:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29589:2;29570:7;:16;29578:7;29570:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29628:7;29624:2;29609:27;;29618:4;29609:27;;;;;;;;;;;;29066:578;;;:::o;49037:497::-;49118:22;49126:4;49132:7;49118;:22::i;:::-;49113:414;;49306:41;49334:7;49306:41;;49344:2;49306:19;:41::i;:::-;49420:38;49448:4;49440:13;;49455:2;49420:19;:38::i;:::-;49211:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49157:358;;;;;;;;;;;:::i;:::-;;;;;;;;49113:414;49037:497;;:::o;52460:229::-;52535:22;52543:4;52549:7;52535;:22::i;:::-;52530:152;;52606:4;52574:6;:12;52581:4;52574:12;;;;;;;;;;;:20;;:29;52595:7;52574:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;52657:12;:10;:12::i;:::-;52630:40;;52648:7;52630:40;;52642:4;52630:40;;;;;;;;;;52530:152;52460:229;;:::o;52697:230::-;52772:22;52780:4;52786:7;52772;:22::i;:::-;52768:152;;;52843:5;52811:6;:12;52818:4;52811:12;;;;;;;;;;;:20;;:29;52832:7;52811:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;52895:12;:10;:12::i;:::-;52868:40;;52886:7;52868:40;;52880:4;52868:40;;;;;;;;;;52768:152;52697:230;;:::o;42408:114::-;42473:7;42500;:14;;;42493:21;;42408:114;;;:::o;25152:315::-;25309:28;25319:4;25325:2;25329:7;25309:9;:28::i;:::-;25356:48;25379:4;25385:2;25389:7;25398:5;25356:22;:48::i;:::-;25348:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25152:315;;;;:::o;32326:679::-;32399:13;32433:16;32441:7;32433;:16::i;:::-;32425:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;32516:23;32542:10;:19;32553:7;32542:19;;;;;;;;;;;32516:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32572:18;32593:10;:8;:10::i;:::-;32572:31;;32701:1;32685:4;32679:18;:23;32675:72;;;32726:9;32719:16;;;;;;32675:72;32877:1;32857:9;32851:23;:27;32847:108;;;32926:4;32932:9;32909:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32895:48;;;;;;32847:108;32974:23;32989:7;32974:14;:23::i;:::-;32967:30;;;;32326:679;;;;:::o;42530:127::-;42637:1;42619:7;:14;;;:19;;;;;;;;;;;42530:127;:::o;27758:382::-;27852:1;27838:16;;:2;:16;;;;27830:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27911:16;27919:7;27911;:16::i;:::-;27910:17;27902:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27973:45;28002:1;28006:2;28010:7;27973:20;:45::i;:::-;28048:1;28031:9;:13;28041:2;28031:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28079:2;28060:7;:16;28068:7;28060:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28124:7;28120:2;28099:33;;28116:1;28099:33;;;;;;;;;;;;27758:382;;:::o;33161:217::-;33261:16;33269:7;33261;:16::i;:::-;33253:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;33361:9;33339:10;:19;33350:7;33339:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;33161:217;;:::o;48312:204::-;48397:4;48436:32;48421:47;;;:11;:47;;;;:87;;;;48472:36;48496:11;48472:23;:36::i;:::-;48421:87;48414:94;;48312:204;;;:::o;53592:187::-;53727:44;53754:4;53760:2;53764:6;53727:26;:44::i;:::-;53592:187;;;:::o;17325:451::-;17400:13;17426:19;17471:1;17462:6;17458:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;17448:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17426:47;;17484:15;:6;17491:1;17484:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;17510;:6;17517:1;17510:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;17541:9;17566:1;17557:6;17553:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;17541:26;;17536:135;17573:1;17569;:5;17536:135;;;17608:12;17629:3;17621:5;:11;17608:25;;;;;;;:::i;:::-;;;;;17596:6;17603:1;17596:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;17658:1;17648:11;;;;;17576:3;;;;:::i;:::-;;;17536:135;;;;17698:1;17689:5;:10;17681:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;17761:6;17747:21;;;17325:451;;;;:::o;30501:799::-;30656:4;30677:15;:2;:13;;;:15::i;:::-;30673:620;;;30729:2;30713:36;;;30750:12;:10;:12::i;:::-;30764:4;30770:7;30779:5;30713:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30709:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30972:1;30955:6;:13;:18;30951:272;;;30998:60;;;;;;;;;;:::i;:::-;;;;;;;;30951:272;31173:6;31167:13;31158:6;31154:2;31150:15;31143:38;30709:529;30846:41;;;30836:51;;;:6;:51;;;;30829:58;;;;;30673:620;31277:4;31270:11;;30501:799;;;;;;;:::o;21753:94::-;21804:13;21830:9;;;;;;;;;;;;;;21753:94;:::o;21171:334::-;21244:13;21278:16;21286:7;21278;:16::i;:::-;21270:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;21359:21;21383:10;:8;:10::i;:::-;21359:34;;21435:1;21417:7;21411:21;:25;:86;;;;;;;;;;;;;;;;;21463:7;21472:18;:7;:16;:18::i;:::-;21446:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21411:86;21404:93;;;21171:334;;;:::o;19882:305::-;19984:4;20036:25;20021:40;;;:11;:40;;;;:105;;;;20093:33;20078:48;;;:11;:48;;;;20021:105;:158;;;;20143:36;20167:11;20143:23;:36::i;:::-;20021:158;20001:178;;19882:305;;;:::o;37200:589::-;37344:45;37371:4;37377:2;37381:7;37344:26;:45::i;:::-;37422:1;37406:18;;:4;:18;;;37402:187;;;37441:40;37473:7;37441:31;:40::i;:::-;37402:187;;;37511:2;37503:10;;:4;:10;;;37499:90;;37530:47;37563:4;37569:7;37530:32;:47::i;:::-;37499:90;37402:187;37617:1;37603:16;;:2;:16;;;37599:183;;;37636:45;37673:7;37636:36;:45::i;:::-;37599:183;;;37709:4;37703:10;;:2;:10;;;37699:83;;37730:40;37758:2;37762:7;37730:27;:40::i;:::-;37699:83;37599:183;37200:589;;;:::o;7702:387::-;7762:4;7970:12;8037:7;8025:20;8017:28;;8080:1;8073:4;:8;8066:15;;;7702:387;;;:::o;16024:723::-;16080:13;16310:1;16301:5;:10;16297:53;;;16328:10;;;;;;;;;;;;;;;;;;;;;16297:53;16360:12;16375:5;16360:20;;16391:14;16416:78;16431:1;16423:4;:9;16416:78;;16449:8;;;;;:::i;:::-;;;;16480:2;16472:10;;;;;:::i;:::-;;;16416:78;;;16504:19;16536:6;16526:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16504:39;;16554:154;16570:1;16561:5;:10;16554:154;;16598:1;16588:11;;;;;:::i;:::-;;;16665:2;16657:5;:10;;;;:::i;:::-;16644:2;:24;;;;:::i;:::-;16631:39;;16614:6;16621;16614:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;16694:2;16685:11;;;;;:::i;:::-;;;16554:154;;;16732:6;16718:21;;;;;16024:723;;;;:::o;18486:157::-;18571:4;18610:25;18595:40;;;:11;:40;;;;18588:47;;18486:157;;;:::o;31872:126::-;;;;:::o;38512:164::-;38616:10;:17;;;;38589:15;:24;38605:7;38589:24;;;;;;;;;;;:44;;;;38644:10;38660:7;38644:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38512:164;:::o;39303:988::-;39569:22;39619:1;39594:22;39611:4;39594:16;:22::i;:::-;:26;;;;:::i;:::-;39569:51;;39631:18;39652:17;:26;39670:7;39652:26;;;;;;;;;;;;39631:47;;39799:14;39785:10;:28;39781:328;;39830:19;39852:12;:18;39865:4;39852:18;;;;;;;;;;;;;;;:34;39871:14;39852:34;;;;;;;;;;;;39830:56;;39936:11;39903:12;:18;39916:4;39903:18;;;;;;;;;;;;;;;:30;39922:10;39903:30;;;;;;;;;;;:44;;;;40053:10;40020:17;:30;40038:11;40020:30;;;;;;;;;;;:43;;;;39815:294;39781:328;40205:17;:26;40223:7;40205:26;;;;;;;;;;;40198:33;;;40249:12;:18;40262:4;40249:18;;;;;;;;;;;;;;;:34;40268:14;40249:34;;;;;;;;;;;40242:41;;;39384:907;;39303:988;;:::o;40586:1079::-;40839:22;40884:1;40864:10;:17;;;;:21;;;;:::i;:::-;40839:46;;40896:18;40917:15;:24;40933:7;40917:24;;;;;;;;;;;;40896:45;;41268:19;41290:10;41301:14;41290:26;;;;;;;;:::i;:::-;;;;;;;;;;41268:48;;41354:11;41329:10;41340;41329:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;41465:10;41434:15;:28;41450:11;41434:28;;;;;;;;;;;:41;;;;41606:15;:24;41622:7;41606:24;;;;;;;;;;;41599:31;;;41641:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40657:1008;;;40586:1079;:::o;38090:221::-;38175:14;38192:20;38209:2;38192:16;:20::i;:::-;38175:37;;38250:7;38223:12;:16;38236:2;38223:16;;;;;;;;;;;;;;;:24;38240:6;38223:24;;;;;;;;;;;:34;;;;38297:6;38268:17;:26;38286:7;38268:26;;;;;;;;;;;:35;;;;38164:147;38090:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410: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;;;280:79;;:::i;:::-;249:2;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:2;;;698:79;;:::i;:::-;667:2;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;893:87;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;1035:84;;;;:::o;1125:139::-;1171:5;1209:6;1196:20;1187:29;;1225:33;1252:5;1225:33;:::i;:::-;1177:87;;;;:::o;1270:137::-;1315:5;1353:6;1340:20;1331:29;;1369:32;1395:5;1369:32;:::i;:::-;1321:86;;;;:::o;1413:141::-;1469:5;1500:6;1494:13;1485:22;;1516:32;1542:5;1516:32;:::i;:::-;1475:79;;;;:::o;1573:338::-;1628:5;1677:3;1670:4;1662:6;1658:17;1654:27;1644:2;;1685:79;;:::i;:::-;1644:2;1802:6;1789:20;1827:78;1901:3;1893:6;1886:4;1878:6;1874:17;1827:78;:::i;:::-;1818:87;;1634:277;;;;;:::o;1931:340::-;1987:5;2036:3;2029:4;2021:6;2017:17;2013:27;2003:2;;2044:79;;:::i;:::-;2003:2;2161:6;2148:20;2186:79;2261:3;2253:6;2246:4;2238:6;2234:17;2186:79;:::i;:::-;2177:88;;1993:278;;;;;:::o;2277:139::-;2323:5;2361:6;2348:20;2339:29;;2377:33;2404:5;2377:33;:::i;:::-;2329:87;;;;:::o;2422:329::-;2481:6;2530:2;2518:9;2509:7;2505:23;2501:32;2498:2;;;2536:79;;:::i;:::-;2498:2;2656:1;2681:53;2726:7;2717:6;2706:9;2702:22;2681:53;:::i;:::-;2671:63;;2627:117;2488:263;;;;:::o;2757:474::-;2825:6;2833;2882:2;2870:9;2861:7;2857:23;2853:32;2850:2;;;2888:79;;:::i;:::-;2850:2;3008:1;3033:53;3078:7;3069:6;3058:9;3054:22;3033:53;:::i;:::-;3023:63;;2979:117;3135:2;3161:53;3206:7;3197:6;3186:9;3182:22;3161:53;:::i;:::-;3151:63;;3106:118;2840:391;;;;;:::o;3237:619::-;3314:6;3322;3330;3379:2;3367:9;3358:7;3354:23;3350:32;3347:2;;;3385:79;;:::i;:::-;3347:2;3505:1;3530:53;3575:7;3566:6;3555:9;3551:22;3530:53;:::i;:::-;3520:63;;3476:117;3632:2;3658:53;3703:7;3694:6;3683:9;3679:22;3658:53;:::i;:::-;3648:63;;3603:118;3760:2;3786:53;3831:7;3822:6;3811:9;3807:22;3786:53;:::i;:::-;3776:63;;3731:118;3337:519;;;;;:::o;3862:943::-;3957:6;3965;3973;3981;4030:3;4018:9;4009:7;4005:23;4001:33;3998:2;;;4037:79;;:::i;:::-;3998:2;4157:1;4182:53;4227:7;4218:6;4207:9;4203:22;4182:53;:::i;:::-;4172:63;;4128:117;4284:2;4310:53;4355:7;4346:6;4335:9;4331:22;4310:53;:::i;:::-;4300:63;;4255:118;4412:2;4438:53;4483:7;4474:6;4463:9;4459:22;4438:53;:::i;:::-;4428:63;;4383:118;4568:2;4557:9;4553:18;4540:32;4599:18;4591:6;4588:30;4585:2;;;4621:79;;:::i;:::-;4585:2;4726:62;4780:7;4771:6;4760:9;4756:22;4726:62;:::i;:::-;4716:72;;4511:287;3988:817;;;;;;;:::o;4811:468::-;4876:6;4884;4933:2;4921:9;4912:7;4908:23;4904:32;4901:2;;;4939:79;;:::i;:::-;4901:2;5059:1;5084:53;5129:7;5120:6;5109:9;5105:22;5084:53;:::i;:::-;5074:63;;5030:117;5186:2;5212:50;5254:7;5245:6;5234:9;5230:22;5212:50;:::i;:::-;5202:60;;5157:115;4891:388;;;;;:::o;5285:654::-;5363:6;5371;5420:2;5408:9;5399:7;5395:23;5391:32;5388:2;;;5426:79;;:::i;:::-;5388:2;5546:1;5571:53;5616:7;5607:6;5596:9;5592:22;5571:53;:::i;:::-;5561:63;;5517:117;5701:2;5690:9;5686:18;5673:32;5732:18;5724:6;5721:30;5718:2;;;5754:79;;:::i;:::-;5718:2;5859:63;5914:7;5905:6;5894:9;5890:22;5859:63;:::i;:::-;5849:73;;5644:288;5378:561;;;;;:::o;5945:474::-;6013:6;6021;6070:2;6058:9;6049:7;6045:23;6041:32;6038:2;;;6076:79;;:::i;:::-;6038:2;6196:1;6221:53;6266:7;6257:6;6246:9;6242:22;6221:53;:::i;:::-;6211:63;;6167:117;6323:2;6349:53;6394:7;6385:6;6374:9;6370:22;6349:53;:::i;:::-;6339:63;;6294:118;6028:391;;;;;:::o;6425:329::-;6484:6;6533:2;6521:9;6512:7;6508:23;6504:32;6501:2;;;6539:79;;:::i;:::-;6501:2;6659:1;6684:53;6729:7;6720:6;6709:9;6705:22;6684:53;:::i;:::-;6674:63;;6630:117;6491:263;;;;:::o;6760:474::-;6828:6;6836;6885:2;6873:9;6864:7;6860:23;6856:32;6853:2;;;6891:79;;:::i;:::-;6853:2;7011:1;7036:53;7081:7;7072:6;7061:9;7057:22;7036:53;:::i;:::-;7026:63;;6982:117;7138:2;7164:53;7209:7;7200:6;7189:9;7185:22;7164:53;:::i;:::-;7154:63;;7109:118;6843:391;;;;;:::o;7240:327::-;7298:6;7347:2;7335:9;7326:7;7322:23;7318:32;7315:2;;;7353:79;;:::i;:::-;7315:2;7473:1;7498:52;7542:7;7533:6;7522:9;7518:22;7498:52;:::i;:::-;7488:62;;7444:116;7305:262;;;;:::o;7573:349::-;7642:6;7691:2;7679:9;7670:7;7666:23;7662:32;7659:2;;;7697:79;;:::i;:::-;7659:2;7817:1;7842:63;7897:7;7888:6;7877:9;7873:22;7842:63;:::i;:::-;7832:73;;7788:127;7649:273;;;;:::o;7928:329::-;7987:6;8036:2;8024:9;8015:7;8011:23;8007:32;8004:2;;;8042:79;;:::i;:::-;8004:2;8162:1;8187:53;8232:7;8223:6;8212:9;8208:22;8187:53;:::i;:::-;8177:63;;8133:117;7994:263;;;;:::o;8263:118::-;8350:24;8368:5;8350:24;:::i;:::-;8345:3;8338:37;8328:53;;:::o;8387:109::-;8468:21;8483:5;8468:21;:::i;:::-;8463:3;8456:34;8446:50;;:::o;8502:118::-;8589:24;8607:5;8589:24;:::i;:::-;8584:3;8577:37;8567:53;;:::o;8626:360::-;8712:3;8740:38;8772:5;8740:38;:::i;:::-;8794:70;8857:6;8852:3;8794:70;:::i;:::-;8787:77;;8873:52;8918:6;8913:3;8906:4;8899:5;8895:16;8873:52;:::i;:::-;8950:29;8972:6;8950:29;:::i;:::-;8945:3;8941:39;8934:46;;8716:270;;;;;:::o;8992:364::-;9080:3;9108:39;9141:5;9108:39;:::i;:::-;9163:71;9227:6;9222:3;9163:71;:::i;:::-;9156:78;;9243:52;9288:6;9283:3;9276:4;9269:5;9265:16;9243:52;:::i;:::-;9320:29;9342:6;9320:29;:::i;:::-;9315:3;9311:39;9304:46;;9084:272;;;;;:::o;9362:377::-;9468:3;9496:39;9529:5;9496:39;:::i;:::-;9551:89;9633:6;9628:3;9551:89;:::i;:::-;9544:96;;9649:52;9694:6;9689:3;9682:4;9675:5;9671:16;9649:52;:::i;:::-;9726:6;9721:3;9717:16;9710:23;;9472:267;;;;;:::o;9745:366::-;9887:3;9908:67;9972:2;9967:3;9908:67;:::i;:::-;9901:74;;9984:93;10073:3;9984:93;:::i;:::-;10102:2;10097:3;10093:12;10086:19;;9891:220;;;:::o;10117:366::-;10259:3;10280:67;10344:2;10339:3;10280:67;:::i;:::-;10273:74;;10356:93;10445:3;10356:93;:::i;:::-;10474:2;10469:3;10465:12;10458:19;;10263:220;;;:::o;10489:366::-;10631:3;10652:67;10716:2;10711:3;10652:67;:::i;:::-;10645:74;;10728:93;10817:3;10728:93;:::i;:::-;10846:2;10841:3;10837:12;10830:19;;10635:220;;;:::o;10861:366::-;11003:3;11024:67;11088:2;11083:3;11024:67;:::i;:::-;11017:74;;11100:93;11189:3;11100:93;:::i;:::-;11218:2;11213:3;11209:12;11202:19;;11007:220;;;:::o;11233:366::-;11375:3;11396:67;11460:2;11455:3;11396:67;:::i;:::-;11389:74;;11472:93;11561:3;11472:93;:::i;:::-;11590:2;11585:3;11581:12;11574:19;;11379:220;;;:::o;11605:366::-;11747:3;11768:67;11832:2;11827:3;11768:67;:::i;:::-;11761:74;;11844:93;11933:3;11844:93;:::i;:::-;11962:2;11957:3;11953:12;11946:19;;11751:220;;;:::o;11977:366::-;12119:3;12140:67;12204:2;12199:3;12140:67;:::i;:::-;12133:74;;12216:93;12305:3;12216:93;:::i;:::-;12334:2;12329:3;12325:12;12318:19;;12123:220;;;:::o;12349:366::-;12491:3;12512:67;12576:2;12571:3;12512:67;:::i;:::-;12505:74;;12588:93;12677:3;12588:93;:::i;:::-;12706:2;12701:3;12697:12;12690:19;;12495:220;;;:::o;12721:366::-;12863:3;12884:67;12948:2;12943:3;12884:67;:::i;:::-;12877:74;;12960:93;13049:3;12960:93;:::i;:::-;13078:2;13073:3;13069:12;13062:19;;12867:220;;;:::o;13093:366::-;13235:3;13256:67;13320:2;13315:3;13256:67;:::i;:::-;13249:74;;13332:93;13421:3;13332:93;:::i;:::-;13450:2;13445:3;13441:12;13434:19;;13239:220;;;:::o;13465:366::-;13607:3;13628:67;13692:2;13687:3;13628:67;:::i;:::-;13621:74;;13704:93;13793:3;13704:93;:::i;:::-;13822:2;13817:3;13813:12;13806:19;;13611:220;;;:::o;13837:366::-;13979:3;14000:67;14064:2;14059:3;14000:67;:::i;:::-;13993:74;;14076:93;14165:3;14076:93;:::i;:::-;14194:2;14189:3;14185:12;14178:19;;13983:220;;;:::o;14209:366::-;14351:3;14372:67;14436:2;14431:3;14372:67;:::i;:::-;14365:74;;14448:93;14537:3;14448:93;:::i;:::-;14566:2;14561:3;14557:12;14550:19;;14355:220;;;:::o;14581:366::-;14723:3;14744:67;14808:2;14803:3;14744:67;:::i;:::-;14737:74;;14820:93;14909:3;14820:93;:::i;:::-;14938:2;14933:3;14929:12;14922:19;;14727:220;;;:::o;14953:366::-;15095:3;15116:67;15180:2;15175:3;15116:67;:::i;:::-;15109:74;;15192:93;15281:3;15192:93;:::i;:::-;15310:2;15305:3;15301:12;15294:19;;15099:220;;;:::o;15325:366::-;15467:3;15488:67;15552:2;15547:3;15488:67;:::i;:::-;15481:74;;15564:93;15653:3;15564:93;:::i;:::-;15682:2;15677:3;15673:12;15666:19;;15471:220;;;:::o;15697:366::-;15839:3;15860:67;15924:2;15919:3;15860:67;:::i;:::-;15853:74;;15936:93;16025:3;15936:93;:::i;:::-;16054:2;16049:3;16045:12;16038:19;;15843:220;;;:::o;16069:366::-;16211:3;16232:67;16296:2;16291:3;16232:67;:::i;:::-;16225:74;;16308:93;16397:3;16308:93;:::i;:::-;16426:2;16421:3;16417:12;16410:19;;16215:220;;;:::o;16441:366::-;16583:3;16604:67;16668:2;16663:3;16604:67;:::i;:::-;16597:74;;16680:93;16769:3;16680:93;:::i;:::-;16798:2;16793:3;16789:12;16782:19;;16587:220;;;:::o;16813:366::-;16955:3;16976:67;17040:2;17035:3;16976:67;:::i;:::-;16969:74;;17052:93;17141:3;17052:93;:::i;:::-;17170:2;17165:3;17161:12;17154:19;;16959:220;;;:::o;17185:402::-;17345:3;17366:85;17448:2;17443:3;17366:85;:::i;:::-;17359:92;;17460:93;17549:3;17460:93;:::i;:::-;17578:2;17573:3;17569:12;17562:19;;17349:238;;;:::o;17593:402::-;17753:3;17774:85;17856:2;17851:3;17774:85;:::i;:::-;17767:92;;17868:93;17957:3;17868:93;:::i;:::-;17986:2;17981:3;17977:12;17970:19;;17757:238;;;:::o;18001:366::-;18143:3;18164:67;18228:2;18223:3;18164:67;:::i;:::-;18157:74;;18240:93;18329:3;18240:93;:::i;:::-;18358:2;18353:3;18349:12;18342:19;;18147:220;;;:::o;18373:118::-;18460:24;18478:5;18460:24;:::i;:::-;18455:3;18448:37;18438:53;;:::o;18497:435::-;18677:3;18699:95;18790:3;18781:6;18699:95;:::i;:::-;18692:102;;18811:95;18902:3;18893:6;18811:95;:::i;:::-;18804:102;;18923:3;18916:10;;18681:251;;;;;:::o;18938:967::-;19320:3;19342:148;19486:3;19342:148;:::i;:::-;19335:155;;19507:95;19598:3;19589:6;19507:95;:::i;:::-;19500:102;;19619:148;19763:3;19619:148;:::i;:::-;19612:155;;19784:95;19875:3;19866:6;19784:95;:::i;:::-;19777:102;;19896:3;19889:10;;19324:581;;;;;:::o;19911:222::-;20004:4;20042:2;20031:9;20027:18;20019:26;;20055:71;20123:1;20112:9;20108:17;20099:6;20055:71;:::i;:::-;20009:124;;;;:::o;20139:640::-;20334:4;20372:3;20361:9;20357:19;20349:27;;20386:71;20454:1;20443:9;20439:17;20430:6;20386:71;:::i;:::-;20467:72;20535:2;20524:9;20520:18;20511:6;20467:72;:::i;:::-;20549;20617:2;20606:9;20602:18;20593:6;20549:72;:::i;:::-;20668:9;20662:4;20658:20;20653:2;20642:9;20638:18;20631:48;20696:76;20767:4;20758:6;20696:76;:::i;:::-;20688:84;;20339:440;;;;;;;:::o;20785:210::-;20872:4;20910:2;20899:9;20895:18;20887:26;;20923:65;20985:1;20974:9;20970:17;20961:6;20923:65;:::i;:::-;20877:118;;;;:::o;21001:222::-;21094:4;21132:2;21121:9;21117:18;21109:26;;21145:71;21213:1;21202:9;21198:17;21189:6;21145:71;:::i;:::-;21099:124;;;;:::o;21229:313::-;21342:4;21380:2;21369:9;21365:18;21357:26;;21429:9;21423:4;21419:20;21415:1;21404:9;21400:17;21393:47;21457:78;21530:4;21521:6;21457:78;:::i;:::-;21449:86;;21347:195;;;;:::o;21548:419::-;21714:4;21752:2;21741:9;21737:18;21729:26;;21801:9;21795:4;21791:20;21787:1;21776:9;21772:17;21765:47;21829:131;21955:4;21829:131;:::i;:::-;21821:139;;21719:248;;;:::o;21973:419::-;22139:4;22177:2;22166:9;22162:18;22154:26;;22226:9;22220:4;22216:20;22212:1;22201:9;22197:17;22190:47;22254:131;22380:4;22254:131;:::i;:::-;22246:139;;22144:248;;;:::o;22398:419::-;22564:4;22602:2;22591:9;22587:18;22579:26;;22651:9;22645:4;22641:20;22637:1;22626:9;22622:17;22615:47;22679:131;22805:4;22679:131;:::i;:::-;22671:139;;22569:248;;;:::o;22823:419::-;22989:4;23027:2;23016:9;23012:18;23004:26;;23076:9;23070:4;23066:20;23062:1;23051:9;23047:17;23040:47;23104:131;23230:4;23104:131;:::i;:::-;23096:139;;22994:248;;;:::o;23248:419::-;23414:4;23452:2;23441:9;23437:18;23429:26;;23501:9;23495:4;23491:20;23487:1;23476:9;23472:17;23465:47;23529:131;23655:4;23529:131;:::i;:::-;23521:139;;23419:248;;;:::o;23673:419::-;23839:4;23877:2;23866:9;23862:18;23854:26;;23926:9;23920:4;23916:20;23912:1;23901:9;23897:17;23890:47;23954:131;24080:4;23954:131;:::i;:::-;23946:139;;23844:248;;;:::o;24098:419::-;24264:4;24302:2;24291:9;24287:18;24279:26;;24351:9;24345:4;24341:20;24337:1;24326:9;24322:17;24315:47;24379:131;24505:4;24379:131;:::i;:::-;24371:139;;24269:248;;;:::o;24523:419::-;24689:4;24727:2;24716:9;24712:18;24704:26;;24776:9;24770:4;24766:20;24762:1;24751:9;24747:17;24740:47;24804:131;24930:4;24804:131;:::i;:::-;24796:139;;24694:248;;;:::o;24948:419::-;25114:4;25152:2;25141:9;25137:18;25129:26;;25201:9;25195:4;25191:20;25187:1;25176:9;25172:17;25165:47;25229:131;25355:4;25229:131;:::i;:::-;25221:139;;25119:248;;;:::o;25373:419::-;25539:4;25577:2;25566:9;25562:18;25554:26;;25626:9;25620:4;25616:20;25612:1;25601:9;25597:17;25590:47;25654:131;25780:4;25654:131;:::i;:::-;25646:139;;25544:248;;;:::o;25798:419::-;25964:4;26002:2;25991:9;25987:18;25979:26;;26051:9;26045:4;26041:20;26037:1;26026:9;26022:17;26015:47;26079:131;26205:4;26079:131;:::i;:::-;26071:139;;25969:248;;;:::o;26223:419::-;26389:4;26427:2;26416:9;26412:18;26404:26;;26476:9;26470:4;26466:20;26462:1;26451:9;26447:17;26440:47;26504:131;26630:4;26504:131;:::i;:::-;26496:139;;26394:248;;;:::o;26648:419::-;26814:4;26852:2;26841:9;26837:18;26829:26;;26901:9;26895:4;26891:20;26887:1;26876:9;26872:17;26865:47;26929:131;27055:4;26929:131;:::i;:::-;26921:139;;26819:248;;;:::o;27073:419::-;27239:4;27277:2;27266:9;27262:18;27254:26;;27326:9;27320:4;27316:20;27312:1;27301:9;27297:17;27290:47;27354:131;27480:4;27354:131;:::i;:::-;27346:139;;27244:248;;;:::o;27498:419::-;27664:4;27702:2;27691:9;27687:18;27679:26;;27751:9;27745:4;27741:20;27737:1;27726:9;27722:17;27715:47;27779:131;27905:4;27779:131;:::i;:::-;27771:139;;27669:248;;;:::o;27923:419::-;28089:4;28127:2;28116:9;28112:18;28104:26;;28176:9;28170:4;28166:20;28162:1;28151:9;28147:17;28140:47;28204:131;28330:4;28204:131;:::i;:::-;28196:139;;28094:248;;;:::o;28348:419::-;28514:4;28552:2;28541:9;28537:18;28529:26;;28601:9;28595:4;28591:20;28587:1;28576:9;28572:17;28565:47;28629:131;28755:4;28629:131;:::i;:::-;28621:139;;28519:248;;;:::o;28773:419::-;28939:4;28977:2;28966:9;28962:18;28954:26;;29026:9;29020:4;29016:20;29012:1;29001:9;28997:17;28990:47;29054:131;29180:4;29054:131;:::i;:::-;29046:139;;28944:248;;;:::o;29198:419::-;29364:4;29402:2;29391:9;29387:18;29379:26;;29451:9;29445:4;29441:20;29437:1;29426:9;29422:17;29415:47;29479:131;29605:4;29479:131;:::i;:::-;29471:139;;29369:248;;;:::o;29623:419::-;29789:4;29827:2;29816:9;29812:18;29804:26;;29876:9;29870:4;29866:20;29862:1;29851:9;29847:17;29840:47;29904:131;30030:4;29904:131;:::i;:::-;29896:139;;29794:248;;;:::o;30048:419::-;30214:4;30252:2;30241:9;30237:18;30229:26;;30301:9;30295:4;30291:20;30287:1;30276:9;30272:17;30265:47;30329:131;30455:4;30329:131;:::i;:::-;30321:139;;30219:248;;;:::o;30473:222::-;30566:4;30604:2;30593:9;30589:18;30581:26;;30617:71;30685:1;30674:9;30670:17;30661:6;30617:71;:::i;:::-;30571:124;;;;:::o;30701:129::-;30735:6;30762:20;;:::i;:::-;30752:30;;30791:33;30819:4;30811:6;30791:33;:::i;:::-;30742:88;;;:::o;30836:75::-;30869:6;30902:2;30896:9;30886:19;;30876:35;:::o;30917:307::-;30978:4;31068:18;31060:6;31057:30;31054:2;;;31090:18;;:::i;:::-;31054:2;31128:29;31150:6;31128:29;:::i;:::-;31120:37;;31212:4;31206;31202:15;31194:23;;30983:241;;;:::o;31230:308::-;31292:4;31382:18;31374:6;31371:30;31368:2;;;31404:18;;:::i;:::-;31368:2;31442:29;31464:6;31442:29;:::i;:::-;31434:37;;31526:4;31520;31516:15;31508:23;;31297:241;;;:::o;31544:98::-;31595:6;31629:5;31623:12;31613:22;;31602:40;;;:::o;31648:99::-;31700:6;31734:5;31728:12;31718:22;;31707:40;;;:::o;31753:168::-;31836:11;31870:6;31865:3;31858:19;31910:4;31905:3;31901:14;31886:29;;31848:73;;;;:::o;31927:169::-;32011:11;32045:6;32040:3;32033:19;32085:4;32080:3;32076:14;32061:29;;32023:73;;;;:::o;32102:148::-;32204:11;32241:3;32226:18;;32216:34;;;;:::o;32256:305::-;32296:3;32315:20;32333:1;32315:20;:::i;:::-;32310:25;;32349:20;32367:1;32349:20;:::i;:::-;32344:25;;32503:1;32435:66;32431:74;32428:1;32425:81;32422:2;;;32509:18;;:::i;:::-;32422:2;32553:1;32550;32546:9;32539:16;;32300:261;;;;:::o;32567:185::-;32607:1;32624:20;32642:1;32624:20;:::i;:::-;32619:25;;32658:20;32676:1;32658:20;:::i;:::-;32653:25;;32697:1;32687:2;;32702:18;;:::i;:::-;32687:2;32744:1;32741;32737:9;32732:14;;32609:143;;;;:::o;32758:348::-;32798:7;32821:20;32839:1;32821:20;:::i;:::-;32816:25;;32855:20;32873:1;32855:20;:::i;:::-;32850:25;;33043:1;32975:66;32971:74;32968:1;32965:81;32960:1;32953:9;32946:17;32942:105;32939:2;;;33050:18;;:::i;:::-;32939:2;33098:1;33095;33091:9;33080:20;;32806:300;;;;:::o;33112:191::-;33152:4;33172:20;33190:1;33172:20;:::i;:::-;33167:25;;33206:20;33224:1;33206:20;:::i;:::-;33201:25;;33245:1;33242;33239:8;33236:2;;;33250:18;;:::i;:::-;33236:2;33295:1;33292;33288:9;33280:17;;33157:146;;;;:::o;33309:96::-;33346:7;33375:24;33393:5;33375:24;:::i;:::-;33364:35;;33354:51;;;:::o;33411:90::-;33445:7;33488:5;33481:13;33474:21;33463:32;;33453:48;;;:::o;33507:77::-;33544:7;33573:5;33562:16;;33552:32;;;:::o;33590:149::-;33626:7;33666:66;33659:5;33655:78;33644:89;;33634:105;;;:::o;33745:126::-;33782:7;33822:42;33815:5;33811:54;33800:65;;33790:81;;;:::o;33877:77::-;33914:7;33943:5;33932:16;;33922:32;;;:::o;33960:154::-;34044:6;34039:3;34034;34021:30;34106:1;34097:6;34092:3;34088:16;34081:27;34011:103;;;:::o;34120:307::-;34188:1;34198:113;34212:6;34209:1;34206:13;34198:113;;;34297:1;34292:3;34288:11;34282:18;34278:1;34273:3;34269:11;34262:39;34234:2;34231:1;34227:10;34222:15;;34198:113;;;34329:6;34326:1;34323:13;34320:2;;;34409:1;34400:6;34395:3;34391:16;34384:27;34320:2;34169:258;;;;:::o;34433:171::-;34472:3;34495:24;34513:5;34495:24;:::i;:::-;34486:33;;34541:4;34534:5;34531:15;34528:2;;;34549:18;;:::i;:::-;34528:2;34596:1;34589:5;34585:13;34578:20;;34476:128;;;:::o;34610:320::-;34654:6;34691:1;34685:4;34681:12;34671:22;;34738:1;34732:4;34728:12;34759:18;34749:2;;34815:4;34807:6;34803:17;34793:27;;34749:2;34877;34869:6;34866:14;34846:18;34843:38;34840:2;;;34896:18;;:::i;:::-;34840:2;34661:269;;;;:::o;34936:281::-;35019:27;35041:4;35019:27;:::i;:::-;35011:6;35007:40;35149:6;35137:10;35134:22;35113:18;35101:10;35098:34;35095:62;35092:2;;;35160:18;;:::i;:::-;35092:2;35200:10;35196:2;35189:22;34979:238;;;:::o;35223:233::-;35262:3;35285:24;35303:5;35285:24;:::i;:::-;35276:33;;35331:66;35324:5;35321:77;35318:2;;;35401:18;;:::i;:::-;35318:2;35448:1;35441:5;35437:13;35430:20;;35266:190;;;:::o;35462:176::-;35494:1;35511:20;35529:1;35511:20;:::i;:::-;35506:25;;35545:20;35563:1;35545:20;:::i;:::-;35540:25;;35584:1;35574:2;;35589:18;;:::i;:::-;35574:2;35630:1;35627;35623:9;35618:14;;35496:142;;;;:::o;35644:180::-;35692:77;35689:1;35682:88;35789:4;35786:1;35779:15;35813:4;35810:1;35803:15;35830:180;35878:77;35875:1;35868:88;35975:4;35972:1;35965:15;35999:4;35996:1;35989:15;36016:180;36064:77;36061:1;36054:88;36161:4;36158:1;36151:15;36185:4;36182:1;36175:15;36202:180;36250:77;36247:1;36240:88;36347:4;36344:1;36337:15;36371:4;36368:1;36361:15;36388:180;36436:77;36433:1;36426:88;36533:4;36530:1;36523:15;36557:4;36554:1;36547:15;36574:180;36622:77;36619:1;36612:88;36719:4;36716:1;36709:15;36743:4;36740:1;36733:15;36760:117;36869:1;36866;36859:12;36883:117;36992:1;36989;36982:12;37006:117;37115:1;37112;37105:12;37129:117;37238:1;37235;37228:12;37252:102;37293:6;37344:2;37340:7;37335:2;37328:5;37324:14;37320:28;37310:38;;37300:54;;;:::o;37360:182::-;37500:34;37496:1;37488:6;37484:14;37477:58;37466:76;:::o;37548:230::-;37688:34;37684:1;37676:6;37672:14;37665:58;37757:13;37752:2;37744:6;37740:15;37733:38;37654:124;:::o;37784:237::-;37924:34;37920:1;37912:6;37908:14;37901:58;37993:20;37988:2;37980:6;37976:15;37969:45;37890:131;:::o;38027:178::-;38167:30;38163:1;38155:6;38151:14;38144:54;38133:72;:::o;38211:223::-;38351:34;38347:1;38339:6;38335:14;38328:58;38420:6;38415:2;38407:6;38403:15;38396:31;38317:117;:::o;38440:175::-;38580:27;38576:1;38568:6;38564:14;38557:51;38546:69;:::o;38621:231::-;38761:34;38757:1;38749:6;38745:14;38738:58;38830:14;38825:2;38817:6;38813:15;38806:39;38727:125;:::o;38858:243::-;38998:34;38994:1;38986:6;38982:14;38975:58;39067:26;39062:2;39054:6;39050:15;39043:51;38964:137;:::o;39107:172::-;39247:24;39243:1;39235:6;39231:14;39224:48;39213:66;:::o;39285:229::-;39425:34;39421:1;39413:6;39409:14;39402:58;39494:12;39489:2;39481:6;39477:15;39470:37;39391:123;:::o;39520:228::-;39660:34;39656:1;39648:6;39644:14;39637:58;39729:11;39724:2;39716:6;39712:15;39705:36;39626:122;:::o;39754:233::-;39894:34;39890:1;39882:6;39878:14;39871:58;39963:16;39958:2;39950:6;39946:15;39939:41;39860:127;:::o;39993:182::-;40133:34;40129:1;40121:6;40117:14;40110:58;40099:76;:::o;40181:236::-;40321:34;40317:1;40309:6;40305:14;40298:58;40390:19;40385:2;40377:6;40373:15;40366:44;40287:130;:::o;40423:231::-;40563:34;40559:1;40551:6;40547:14;40540:58;40632:14;40627:2;40619:6;40615:15;40608:39;40529:125;:::o;40660:228::-;40800:34;40796:1;40788:6;40784:14;40777:58;40869:11;40864:2;40856:6;40852:15;40845:36;40766:122;:::o;40894:234::-;41034:34;41030:1;41022:6;41018:14;41011:58;41103:17;41098:2;41090:6;41086:15;41079:42;41000:128;:::o;41134:220::-;41274:34;41270:1;41262:6;41258:14;41251:58;41343:3;41338:2;41330:6;41326:15;41319:28;41240:114;:::o;41360:236::-;41500:34;41496:1;41488:6;41484:14;41477:58;41569:19;41564:2;41556:6;41552:15;41545:44;41466:130;:::o;41602:231::-;41742:34;41738:1;41730:6;41726:14;41719:58;41811:14;41806:2;41798:6;41794:15;41787:39;41708:125;:::o;41839:173::-;41979:25;41975:1;41967:6;41963:14;41956:49;41945:67;:::o;42018:167::-;42158:19;42154:1;42146:6;42142:14;42135:43;42124:61;:::o;42191:234::-;42331:34;42327:1;42319:6;42315:14;42308:58;42400:17;42395:2;42387:6;42383:15;42376:42;42297:128;:::o;42431:122::-;42504:24;42522:5;42504:24;:::i;:::-;42497:5;42494:35;42484:2;;42543:1;42540;42533:12;42484:2;42474:79;:::o;42559:116::-;42629:21;42644:5;42629:21;:::i;:::-;42622:5;42619:32;42609:2;;42665:1;42662;42655:12;42609:2;42599:76;:::o;42681:122::-;42754:24;42772:5;42754:24;:::i;:::-;42747:5;42744:35;42734:2;;42793:1;42790;42783:12;42734:2;42724:79;:::o;42809:120::-;42881:23;42898:5;42881:23;:::i;:::-;42874:5;42871:34;42861:2;;42919:1;42916;42909:12;42861:2;42851:78;:::o;42935:122::-;43008:24;43026:5;43008:24;:::i;:::-;43001:5;42998:35;42988:2;;43047:1;43044;43037:12;42988:2;42978:79;:::o

Swarm Source

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