ETH Price: $2,448.62 (-0.11%)
Gas: 7.85 Gwei

Token

torii (TORII)
 

Overview

Max Total Supply

101 TORII

Holders

82

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
Himegami Protocol: Deployer
Balance
1 TORII
0x1157eec1448c05fcffed85ccd4c922ce8cf6e09e
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Torii

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 1 of 2: CryptoZinjaTorii.sol
pragma solidity >=0.8.10 <=0.8.10;

import "./OpenzeppelinERC721.sol";


// =========== =========== =========== =========== =========== 
//   |  |  |     |  |  |     |  |  |     |  |  |     |  |  |   
// =========== =========== =========== =========== =========== 
//   |     |     |     |     |     |     |     |     |     |   
//   |     |     |     |     |     |     |     |     |     |   


// =========== =========== =========== =========== =========== 
//   |  |  |     |  |  |     |  |  |     |  |  |     |  |  |   
// =========== =========== =========== =========== =========== 
//   |     |     |     |     |     |     |     |     |     |   
//   |     |     |     |     |     |     |     |     |     |   



//ZZZZZZZZZZZZZZZZZZZ  iiii                    jjjj                   
//Z:::::::::::::::::Z i::::i                  j::::j                  
//Z:::::::::::::::::Z  iiii                    jjjj                   
//Z:::ZZZZZZZZ:::::Z                                                  
//ZZZZZ     Z:::::Z  iiiiiiinnnn  nnnnnnnn   jjjjjjj  aaaaaaaaaaaaa   
//        Z:::::Z    i:::::in:::nn::::::::nn j:::::j  a::::::::::::a  
//       Z:::::Z      i::::in::::::::::::::nn j::::j  aaaaaaaaa:::::a 
//      Z:::::Z       i::::inn:::::::::::::::nj::::j           a::::a 
//     Z:::::Z        i::::i  n:::::nnnn:::::nj::::j    aaaaaaa:::::a 
//    Z:::::Z         i::::i  n::::n    n::::nj::::j  aa::::::::::::a 
//   Z:::::Z          i::::i  n::::n    n::::nj::::j a::::aaaa::::::a 
//ZZZ:::::Z     ZZZZZ i::::i  n::::n    n::::nj::::ja::::a    a:::::a 
//Z::::::ZZZZZZZZ:::Zi::::::i n::::n    n::::nj::::ja::::a    a:::::a 
//Z:::::::::::::::::Zi::::::i n::::n    n::::nj::::ja:::::aaaa::::::a 
//Z:::::::::::::::::Zi::::::i n::::n    n::::nj::::j a::::::::::aa:::a
//ZZZZZZZZZZZZZZZZZZZiiiiiiii nnnnnn    nnnnnnj::::j  aaaaaaaaaa  aaaa
//                                            j::::j                  
//                                  jjjj      j::::j                  
//                                 j::::jj   j:::::j                  
//                                 j::::::jjj::::::j                  
//                                  jj::::::::::::j                   
//                                    jjj::::::jjj                    
//                                       jjjjjj                       



// =========== =========== =========== =========== =========== 
//   |  |  |     |  |  |     |  |  |     |  |  |     |  |  |   
// =========== =========== =========== =========== =========== 
//   |     |     |     |     |     |     |     |     |     |   
//   |     |     |     |     |     |     |     |     |     |   


// =========== =========== =========== =========== =========== 
//   |  |  |     |  |  |     |  |  |     |  |  |     |  |  |   
// =========== =========== =========== =========== =========== 
//   |     |     |     |     |     |     |     |     |     |   
//   |     |     |     |     |     |     |     |     |     |   



contract Torii is  ERC721URIStorage , ERC721Enumerable{

    address public owner;
    uint public nftid = 0;
    mapping(uint => string) toriiMessage;

    //zinja metadata
    string[5] z;

    //O-torii metadata
    string[4] o;

    //senbon-torii metadata
    string[4] s;

    mapping(uint=>string) builtyear;

    function multiMint(uint qty) public {
        require( _msgSender() == owner );
        uint target = nftid - 1 + qty;
        for (uint i = nftid; i <= target; i++ ){
            _safeMint( owner , nftid);
            builtyear[nftid] = calcYear();
            nftid++;
        }
    }

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

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

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721,ERC721URIStorage)
        returns (string memory)
    {
        if(tokenId == 0){
            string memory Otorii = string(abi.encodePacked(z[0],o[0],Strings.toString(tokenId),o[1],z[1],o[2],z[2],o[3],builtyear[tokenId],z[3],readToriiMessage(tokenId),z[4]));
            return Otorii;
        }
        string memory json = string(abi.encodePacked(z[0],s[0],Strings.toString(tokenId),s[1],z[1],s[2],z[2],s[3],builtyear[tokenId],z[3],readToriiMessage(tokenId),z[4]));
        return json;
    }

    function setToriiMessage(uint _tokenId , string memory _toriiMessage ) public {
        require(_msgSender() == ownerOf(_tokenId));
        toriiMessage[_tokenId] = _toriiMessage;
    }

    function readToriiMessage(uint _tokenId ) public view returns(string memory){
        if(keccak256(abi.encodePacked(toriiMessage[_tokenId])) == keccak256(abi.encodePacked("")) ){
            return "no name";
        }
        return toriiMessage[_tokenId];
    }

    function calcYear() public view returns (string memory){
        return Strings.toString(calcYearLogic(block.timestamp));
    }

    function calcYearLogic(uint _unixtime) public pure returns (uint){
        return 1970 + _unixtime/((31536000 * 3 + 31622400)/4);
    }


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



    constructor() ERC721("torii" , "TORII" ) {

        z[0] = "data:application/json;utf8,{\"name\":\"";
        s[0] = "\u3010\u5343\u672c\u9ce5\u5c45\u3011Engrave name on the Senbon-Torii #";
        o[0] = "\u3010\u5275\u5efa\u8a18\u5ff5 \u5927\u9ce5\u5c45\u3011Engrave name on the O-Torii";
        s[1] = "\",\"description\":\"Metaverse\u306b\u5275\u5efa\u3055\u308c\u308bCrypto Zinja\u306b\u5b58\u5728\u3059\u308b\u5343\u672c\u9ce5\u5c45\u306b\u540d\u524d\u3092\u523b\u3080\u6a29\u5229\u306eNFT\u3067\u3059\u3002\u540d\u524d\u3092\u523b\u3080\u3053\u3068\u306f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u5171\u306b\u652f\u3048\u3066\u4e0b\u3055\u308b\u8a3c\u3068\u306a\u308a\u307e\u3059\u3002";
        o[1] = "\",\"description\":\"Metaverse\u306b\u5275\u5efa\u3055\u308c\u308bCrypto Zinja\u306e\u4e2d\u592e\u306b\u5b58\u5728\u3059\u308b\u5927\u9ce5\u5c45\u306b\u540d\u524d\u3092\u523b\u3080\u6a29\u5229\u306eNFT\u3067\u3059\u3002\u8a18\u5ff5\u3059\u3079\u304d\u5275\u5efa\u8a18\u5ff5\u306e\u5927\u9ce5\u5c45\u306b\u540d\u524d\u3092\u523b\u3080\u3053\u3068\u306f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u5927\u304d\u304f\u652f\u3048\u3066\u4e0b\u3055\u308b\u8a3c\u3068\u306a\u308a\u307e\u3059\u3002";
        z[1] = "Crypto Zinja\u306e\u6b63\u5f0f\u30aa\u30fc\u30d7\u30f3\u3068\u5171\u306b\u3053\u3061\u3089\u306e\u30da\u30fc\u30b8\u304b\u3089\u540d\u524d\u3092\u523b\u3080\u4e8b\u304c\u51fa\u6765\u307e\u3059\u3002 https://conata.world/zinja \u3000\u523b\u3080\u540d\u524d\u306b\u95a2\u3057\u3066\u306f\u304a\u540d\u524d\u3001\u4f01\u696d\u540d\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d\u306a\u3069\u597d\u304d\u306a\u6587\u5b57\u3092\u523b\u3093\u3067\u9802\u304f\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002Crypto Zinja\u306f\u65e5\u672c\u53e4\u6765\u306e\u6587\u5316\u3092\u984c\u6750\u306b\u73fe\u5b9f\u7a7a\u9593\u3092\u5dfb\u304d\u8fbc\u307f\u62e1\u5f35\u3057\u3066\u3044\u304f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u3059\u3002\u3053\u306e\u7a7a\u9593\u3092\u5171\u306b\u80b2\u3066\u3066\u304f\u3060\u3055\u308b\u3042\u306a\u305f\u306b\u611f\u8b1d\u3092\u8fbc\u3081\u3066\u3002  \\n  \\nThis is an NFT for the right to have your name engraved on the ";
        s[2] = "Senbon";
        o[2] = "O";
        z[2] = "-Torii gate of Crypto Zinja, which will be built in Metaverse. You can inscribe your name on this page when Crypto Zinja is officially opened: https://conata.world/zinja You can inscribe your name, company name, project name, etc. Crypto Zinja is a project to involve and expand the real space based on the ancient Japanese culture. I would like to express our gratitude to you who will nurture this space with us.\",\"animation_url\":\"";
        s[3] = "https://arweave.net/NsU6pqKl04X6m0E7_fEKut3j5kBYQ1421cf1NW9gtGY\",\"image\":\"https://arweave.net/7FdbwyAuZ80xjZMm71Fz7ssCovFd1wtmKhGTqEvu-7U\",\"external_url\":\"https://conata.world/zinja\",\"attributes\":[{ \"trait_type\": \"Artist\", \"value\": \"AIMI SEKIGUCHI\"},{\"trait_type\": \"Tori-name\", \"value\": \"Senbon-Torii\"},{\"trait_type\": \"Year\", \"value\": \"";
        o[3] = "https://arweave.net/ioEuPnHgNSwwP1lrh4t6JKl0tTE-lkymCHAnDBLaCF4\",\"image\":\"https://arweave.net/Fl6pX4mF5RvldLIlVq5FFlWw9MGaV7GdxSfuO2hpXFw\",\"external_url\":\"https://conata.world/zinja\",\"attributes\":[{ \"trait_type\": \"Artist\", \"value\": \"AIMI SEKIGUCHI\"},{\"trait_type\": \"Tori-name\", \"value\": \"O-Torii\"},{\"trait_type\": \"Year\", \"value\": \"";
        z[3] = "\"},{\"trait_type\": \"Dedication Name\", \"value\": \"";
        z[4] = "\"}]}";
        owner = _msgSender();
        _safeMint( owner , nftid);


        builtyear[0] = "2021";
        nftid++;
    } 
}


File 2 of 2: OpenzeppelinERC721.sol
// 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;
}




/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}









/**
 * @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;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}








/**
 * @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}. 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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` 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 { }
}















/**
 * @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();
    }
}







/**
 * @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];
        }
    }
}


Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calcYear","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_unixtime","type":"uint256"}],"name":"calcYearLogic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"multiMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"readToriiMessage","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_toriiMessage","type":"string"}],"name":"setToriiMessage","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"}]

60806040526000600c553480156200001657600080fd5b506040518060400160405280600581526020017f746f7269690000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f544f52494900000000000000000000000000000000000000000000000000000081525081600090805190602001906200009b92919062000fd2565b508060019080519060200190620000b492919062000fd2565b5050506040518060600160405280602481526020016200518460249139600e600060058110620000e957620000e862001082565b5b019080519060200190620000ff92919062000fd2565b50604051806060016040528060348152602001620051a860349139601760006004811062000132576200013162001082565b5b0190805190602001906200014892919062000fd2565b5060405180606001604052806037815260200162004dba6037913960136000600481106200017b576200017a62001082565b5b0190805190602001906200019192919062000fd2565b5060405180610100016040528060d48152602001620055e460d491396017600160048110620001c557620001c462001082565b5b019080519060200190620001db92919062000fd2565b506040518061014001604052806101078152602001620051dc6101079139601360016004811062000211576200021062001082565b5b0190805190602001906200022792919062000fd2565b50604051806102400160405280610219815260200162004f3c6102199139600e6001600581106200025d576200025c62001082565b5b0190805190602001906200027392919062000fd2565b506040518060400160405280600681526020017f53656e626f6e00000000000000000000000000000000000000000000000000008152506017600260048110620002c257620002c162001082565b5b019080519060200190620002d892919062000fd2565b506040518060400160405280600181526020017f4f00000000000000000000000000000000000000000000000000000000000000815250601360026004811062000327576200032662001082565b5b0190805190602001906200033d92919062000fd2565b50604051806101e001604052806101b18152602001620054336101b19139600e60026005811062000373576200037262001082565b5b0190805190602001906200038992919062000fd2565b506040518061018001604052806101508152602001620052e361015091396017600360048110620003bf57620003be62001082565b5b019080519060200190620003d592919062000fd2565b5060405180610180016040528061014b815260200162004df161014b913960136003600481106200040b576200040a62001082565b5b0190805190602001906200042192919062000fd2565b506040518060600160405280602f815260200162005155602f9139600e60036005811062000454576200045362001082565b5b0190805190602001906200046a92919062000fd2565b506040518060400160405280600481526020017f227d5d7d00000000000000000000000000000000000000000000000000000000815250600e600460058110620004b957620004b862001082565b5b019080519060200190620004cf92919062000fd2565b50620004e0620005d560201b60201c565b600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000556600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c54620005dd60201b60201c565b6040518060400160405280600481526020017f3230323100000000000000000000000000000000000000000000000000000000815250601b60008081526020019081526020016000209080519060200190620005b492919062000fd2565b50600c6000815480929190620005ca90620010ea565b91905055506200166b565b600033905090565b620005ff8282604051806020016040528060008152506200060360201b60201c565b5050565b6200061583836200067160201b60201c565b6200062a60008484846200085760201b60201c565b6200066c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200066390620011bf565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620006e4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006db9062001231565b60405180910390fd5b620006f58162000a0160201b60201c565b1562000738576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200072f90620012a3565b60405180910390fd5b6200074c6000838362000a6d60201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200079e9190620012c5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620008858473ffffffffffffffffffffffffffffffffffffffff1662000a8a60201b620012921760201c565b15620009f4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620008b7620005d560201b60201c565b8786866040518563ffffffff1660e01b8152600401620008db94939291906200141c565b6020604051808303816000875af19250505080156200091a57506040513d601f19601f82011682018060405250810190620009179190620014d2565b60015b620009a3573d80600081146200094d576040519150601f19603f3d011682016040523d82523d6000602084013e62000952565b606091505b506000815114156200099b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200099290620011bf565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050620009f9565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b62000a8583838362000a9d60201b620012a51760201c565b505050565b600080823b905060008111915050919050565b62000ab583838362000be460201b620013b91760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000b025762000afc8162000be960201b60201c565b62000b4a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000b495762000b48838262000c3260201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000b975762000b918162000daf60201b60201c565b62000bdf565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000bde5762000bdd828262000e8b60201b60201c565b5b5b505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162000c4c8462000f1760201b62000b261760201c565b62000c58919062001504565b905060006008600084815260200190815260200160002054905081811462000d3e576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160098054905062000dc5919062001504565b90506000600a600084815260200190815260200160002054905060006009838154811062000df85762000df762001082565b5b90600052602060002001549050806009838154811062000e1d5762000e1c62001082565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548062000e6f5762000e6e6200153f565b5b6001900381819060005260206000200160009055905550505050565b600062000ea38362000f1760201b62000b261760201c565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000f8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000f8290620015e4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000fe09062001635565b90600052602060002090601f01602090048101928262001004576000855562001050565b82601f106200101f57805160ff191683800117855562001050565b8280016001018555821562001050579182015b828111156200104f57825182559160200191906001019062001032565b5b5090506200105f919062001063565b5090565b5b808211156200107e57600081600090555060010162001064565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b6000620010f782620010e0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156200112d576200112c620010b1565b5b600182019050919050565b600082825260208201905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000620011a760328362001138565b9150620011b48262001149565b604082019050919050565b60006020820190508181036000830152620011da8162001198565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006200121960208362001138565b91506200122682620011e1565b602082019050919050565b600060208201905081810360008301526200124c816200120a565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006200128b601c8362001138565b9150620012988262001253565b602082019050919050565b60006020820190508181036000830152620012be816200127c565b9050919050565b6000620012d282620010e0565b9150620012df83620010e0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620013175762001316620010b1565b5b828201905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200134f8262001322565b9050919050565b620013618162001342565b82525050565b6200137281620010e0565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620013b457808201518184015260208101905062001397565b83811115620013c4576000848401525b50505050565b6000601f19601f8301169050919050565b6000620013e88262001378565b620013f4818562001383565b93506200140681856020860162001394565b6200141181620013ca565b840191505092915050565b600060808201905062001433600083018762001356565b62001442602083018662001356565b62001451604083018562001367565b8181036060830152620014658184620013db565b905095945050505050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b620014ac8162001475565b8114620014b857600080fd5b50565b600081519050620014cc81620014a1565b92915050565b600060208284031215620014eb57620014ea62001470565b5b6000620014fb84828501620014bb565b91505092915050565b60006200151182620010e0565b91506200151e83620010e0565b925082821015620015345762001533620010b1565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000620015cc602a8362001138565b9150620015d9826200156e565b604082019050919050565b60006020820190508181036000830152620015ff81620015bd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200164e57607f821691505b6020821081141562001665576200166462001606565b5b50919050565b61373f806200167b6000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80636352211e116100c357806395d89b411161007c57806395d89b41146103d8578063a22cb465146103f6578063ab00492f14610412578063b88d4fde1461042e578063c87b56dd1461044a578063e985e9c51461047a5761014d565b80636352211e146103025780636a2a0696146103325780636fd976bc1461034e57806370a082311461036c57806374222b841461039c5780638da5cb5b146103ba5761014d565b806323b872dd1161011557806323b872dd1461020a5780632f745c591461022657806333c93012146102565780633cabd8ac1461028657806342842e0e146102b65780634f6ccce7146102d25761014d565b806301ffc9a71461015257806306fdde0314610182578063081812fc146101a0578063095ea7b3146101d057806318160ddd146101ec575b600080fd5b61016c6004803603810190610167919061239c565b6104aa565b60405161017991906123e4565b60405180910390f35b61018a6104bc565b6040516101979190612498565b60405180910390f35b6101ba60048036038101906101b591906124f0565b61054e565b6040516101c7919061255e565b60405180910390f35b6101ea60048036038101906101e591906125a5565b6105d3565b005b6101f46106eb565b60405161020191906125f4565b60405180910390f35b610224600480360381019061021f919061260f565b6106f8565b005b610240600480360381019061023b91906125a5565b610758565b60405161024d91906125f4565b60405180910390f35b610270600480360381019061026b91906124f0565b6107fd565b60405161027d91906125f4565b60405180910390f35b6102a0600480360381019061029b91906124f0565b610823565b6040516102ad9190612498565b60405180910390f35b6102d060048036038101906102cb919061260f565b61096a565b005b6102ec60048036038101906102e791906124f0565b61098a565b6040516102f991906125f4565b60405180910390f35b61031c600480360381019061031791906124f0565b6109fb565b604051610329919061255e565b60405180910390f35b61034c60048036038101906103479190612797565b610aad565b005b610356610b20565b60405161036391906125f4565b60405180910390f35b610386600480360381019061038191906127f3565b610b26565b60405161039391906125f4565b60405180910390f35b6103a4610bde565b6040516103b19190612498565b60405180910390f35b6103c2610bf6565b6040516103cf919061255e565b60405180910390f35b6103e0610c1c565b6040516103ed9190612498565b60405180910390f35b610410600480360381019061040b919061284c565b610cae565b005b61042c600480360381019061042791906124f0565b610e2f565b005b6104486004803603810190610443919061292d565b610f4c565b005b610464600480360381019061045f91906124f0565b610fae565b6040516104719190612498565b60405180910390f35b610494600480360381019061048f91906129b0565b6111fe565b6040516104a191906123e4565b60405180910390f35b60006104b5826113be565b9050919050565b6060600080546104cb90612a1f565b80601f01602080910402602001604051908101604052809291908181526020018280546104f790612a1f565b80156105445780601f1061051957610100808354040283529160200191610544565b820191906000526020600020905b81548152906001019060200180831161052757829003601f168201915b5050505050905090565b600061055982611438565b610598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058f90612ac3565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105de826109fb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561064f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064690612b55565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661066e6114a4565b73ffffffffffffffffffffffffffffffffffffffff16148061069d575061069c816106976114a4565b6111fe565b5b6106dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d390612be7565b60405180910390fd5b6106e683836114ac565b505050565b6000600980549050905090565b6107096107036114a4565b82611565565b610748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073f90612c79565b60405180910390fd5b610753838383611643565b505050565b600061076383610b26565b82106107a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079b90612d0b565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60006301e187e08261080f9190612d89565b6107b261081c9190612dba565b9050919050565b606060405160200161083490612e41565b60405160208183030381529060405280519060200120600d600084815260200190815260200160002060405160200161086d9190612eea565b6040516020818303038152906040528051906020012014156108c6576040518060400160405280600781526020017f6e6f206e616d65000000000000000000000000000000000000000000000000008152509050610965565b600d600083815260200190815260200160002080546108e490612a1f565b80601f016020809104026020016040519081016040528092919081815260200182805461091090612a1f565b801561095d5780601f106109325761010080835404028352916020019161095d565b820191906000526020600020905b81548152906001019060200180831161094057829003601f168201915b505050505090505b919050565b61098583838360405180602001604052806000815250610f4c565b505050565b60006109946106eb565b82106109d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cc90612f73565b60405180910390fd5b600982815481106109e9576109e8612f93565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610aa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9b90613034565b60405180910390fd5b80915050919050565b610ab6826109fb565b73ffffffffffffffffffffffffffffffffffffffff16610ad46114a4565b73ffffffffffffffffffffffffffffffffffffffff1614610af457600080fd5b80600d60008481526020019081526020016000209080519060200190610b1b92919061228d565b505050565b600c5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8e906130c6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060610bf1610bec426107fd565b61189f565b905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060018054610c2b90612a1f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5790612a1f565b8015610ca45780601f10610c7957610100808354040283529160200191610ca4565b820191906000526020600020905b815481529060010190602001808311610c8757829003601f168201915b5050505050905090565b610cb66114a4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1b90613132565b60405180910390fd5b8060056000610d316114a4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610dde6114a4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e2391906123e4565b60405180910390a35050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610e706114a4565b73ffffffffffffffffffffffffffffffffffffffff1614610e9057600080fd5b6000816001600c54610ea29190613152565b610eac9190612dba565b90506000600c5490505b818111610f4757610eeb600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c54611a00565b610ef3610bde565b601b6000600c5481526020019081526020016000209080519060200190610f1b92919061228d565b50600c6000815480929190610f2f90613186565b91905055508080610f3f90613186565b915050610eb6565b505050565b610f5d610f576114a4565b83611565565b610f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9390612c79565b60405180910390fd5b610fa884848484611a1e565b50505050565b606060008214156110db576000600e600060058110610fd057610fcf612f93565b5b016013600060048110610fe657610fe5612f93565b5b01610ff08561189f565b601360016004811061100557611004612f93565b5b01600e60016005811061101b5761101a612f93565b5b01601360026004811061103157611030612f93565b5b01600e60026005811061104757611046612f93565b5b01601360036004811061105d5761105c612f93565b5b01601b60008c8152602001908152602001600020600e60036005811061108657611085612f93565b5b016110908d610823565b600e6004600581106110a5576110a4612f93565b5b016040516020016110c19c9b9a99989796959493929190613200565b6040516020818303038152906040529050809150506111f9565b6000600e6000600581106110f2576110f1612f93565b5b01601760006004811061110857611107612f93565b5b016111128561189f565b601760016004811061112757611126612f93565b5b01600e60016005811061113d5761113c612f93565b5b01601760026004811061115357611152612f93565b5b01600e60026005811061116957611168612f93565b5b01601760036004811061117f5761117e612f93565b5b01601b60008c8152602001908152602001600020600e6003600581106111a8576111a7612f93565b5b016111b28d610823565b600e6004600581106111c7576111c6612f93565b5b016040516020016111e39c9b9a99989796959493929190613200565b6040516020818303038152906040529050809150505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080823b905060008111915050919050565b6112b08383836113b9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112f3576112ee81611a7a565b611332565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611331576113308382611ac3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113755761137081611c30565b6113b4565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146113b3576113b28282611d01565b5b5b505050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611431575061143082611d80565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661151f836109fb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061157082611438565b6115af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a690613318565b60405180910390fd5b60006115ba836109fb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061162957508373ffffffffffffffffffffffffffffffffffffffff166116118461054e565b73ffffffffffffffffffffffffffffffffffffffff16145b8061163a575061163981856111fe565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611663826109fb565b73ffffffffffffffffffffffffffffffffffffffff16146116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b0906133aa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611729576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117209061343c565b60405180910390fd5b611734838383611e62565b61173f6000826114ac565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461178f9190613152565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117e69190612dba565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008214156118e7576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506119fb565b600082905060005b6000821461191957808061190290613186565b915050600a826119129190612d89565b91506118ef565b60008167ffffffffffffffff8111156119355761193461266c565b5b6040519080825280601f01601f1916602001820160405280156119675781602001600182028036833780820191505090505b5090505b600085146119f4576001826119809190613152565b9150600a8561198f919061345c565b603061199b9190612dba565b60f81b8183815181106119b1576119b0612f93565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856119ed9190612d89565b945061196b565b8093505050505b919050565b611a1a828260405180602001604052806000815250611e72565b5050565b611a29848484611643565b611a3584848484611ecd565b611a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6b906134ff565b60405180910390fd5b50505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001611ad084610b26565b611ada9190613152565b9050600060086000848152602001908152602001600020549050818114611bbf576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050611c449190613152565b90506000600a6000848152602001908152602001600020549050600060098381548110611c7457611c73612f93565b5b906000526020600020015490508060098381548110611c9657611c95612f93565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480611ce557611ce461351f565b5b6001900381819060005260206000200160009055905550505050565b6000611d0c83610b26565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e4b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e5b5750611e5a82612055565b5b9050919050565b611e6d8383836112a5565b505050565b611e7c83836120bf565b611e896000848484611ecd565b611ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebf906134ff565b60405180910390fd5b505050565b6000611eee8473ffffffffffffffffffffffffffffffffffffffff16611292565b15612048578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f176114a4565b8786866040518563ffffffff1660e01b8152600401611f3994939291906135a3565b6020604051808303816000875af1925050508015611f7557506040513d601f19601f82011682018060405250810190611f729190613604565b60015b611ff8573d8060008114611fa5576040519150601f19603f3d011682016040523d82523d6000602084013e611faa565b606091505b50600081511415611ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe7906134ff565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061204d565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561212f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121269061367d565b60405180910390fd5b61213881611438565b15612178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216f906136e9565b60405180910390fd5b61218460008383611e62565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121d49190612dba565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461229990612a1f565b90600052602060002090601f0160209004810192826122bb5760008555612302565b82601f106122d457805160ff1916838001178555612302565b82800160010185558215612302579182015b828111156123015782518255916020019190600101906122e6565b5b50905061230f9190612313565b5090565b5b8082111561232c576000816000905550600101612314565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61237981612344565b811461238457600080fd5b50565b60008135905061239681612370565b92915050565b6000602082840312156123b2576123b161233a565b5b60006123c084828501612387565b91505092915050565b60008115159050919050565b6123de816123c9565b82525050565b60006020820190506123f960008301846123d5565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561243957808201518184015260208101905061241e565b83811115612448576000848401525b50505050565b6000601f19601f8301169050919050565b600061246a826123ff565b612474818561240a565b935061248481856020860161241b565b61248d8161244e565b840191505092915050565b600060208201905081810360008301526124b2818461245f565b905092915050565b6000819050919050565b6124cd816124ba565b81146124d857600080fd5b50565b6000813590506124ea816124c4565b92915050565b6000602082840312156125065761250561233a565b5b6000612514848285016124db565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006125488261251d565b9050919050565b6125588161253d565b82525050565b6000602082019050612573600083018461254f565b92915050565b6125828161253d565b811461258d57600080fd5b50565b60008135905061259f81612579565b92915050565b600080604083850312156125bc576125bb61233a565b5b60006125ca85828601612590565b92505060206125db858286016124db565b9150509250929050565b6125ee816124ba565b82525050565b600060208201905061260960008301846125e5565b92915050565b6000806000606084860312156126285761262761233a565b5b600061263686828701612590565b935050602061264786828701612590565b9250506040612658868287016124db565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6126a48261244e565b810181811067ffffffffffffffff821117156126c3576126c261266c565b5b80604052505050565b60006126d6612330565b90506126e2828261269b565b919050565b600067ffffffffffffffff8211156127025761270161266c565b5b61270b8261244e565b9050602081019050919050565b82818337600083830152505050565b600061273a612735846126e7565b6126cc565b90508281526020810184848401111561275657612755612667565b5b612761848285612718565b509392505050565b600082601f83011261277e5761277d612662565b5b813561278e848260208601612727565b91505092915050565b600080604083850312156127ae576127ad61233a565b5b60006127bc858286016124db565b925050602083013567ffffffffffffffff8111156127dd576127dc61233f565b5b6127e985828601612769565b9150509250929050565b6000602082840312156128095761280861233a565b5b600061281784828501612590565b91505092915050565b612829816123c9565b811461283457600080fd5b50565b60008135905061284681612820565b92915050565b600080604083850312156128635761286261233a565b5b600061287185828601612590565b925050602061288285828601612837565b9150509250929050565b600067ffffffffffffffff8211156128a7576128a661266c565b5b6128b08261244e565b9050602081019050919050565b60006128d06128cb8461288c565b6126cc565b9050828152602081018484840111156128ec576128eb612667565b5b6128f7848285612718565b509392505050565b600082601f83011261291457612913612662565b5b81356129248482602086016128bd565b91505092915050565b600080600080608085870312156129475761294661233a565b5b600061295587828801612590565b945050602061296687828801612590565b9350506040612977878288016124db565b925050606085013567ffffffffffffffff8111156129985761299761233f565b5b6129a4878288016128ff565b91505092959194509250565b600080604083850312156129c7576129c661233a565b5b60006129d585828601612590565b92505060206129e685828601612590565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612a3757607f821691505b60208210811415612a4b57612a4a6129f0565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612aad602c8361240a565b9150612ab882612a51565b604082019050919050565b60006020820190508181036000830152612adc81612aa0565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612b3f60218361240a565b9150612b4a82612ae3565b604082019050919050565b60006020820190508181036000830152612b6e81612b32565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612bd160388361240a565b9150612bdc82612b75565b604082019050919050565b60006020820190508181036000830152612c0081612bc4565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000612c6360318361240a565b9150612c6e82612c07565b604082019050919050565b60006020820190508181036000830152612c9281612c56565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000612cf5602b8361240a565b9150612d0082612c99565b604082019050919050565b60006020820190508181036000830152612d2481612ce8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612d94826124ba565b9150612d9f836124ba565b925082612daf57612dae612d2b565b5b828204905092915050565b6000612dc5826124ba565b9150612dd0836124ba565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e0557612e04612d5a565b5b828201905092915050565b600081905092915050565b50565b6000612e2b600083612e10565b9150612e3682612e1b565b600082019050919050565b6000612e4c82612e1e565b9150819050919050565b60008190508160005260206000209050919050565b60008154612e7881612a1f565b612e828186612e10565b94506001821660008114612e9d5760018114612eae57612ee1565b60ff19831686528186019350612ee1565b612eb785612e56565b60005b83811015612ed957815481890152600182019150602081019050612eba565b838801955050505b50505092915050565b6000612ef68284612e6b565b915081905092915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000612f5d602c8361240a565b9150612f6882612f01565b604082019050919050565b60006020820190508181036000830152612f8c81612f50565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061301e60298361240a565b915061302982612fc2565b604082019050919050565b6000602082019050818103600083015261304d81613011565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006130b0602a8361240a565b91506130bb82613054565b604082019050919050565b600060208201905081810360008301526130df816130a3565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061311c60198361240a565b9150613127826130e6565b602082019050919050565b6000602082019050818103600083015261314b8161310f565b9050919050565b600061315d826124ba565b9150613168836124ba565b92508282101561317b5761317a612d5a565b5b828203905092915050565b6000613191826124ba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131c4576131c3612d5a565b5b600182019050919050565b60006131da826123ff565b6131e48185612e10565b93506131f481856020860161241b565b80840191505092915050565b600061320c828f612e6b565b9150613218828e612e6b565b9150613224828d6131cf565b9150613230828c612e6b565b915061323c828b612e6b565b9150613248828a612e6b565b91506132548289612e6b565b91506132608288612e6b565b915061326c8287612e6b565b91506132788286612e6b565b915061328482856131cf565b91506132908284612e6b565b91508190509d9c50505050505050505050505050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613302602c8361240a565b915061330d826132a6565b604082019050919050565b60006020820190508181036000830152613331816132f5565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061339460298361240a565b915061339f82613338565b604082019050919050565b600060208201905081810360008301526133c381613387565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061342660248361240a565b9150613431826133ca565b604082019050919050565b6000602082019050818103600083015261345581613419565b9050919050565b6000613467826124ba565b9150613472836124ba565b92508261348257613481612d2b565b5b828206905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006134e960328361240a565b91506134f48261348d565b604082019050919050565b60006020820190508181036000830152613518816134dc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006135758261354e565b61357f8185613559565b935061358f81856020860161241b565b6135988161244e565b840191505092915050565b60006080820190506135b8600083018761254f565b6135c5602083018661254f565b6135d260408301856125e5565b81810360608301526135e4818461356a565b905095945050505050565b6000815190506135fe81612370565b92915050565b60006020828403121561361a5761361961233a565b5b6000613628848285016135ef565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061366760208361240a565b915061367282613631565b602082019050919050565b600060208201905081810360008301526136968161365a565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006136d3601c8361240a565b91506136de8261369d565b602082019050919050565b60006020820190508181036000830152613702816136c6565b905091905056fea26469706673582212203303cefee8cb90cd0833abda08d97fe97c5470b9343171d12f8b744402aea1cb64736f6c634300080a0033e38090e589b5e5bbbae8a898e5bfb520e5a4a7e9b3a5e5b185e38091456e6772617665206e616d65206f6e20746865204f2d546f72696968747470733a2f2f617277656176652e6e65742f696f4575506e48674e53777750316c72683474364a4b6c307454452d6c6b796d4348416e44424c61434634222c22696d616765223a2268747470733a2f2f617277656176652e6e65742f466c367058346d463552766c644c496c56713546466c5777394d476156374764785366754f326870584677222c2265787465726e616c5f75726c223a2268747470733a2f2f636f6e6174612e776f726c642f7a696e6a61222c2261747472696275746573223a5b7b202274726169745f74797065223a2022417274697374222c202276616c7565223a202241494d492053454b494755434849227d2c7b2274726169745f74797065223a2022546f72692d6e616d65222c202276616c7565223a20224f2d546f726969227d2c7b2274726169745f74797065223a202259656172222c202276616c7565223a202243727970746f205a696e6a61e381aee6ada3e5bc8fe382aae383bce38397e383b3e381a8e585b1e381abe38193e381a1e38289e381aee3839ae383bce382b8e3818be38289e5908de5898de38292e588bbe38280e4ba8be3818ce587bae69da5e381bee38199e380822068747470733a2f2f636f6e6174612e776f726c642f7a696e6a6120e38080e588bbe38280e5908de5898de381abe996a2e38197e381a6e381afe3818ae5908de5898de38081e4bc81e6a5ade5908de38081e38397e383ade382b8e382a7e382afe38388e5908de381aae381a9e5a5bde3818de381aae69687e5ad97e38292e588bbe38293e381a7e9a082e3818fe38193e381a8e3818ce381a7e3818de381bee38199e3808243727970746f205a696e6a61e381afe697a5e69cace58fa4e69da5e381aee69687e58c96e38292e9a18ce69d90e381abe78fbee5ae9fe7a9bae99693e38292e5b7bbe3818de8bebce381bfe68ba1e5bcb5e38197e381a6e38184e3818fe38397e383ade382b8e382a7e382afe38388e381a7e38199e38082e38193e381aee7a9bae99693e38292e585b1e381abe882b2e381a6e381a6e3818fe381a0e38195e3828be38182e381aae3819fe381abe6849fe8ac9de38292e8bebce38281e381a6e3808220205c6e20205c6e5468697320697320616e204e465420666f722074686520726967687420746f206861766520796f7572206e616d6520656e677261766564206f6e2074686520227d2c7b2274726169745f74797065223a202244656469636174696f6e204e616d65222c202276616c7565223a2022646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b226e616d65223a22e38090e58d83e69cace9b3a5e5b185e38091456e6772617665206e616d65206f6e207468652053656e626f6e2d546f7269692023222c226465736372697074696f6e223a224d6574617665727365e381abe589b5e5bbbae38195e3828ce3828b43727970746f205a696e6a61e381aee4b8ade5a4aee381abe5ad98e59ca8e38199e3828be5a4a7e9b3a5e5b185e381abe5908de5898de38292e588bbe38280e6a8a9e588a9e381ae4e4654e381a7e38199e38082e8a898e5bfb5e38199e381b9e3818de589b5e5bbbae8a898e5bfb5e381aee5a4a7e9b3a5e5b185e381abe5908de5898de38292e588bbe38280e38193e381a8e381afe38397e383ade382b8e382a7e382afe38388e38292e5a4a7e3818de3818fe694afe38188e381a6e4b88be38195e3828be8a8bce381a8e381aae3828ae381bee38199e3808268747470733a2f2f617277656176652e6e65742f4e73553670714b6c303458366d3045375f66454b7574336a356b425951313432316366314e573967744759222c22696d616765223a2268747470733a2f2f617277656176652e6e65742f37466462777941755a3830786a5a4d6d3731467a377373436f7646643177746d4b684754714576752d3755222c2265787465726e616c5f75726c223a2268747470733a2f2f636f6e6174612e776f726c642f7a696e6a61222c2261747472696275746573223a5b7b202274726169745f74797065223a2022417274697374222c202276616c7565223a202241494d492053454b494755434849227d2c7b2274726169745f74797065223a2022546f72692d6e616d65222c202276616c7565223a202253656e626f6e2d546f726969227d2c7b2274726169745f74797065223a202259656172222c202276616c7565223a20222d546f7269692067617465206f662043727970746f205a696e6a612c2077686963682077696c6c206265206275696c7420696e204d65746176657273652e20596f752063616e20696e73637269626520796f7572206e616d65206f6e20746869732070616765207768656e2043727970746f205a696e6a61206973206f6666696369616c6c79206f70656e65643a2068747470733a2f2f636f6e6174612e776f726c642f7a696e6a6120596f752063616e20696e73637269626520796f7572206e616d652c20636f6d70616e79206e616d652c2070726f6a656374206e616d652c206574632e2043727970746f205a696e6a6120697320612070726f6a65637420746f20696e766f6c766520616e6420657870616e6420746865207265616c207370616365206261736564206f6e2074686520616e6369656e74204a6170616e6573652063756c747572652e204920776f756c64206c696b6520746f2065787072657373206f75722067726174697475646520746f20796f752077686f2077696c6c206e757274757265207468697320737061636520776974682075732e222c22616e696d6174696f6e5f75726c223a22222c226465736372697074696f6e223a224d6574617665727365e381abe589b5e5bbbae38195e3828ce3828b43727970746f205a696e6a61e381abe5ad98e59ca8e38199e3828be58d83e69cace9b3a5e5b185e381abe5908de5898de38292e588bbe38280e6a8a9e588a9e381ae4e4654e381a7e38199e38082e5908de5898de38292e588bbe38280e38193e381a8e381afe38397e383ade382b8e382a7e382afe38388e38292e585b1e381abe694afe38188e381a6e4b88be38195e3828be8a8bce381a8e381aae3828ae381bee38199e38082

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061014d5760003560e01c80636352211e116100c357806395d89b411161007c57806395d89b41146103d8578063a22cb465146103f6578063ab00492f14610412578063b88d4fde1461042e578063c87b56dd1461044a578063e985e9c51461047a5761014d565b80636352211e146103025780636a2a0696146103325780636fd976bc1461034e57806370a082311461036c57806374222b841461039c5780638da5cb5b146103ba5761014d565b806323b872dd1161011557806323b872dd1461020a5780632f745c591461022657806333c93012146102565780633cabd8ac1461028657806342842e0e146102b65780634f6ccce7146102d25761014d565b806301ffc9a71461015257806306fdde0314610182578063081812fc146101a0578063095ea7b3146101d057806318160ddd146101ec575b600080fd5b61016c6004803603810190610167919061239c565b6104aa565b60405161017991906123e4565b60405180910390f35b61018a6104bc565b6040516101979190612498565b60405180910390f35b6101ba60048036038101906101b591906124f0565b61054e565b6040516101c7919061255e565b60405180910390f35b6101ea60048036038101906101e591906125a5565b6105d3565b005b6101f46106eb565b60405161020191906125f4565b60405180910390f35b610224600480360381019061021f919061260f565b6106f8565b005b610240600480360381019061023b91906125a5565b610758565b60405161024d91906125f4565b60405180910390f35b610270600480360381019061026b91906124f0565b6107fd565b60405161027d91906125f4565b60405180910390f35b6102a0600480360381019061029b91906124f0565b610823565b6040516102ad9190612498565b60405180910390f35b6102d060048036038101906102cb919061260f565b61096a565b005b6102ec60048036038101906102e791906124f0565b61098a565b6040516102f991906125f4565b60405180910390f35b61031c600480360381019061031791906124f0565b6109fb565b604051610329919061255e565b60405180910390f35b61034c60048036038101906103479190612797565b610aad565b005b610356610b20565b60405161036391906125f4565b60405180910390f35b610386600480360381019061038191906127f3565b610b26565b60405161039391906125f4565b60405180910390f35b6103a4610bde565b6040516103b19190612498565b60405180910390f35b6103c2610bf6565b6040516103cf919061255e565b60405180910390f35b6103e0610c1c565b6040516103ed9190612498565b60405180910390f35b610410600480360381019061040b919061284c565b610cae565b005b61042c600480360381019061042791906124f0565b610e2f565b005b6104486004803603810190610443919061292d565b610f4c565b005b610464600480360381019061045f91906124f0565b610fae565b6040516104719190612498565b60405180910390f35b610494600480360381019061048f91906129b0565b6111fe565b6040516104a191906123e4565b60405180910390f35b60006104b5826113be565b9050919050565b6060600080546104cb90612a1f565b80601f01602080910402602001604051908101604052809291908181526020018280546104f790612a1f565b80156105445780601f1061051957610100808354040283529160200191610544565b820191906000526020600020905b81548152906001019060200180831161052757829003601f168201915b5050505050905090565b600061055982611438565b610598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058f90612ac3565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105de826109fb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561064f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064690612b55565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661066e6114a4565b73ffffffffffffffffffffffffffffffffffffffff16148061069d575061069c816106976114a4565b6111fe565b5b6106dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d390612be7565b60405180910390fd5b6106e683836114ac565b505050565b6000600980549050905090565b6107096107036114a4565b82611565565b610748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073f90612c79565b60405180910390fd5b610753838383611643565b505050565b600061076383610b26565b82106107a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079b90612d0b565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60006301e187e08261080f9190612d89565b6107b261081c9190612dba565b9050919050565b606060405160200161083490612e41565b60405160208183030381529060405280519060200120600d600084815260200190815260200160002060405160200161086d9190612eea565b6040516020818303038152906040528051906020012014156108c6576040518060400160405280600781526020017f6e6f206e616d65000000000000000000000000000000000000000000000000008152509050610965565b600d600083815260200190815260200160002080546108e490612a1f565b80601f016020809104026020016040519081016040528092919081815260200182805461091090612a1f565b801561095d5780601f106109325761010080835404028352916020019161095d565b820191906000526020600020905b81548152906001019060200180831161094057829003601f168201915b505050505090505b919050565b61098583838360405180602001604052806000815250610f4c565b505050565b60006109946106eb565b82106109d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cc90612f73565b60405180910390fd5b600982815481106109e9576109e8612f93565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610aa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9b90613034565b60405180910390fd5b80915050919050565b610ab6826109fb565b73ffffffffffffffffffffffffffffffffffffffff16610ad46114a4565b73ffffffffffffffffffffffffffffffffffffffff1614610af457600080fd5b80600d60008481526020019081526020016000209080519060200190610b1b92919061228d565b505050565b600c5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8e906130c6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060610bf1610bec426107fd565b61189f565b905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060018054610c2b90612a1f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5790612a1f565b8015610ca45780601f10610c7957610100808354040283529160200191610ca4565b820191906000526020600020905b815481529060010190602001808311610c8757829003601f168201915b5050505050905090565b610cb66114a4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1b90613132565b60405180910390fd5b8060056000610d316114a4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610dde6114a4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e2391906123e4565b60405180910390a35050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610e706114a4565b73ffffffffffffffffffffffffffffffffffffffff1614610e9057600080fd5b6000816001600c54610ea29190613152565b610eac9190612dba565b90506000600c5490505b818111610f4757610eeb600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c54611a00565b610ef3610bde565b601b6000600c5481526020019081526020016000209080519060200190610f1b92919061228d565b50600c6000815480929190610f2f90613186565b91905055508080610f3f90613186565b915050610eb6565b505050565b610f5d610f576114a4565b83611565565b610f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9390612c79565b60405180910390fd5b610fa884848484611a1e565b50505050565b606060008214156110db576000600e600060058110610fd057610fcf612f93565b5b016013600060048110610fe657610fe5612f93565b5b01610ff08561189f565b601360016004811061100557611004612f93565b5b01600e60016005811061101b5761101a612f93565b5b01601360026004811061103157611030612f93565b5b01600e60026005811061104757611046612f93565b5b01601360036004811061105d5761105c612f93565b5b01601b60008c8152602001908152602001600020600e60036005811061108657611085612f93565b5b016110908d610823565b600e6004600581106110a5576110a4612f93565b5b016040516020016110c19c9b9a99989796959493929190613200565b6040516020818303038152906040529050809150506111f9565b6000600e6000600581106110f2576110f1612f93565b5b01601760006004811061110857611107612f93565b5b016111128561189f565b601760016004811061112757611126612f93565b5b01600e60016005811061113d5761113c612f93565b5b01601760026004811061115357611152612f93565b5b01600e60026005811061116957611168612f93565b5b01601760036004811061117f5761117e612f93565b5b01601b60008c8152602001908152602001600020600e6003600581106111a8576111a7612f93565b5b016111b28d610823565b600e6004600581106111c7576111c6612f93565b5b016040516020016111e39c9b9a99989796959493929190613200565b6040516020818303038152906040529050809150505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080823b905060008111915050919050565b6112b08383836113b9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112f3576112ee81611a7a565b611332565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611331576113308382611ac3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113755761137081611c30565b6113b4565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146113b3576113b28282611d01565b5b5b505050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611431575061143082611d80565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661151f836109fb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061157082611438565b6115af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a690613318565b60405180910390fd5b60006115ba836109fb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061162957508373ffffffffffffffffffffffffffffffffffffffff166116118461054e565b73ffffffffffffffffffffffffffffffffffffffff16145b8061163a575061163981856111fe565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611663826109fb565b73ffffffffffffffffffffffffffffffffffffffff16146116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b0906133aa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611729576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117209061343c565b60405180910390fd5b611734838383611e62565b61173f6000826114ac565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461178f9190613152565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117e69190612dba565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008214156118e7576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506119fb565b600082905060005b6000821461191957808061190290613186565b915050600a826119129190612d89565b91506118ef565b60008167ffffffffffffffff8111156119355761193461266c565b5b6040519080825280601f01601f1916602001820160405280156119675781602001600182028036833780820191505090505b5090505b600085146119f4576001826119809190613152565b9150600a8561198f919061345c565b603061199b9190612dba565b60f81b8183815181106119b1576119b0612f93565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856119ed9190612d89565b945061196b565b8093505050505b919050565b611a1a828260405180602001604052806000815250611e72565b5050565b611a29848484611643565b611a3584848484611ecd565b611a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6b906134ff565b60405180910390fd5b50505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001611ad084610b26565b611ada9190613152565b9050600060086000848152602001908152602001600020549050818114611bbf576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050611c449190613152565b90506000600a6000848152602001908152602001600020549050600060098381548110611c7457611c73612f93565b5b906000526020600020015490508060098381548110611c9657611c95612f93565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480611ce557611ce461351f565b5b6001900381819060005260206000200160009055905550505050565b6000611d0c83610b26565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e4b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e5b5750611e5a82612055565b5b9050919050565b611e6d8383836112a5565b505050565b611e7c83836120bf565b611e896000848484611ecd565b611ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebf906134ff565b60405180910390fd5b505050565b6000611eee8473ffffffffffffffffffffffffffffffffffffffff16611292565b15612048578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f176114a4565b8786866040518563ffffffff1660e01b8152600401611f3994939291906135a3565b6020604051808303816000875af1925050508015611f7557506040513d601f19601f82011682018060405250810190611f729190613604565b60015b611ff8573d8060008114611fa5576040519150601f19603f3d011682016040523d82523d6000602084013e611faa565b606091505b50600081511415611ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe7906134ff565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061204d565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561212f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121269061367d565b60405180910390fd5b61213881611438565b15612178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216f906136e9565b60405180910390fd5b61218460008383611e62565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121d49190612dba565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461229990612a1f565b90600052602060002090601f0160209004810192826122bb5760008555612302565b82601f106122d457805160ff1916838001178555612302565b82800160010185558215612302579182015b828111156123015782518255916020019190600101906122e6565b5b50905061230f9190612313565b5090565b5b8082111561232c576000816000905550600101612314565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61237981612344565b811461238457600080fd5b50565b60008135905061239681612370565b92915050565b6000602082840312156123b2576123b161233a565b5b60006123c084828501612387565b91505092915050565b60008115159050919050565b6123de816123c9565b82525050565b60006020820190506123f960008301846123d5565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561243957808201518184015260208101905061241e565b83811115612448576000848401525b50505050565b6000601f19601f8301169050919050565b600061246a826123ff565b612474818561240a565b935061248481856020860161241b565b61248d8161244e565b840191505092915050565b600060208201905081810360008301526124b2818461245f565b905092915050565b6000819050919050565b6124cd816124ba565b81146124d857600080fd5b50565b6000813590506124ea816124c4565b92915050565b6000602082840312156125065761250561233a565b5b6000612514848285016124db565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006125488261251d565b9050919050565b6125588161253d565b82525050565b6000602082019050612573600083018461254f565b92915050565b6125828161253d565b811461258d57600080fd5b50565b60008135905061259f81612579565b92915050565b600080604083850312156125bc576125bb61233a565b5b60006125ca85828601612590565b92505060206125db858286016124db565b9150509250929050565b6125ee816124ba565b82525050565b600060208201905061260960008301846125e5565b92915050565b6000806000606084860312156126285761262761233a565b5b600061263686828701612590565b935050602061264786828701612590565b9250506040612658868287016124db565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6126a48261244e565b810181811067ffffffffffffffff821117156126c3576126c261266c565b5b80604052505050565b60006126d6612330565b90506126e2828261269b565b919050565b600067ffffffffffffffff8211156127025761270161266c565b5b61270b8261244e565b9050602081019050919050565b82818337600083830152505050565b600061273a612735846126e7565b6126cc565b90508281526020810184848401111561275657612755612667565b5b612761848285612718565b509392505050565b600082601f83011261277e5761277d612662565b5b813561278e848260208601612727565b91505092915050565b600080604083850312156127ae576127ad61233a565b5b60006127bc858286016124db565b925050602083013567ffffffffffffffff8111156127dd576127dc61233f565b5b6127e985828601612769565b9150509250929050565b6000602082840312156128095761280861233a565b5b600061281784828501612590565b91505092915050565b612829816123c9565b811461283457600080fd5b50565b60008135905061284681612820565b92915050565b600080604083850312156128635761286261233a565b5b600061287185828601612590565b925050602061288285828601612837565b9150509250929050565b600067ffffffffffffffff8211156128a7576128a661266c565b5b6128b08261244e565b9050602081019050919050565b60006128d06128cb8461288c565b6126cc565b9050828152602081018484840111156128ec576128eb612667565b5b6128f7848285612718565b509392505050565b600082601f83011261291457612913612662565b5b81356129248482602086016128bd565b91505092915050565b600080600080608085870312156129475761294661233a565b5b600061295587828801612590565b945050602061296687828801612590565b9350506040612977878288016124db565b925050606085013567ffffffffffffffff8111156129985761299761233f565b5b6129a4878288016128ff565b91505092959194509250565b600080604083850312156129c7576129c661233a565b5b60006129d585828601612590565b92505060206129e685828601612590565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612a3757607f821691505b60208210811415612a4b57612a4a6129f0565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612aad602c8361240a565b9150612ab882612a51565b604082019050919050565b60006020820190508181036000830152612adc81612aa0565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612b3f60218361240a565b9150612b4a82612ae3565b604082019050919050565b60006020820190508181036000830152612b6e81612b32565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612bd160388361240a565b9150612bdc82612b75565b604082019050919050565b60006020820190508181036000830152612c0081612bc4565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000612c6360318361240a565b9150612c6e82612c07565b604082019050919050565b60006020820190508181036000830152612c9281612c56565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000612cf5602b8361240a565b9150612d0082612c99565b604082019050919050565b60006020820190508181036000830152612d2481612ce8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612d94826124ba565b9150612d9f836124ba565b925082612daf57612dae612d2b565b5b828204905092915050565b6000612dc5826124ba565b9150612dd0836124ba565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e0557612e04612d5a565b5b828201905092915050565b600081905092915050565b50565b6000612e2b600083612e10565b9150612e3682612e1b565b600082019050919050565b6000612e4c82612e1e565b9150819050919050565b60008190508160005260206000209050919050565b60008154612e7881612a1f565b612e828186612e10565b94506001821660008114612e9d5760018114612eae57612ee1565b60ff19831686528186019350612ee1565b612eb785612e56565b60005b83811015612ed957815481890152600182019150602081019050612eba565b838801955050505b50505092915050565b6000612ef68284612e6b565b915081905092915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000612f5d602c8361240a565b9150612f6882612f01565b604082019050919050565b60006020820190508181036000830152612f8c81612f50565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061301e60298361240a565b915061302982612fc2565b604082019050919050565b6000602082019050818103600083015261304d81613011565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006130b0602a8361240a565b91506130bb82613054565b604082019050919050565b600060208201905081810360008301526130df816130a3565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061311c60198361240a565b9150613127826130e6565b602082019050919050565b6000602082019050818103600083015261314b8161310f565b9050919050565b600061315d826124ba565b9150613168836124ba565b92508282101561317b5761317a612d5a565b5b828203905092915050565b6000613191826124ba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131c4576131c3612d5a565b5b600182019050919050565b60006131da826123ff565b6131e48185612e10565b93506131f481856020860161241b565b80840191505092915050565b600061320c828f612e6b565b9150613218828e612e6b565b9150613224828d6131cf565b9150613230828c612e6b565b915061323c828b612e6b565b9150613248828a612e6b565b91506132548289612e6b565b91506132608288612e6b565b915061326c8287612e6b565b91506132788286612e6b565b915061328482856131cf565b91506132908284612e6b565b91508190509d9c50505050505050505050505050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613302602c8361240a565b915061330d826132a6565b604082019050919050565b60006020820190508181036000830152613331816132f5565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061339460298361240a565b915061339f82613338565b604082019050919050565b600060208201905081810360008301526133c381613387565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061342660248361240a565b9150613431826133ca565b604082019050919050565b6000602082019050818103600083015261345581613419565b9050919050565b6000613467826124ba565b9150613472836124ba565b92508261348257613481612d2b565b5b828206905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006134e960328361240a565b91506134f48261348d565b604082019050919050565b60006020820190508181036000830152613518816134dc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006135758261354e565b61357f8185613559565b935061358f81856020860161241b565b6135988161244e565b840191505092915050565b60006080820190506135b8600083018761254f565b6135c5602083018661254f565b6135d260408301856125e5565b81810360608301526135e4818461356a565b905095945050505050565b6000815190506135fe81612370565b92915050565b60006020828403121561361a5761361961233a565b5b6000613628848285016135ef565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061366760208361240a565b915061367282613631565b602082019050919050565b600060208201905081810360008301526136968161365a565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006136d3601c8361240a565b91506136de8261369d565b602082019050919050565b60006020820190508181036000830152613702816136c6565b905091905056fea26469706673582212203303cefee8cb90cd0833abda08d97fe97c5470b9343171d12f8b744402aea1cb64736f6c634300080a0033

Deployed Bytecode Sourcemap

3060:6249:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5391:211;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20770:100:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22230:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21767:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34017:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23120:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33685:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5244:137:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4831:268;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23496:151:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34207:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20464:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4635:188:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3150:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20194:208:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5107:129:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3123:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20939:104:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22523:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3398:294:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23718:285:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4033:594:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22889:164:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5391:211:0;5529:4;5558:36;5582:11;5558:23;:36::i;:::-;5551:43;;5391:211;;;:::o;20770:100:1:-;20824:13;20857:5;20850:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20770:100;:::o;22230:221::-;22306:7;22334:16;22342:7;22334;:16::i;:::-;22326:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22419:15;:24;22435:7;22419:24;;;;;;;;;;;;;;;;;;;;;22412:31;;22230:221;;;:::o;21767:397::-;21848:13;21864:23;21879:7;21864:14;:23::i;:::-;21848:39;;21912:5;21906:11;;:2;:11;;;;21898:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;21992:5;21976:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22001:37;22018:5;22025:12;:10;:12::i;:::-;22001:16;:37::i;:::-;21976:62;21968:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;22135:21;22144:2;22148:7;22135:8;:21::i;:::-;21837:327;21767:397;;:::o;34017:113::-;34078:7;34105:10;:17;;;;34098:24;;34017:113;:::o;23120:305::-;23281:41;23300:12;:10;:12::i;:::-;23314:7;23281:18;:41::i;:::-;23273:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23389:28;23399:4;23405:2;23409:7;23389:9;:28::i;:::-;23120:305;;;:::o;33685:256::-;33782:7;33818:23;33835:5;33818:16;:23::i;:::-;33810:5;:31;33802:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;33907:12;:19;33920:5;33907:19;;;;;;;;;;;;;;;:26;33927:5;33907:26;;;;;;;;;;;;33900:33;;33685:256;;;;:::o;5244:137:0:-;5304:4;5345:27;5334:9;:39;;;;:::i;:::-;5327:4;:46;;;;:::i;:::-;5320:53;;5244:137;;;:::o;4831:268::-;4893:13;4986:20;;;;;;;:::i;:::-;;;;;;;;;;;;;4976:31;;;;;;4948:12;:22;4961:8;4948:22;;;;;;;;;;;4931:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;4921:51;;;;;;:86;4918:134;;;5024:16;;;;;;;;;;;;;;;;;;;;;4918:134;5069:12;:22;5082:8;5069:22;;;;;;;;;;;5062:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4831:268;;;;:::o;23496:151:1:-;23600:39;23617:4;23623:2;23627:7;23600:39;;;;;;;;;;;;:16;:39::i;:::-;23496:151;;;:::o;34207:233::-;34282:7;34318:30;:28;:30::i;:::-;34310:5;:38;34302:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;34415:10;34426:5;34415:17;;;;;;;;:::i;:::-;;;;;;;;;;34408:24;;34207:233;;;:::o;20464:239::-;20536:7;20556:13;20572:7;:16;20580:7;20572:16;;;;;;;;;;;;;;;;;;;;;20556:32;;20624:1;20607:19;;:5;:19;;;;20599:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20690:5;20683:12;;;20464:239;;;:::o;4635:188:0:-;4748:17;4756:8;4748:7;:17::i;:::-;4732:33;;:12;:10;:12::i;:::-;:33;;;4724:42;;;;;;4802:13;4777:12;:22;4790:8;4777:22;;;;;;;;;;;:38;;;;;;;;;;;;:::i;:::-;;4635:188;;:::o;3150:21::-;;;;:::o;20194:208:1:-;20266:7;20311:1;20294:19;;:5;:19;;;;20286:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20378:9;:16;20388:5;20378:16;;;;;;;;;;;;;;;;20371:23;;20194:208;;;:::o;5107:129:0:-;5148:13;5180:48;5197:30;5211:15;5197:13;:30::i;:::-;5180:16;:48::i;:::-;5173:55;;5107:129;:::o;3123:20::-;;;;;;;;;;;;;:::o;20939:104:1:-;20995:13;21028:7;21021:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20939:104;:::o;22523:295::-;22638:12;:10;:12::i;:::-;22626:24;;:8;:24;;;;22618:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22738:8;22693:18;:32;22712:12;:10;:12::i;:::-;22693:32;;;;;;;;;;;;;;;:42;22726:8;22693:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;22791:8;22762:48;;22777:12;:10;:12::i;:::-;22762:48;;;22801:8;22762:48;;;;;;:::i;:::-;;;;;;;;22523:295;;:::o;3398:294:0:-;3470:5;;;;;;;;;;;3454:21;;:12;:10;:12::i;:::-;:21;;;3445:32;;;;;;3488:11;3514:3;3510:1;3502:5;;:9;;;;:::i;:::-;:15;;;;:::i;:::-;3488:29;;3533:6;3542:5;;3533:14;;3528:157;3554:6;3549:1;:11;3528:157;;3582:25;3593:5;;;;;;;;;;;3601;;3582:9;:25::i;:::-;3641:10;:8;:10::i;:::-;3622:9;:16;3632:5;;3622:16;;;;;;;;;;;:29;;;;;;;;;;;;:::i;:::-;;3666:5;;:7;;;;;;;;;:::i;:::-;;;;;;3562:3;;;;;:::i;:::-;;;;3528:157;;;;3434:258;3398:294;:::o;23718:285:1:-;23850:41;23869:12;:10;:12::i;:::-;23883:7;23850:18;:41::i;:::-;23842:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23956:39;23970:4;23976:2;23980:7;23989:5;23956:13;:39::i;:::-;23718:285;;;;:::o;4033:594:0:-;4159:13;4204:1;4193:7;:12;4190:235;;;4221:20;4268:1;4270;4268:4;;;;;;;:::i;:::-;;;4273:1;4275;4273:4;;;;;;;:::i;:::-;;;4278:25;4295:7;4278:16;:25::i;:::-;4304:1;4306;4304:4;;;;;;;:::i;:::-;;;4309:1;4311;4309:4;;;;;;;:::i;:::-;;;4314:1;4316;4314:4;;;;;;;:::i;:::-;;;4319:1;4321;4319:4;;;;;;;:::i;:::-;;;4324:1;4326;4324:4;;;;;;;:::i;:::-;;;4329:9;:18;4339:7;4329:18;;;;;;;;;;;4348:1;4350;4348:4;;;;;;;:::i;:::-;;;4353:25;4370:7;4353:16;:25::i;:::-;4379:1;4381;4379:4;;;;;;;:::i;:::-;;;4251:133;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4221:164;;4407:6;4400:13;;;;;4190:235;4435:18;4480:1;4482;4480:4;;;;;;;:::i;:::-;;;4485:1;4487;4485:4;;;;;;;:::i;:::-;;;4490:25;4507:7;4490:16;:25::i;:::-;4516:1;4518;4516:4;;;;;;;:::i;:::-;;;4521:1;4523;4521:4;;;;;;;:::i;:::-;;;4526:1;4528;4526:4;;;;;;;:::i;:::-;;;4531:1;4533;4531:4;;;;;;;:::i;:::-;;;4536:1;4538;4536:4;;;;;;;:::i;:::-;;;4541:9;:18;4551:7;4541:18;;;;;;;;;;;4560:1;4562;4560:4;;;;;;;:::i;:::-;;;4565:25;4582:7;4565:16;:25::i;:::-;4591:1;4593;4591:4;;;;;;;:::i;:::-;;;4463:133;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4435:162;;4615:4;4608:11;;;4033:594;;;;:::o;22889:164:1:-;22986:4;23010:18;:25;23029:5;23010:25;;;;;;;;;;;;;;;:35;23036:8;23010:35;;;;;;;;;;;;;;;;;;;;;;;;;23003:42;;22889:164;;;;:::o;9573:422::-;9633:4;9841:12;9952:7;9940:20;9932:28;;9986:1;9979:4;:8;9972:15;;;9573:422;;;:::o;35053:555::-;35163:45;35190:4;35196:2;35200:7;35163:26;:45::i;:::-;35241:1;35225:18;;:4;:18;;;35221:187;;;35260:40;35292:7;35260:31;:40::i;:::-;35221:187;;;35330:2;35322:10;;:4;:10;;;35318:90;;35349:47;35382:4;35388:7;35349:32;:47::i;:::-;35318:90;35221:187;35436:1;35422:16;;:2;:16;;;35418:183;;;35455:45;35492:7;35455:36;:45::i;:::-;35418:183;;;35528:4;35522:10;;:2;:10;;;35518:83;;35549:40;35577:2;35581:7;35549:27;:40::i;:::-;35518:83;35418:183;35053:555;;;:::o;31542:93::-;;;;:::o;33364:237::-;33466:4;33505:35;33490:50;;;:11;:50;;;;:103;;;;33557:36;33581:11;33557:23;:36::i;:::-;33490:103;33483:110;;33364:237;;;:::o;25470:127::-;25535:4;25587:1;25559:30;;:7;:16;25567:7;25559:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25552:37;;25470:127;;;:::o;17379:98::-;17432:7;17459:10;17452:17;;17379:98;:::o;29347:174::-;29449:2;29422:15;:24;29438:7;29422:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29505:7;29501:2;29467:46;;29476:23;29491:7;29476:14;:23::i;:::-;29467:46;;;;;;;;;;;;29347:174;;:::o;25764:348::-;25857:4;25882:16;25890:7;25882;:16::i;:::-;25874:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25958:13;25974:23;25989:7;25974:14;:23::i;:::-;25958:39;;26027:5;26016:16;;:7;:16;;;:51;;;;26060:7;26036:31;;:20;26048:7;26036:11;:20::i;:::-;:31;;;26016:51;:87;;;;26071:32;26088:5;26095:7;26071:16;:32::i;:::-;26016:87;26008:96;;;25764:348;;;;:::o;28685:544::-;28810:4;28783:31;;:23;28798:7;28783:14;:23::i;:::-;:31;;;28775:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;28893:1;28879:16;;:2;:16;;;;28871:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;28949:39;28970:4;28976:2;28980:7;28949:20;:39::i;:::-;29053:29;29070:1;29074:7;29053:8;:29::i;:::-;29114:1;29095:9;:15;29105:4;29095:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29143:1;29126:9;:13;29136:2;29126:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29174:2;29155:7;:16;29163:7;29155:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29213:7;29209:2;29194:27;;29203:4;29194:27;;;;;;;;;;;;28685:544;;;:::o;5658:723::-;5714:13;5944:1;5935:5;:10;5931:53;;;5962:10;;;;;;;;;;;;;;;;;;;;;5931:53;5994:12;6009:5;5994:20;;6025:14;6050:78;6065:1;6057:4;:9;6050:78;;6083:8;;;;;:::i;:::-;;;;6114:2;6106:10;;;;;:::i;:::-;;;6050:78;;;6138:19;6170:6;6160:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6138:39;;6188:154;6204:1;6195:5;:10;6188:154;;6232:1;6222:11;;;;;:::i;:::-;;;6299:2;6291:5;:10;;;;:::i;:::-;6278:2;:24;;;;:::i;:::-;6265:39;;6248:6;6255;6248:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;6328:2;6319:11;;;;;:::i;:::-;;;6188:154;;;6366:6;6352:21;;;;;5658:723;;;;:::o;26454:110::-;26530:26;26540:2;26544:7;26530:26;;;;;;;;;;;;:9;:26::i;:::-;26454:110;;:::o;24885:272::-;24999:28;25009:4;25015:2;25019:7;24999:9;:28::i;:::-;25046:48;25069:4;25075:2;25079:7;25088:5;25046:22;:48::i;:::-;25038:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;24885:272;;;;:::o;36331:164::-;36435:10;:17;;;;36408:15;:24;36424:7;36408:24;;;;;;;;;;;:44;;;;36463:10;36479:7;36463:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36331:164;:::o;37122:988::-;37388:22;37438:1;37413:22;37430:4;37413:16;:22::i;:::-;:26;;;;:::i;:::-;37388:51;;37450:18;37471:17;:26;37489:7;37471:26;;;;;;;;;;;;37450:47;;37618:14;37604:10;:28;37600:328;;37649:19;37671:12;:18;37684:4;37671:18;;;;;;;;;;;;;;;:34;37690:14;37671:34;;;;;;;;;;;;37649:56;;37755:11;37722:12;:18;37735:4;37722:18;;;;;;;;;;;;;;;:30;37741:10;37722:30;;;;;;;;;;;:44;;;;37872:10;37839:17;:30;37857:11;37839:30;;;;;;;;;;;:43;;;;37634:294;37600:328;38024:17;:26;38042:7;38024:26;;;;;;;;;;;38017:33;;;38068:12;:18;38081:4;38068:18;;;;;;;;;;;;;;;:34;38087:14;38068:34;;;;;;;;;;;38061:41;;;37203:907;;37122:988;;:::o;38405:1079::-;38658:22;38703:1;38683:10;:17;;;;:21;;;;:::i;:::-;38658:46;;38715:18;38736:15;:24;38752:7;38736:24;;;;;;;;;;;;38715:45;;39087:19;39109:10;39120:14;39109:26;;;;;;;;:::i;:::-;;;;;;;;;;39087:48;;39173:11;39148:10;39159;39148:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;39284:10;39253:15;:28;39269:11;39253:28;;;;;;;;;;;:41;;;;39425:15;:24;39441:7;39425:24;;;;;;;;;;;39418:31;;;39460:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38476:1008;;;38405:1079;:::o;35909:221::-;35994:14;36011:20;36028:2;36011:16;:20::i;:::-;35994:37;;36069:7;36042:12;:16;36055:2;36042:16;;;;;;;;;;;;;;;:24;36059:6;36042:24;;;;;;;;;;;:34;;;;36116:6;36087:17;:26;36105:7;36087:26;;;;;;;;;;;:35;;;;35983:147;35909:221;;:::o;19838:292::-;19940:4;19979:25;19964:40;;;:11;:40;;;;:105;;;;20036:33;20021:48;;;:11;:48;;;;19964:105;:158;;;;20086:36;20110:11;20086:23;:36::i;:::-;19964:158;19957:165;;19838:292;;;:::o;3700:203:0:-;3850:45;3877:4;3883:2;3887:7;3850:26;:45::i;:::-;3700:203;;;:::o;26791:250:1:-;26887:18;26893:2;26897:7;26887:5;:18::i;:::-;26924:54;26955:1;26959:2;26963:7;26972:5;26924:22;:54::i;:::-;26916:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;26791:250;;;:::o;30086:843::-;30207:4;30233:15;:2;:13;;;:15::i;:::-;30229:693;;;30285:2;30269:36;;;30306:12;:10;:12::i;:::-;30320:4;30326:7;30335:5;30269:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30265:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30532:1;30515:6;:13;:18;30511:341;;;30558:60;;;;;;;;;;:::i;:::-;;;;;;;;30511:341;30802:6;30796:13;30787:6;30783:2;30779:15;30772:38;30265:602;30402:45;;;30392:55;;;:6;:55;;;;30385:62;;;;;30229:693;30906:4;30899:11;;30086:843;;;;;;;:::o;18439:157::-;18524:4;18563:25;18548:40;;;:11;:40;;;;18541:47;;18439:157;;;:::o;27377:382::-;27471:1;27457:16;;:2;:16;;;;27449:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27530:16;27538:7;27530;:16::i;:::-;27529:17;27521:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27592:45;27621:1;27625:2;27629:7;27592:20;:45::i;:::-;27667:1;27650:9;:13;27660:2;27650:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;27698:2;27679:7;:16;27687:7;27679:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;27743:7;27739:2;27718:33;;27735:1;27718:33;;;;;;;;;;;;27377:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:2:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:180;6209:77;6206:1;6199:88;6306:4;6303:1;6296:15;6330:4;6327:1;6320:15;6347:281;6430:27;6452:4;6430:27;:::i;:::-;6422:6;6418:40;6560:6;6548:10;6545:22;6524:18;6512:10;6509:34;6506:62;6503:88;;;6571:18;;:::i;:::-;6503:88;6611:10;6607:2;6600:22;6390:238;6347:281;;:::o;6634:129::-;6668:6;6695:20;;:::i;:::-;6685:30;;6724:33;6752:4;6744:6;6724:33;:::i;:::-;6634:129;;;:::o;6769:308::-;6831:4;6921:18;6913:6;6910:30;6907:56;;;6943:18;;:::i;:::-;6907:56;6981:29;7003:6;6981:29;:::i;:::-;6973:37;;7065:4;7059;7055:15;7047:23;;6769:308;;;:::o;7083:154::-;7167:6;7162:3;7157;7144:30;7229:1;7220:6;7215:3;7211:16;7204:27;7083:154;;;:::o;7243:412::-;7321:5;7346:66;7362:49;7404:6;7362:49;:::i;:::-;7346:66;:::i;:::-;7337:75;;7435:6;7428:5;7421:21;7473:4;7466:5;7462:16;7511:3;7502:6;7497:3;7493:16;7490:25;7487:112;;;7518:79;;:::i;:::-;7487:112;7608:41;7642:6;7637:3;7632;7608:41;:::i;:::-;7327:328;7243:412;;;;;:::o;7675:340::-;7731:5;7780:3;7773:4;7765:6;7761:17;7757:27;7747:122;;7788:79;;:::i;:::-;7747:122;7905:6;7892:20;7930:79;8005:3;7997:6;7990:4;7982:6;7978:17;7930:79;:::i;:::-;7921:88;;7737:278;7675:340;;;;:::o;8021:654::-;8099:6;8107;8156:2;8144:9;8135:7;8131:23;8127:32;8124:119;;;8162:79;;:::i;:::-;8124:119;8282:1;8307:53;8352:7;8343:6;8332:9;8328:22;8307:53;:::i;:::-;8297:63;;8253:117;8437:2;8426:9;8422:18;8409:32;8468:18;8460:6;8457:30;8454:117;;;8490:79;;:::i;:::-;8454:117;8595:63;8650:7;8641:6;8630:9;8626:22;8595:63;:::i;:::-;8585:73;;8380:288;8021:654;;;;;:::o;8681:329::-;8740:6;8789:2;8777:9;8768:7;8764:23;8760:32;8757:119;;;8795:79;;:::i;:::-;8757:119;8915:1;8940:53;8985:7;8976:6;8965:9;8961:22;8940:53;:::i;:::-;8930:63;;8886:117;8681:329;;;;:::o;9016:116::-;9086:21;9101:5;9086:21;:::i;:::-;9079:5;9076:32;9066:60;;9122:1;9119;9112:12;9066:60;9016:116;:::o;9138:133::-;9181:5;9219:6;9206:20;9197:29;;9235:30;9259:5;9235:30;:::i;:::-;9138:133;;;;:::o;9277:468::-;9342:6;9350;9399:2;9387:9;9378:7;9374:23;9370:32;9367:119;;;9405:79;;:::i;:::-;9367:119;9525:1;9550:53;9595:7;9586:6;9575:9;9571:22;9550:53;:::i;:::-;9540:63;;9496:117;9652:2;9678:50;9720:7;9711:6;9700:9;9696:22;9678:50;:::i;:::-;9668:60;;9623:115;9277:468;;;;;:::o;9751:307::-;9812:4;9902:18;9894:6;9891:30;9888:56;;;9924:18;;:::i;:::-;9888:56;9962:29;9984:6;9962:29;:::i;:::-;9954:37;;10046:4;10040;10036:15;10028:23;;9751:307;;;:::o;10064:410::-;10141:5;10166:65;10182:48;10223:6;10182:48;:::i;:::-;10166:65;:::i;:::-;10157:74;;10254:6;10247:5;10240:21;10292:4;10285:5;10281:16;10330:3;10321:6;10316:3;10312:16;10309:25;10306:112;;;10337:79;;:::i;:::-;10306:112;10427:41;10461:6;10456:3;10451;10427:41;:::i;:::-;10147:327;10064:410;;;;;:::o;10493:338::-;10548:5;10597:3;10590:4;10582:6;10578:17;10574:27;10564:122;;10605:79;;:::i;:::-;10564:122;10722:6;10709:20;10747:78;10821:3;10813:6;10806:4;10798:6;10794:17;10747:78;:::i;:::-;10738:87;;10554:277;10493:338;;;;:::o;10837:943::-;10932:6;10940;10948;10956;11005:3;10993:9;10984:7;10980:23;10976:33;10973:120;;;11012:79;;:::i;:::-;10973:120;11132:1;11157:53;11202:7;11193:6;11182:9;11178:22;11157:53;:::i;:::-;11147:63;;11103:117;11259:2;11285:53;11330:7;11321:6;11310:9;11306:22;11285:53;:::i;:::-;11275:63;;11230:118;11387:2;11413:53;11458:7;11449:6;11438:9;11434:22;11413:53;:::i;:::-;11403:63;;11358:118;11543:2;11532:9;11528:18;11515:32;11574:18;11566:6;11563:30;11560:117;;;11596:79;;:::i;:::-;11560:117;11701:62;11755:7;11746:6;11735:9;11731:22;11701:62;:::i;:::-;11691:72;;11486:287;10837:943;;;;;;;:::o;11786:474::-;11854:6;11862;11911:2;11899:9;11890:7;11886:23;11882:32;11879:119;;;11917:79;;:::i;:::-;11879:119;12037:1;12062:53;12107:7;12098:6;12087:9;12083:22;12062:53;:::i;:::-;12052:63;;12008:117;12164:2;12190:53;12235:7;12226:6;12215:9;12211:22;12190:53;:::i;:::-;12180:63;;12135:118;11786:474;;;;;:::o;12266:180::-;12314:77;12311:1;12304:88;12411:4;12408:1;12401:15;12435:4;12432:1;12425:15;12452:320;12496:6;12533:1;12527:4;12523:12;12513:22;;12580:1;12574:4;12570:12;12601:18;12591:81;;12657:4;12649:6;12645:17;12635:27;;12591:81;12719:2;12711:6;12708:14;12688:18;12685:38;12682:84;;;12738:18;;:::i;:::-;12682:84;12503:269;12452:320;;;:::o;12778:231::-;12918:34;12914:1;12906:6;12902:14;12895:58;12987:14;12982:2;12974:6;12970:15;12963:39;12778:231;:::o;13015:366::-;13157:3;13178:67;13242:2;13237:3;13178:67;:::i;:::-;13171:74;;13254:93;13343:3;13254:93;:::i;:::-;13372:2;13367:3;13363:12;13356:19;;13015:366;;;:::o;13387:419::-;13553:4;13591:2;13580:9;13576:18;13568:26;;13640:9;13634:4;13630:20;13626:1;13615:9;13611:17;13604:47;13668:131;13794:4;13668:131;:::i;:::-;13660:139;;13387:419;;;:::o;13812:220::-;13952:34;13948:1;13940:6;13936:14;13929:58;14021:3;14016:2;14008:6;14004:15;13997:28;13812:220;:::o;14038:366::-;14180:3;14201:67;14265:2;14260:3;14201:67;:::i;:::-;14194:74;;14277:93;14366:3;14277:93;:::i;:::-;14395:2;14390:3;14386:12;14379:19;;14038:366;;;:::o;14410:419::-;14576:4;14614:2;14603:9;14599:18;14591:26;;14663:9;14657:4;14653:20;14649:1;14638:9;14634:17;14627:47;14691:131;14817:4;14691:131;:::i;:::-;14683:139;;14410:419;;;:::o;14835:243::-;14975:34;14971:1;14963:6;14959:14;14952:58;15044:26;15039:2;15031:6;15027:15;15020:51;14835:243;:::o;15084:366::-;15226:3;15247:67;15311:2;15306:3;15247:67;:::i;:::-;15240:74;;15323:93;15412:3;15323:93;:::i;:::-;15441:2;15436:3;15432:12;15425:19;;15084:366;;;:::o;15456:419::-;15622:4;15660:2;15649:9;15645:18;15637:26;;15709:9;15703:4;15699:20;15695:1;15684:9;15680:17;15673:47;15737:131;15863:4;15737:131;:::i;:::-;15729:139;;15456:419;;;:::o;15881:236::-;16021:34;16017:1;16009:6;16005:14;15998:58;16090:19;16085:2;16077:6;16073:15;16066:44;15881:236;:::o;16123:366::-;16265:3;16286:67;16350:2;16345:3;16286:67;:::i;:::-;16279:74;;16362:93;16451:3;16362:93;:::i;:::-;16480:2;16475:3;16471:12;16464:19;;16123:366;;;:::o;16495:419::-;16661:4;16699:2;16688:9;16684:18;16676:26;;16748:9;16742:4;16738:20;16734:1;16723:9;16719:17;16712:47;16776:131;16902:4;16776:131;:::i;:::-;16768:139;;16495:419;;;:::o;16920:230::-;17060:34;17056:1;17048:6;17044:14;17037:58;17129:13;17124:2;17116:6;17112:15;17105:38;16920:230;:::o;17156:366::-;17298:3;17319:67;17383:2;17378:3;17319:67;:::i;:::-;17312:74;;17395:93;17484:3;17395:93;:::i;:::-;17513:2;17508:3;17504:12;17497:19;;17156:366;;;:::o;17528:419::-;17694:4;17732:2;17721:9;17717:18;17709:26;;17781:9;17775:4;17771:20;17767:1;17756:9;17752:17;17745:47;17809:131;17935:4;17809:131;:::i;:::-;17801:139;;17528:419;;;:::o;17953:180::-;18001:77;17998:1;17991:88;18098:4;18095:1;18088:15;18122:4;18119:1;18112:15;18139:180;18187:77;18184:1;18177:88;18284:4;18281:1;18274:15;18308:4;18305:1;18298:15;18325:185;18365:1;18382:20;18400:1;18382:20;:::i;:::-;18377:25;;18416:20;18434:1;18416:20;:::i;:::-;18411:25;;18455:1;18445:35;;18460:18;;:::i;:::-;18445:35;18502:1;18499;18495:9;18490:14;;18325:185;;;;:::o;18516:305::-;18556:3;18575:20;18593:1;18575:20;:::i;:::-;18570:25;;18609:20;18627:1;18609:20;:::i;:::-;18604:25;;18763:1;18695:66;18691:74;18688:1;18685:81;18682:107;;;18769:18;;:::i;:::-;18682:107;18813:1;18810;18806:9;18799:16;;18516:305;;;;:::o;18827:148::-;18929:11;18966:3;18951:18;;18827:148;;;;:::o;18981:114::-;;:::o;19101:400::-;19261:3;19282:84;19364:1;19359:3;19282:84;:::i;:::-;19275:91;;19375:93;19464:3;19375:93;:::i;:::-;19493:1;19488:3;19484:11;19477:18;;19101:400;;;:::o;19507:381::-;19692:3;19714:148;19858:3;19714:148;:::i;:::-;19707:155;;19879:3;19872:10;;19507:381;;;:::o;19894:141::-;19943:4;19966:3;19958:11;;19989:3;19986:1;19979:14;20023:4;20020:1;20010:18;20002:26;;19894:141;;;:::o;20065:845::-;20168:3;20205:5;20199:12;20234:36;20260:9;20234:36;:::i;:::-;20286:89;20368:6;20363:3;20286:89;:::i;:::-;20279:96;;20406:1;20395:9;20391:17;20422:1;20417:137;;;;20568:1;20563:341;;;;20384:520;;20417:137;20501:4;20497:9;20486;20482:25;20477:3;20470:38;20537:6;20532:3;20528:16;20521:23;;20417:137;;20563:341;20630:38;20662:5;20630:38;:::i;:::-;20690:1;20704:154;20718:6;20715:1;20712:13;20704:154;;;20792:7;20786:14;20782:1;20777:3;20773:11;20766:35;20842:1;20833:7;20829:15;20818:26;;20740:4;20737:1;20733:12;20728:17;;20704:154;;;20887:6;20882:3;20878:16;20871:23;;20570:334;;20384:520;;20172:738;;20065:845;;;;:::o;20916:269::-;21045:3;21067:92;21155:3;21146:6;21067:92;:::i;:::-;21060:99;;21176:3;21169:10;;20916:269;;;;:::o;21191:231::-;21331:34;21327:1;21319:6;21315:14;21308:58;21400:14;21395:2;21387:6;21383:15;21376:39;21191:231;:::o;21428:366::-;21570:3;21591:67;21655:2;21650:3;21591:67;:::i;:::-;21584:74;;21667:93;21756:3;21667:93;:::i;:::-;21785:2;21780:3;21776:12;21769:19;;21428:366;;;:::o;21800:419::-;21966:4;22004:2;21993:9;21989:18;21981:26;;22053:9;22047:4;22043:20;22039:1;22028:9;22024:17;22017:47;22081:131;22207:4;22081:131;:::i;:::-;22073:139;;21800:419;;;:::o;22225:180::-;22273:77;22270:1;22263:88;22370:4;22367:1;22360:15;22394:4;22391:1;22384:15;22411:228;22551:34;22547:1;22539:6;22535:14;22528:58;22620:11;22615:2;22607:6;22603:15;22596:36;22411:228;:::o;22645:366::-;22787:3;22808:67;22872:2;22867:3;22808:67;:::i;:::-;22801:74;;22884:93;22973:3;22884:93;:::i;:::-;23002:2;22997:3;22993:12;22986:19;;22645:366;;;:::o;23017:419::-;23183:4;23221:2;23210:9;23206:18;23198:26;;23270:9;23264:4;23260:20;23256:1;23245:9;23241:17;23234:47;23298:131;23424:4;23298:131;:::i;:::-;23290:139;;23017:419;;;:::o;23442:229::-;23582:34;23578:1;23570:6;23566:14;23559:58;23651:12;23646:2;23638:6;23634:15;23627:37;23442:229;:::o;23677:366::-;23819:3;23840:67;23904:2;23899:3;23840:67;:::i;:::-;23833:74;;23916:93;24005:3;23916:93;:::i;:::-;24034:2;24029:3;24025:12;24018:19;;23677:366;;;:::o;24049:419::-;24215:4;24253:2;24242:9;24238:18;24230:26;;24302:9;24296:4;24292:20;24288:1;24277:9;24273:17;24266:47;24330:131;24456:4;24330:131;:::i;:::-;24322:139;;24049:419;;;:::o;24474:175::-;24614:27;24610:1;24602:6;24598:14;24591:51;24474:175;:::o;24655:366::-;24797:3;24818:67;24882:2;24877:3;24818:67;:::i;:::-;24811:74;;24894:93;24983:3;24894:93;:::i;:::-;25012:2;25007:3;25003:12;24996:19;;24655:366;;;:::o;25027:419::-;25193:4;25231:2;25220:9;25216:18;25208:26;;25280:9;25274:4;25270:20;25266:1;25255:9;25251:17;25244:47;25308:131;25434:4;25308:131;:::i;:::-;25300:139;;25027:419;;;:::o;25452:191::-;25492:4;25512:20;25530:1;25512:20;:::i;:::-;25507:25;;25546:20;25564:1;25546:20;:::i;:::-;25541:25;;25585:1;25582;25579:8;25576:34;;;25590:18;;:::i;:::-;25576:34;25635:1;25632;25628:9;25620:17;;25452:191;;;;:::o;25649:233::-;25688:3;25711:24;25729:5;25711:24;:::i;:::-;25702:33;;25757:66;25750:5;25747:77;25744:103;;;25827:18;;:::i;:::-;25744:103;25874:1;25867:5;25863:13;25856:20;;25649:233;;;:::o;25888:377::-;25994:3;26022:39;26055:5;26022:39;:::i;:::-;26077:89;26159:6;26154:3;26077:89;:::i;:::-;26070:96;;26175:52;26220:6;26215:3;26208:4;26201:5;26197:16;26175:52;:::i;:::-;26252:6;26247:3;26243:16;26236:23;;25998:267;25888:377;;;;:::o;26271:1979::-;26903:3;26925:92;27013:3;27004:6;26925:92;:::i;:::-;26918:99;;27034:92;27122:3;27113:6;27034:92;:::i;:::-;27027:99;;27143:95;27234:3;27225:6;27143:95;:::i;:::-;27136:102;;27255:92;27343:3;27334:6;27255:92;:::i;:::-;27248:99;;27364:92;27452:3;27443:6;27364:92;:::i;:::-;27357:99;;27473:92;27561:3;27552:6;27473:92;:::i;:::-;27466:99;;27582:92;27670:3;27661:6;27582:92;:::i;:::-;27575:99;;27691:92;27779:3;27770:6;27691:92;:::i;:::-;27684:99;;27800:92;27888:3;27879:6;27800:92;:::i;:::-;27793:99;;27909:92;27997:3;27988:6;27909:92;:::i;:::-;27902:99;;28018:96;28110:3;28100:7;28018:96;:::i;:::-;28011:103;;28131:93;28220:3;28210:7;28131:93;:::i;:::-;28124:100;;28241:3;28234:10;;26271:1979;;;;;;;;;;;;;;;:::o;28256:231::-;28396:34;28392:1;28384:6;28380:14;28373:58;28465:14;28460:2;28452:6;28448:15;28441:39;28256:231;:::o;28493:366::-;28635:3;28656:67;28720:2;28715:3;28656:67;:::i;:::-;28649:74;;28732:93;28821:3;28732:93;:::i;:::-;28850:2;28845:3;28841:12;28834:19;;28493:366;;;:::o;28865:419::-;29031:4;29069:2;29058:9;29054:18;29046:26;;29118:9;29112:4;29108:20;29104:1;29093:9;29089:17;29082:47;29146:131;29272:4;29146:131;:::i;:::-;29138:139;;28865:419;;;:::o;29290:228::-;29430:34;29426:1;29418:6;29414:14;29407:58;29499:11;29494:2;29486:6;29482:15;29475:36;29290:228;:::o;29524:366::-;29666:3;29687:67;29751:2;29746:3;29687:67;:::i;:::-;29680:74;;29763:93;29852:3;29763:93;:::i;:::-;29881:2;29876:3;29872:12;29865:19;;29524:366;;;:::o;29896:419::-;30062:4;30100:2;30089:9;30085:18;30077:26;;30149:9;30143:4;30139:20;30135:1;30124:9;30120:17;30113:47;30177:131;30303:4;30177:131;:::i;:::-;30169:139;;29896:419;;;:::o;30321:223::-;30461:34;30457:1;30449:6;30445:14;30438:58;30530:6;30525:2;30517:6;30513:15;30506:31;30321:223;:::o;30550:366::-;30692:3;30713:67;30777:2;30772:3;30713:67;:::i;:::-;30706:74;;30789:93;30878:3;30789:93;:::i;:::-;30907:2;30902:3;30898:12;30891:19;;30550:366;;;:::o;30922:419::-;31088:4;31126:2;31115:9;31111:18;31103:26;;31175:9;31169:4;31165:20;31161:1;31150:9;31146:17;31139:47;31203:131;31329:4;31203:131;:::i;:::-;31195:139;;30922:419;;;:::o;31347:176::-;31379:1;31396:20;31414:1;31396:20;:::i;:::-;31391:25;;31430:20;31448:1;31430:20;:::i;:::-;31425:25;;31469:1;31459:35;;31474:18;;:::i;:::-;31459:35;31515:1;31512;31508:9;31503:14;;31347:176;;;;:::o;31529:237::-;31669:34;31665:1;31657:6;31653:14;31646:58;31738:20;31733:2;31725:6;31721:15;31714:45;31529:237;:::o;31772:366::-;31914:3;31935:67;31999:2;31994:3;31935:67;:::i;:::-;31928:74;;32011:93;32100:3;32011:93;:::i;:::-;32129:2;32124:3;32120:12;32113:19;;31772:366;;;:::o;32144:419::-;32310:4;32348:2;32337:9;32333:18;32325:26;;32397:9;32391:4;32387:20;32383:1;32372:9;32368:17;32361:47;32425:131;32551:4;32425:131;:::i;:::-;32417:139;;32144:419;;;:::o;32569:180::-;32617:77;32614:1;32607:88;32714:4;32711:1;32704:15;32738:4;32735:1;32728:15;32755:98;32806:6;32840:5;32834:12;32824:22;;32755:98;;;:::o;32859:168::-;32942:11;32976:6;32971:3;32964:19;33016:4;33011:3;33007:14;32992:29;;32859:168;;;;:::o;33033:360::-;33119:3;33147:38;33179:5;33147:38;:::i;:::-;33201:70;33264:6;33259:3;33201:70;:::i;:::-;33194:77;;33280:52;33325:6;33320:3;33313:4;33306:5;33302:16;33280:52;:::i;:::-;33357:29;33379:6;33357:29;:::i;:::-;33352:3;33348:39;33341:46;;33123:270;33033:360;;;;:::o;33399:640::-;33594:4;33632:3;33621:9;33617:19;33609:27;;33646:71;33714:1;33703:9;33699:17;33690:6;33646:71;:::i;:::-;33727:72;33795:2;33784:9;33780:18;33771:6;33727:72;:::i;:::-;33809;33877:2;33866:9;33862:18;33853:6;33809:72;:::i;:::-;33928:9;33922:4;33918:20;33913:2;33902:9;33898:18;33891:48;33956:76;34027:4;34018:6;33956:76;:::i;:::-;33948:84;;33399:640;;;;;;;:::o;34045:141::-;34101:5;34132:6;34126:13;34117:22;;34148:32;34174:5;34148:32;:::i;:::-;34045:141;;;;:::o;34192:349::-;34261:6;34310:2;34298:9;34289:7;34285:23;34281:32;34278:119;;;34316:79;;:::i;:::-;34278:119;34436:1;34461:63;34516:7;34507:6;34496:9;34492:22;34461:63;:::i;:::-;34451:73;;34407:127;34192:349;;;;:::o;34547:182::-;34687:34;34683:1;34675:6;34671:14;34664:58;34547:182;:::o;34735:366::-;34877:3;34898:67;34962:2;34957:3;34898:67;:::i;:::-;34891:74;;34974:93;35063:3;34974:93;:::i;:::-;35092:2;35087:3;35083:12;35076:19;;34735:366;;;:::o;35107:419::-;35273:4;35311:2;35300:9;35296:18;35288:26;;35360:9;35354:4;35350:20;35346:1;35335:9;35331:17;35324:47;35388:131;35514:4;35388:131;:::i;:::-;35380:139;;35107:419;;;:::o;35532:178::-;35672:30;35668:1;35660:6;35656:14;35649:54;35532:178;:::o;35716:366::-;35858:3;35879:67;35943:2;35938:3;35879:67;:::i;:::-;35872:74;;35955:93;36044:3;35955:93;:::i;:::-;36073:2;36068:3;36064:12;36057:19;;35716:366;;;:::o;36088:419::-;36254:4;36292:2;36281:9;36277:18;36269:26;;36341:9;36335:4;36331:20;36327:1;36316:9;36312:17;36305:47;36369:131;36495:4;36369:131;:::i;:::-;36361:139;;36088:419;;;:::o

Swarm Source

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