Contract 0x38abA480f2bA7A17bC01EE5E1AD64fCedd93EfE7

Txn Hash Method
Block
From
To
Value
0x91075d9e4fdfaf919ce5bed83c43d359673e739d2a03696eb7a44d5a0d223826Faucet168290642023-11-04 8:23:16115 days 6 hrs ago0x8935d3183d19b4f88bed80545f282124ba016b04 IN  0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH0.000016341380.11
0xaa046f2450d80e8f676e3ae362b0402a5f60b64259c00d78cbe1f1c07b06ad92Faucet163182452023-10-23 12:35:58127 days 2 hrs ago0x7ece02800cad789fdc2553fad88aa1030cc4df76 IN  0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH0.0002264419311.50000005
0x8193104b0ae3becbe2b81c48e0dde58aaa3829e5f8122d4d0b3c9fe7e8dd7831Faucet152069852023-09-27 19:13:58152 days 19 hrs ago0x1b1e924a0a9c86a9023be9791bb81ecfb8cc4011 IN  0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH0.0002270370071.50000005
0x0b38dd43544b296209b1f3a70f232787b39a3b57bf537a728e27d2842edbec6cFaucet152069822023-09-27 19:13:52152 days 19 hrs ago0x1b1e924a0a9c86a9023be9791bb81ecfb8cc4011 IN  0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH0.0002270370071.50000005
0xae55183a8d1fdf30a7fc584ade7f2a1346440871f79d77850e0e2e0d3c684c25Faucet152069792023-09-27 19:13:46152 days 19 hrs ago0x1b1e924a0a9c86a9023be9791bb81ecfb8cc4011 IN  0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH0.0002228370071.500000051
0x9aa3a95c4c594b77486f963e173ccab69f8c548a5025c8c9d96857779838150fSet Approval For...150795102023-09-24 20:24:48155 days 18 hrs ago0x1b1e924a0a9c86a9023be9791bb81ecfb8cc4011 IN  0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH0.0000701055021.50000005
0x1c57fc47c9b80425cc98d3cf4a2966a0e5f48c5edb23bee4b8fd7412748dcd19Faucet142931182023-09-06 15:31:44173 days 23 hrs ago0x0153867e54f3a3a21217c989e9ceb939d946cb26 IN  0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH0.0002270370071.50000005
0xed55100d071d6be84147aa9b60cf8bcc9c025dc586d34bd853a37cf3428298faFaucet142930902023-09-06 15:30:48173 days 23 hrs ago0x0153867e54f3a3a21217c989e9ceb939d946cb26 IN  0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH0.0002228370071.50000005
0x0216732ea8aabd187b51b89591f4cd321efb2a4f3868d43175d182189901ff75Faucet139910712023-08-30 15:43:30180 days 22 hrs ago0xdc5f22670df11f02ffd62b48f4b3d9d29783b33e IN  0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH0.0002228370071.50000005
0x5d65205a0a539f47a57b4eadf789036804d27d66926c1540e33e9b9cbc47f116Faucet137736832023-08-25 14:57:14185 days 23 hrs ago0x8d31794751b0dcf2f87efad9c5937490e71284d2 IN  0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH0.0002270370071.50000005
0x5b52f954906e76acbb9f7578a1e470a780bf685b030362598fa885837e342b48Faucet137734092023-08-25 14:48:06185 days 23 hrs ago0x8d31794751b0dcf2f87efad9c5937490e71284d2 IN  0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH0.0002270370071.50000005
0x4ecb83208a76bd9c8e997f8a02cfecb8732c672a4d2814619d3248ba4b5ae452Faucet137733162023-08-25 14:45:00185 days 23 hrs ago0x8d31794751b0dcf2f87efad9c5937490e71284d2 IN  0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH0.0002270370071.50000005
0xb03b1a5fb63f3057b3f293f0074f5a0458f56c74127a4e14f0386c277035e8d2Faucet137732972023-08-25 14:44:22185 days 23 hrs ago0x8d31794751b0dcf2f87efad9c5937490e71284d2 IN  0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH0.0002270370071.50000005
0xd29c8b958a0e0baca4643288c413c8ec123d6c6457d6fd4cb1e719b95d5327eeFaucet137732582023-08-25 14:43:04185 days 23 hrs ago0x8d31794751b0dcf2f87efad9c5937490e71284d2 IN  0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH0.0002270370071.50000005
0x6b0685d90f6592ea66fdfc48f74a492a169970415cb666d360f1183c75c593e6Faucet137732192023-08-25 14:41:46185 days 23 hrs ago0x8d31794751b0dcf2f87efad9c5937490e71284d2 IN  0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH0.0002270370071.50000005
0xc022ec244fe8dac38b816b0b3a0e178cbe2024e5194795bd680f42efb8fd95eeFaucet137731712023-08-25 14:40:10186 days ago0x8d31794751b0dcf2f87efad9c5937490e71284d2 IN  0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH0.0002270370071.50000005
0xea901d60cd959516d8addd8ed4408afa6431af0da7e6a903fd1863f0efbd251eFaucet137731592023-08-25 14:39:46186 days ago0x8d31794751b0dcf2f87efad9c5937490e71284d2 IN  0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH0.0002270370071.50000005
0x512812aa3561554c980b5921e6b97364b54a1b69e9927c93faf02cea1341881fFaucet137728702023-08-25 14:30:08186 days 10 mins ago0x8d31794751b0dcf2f87efad9c5937490e71284d2 IN  0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH0.0002270370071.50000005
0x49347d608163bd7cc0628bcfd9d8713977319f49f61322ef620aec88eeebc40fFaucet137725532023-08-25 14:19:34186 days 21 mins ago0x8d31794751b0dcf2f87efad9c5937490e71284d2 IN  0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH0.0002270370071.50000005
0x9e378e73cf9630cec3791a466c41f9db984a14fd803bcb98348739883973ddadFaucet137723242023-08-25 14:11:56186 days 28 mins ago0x8d31794751b0dcf2f87efad9c5937490e71284d2 IN  0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH0.0002270370071.50000005
0xac27723e095c0fdd8cdc78cce0f0b298be6af316a4e52b4bdd1fcb332487e7c7Faucet137722982023-08-25 14:11:04186 days 29 mins ago0x8d31794751b0dcf2f87efad9c5937490e71284d2 IN  0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH0.0002270370071.50000005
0x32f2996c7bcce8e6556258371647917df016757a1ed0284a9b9b76b9f0b1c9dbFaucet137722662023-08-25 14:10:00186 days 30 mins ago0x8d31794751b0dcf2f87efad9c5937490e71284d2 IN  0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH0.0002270370071.50000005
0x1b78160b3cfe1422a0191d352f10373c714500c398dba988ece4b1b1e835152bFaucet137722132023-08-25 14:08:14186 days 32 mins ago0x8d31794751b0dcf2f87efad9c5937490e71284d2 IN  0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH0.0002270370071.50000005
0xf87b1b769d9b5ebb95ec3f0eeab62703454efca7bde81c07144eaba6c8ab63f1Faucet137721972023-08-25 14:07:42186 days 33 mins ago0x8d31794751b0dcf2f87efad9c5937490e71284d2 IN  0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH0.0002270370071.50000005
0x0b2d346f13cc14689c230fa8ef7c965f3897d710bd29ea7711b1d85719b9b34dFaucet137721352023-08-25 14:05:38186 days 35 mins ago0x8d31794751b0dcf2f87efad9c5937490e71284d2 IN  0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH0.0002270370071.50000005
[ Download CSV Export 
Latest 24 internal transactions
Parent Txn Hash Block From To Value
0xeb898816a3b65462a766493d6640e35ffb7b1d4ccd917202c044a918c0c5673c110944352023-06-24 14:28:58248 days 11 mins ago 0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe7 0x6c205e7b3207b0bfe7975a7eaccbcec0d6ac569d0 ETH
0xeb898816a3b65462a766493d6640e35ffb7b1d4ccd917202c044a918c0c5673c110944352023-06-24 14:28:58248 days 11 mins ago 0x7248bf99b73c20fb05e6e3de26e8913b85d9ace5 0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH
0x4d4dae5fd7d435fc3a06836f681022a7dfd18c6e8fc375235f6b6cf39a58d8a1104237172023-06-09 1:51:42263 days 12 hrs ago 0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe7 0xf7a74056dc2951023d853b062f8bffb326f29d150 ETH
0x4d4dae5fd7d435fc3a06836f681022a7dfd18c6e8fc375235f6b6cf39a58d8a1104237172023-06-09 1:51:42263 days 12 hrs ago 0x7248bf99b73c20fb05e6e3de26e8913b85d9ace5 0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH
0xd1f33ef6410f3c934ccbfb73a62f6ec29336260b0214f766a92094079efdd785104071962023-06-08 16:41:00263 days 21 hrs ago 0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe7 0x280a98cb85311e24fea4c6fe64f63ab4267956ea0 ETH
0xd1f33ef6410f3c934ccbfb73a62f6ec29336260b0214f766a92094079efdd785104071962023-06-08 16:41:00263 days 21 hrs ago 0x7248bf99b73c20fb05e6e3de26e8913b85d9ace5 0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH
0x47f1933abc6d1d067b00787ac1e423cf816dd3737fe99b9764fabedb306cc132102765652023-06-05 16:06:38266 days 22 hrs ago 0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe7 0x4b743baf2ac6a48ed83488cc2cb42eeb8fee07c20 ETH
0x47f1933abc6d1d067b00787ac1e423cf816dd3737fe99b9764fabedb306cc132102765652023-06-05 16:06:38266 days 22 hrs ago 0x7248bf99b73c20fb05e6e3de26e8913b85d9ace5 0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH
0x72a442f2b8f1baff1e60319ab29739ae8d2f863a580d0f96f62468503ffa7cc3102435872023-06-04 21:47:22267 days 16 hrs ago 0x018a1895894653a0d83a9c0cbae1cb295381f516 0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH
0x64a7c46d6865115170efd54271b210eeb2aae3597483b7143f8f264d88e633a1102432242023-06-04 21:35:16267 days 17 hrs ago 0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe7 0x018a1895894653a0d83a9c0cbae1cb295381f5160 ETH
0x64a7c46d6865115170efd54271b210eeb2aae3597483b7143f8f264d88e633a1102432242023-06-04 21:35:16267 days 17 hrs ago 0x7248bf99b73c20fb05e6e3de26e8913b85d9ace5 0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH
0x88b38d7afd2084a2eb2055545671f4402a92c619c1ddd6609f51ee515b8b2c03102079632023-06-04 1:59:54268 days 12 hrs ago 0x67b373c07007c259970e8a412e9faa356bfadfcf 0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH
0xe3560454d50681b89266faaceb3c681163b2da61c107049d4e369c4a4422f09e102075162023-06-04 1:45:00268 days 12 hrs ago 0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe7 0x67b373c07007c259970e8a412e9faa356bfadfcf0 ETH
0xe3560454d50681b89266faaceb3c681163b2da61c107049d4e369c4a4422f09e102075162023-06-04 1:45:00268 days 12 hrs ago 0x7248bf99b73c20fb05e6e3de26e8913b85d9ace5 0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH
0x538200269f160f76bb30c9d22d2867dff822c2bd21a3ed788ef5a6879d62cd9c102034852023-06-03 23:30:38268 days 15 hrs ago 0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe7 0x0cfafe94cdf72a5cad64369f382799e1d208dc4e0 ETH
0x538200269f160f76bb30c9d22d2867dff822c2bd21a3ed788ef5a6879d62cd9c102034852023-06-03 23:30:38268 days 15 hrs ago 0x7248bf99b73c20fb05e6e3de26e8913b85d9ace5 0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH
0xf734c5e63d3c6f8a2ac22586e8cc10121f57d2b26d6bcb5e0af566e88b3300e595673782023-05-20 6:07:04283 days 8 hrs ago 0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe7 0x2a85fb2ad99082b346b48712350d6351d3971c530 ETH
0xf734c5e63d3c6f8a2ac22586e8cc10121f57d2b26d6bcb5e0af566e88b3300e595673782023-05-20 6:07:04283 days 8 hrs ago 0x7248bf99b73c20fb05e6e3de26e8913b85d9ace5 0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH
0x3f55b085451d23cd1ca9efde917ef7a031ba6ff71a54a9c65ba00937ab02d5df91593302023-05-10 19:25:28292 days 19 hrs ago 0xf6dad8e0e387bc6d760a311755aece5b78bb1cf0 0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH
0xb549e9afbb0e610b8a132f6ca8880276d6243e8c474a527e32254efe94186b9c91532132023-05-10 16:01:34292 days 22 hrs ago 0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe7 0xf6dad8e0e387bc6d760a311755aece5b78bb1cf00 ETH
0xb549e9afbb0e610b8a132f6ca8880276d6243e8c474a527e32254efe94186b9c91532132023-05-10 16:01:34292 days 22 hrs ago 0x7248bf99b73c20fb05e6e3de26e8913b85d9ace5 0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH
0x619bae73095a72fc8fbc3754b35b4950e3777577c16bbc0e746a2e1ff12e0ae191525952023-05-10 15:40:58292 days 22 hrs ago 0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe7 0x0f0627d274c359800053a76c2bcf114b11aaa5400 ETH
0x619bae73095a72fc8fbc3754b35b4950e3777577c16bbc0e746a2e1ff12e0ae191525952023-05-10 15:40:58292 days 22 hrs ago 0x7248bf99b73c20fb05e6e3de26e8913b85d9ace5 0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH
0x40c514a635c2441eb02d611a1a96ee5090251d3541c87d8b445bf270a44b285d91525252023-05-10 15:38:38292 days 23 hrs ago 0x7248bf99b73c20fb05e6e3de26e8913b85d9ace5 0x38aba480f2ba7a17bc01ee5e1ad64fcedd93efe70 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
NotFungibleNorUseful

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at goerli-optimism.etherscan.io on 2022-08-18
*/

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;


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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

// File: contracts/NFNU.sol

pragma solidity 0.8.13;



contract NotFungibleNorUseful is ERC721, ERC721Enumerable, Ownable {
    constructor() ERC721("NotFungibleNorUseful", "NFNU") {}

    uint nextTokenId = 1;

    // The faucet 
    function faucet() public {
      _safeMint(msg.sender, nextTokenId);  
      nextTokenId++;
    }

    // The following functions are overrides required by Solidity.

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

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

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"faucet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526001600b553480156200001657600080fd5b506040518060400160405280601481526020017f4e6f7446756e6769626c654e6f7255736566756c0000000000000000000000008152506040518060400160405280600481526020017f4e464e550000000000000000000000000000000000000000000000000000000081525081600090805190602001906200009b929190620001ab565b508060019080519060200190620000b4929190620001ab565b505050620000d7620000cb620000dd60201b60201c565b620000e560201b60201c565b620002bf565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001b9906200028a565b90600052602060002090601f016020900481019282620001dd576000855562000229565b82601f10620001f857805160ff191683800117855562000229565b8280016001018555821562000229579182015b82811115620002285782518255916020019190600101906200020b565b5b5090506200023891906200023c565b5090565b5b80821115620002575760008160009055506001016200023d565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002a357607f821691505b602082108103620002b957620002b86200025b565b5b50919050565b61302480620002cf6000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c806370a08231116100ad578063b88d4fde11610071578063b88d4fde14610343578063c87b56dd1461035f578063de5f72fd1461038f578063e985e9c514610399578063f2fde38b146103c95761012c565b806370a08231146102b1578063715018a6146102e15780638da5cb5b146102eb57806395d89b4114610309578063a22cb465146103275761012c565b806323b872dd116100f457806323b872dd146101e95780632f745c591461020557806342842e0e146102355780634f6ccce7146102515780636352211e146102815761012c565b806301ffc9a71461013157806306fdde0314610161578063081812fc1461017f578063095ea7b3146101af57806318160ddd146101cb575b600080fd5b61014b60048036038101906101469190611f34565b6103e5565b6040516101589190611f7c565b60405180910390f35b6101696103f7565b6040516101769190612030565b60405180910390f35b61019960048036038101906101949190612088565b610489565b6040516101a691906120f6565b60405180910390f35b6101c960048036038101906101c4919061213d565b6104cf565b005b6101d36105e6565b6040516101e0919061218c565b60405180910390f35b61020360048036038101906101fe91906121a7565b6105f3565b005b61021f600480360381019061021a919061213d565b610653565b60405161022c919061218c565b60405180910390f35b61024f600480360381019061024a91906121a7565b6106f8565b005b61026b60048036038101906102669190612088565b610718565b604051610278919061218c565b60405180910390f35b61029b60048036038101906102969190612088565b610789565b6040516102a891906120f6565b60405180910390f35b6102cb60048036038101906102c691906121fa565b61083a565b6040516102d8919061218c565b60405180910390f35b6102e96108f1565b005b6102f3610905565b60405161030091906120f6565b60405180910390f35b61031161092f565b60405161031e9190612030565b60405180910390f35b610341600480360381019061033c9190612253565b6109c1565b005b61035d600480360381019061035891906123c8565b6109d7565b005b61037960048036038101906103749190612088565b610a39565b6040516103869190612030565b60405180910390f35b610397610aa1565b005b6103b360048036038101906103ae919061244b565b610ac7565b6040516103c09190611f7c565b60405180910390f35b6103e360048036038101906103de91906121fa565b610b5b565b005b60006103f082610bde565b9050919050565b606060008054610406906124ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610432906124ba565b801561047f5780601f106104545761010080835404028352916020019161047f565b820191906000526020600020905b81548152906001019060200180831161046257829003601f168201915b5050505050905090565b600061049482610c58565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104da82610789565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361054a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105419061255d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610569610ca3565b73ffffffffffffffffffffffffffffffffffffffff161480610598575061059781610592610ca3565b610ac7565b5b6105d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce906125ef565b60405180910390fd5b6105e18383610cab565b505050565b6000600880549050905090565b6106046105fe610ca3565b82610d64565b610643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063a90612681565b60405180910390fd5b61064e838383610df9565b505050565b600061065e8361083a565b821061069f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069690612713565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610713838383604051806020016040528060008152506109d7565b505050565b60006107226105e6565b8210610763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075a906127a5565b60405180910390fd5b60088281548110610777576107766127c5565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082890612840565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a1906128d2565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108f961105f565b61090360006110dd565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461093e906124ba565b80601f016020809104026020016040519081016040528092919081815260200182805461096a906124ba565b80156109b75780601f1061098c576101008083540402835291602001916109b7565b820191906000526020600020905b81548152906001019060200180831161099a57829003601f168201915b5050505050905090565b6109d36109cc610ca3565b83836111a3565b5050565b6109e86109e2610ca3565b83610d64565b610a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1e90612681565b60405180910390fd5b610a338484848461130f565b50505050565b6060610a4482610c58565b6000610a4e61136b565b90506000815111610a6e5760405180602001604052806000815250610a99565b80610a7884611382565b604051602001610a8992919061292e565b6040516020818303038152906040525b915050919050565b610aad33600b546114e2565b600b6000815480929190610ac090612981565b9190505550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610b6361105f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc990612a3b565b60405180910390fd5b610bdb816110dd565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c515750610c5082611500565b5b9050919050565b610c61816115e2565b610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9790612840565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610d1e83610789565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610d7083610789565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610db25750610db18185610ac7565b5b80610df057508373ffffffffffffffffffffffffffffffffffffffff16610dd884610489565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610e1982610789565b73ffffffffffffffffffffffffffffffffffffffff1614610e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6690612acd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed590612b5f565b60405180910390fd5b610ee983838361164e565b610ef4600082610cab565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f449190612b7f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f9b9190612bb3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461105a83838361165e565b505050565b611067610ca3565b73ffffffffffffffffffffffffffffffffffffffff16611085610905565b73ffffffffffffffffffffffffffffffffffffffff16146110db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d290612c55565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120890612cc1565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113029190611f7c565b60405180910390a3505050565b61131a848484610df9565b61132684848484611663565b611365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135c90612d53565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b6060600082036113c9576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506114dd565b600082905060005b600082146113fb5780806113e490612981565b915050600a826113f49190612da2565b91506113d1565b60008167ffffffffffffffff8111156114175761141661229d565b5b6040519080825280601f01601f1916602001820160405280156114495781602001600182028036833780820191505090505b5090505b600085146114d6576001826114629190612b7f565b9150600a856114719190612dd3565b603061147d9190612bb3565b60f81b818381518110611493576114926127c5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856114cf9190612da2565b945061144d565b8093505050505b919050565b6114fc8282604051806020016040528060008152506117ea565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806115cb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806115db57506115da82611845565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6116598383836118af565b505050565b505050565b60006116848473ffffffffffffffffffffffffffffffffffffffff166119c1565b156117dd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026116ad610ca3565b8786866040518563ffffffff1660e01b81526004016116cf9493929190612e59565b6020604051808303816000875af192505050801561170b57506040513d601f19601f820116820180604052508101906117089190612eba565b60015b61178d573d806000811461173b576040519150601f19603f3d011682016040523d82523d6000602084013e611740565b606091505b506000815103611785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177c90612d53565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506117e2565b600190505b949350505050565b6117f483836119e4565b6118016000848484611663565b611840576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183790612d53565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6118ba838383611bbd565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036118fc576118f781611bc2565b61193b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461193a576119398382611c0b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361197d5761197881611d78565b6119bc565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146119bb576119ba8282611e49565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4a90612f33565b60405180910390fd5b611a5c816115e2565b15611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9390612f9f565b60405180910390fd5b611aa86000838361164e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611af89190612bb3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611bb96000838361165e565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001611c188461083a565b611c229190612b7f565b9050600060076000848152602001908152602001600020549050818114611d07576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050611d8c9190612b7f565b9050600060096000848152602001908152602001600020549050600060088381548110611dbc57611dbb6127c5565b5b906000526020600020015490508060088381548110611dde57611ddd6127c5565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480611e2d57611e2c612fbf565b5b6001900381819060005260206000200160009055905550505050565b6000611e548361083a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611f1181611edc565b8114611f1c57600080fd5b50565b600081359050611f2e81611f08565b92915050565b600060208284031215611f4a57611f49611ed2565b5b6000611f5884828501611f1f565b91505092915050565b60008115159050919050565b611f7681611f61565b82525050565b6000602082019050611f916000830184611f6d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611fd1578082015181840152602081019050611fb6565b83811115611fe0576000848401525b50505050565b6000601f19601f8301169050919050565b600061200282611f97565b61200c8185611fa2565b935061201c818560208601611fb3565b61202581611fe6565b840191505092915050565b6000602082019050818103600083015261204a8184611ff7565b905092915050565b6000819050919050565b61206581612052565b811461207057600080fd5b50565b6000813590506120828161205c565b92915050565b60006020828403121561209e5761209d611ed2565b5b60006120ac84828501612073565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006120e0826120b5565b9050919050565b6120f0816120d5565b82525050565b600060208201905061210b60008301846120e7565b92915050565b61211a816120d5565b811461212557600080fd5b50565b60008135905061213781612111565b92915050565b6000806040838503121561215457612153611ed2565b5b600061216285828601612128565b925050602061217385828601612073565b9150509250929050565b61218681612052565b82525050565b60006020820190506121a1600083018461217d565b92915050565b6000806000606084860312156121c0576121bf611ed2565b5b60006121ce86828701612128565b93505060206121df86828701612128565b92505060406121f086828701612073565b9150509250925092565b6000602082840312156122105761220f611ed2565b5b600061221e84828501612128565b91505092915050565b61223081611f61565b811461223b57600080fd5b50565b60008135905061224d81612227565b92915050565b6000806040838503121561226a57612269611ed2565b5b600061227885828601612128565b92505060206122898582860161223e565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6122d582611fe6565b810181811067ffffffffffffffff821117156122f4576122f361229d565b5b80604052505050565b6000612307611ec8565b905061231382826122cc565b919050565b600067ffffffffffffffff8211156123335761233261229d565b5b61233c82611fe6565b9050602081019050919050565b82818337600083830152505050565b600061236b61236684612318565b6122fd565b90508281526020810184848401111561238757612386612298565b5b612392848285612349565b509392505050565b600082601f8301126123af576123ae612293565b5b81356123bf848260208601612358565b91505092915050565b600080600080608085870312156123e2576123e1611ed2565b5b60006123f087828801612128565b945050602061240187828801612128565b935050604061241287828801612073565b925050606085013567ffffffffffffffff81111561243357612432611ed7565b5b61243f8782880161239a565b91505092959194509250565b6000806040838503121561246257612461611ed2565b5b600061247085828601612128565b925050602061248185828601612128565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806124d257607f821691505b6020821081036124e5576124e461248b565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612547602183611fa2565b9150612552826124eb565b604082019050919050565b600060208201905081810360008301526125768161253a565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b60006125d9603e83611fa2565b91506125e48261257d565b604082019050919050565b60006020820190508181036000830152612608816125cc565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b600061266b602e83611fa2565b91506126768261260f565b604082019050919050565b6000602082019050818103600083015261269a8161265e565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006126fd602b83611fa2565b9150612708826126a1565b604082019050919050565b6000602082019050818103600083015261272c816126f0565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061278f602c83611fa2565b915061279a82612733565b604082019050919050565b600060208201905081810360008301526127be81612782565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061282a601883611fa2565b9150612835826127f4565b602082019050919050565b600060208201905081810360008301526128598161281d565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006128bc602983611fa2565b91506128c782612860565b604082019050919050565b600060208201905081810360008301526128eb816128af565b9050919050565b600081905092915050565b600061290882611f97565b61291281856128f2565b9350612922818560208601611fb3565b80840191505092915050565b600061293a82856128fd565b915061294682846128fd565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061298c82612052565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036129be576129bd612952565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612a25602683611fa2565b9150612a30826129c9565b604082019050919050565b60006020820190508181036000830152612a5481612a18565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612ab7602583611fa2565b9150612ac282612a5b565b604082019050919050565b60006020820190508181036000830152612ae681612aaa565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612b49602483611fa2565b9150612b5482612aed565b604082019050919050565b60006020820190508181036000830152612b7881612b3c565b9050919050565b6000612b8a82612052565b9150612b9583612052565b925082821015612ba857612ba7612952565b5b828203905092915050565b6000612bbe82612052565b9150612bc983612052565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612bfe57612bfd612952565b5b828201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612c3f602083611fa2565b9150612c4a82612c09565b602082019050919050565b60006020820190508181036000830152612c6e81612c32565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612cab601983611fa2565b9150612cb682612c75565b602082019050919050565b60006020820190508181036000830152612cda81612c9e565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612d3d603283611fa2565b9150612d4882612ce1565b604082019050919050565b60006020820190508181036000830152612d6c81612d30565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612dad82612052565b9150612db883612052565b925082612dc857612dc7612d73565b5b828204905092915050565b6000612dde82612052565b9150612de983612052565b925082612df957612df8612d73565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000612e2b82612e04565b612e358185612e0f565b9350612e45818560208601611fb3565b612e4e81611fe6565b840191505092915050565b6000608082019050612e6e60008301876120e7565b612e7b60208301866120e7565b612e88604083018561217d565b8181036060830152612e9a8184612e20565b905095945050505050565b600081519050612eb481611f08565b92915050565b600060208284031215612ed057612ecf611ed2565b5b6000612ede84828501612ea5565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612f1d602083611fa2565b9150612f2882612ee7565b602082019050919050565b60006020820190508181036000830152612f4c81612f10565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000612f89601c83611fa2565b9150612f9482612f53565b602082019050919050565b60006020820190508181036000830152612fb881612f7c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212204d61b13a626910e89c78c856f798700eba562291d5086dabbeff845d722ca07c64736f6c634300080d0033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061012c5760003560e01c806370a08231116100ad578063b88d4fde11610071578063b88d4fde14610343578063c87b56dd1461035f578063de5f72fd1461038f578063e985e9c514610399578063f2fde38b146103c95761012c565b806370a08231146102b1578063715018a6146102e15780638da5cb5b146102eb57806395d89b4114610309578063a22cb465146103275761012c565b806323b872dd116100f457806323b872dd146101e95780632f745c591461020557806342842e0e146102355780634f6ccce7146102515780636352211e146102815761012c565b806301ffc9a71461013157806306fdde0314610161578063081812fc1461017f578063095ea7b3146101af57806318160ddd146101cb575b600080fd5b61014b60048036038101906101469190611f34565b6103e5565b6040516101589190611f7c565b60405180910390f35b6101696103f7565b6040516101769190612030565b60405180910390f35b61019960048036038101906101949190612088565b610489565b6040516101a691906120f6565b60405180910390f35b6101c960048036038101906101c4919061213d565b6104cf565b005b6101d36105e6565b6040516101e0919061218c565b60405180910390f35b61020360048036038101906101fe91906121a7565b6105f3565b005b61021f600480360381019061021a919061213d565b610653565b60405161022c919061218c565b60405180910390f35b61024f600480360381019061024a91906121a7565b6106f8565b005b61026b60048036038101906102669190612088565b610718565b604051610278919061218c565b60405180910390f35b61029b60048036038101906102969190612088565b610789565b6040516102a891906120f6565b60405180910390f35b6102cb60048036038101906102c691906121fa565b61083a565b6040516102d8919061218c565b60405180910390f35b6102e96108f1565b005b6102f3610905565b60405161030091906120f6565b60405180910390f35b61031161092f565b60405161031e9190612030565b60405180910390f35b610341600480360381019061033c9190612253565b6109c1565b005b61035d600480360381019061035891906123c8565b6109d7565b005b61037960048036038101906103749190612088565b610a39565b6040516103869190612030565b60405180910390f35b610397610aa1565b005b6103b360048036038101906103ae919061244b565b610ac7565b6040516103c09190611f7c565b60405180910390f35b6103e360048036038101906103de91906121fa565b610b5b565b005b60006103f082610bde565b9050919050565b606060008054610406906124ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610432906124ba565b801561047f5780601f106104545761010080835404028352916020019161047f565b820191906000526020600020905b81548152906001019060200180831161046257829003601f168201915b5050505050905090565b600061049482610c58565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104da82610789565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361054a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105419061255d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610569610ca3565b73ffffffffffffffffffffffffffffffffffffffff161480610598575061059781610592610ca3565b610ac7565b5b6105d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce906125ef565b60405180910390fd5b6105e18383610cab565b505050565b6000600880549050905090565b6106046105fe610ca3565b82610d64565b610643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063a90612681565b60405180910390fd5b61064e838383610df9565b505050565b600061065e8361083a565b821061069f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069690612713565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610713838383604051806020016040528060008152506109d7565b505050565b60006107226105e6565b8210610763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075a906127a5565b60405180910390fd5b60088281548110610777576107766127c5565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082890612840565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a1906128d2565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108f961105f565b61090360006110dd565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461093e906124ba565b80601f016020809104026020016040519081016040528092919081815260200182805461096a906124ba565b80156109b75780601f1061098c576101008083540402835291602001916109b7565b820191906000526020600020905b81548152906001019060200180831161099a57829003601f168201915b5050505050905090565b6109d36109cc610ca3565b83836111a3565b5050565b6109e86109e2610ca3565b83610d64565b610a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1e90612681565b60405180910390fd5b610a338484848461130f565b50505050565b6060610a4482610c58565b6000610a4e61136b565b90506000815111610a6e5760405180602001604052806000815250610a99565b80610a7884611382565b604051602001610a8992919061292e565b6040516020818303038152906040525b915050919050565b610aad33600b546114e2565b600b6000815480929190610ac090612981565b9190505550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610b6361105f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc990612a3b565b60405180910390fd5b610bdb816110dd565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c515750610c5082611500565b5b9050919050565b610c61816115e2565b610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9790612840565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610d1e83610789565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610d7083610789565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610db25750610db18185610ac7565b5b80610df057508373ffffffffffffffffffffffffffffffffffffffff16610dd884610489565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610e1982610789565b73ffffffffffffffffffffffffffffffffffffffff1614610e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6690612acd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed590612b5f565b60405180910390fd5b610ee983838361164e565b610ef4600082610cab565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f449190612b7f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f9b9190612bb3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461105a83838361165e565b505050565b611067610ca3565b73ffffffffffffffffffffffffffffffffffffffff16611085610905565b73ffffffffffffffffffffffffffffffffffffffff16146110db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d290612c55565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120890612cc1565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113029190611f7c565b60405180910390a3505050565b61131a848484610df9565b61132684848484611663565b611365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135c90612d53565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b6060600082036113c9576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506114dd565b600082905060005b600082146113fb5780806113e490612981565b915050600a826113f49190612da2565b91506113d1565b60008167ffffffffffffffff8111156114175761141661229d565b5b6040519080825280601f01601f1916602001820160405280156114495781602001600182028036833780820191505090505b5090505b600085146114d6576001826114629190612b7f565b9150600a856114719190612dd3565b603061147d9190612bb3565b60f81b818381518110611493576114926127c5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856114cf9190612da2565b945061144d565b8093505050505b919050565b6114fc8282604051806020016040528060008152506117ea565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806115cb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806115db57506115da82611845565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6116598383836118af565b505050565b505050565b60006116848473ffffffffffffffffffffffffffffffffffffffff166119c1565b156117dd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026116ad610ca3565b8786866040518563ffffffff1660e01b81526004016116cf9493929190612e59565b6020604051808303816000875af192505050801561170b57506040513d601f19601f820116820180604052508101906117089190612eba565b60015b61178d573d806000811461173b576040519150601f19603f3d011682016040523d82523d6000602084013e611740565b606091505b506000815103611785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177c90612d53565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506117e2565b600190505b949350505050565b6117f483836119e4565b6118016000848484611663565b611840576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183790612d53565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6118ba838383611bbd565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036118fc576118f781611bc2565b61193b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461193a576119398382611c0b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361197d5761197881611d78565b6119bc565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146119bb576119ba8282611e49565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4a90612f33565b60405180910390fd5b611a5c816115e2565b15611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9390612f9f565b60405180910390fd5b611aa86000838361164e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611af89190612bb3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611bb96000838361165e565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001611c188461083a565b611c229190612b7f565b9050600060076000848152602001908152602001600020549050818114611d07576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050611d8c9190612b7f565b9050600060096000848152602001908152602001600020549050600060088381548110611dbc57611dbb6127c5565b5b906000526020600020015490508060088381548110611dde57611ddd6127c5565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480611e2d57611e2c612fbf565b5b6001900381819060005260206000200160009055905550505050565b6000611e548361083a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611f1181611edc565b8114611f1c57600080fd5b50565b600081359050611f2e81611f08565b92915050565b600060208284031215611f4a57611f49611ed2565b5b6000611f5884828501611f1f565b91505092915050565b60008115159050919050565b611f7681611f61565b82525050565b6000602082019050611f916000830184611f6d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611fd1578082015181840152602081019050611fb6565b83811115611fe0576000848401525b50505050565b6000601f19601f8301169050919050565b600061200282611f97565b61200c8185611fa2565b935061201c818560208601611fb3565b61202581611fe6565b840191505092915050565b6000602082019050818103600083015261204a8184611ff7565b905092915050565b6000819050919050565b61206581612052565b811461207057600080fd5b50565b6000813590506120828161205c565b92915050565b60006020828403121561209e5761209d611ed2565b5b60006120ac84828501612073565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006120e0826120b5565b9050919050565b6120f0816120d5565b82525050565b600060208201905061210b60008301846120e7565b92915050565b61211a816120d5565b811461212557600080fd5b50565b60008135905061213781612111565b92915050565b6000806040838503121561215457612153611ed2565b5b600061216285828601612128565b925050602061217385828601612073565b9150509250929050565b61218681612052565b82525050565b60006020820190506121a1600083018461217d565b92915050565b6000806000606084860312156121c0576121bf611ed2565b5b60006121ce86828701612128565b93505060206121df86828701612128565b92505060406121f086828701612073565b9150509250925092565b6000602082840312156122105761220f611ed2565b5b600061221e84828501612128565b91505092915050565b61223081611f61565b811461223b57600080fd5b50565b60008135905061224d81612227565b92915050565b6000806040838503121561226a57612269611ed2565b5b600061227885828601612128565b92505060206122898582860161223e565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6122d582611fe6565b810181811067ffffffffffffffff821117156122f4576122f361229d565b5b80604052505050565b6000612307611ec8565b905061231382826122cc565b919050565b600067ffffffffffffffff8211156123335761233261229d565b5b61233c82611fe6565b9050602081019050919050565b82818337600083830152505050565b600061236b61236684612318565b6122fd565b90508281526020810184848401111561238757612386612298565b5b612392848285612349565b509392505050565b600082601f8301126123af576123ae612293565b5b81356123bf848260208601612358565b91505092915050565b600080600080608085870312156123e2576123e1611ed2565b5b60006123f087828801612128565b945050602061240187828801612128565b935050604061241287828801612073565b925050606085013567ffffffffffffffff81111561243357612432611ed7565b5b61243f8782880161239a565b91505092959194509250565b6000806040838503121561246257612461611ed2565b5b600061247085828601612128565b925050602061248185828601612128565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806124d257607f821691505b6020821081036124e5576124e461248b565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612547602183611fa2565b9150612552826124eb565b604082019050919050565b600060208201905081810360008301526125768161253a565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b60006125d9603e83611fa2565b91506125e48261257d565b604082019050919050565b60006020820190508181036000830152612608816125cc565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b600061266b602e83611fa2565b91506126768261260f565b604082019050919050565b6000602082019050818103600083015261269a8161265e565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006126fd602b83611fa2565b9150612708826126a1565b604082019050919050565b6000602082019050818103600083015261272c816126f0565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061278f602c83611fa2565b915061279a82612733565b604082019050919050565b600060208201905081810360008301526127be81612782565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061282a601883611fa2565b9150612835826127f4565b602082019050919050565b600060208201905081810360008301526128598161281d565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006128bc602983611fa2565b91506128c782612860565b604082019050919050565b600060208201905081810360008301526128eb816128af565b9050919050565b600081905092915050565b600061290882611f97565b61291281856128f2565b9350612922818560208601611fb3565b80840191505092915050565b600061293a82856128fd565b915061294682846128fd565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061298c82612052565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036129be576129bd612952565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612a25602683611fa2565b9150612a30826129c9565b604082019050919050565b60006020820190508181036000830152612a5481612a18565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612ab7602583611fa2565b9150612ac282612a5b565b604082019050919050565b60006020820190508181036000830152612ae681612aaa565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612b49602483611fa2565b9150612b5482612aed565b604082019050919050565b60006020820190508181036000830152612b7881612b3c565b9050919050565b6000612b8a82612052565b9150612b9583612052565b925082821015612ba857612ba7612952565b5b828203905092915050565b6000612bbe82612052565b9150612bc983612052565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612bfe57612bfd612952565b5b828201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612c3f602083611fa2565b9150612c4a82612c09565b602082019050919050565b60006020820190508181036000830152612c6e81612c32565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612cab601983611fa2565b9150612cb682612c75565b602082019050919050565b60006020820190508181036000830152612cda81612c9e565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612d3d603283611fa2565b9150612d4882612ce1565b604082019050919050565b60006020820190508181036000830152612d6c81612d30565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612dad82612052565b9150612db883612052565b925082612dc857612dc7612d73565b5b828204905092915050565b6000612dde82612052565b9150612de983612052565b925082612df957612df8612d73565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000612e2b82612e04565b612e358185612e0f565b9350612e45818560208601611fb3565b612e4e81611fe6565b840191505092915050565b6000608082019050612e6e60008301876120e7565b612e7b60208301866120e7565b612e88604083018561217d565b8181036060830152612e9a8184612e20565b905095945050505050565b600081519050612eb481611f08565b92915050565b600060208284031215612ed057612ecf611ed2565b5b6000612ede84828501612ea5565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612f1d602083611fa2565b9150612f2882612ee7565b602082019050919050565b60006020820190508181036000830152612f4c81612f10565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000612f89601c83611fa2565b9150612f9482612f53565b602082019050919050565b60006020820190508181036000830152612fb881612f7c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212204d61b13a626910e89c78c856f798700eba562291d5086dabbeff845d722ca07c64736f6c634300080d0033

Deployed ByteCode Sourcemap

46221:791:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46797:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22977:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24490:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24007:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37955:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25190:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37623:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25597:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38145:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22688:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22419:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45342:103;;;:::i;:::-;;44694:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23146:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24733:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25853:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23321:281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46407:100;;;:::i;:::-;;24959:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45600:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46797:212;46936:4;46965:36;46989:11;46965:23;:36::i;:::-;46958:43;;46797:212;;;:::o;22977:100::-;23031:13;23064:5;23057:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22977:100;:::o;24490:171::-;24566:7;24586:23;24601:7;24586:14;:23::i;:::-;24629:15;:24;24645:7;24629:24;;;;;;;;;;;;;;;;;;;;;24622:31;;24490:171;;;:::o;24007:417::-;24088:13;24104:23;24119:7;24104:14;:23::i;:::-;24088:39;;24152:5;24146:11;;:2;:11;;;24138:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24246:5;24230:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24255:37;24272:5;24279:12;:10;:12::i;:::-;24255:16;:37::i;:::-;24230:62;24208:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;24395:21;24404:2;24408:7;24395:8;:21::i;:::-;24077:347;24007:417;;:::o;37955:113::-;38016:7;38043:10;:17;;;;38036:24;;37955:113;:::o;25190:336::-;25385:41;25404:12;:10;:12::i;:::-;25418:7;25385:18;:41::i;:::-;25377:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;25490:28;25500:4;25506:2;25510:7;25490:9;:28::i;:::-;25190:336;;;:::o;37623:256::-;37720:7;37756:23;37773:5;37756:16;:23::i;:::-;37748:5;:31;37740:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37845:12;:19;37858:5;37845:19;;;;;;;;;;;;;;;:26;37865:5;37845:26;;;;;;;;;;;;37838:33;;37623:256;;;;:::o;25597:185::-;25735:39;25752:4;25758:2;25762:7;25735:39;;;;;;;;;;;;:16;:39::i;:::-;25597:185;;;:::o;38145:233::-;38220:7;38256:30;:28;:30::i;:::-;38248:5;:38;38240:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38353:10;38364:5;38353:17;;;;;;;;:::i;:::-;;;;;;;;;;38346:24;;38145:233;;;:::o;22688:222::-;22760:7;22780:13;22796:7;:16;22804:7;22796:16;;;;;;;;;;;;;;;;;;;;;22780:32;;22848:1;22831:19;;:5;:19;;;22823:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;22897:5;22890:12;;;22688:222;;;:::o;22419:207::-;22491:7;22536:1;22519:19;;:5;:19;;;22511:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22602:9;:16;22612:5;22602:16;;;;;;;;;;;;;;;;22595:23;;22419:207;;;:::o;45342:103::-;44580:13;:11;:13::i;:::-;45407:30:::1;45434:1;45407:18;:30::i;:::-;45342:103::o:0;44694:87::-;44740:7;44767:6;;;;;;;;;;;44760:13;;44694:87;:::o;23146:104::-;23202:13;23235:7;23228:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23146:104;:::o;24733:155::-;24828:52;24847:12;:10;:12::i;:::-;24861:8;24871;24828:18;:52::i;:::-;24733:155;;:::o;25853:323::-;26027:41;26046:12;:10;:12::i;:::-;26060:7;26027:18;:41::i;:::-;26019:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;26130:38;26144:4;26150:2;26154:7;26163:4;26130:13;:38::i;:::-;25853:323;;;;:::o;23321:281::-;23394:13;23420:23;23435:7;23420:14;:23::i;:::-;23456:21;23480:10;:8;:10::i;:::-;23456:34;;23532:1;23514:7;23508:21;:25;:86;;;;;;;;;;;;;;;;;23560:7;23569:18;:7;:16;:18::i;:::-;23543:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23508:86;23501:93;;;23321:281;;;:::o;46407:100::-;46441:34;46451:10;46463:11;;46441:9;:34::i;:::-;46486:11;;:13;;;;;;;;;:::i;:::-;;;;;;46407:100::o;24959:164::-;25056:4;25080:18;:25;25099:5;25080:25;;;;;;;;;;;;;;;:35;25106:8;25080:35;;;;;;;;;;;;;;;;;;;;;;;;;25073:42;;24959:164;;;;:::o;45600:201::-;44580:13;:11;:13::i;:::-;45709:1:::1;45689:22;;:8;:22;;::::0;45681:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;45765:28;45784:8;45765:18;:28::i;:::-;45600:201:::0;:::o;37315:224::-;37417:4;37456:35;37441:50;;;:11;:50;;;;:90;;;;37495:36;37519:11;37495:23;:36::i;:::-;37441:90;37434:97;;37315:224;;;:::o;32465:135::-;32547:16;32555:7;32547;:16::i;:::-;32539:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;32465:135;:::o;16913:98::-;16966:7;16993:10;16986:17;;16913:98;:::o;31744:174::-;31846:2;31819:15;:24;31835:7;31819:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31902:7;31898:2;31864:46;;31873:23;31888:7;31873:14;:23::i;:::-;31864:46;;;;;;;;;;;;31744:174;;:::o;27977:264::-;28070:4;28087:13;28103:23;28118:7;28103:14;:23::i;:::-;28087:39;;28156:5;28145:16;;:7;:16;;;:52;;;;28165:32;28182:5;28189:7;28165:16;:32::i;:::-;28145:52;:87;;;;28225:7;28201:31;;:20;28213:7;28201:11;:20::i;:::-;:31;;;28145:87;28137:96;;;27977:264;;;;:::o;31000:625::-;31159:4;31132:31;;:23;31147:7;31132:14;:23::i;:::-;:31;;;31124:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31238:1;31224:16;;:2;:16;;;31216:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31294:39;31315:4;31321:2;31325:7;31294:20;:39::i;:::-;31398:29;31415:1;31419:7;31398:8;:29::i;:::-;31459:1;31440:9;:15;31450:4;31440:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31488:1;31471:9;:13;31481:2;31471:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31519:2;31500:7;:16;31508:7;31500:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31558:7;31554:2;31539:27;;31548:4;31539:27;;;;;;;;;;;;31579:38;31599:4;31605:2;31609:7;31579:19;:38::i;:::-;31000:625;;;:::o;44859:132::-;44934:12;:10;:12::i;:::-;44923:23;;:7;:5;:7::i;:::-;:23;;;44915:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44859:132::o;45961:191::-;46035:16;46054:6;;;;;;;;;;;46035:25;;46080:8;46071:6;;:17;;;;;;;;;;;;;;;;;;46135:8;46104:40;;46125:8;46104:40;;;;;;;;;;;;46024:128;45961:191;:::o;32061:315::-;32216:8;32207:17;;:5;:17;;;32199:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32303:8;32265:18;:25;32284:5;32265:25;;;;;;;;;;;;;;;:35;32291:8;32265:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32349:8;32327:41;;32342:5;32327:41;;;32359:8;32327:41;;;;;;:::i;:::-;;;;;;;;32061:315;;;:::o;27057:313::-;27213:28;27223:4;27229:2;27233:7;27213:9;:28::i;:::-;27260:47;27283:4;27289:2;27293:7;27302:4;27260:22;:47::i;:::-;27252:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;27057:313;;;;:::o;23851:94::-;23902:13;23928:9;;;;;;;;;;;;;;23851:94;:::o;17555:723::-;17611:13;17841:1;17832:5;:10;17828:53;;17859:10;;;;;;;;;;;;;;;;;;;;;17828:53;17891:12;17906:5;17891:20;;17922:14;17947:78;17962:1;17954:4;:9;17947:78;;17980:8;;;;;:::i;:::-;;;;18011:2;18003:10;;;;;:::i;:::-;;;17947:78;;;18035:19;18067:6;18057:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18035:39;;18085:154;18101:1;18092:5;:10;18085:154;;18129:1;18119:11;;;;;:::i;:::-;;;18196:2;18188:5;:10;;;;:::i;:::-;18175:2;:24;;;;:::i;:::-;18162:39;;18145:6;18152;18145:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18225:2;18216:11;;;;;:::i;:::-;;;18085:154;;;18263:6;18249:21;;;;;17555:723;;;;:::o;28583:110::-;28659:26;28669:2;28673:7;28659:26;;;;;;;;;;;;:9;:26::i;:::-;28583:110;;:::o;22050:305::-;22152:4;22204:25;22189:40;;;:11;:40;;;;:105;;;;22261:33;22246:48;;;:11;:48;;;;22189:105;:158;;;;22311:36;22335:11;22311:23;:36::i;:::-;22189:158;22169:178;;22050:305;;;:::o;27683:127::-;27748:4;27800:1;27772:30;;:7;:16;27780:7;27772:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27765:37;;27683:127;;;:::o;46585:204::-;46736:45;46763:4;46769:2;46773:7;46736:26;:45::i;:::-;46585:204;;;:::o;35100:125::-;;;;:::o;33164:853::-;33318:4;33339:15;:2;:13;;;:15::i;:::-;33335:675;;;33391:2;33375:36;;;33412:12;:10;:12::i;:::-;33426:4;33432:7;33441:4;33375:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33371:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33633:1;33616:6;:13;:18;33612:328;;33659:60;;;;;;;;;;:::i;:::-;;;;;;;;33612:328;33890:6;33884:13;33875:6;33871:2;33867:15;33860:38;33371:584;33507:41;;;33497:51;;;:6;:51;;;;33490:58;;;;;33335:675;33994:4;33987:11;;33164:853;;;;;;;:::o;28920:319::-;29049:18;29055:2;29059:7;29049:5;:18::i;:::-;29100:53;29131:1;29135:2;29139:7;29148:4;29100:22;:53::i;:::-;29078:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;28920:319;;;:::o;20483:157::-;20568:4;20607:25;20592:40;;;:11;:40;;;;20585:47;;20483:157;;;:::o;38991:589::-;39135:45;39162:4;39168:2;39172:7;39135:26;:45::i;:::-;39213:1;39197:18;;:4;:18;;;39193:187;;39232:40;39264:7;39232:31;:40::i;:::-;39193:187;;;39302:2;39294:10;;:4;:10;;;39290:90;;39321:47;39354:4;39360:7;39321:32;:47::i;:::-;39290:90;39193:187;39408:1;39394:16;;:2;:16;;;39390:183;;39427:45;39464:7;39427:36;:45::i;:::-;39390:183;;;39500:4;39494:10;;:2;:10;;;39490:83;;39521:40;39549:2;39553:7;39521:27;:40::i;:::-;39490:83;39390:183;38991:589;;;:::o;8914:326::-;8974:4;9231:1;9209:7;:19;;;:23;9202:30;;8914:326;;;:::o;29575:439::-;29669:1;29655:16;;:2;:16;;;29647:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29728:16;29736:7;29728;:16::i;:::-;29727:17;29719:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29790:45;29819:1;29823:2;29827:7;29790:20;:45::i;:::-;29865:1;29848:9;:13;29858:2;29848:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29896:2;29877:7;:16;29885:7;29877:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29941:7;29937:2;29916:33;;29933:1;29916:33;;;;;;;;;;;;29962:44;29990:1;29994:2;29998:7;29962:19;:44::i;:::-;29575:439;;:::o;34589:126::-;;;;:::o;40303:164::-;40407:10;:17;;;;40380:15;:24;40396:7;40380:24;;;;;;;;;;;:44;;;;40435:10;40451:7;40435:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40303:164;:::o;41094:988::-;41360:22;41410:1;41385:22;41402:4;41385:16;:22::i;:::-;:26;;;;:::i;:::-;41360:51;;41422:18;41443:17;:26;41461:7;41443:26;;;;;;;;;;;;41422:47;;41590:14;41576:10;:28;41572:328;;41621:19;41643:12;:18;41656:4;41643:18;;;;;;;;;;;;;;;:34;41662:14;41643:34;;;;;;;;;;;;41621:56;;41727:11;41694:12;:18;41707:4;41694:18;;;;;;;;;;;;;;;:30;41713:10;41694:30;;;;;;;;;;;:44;;;;41844:10;41811:17;:30;41829:11;41811:30;;;;;;;;;;;:43;;;;41606:294;41572:328;41996:17;:26;42014:7;41996:26;;;;;;;;;;;41989:33;;;42040:12;:18;42053:4;42040:18;;;;;;;;;;;;;;;:34;42059:14;42040:34;;;;;;;;;;;42033:41;;;41175:907;;41094:988;;:::o;42377:1079::-;42630:22;42675:1;42655:10;:17;;;;:21;;;;:::i;:::-;42630:46;;42687:18;42708:15;:24;42724:7;42708:24;;;;;;;;;;;;42687:45;;43059:19;43081:10;43092:14;43081:26;;;;;;;;:::i;:::-;;;;;;;;;;43059:48;;43145:11;43120:10;43131;43120:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;43256:10;43225:15;:28;43241:11;43225:28;;;;;;;;;;;:41;;;;43397:15;:24;43413:7;43397:24;;;;;;;;;;;43390:31;;;43432:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42448:1008;;;42377:1079;:::o;39881:221::-;39966:14;39983:20;40000:2;39983:16;:20::i;:::-;39966:37;;40041:7;40014:12;:16;40027:2;40014:16;;;;;;;;;;;;;;;:24;40031:6;40014:24;;;;;;;;;;;:34;;;;40088:6;40059:17;:26;40077:7;40059:26;;;;;;;;;;;:35;;;;39955:147;39881:221;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938: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:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:116::-;6320:21;6335:5;6320:21;:::i;:::-;6313:5;6310:32;6300:60;;6356:1;6353;6346:12;6300:60;6250:116;:::o;6372:133::-;6415:5;6453:6;6440:20;6431:29;;6469:30;6493:5;6469:30;:::i;:::-;6372:133;;;;:::o;6511:468::-;6576:6;6584;6633:2;6621:9;6612:7;6608:23;6604:32;6601:119;;;6639:79;;:::i;:::-;6601:119;6759:1;6784:53;6829:7;6820:6;6809:9;6805:22;6784:53;:::i;:::-;6774:63;;6730:117;6886:2;6912:50;6954:7;6945:6;6934:9;6930:22;6912:50;:::i;:::-;6902:60;;6857:115;6511:468;;;;;:::o;6985:117::-;7094:1;7091;7084:12;7108:117;7217:1;7214;7207:12;7231:180;7279:77;7276:1;7269:88;7376:4;7373:1;7366:15;7400:4;7397:1;7390:15;7417:281;7500:27;7522:4;7500:27;:::i;:::-;7492:6;7488:40;7630:6;7618:10;7615:22;7594:18;7582:10;7579:34;7576:62;7573:88;;;7641:18;;:::i;:::-;7573:88;7681:10;7677:2;7670:22;7460:238;7417:281;;:::o;7704:129::-;7738:6;7765:20;;:::i;:::-;7755:30;;7794:33;7822:4;7814:6;7794:33;:::i;:::-;7704:129;;;:::o;7839:307::-;7900:4;7990:18;7982:6;7979:30;7976:56;;;8012:18;;:::i;:::-;7976:56;8050:29;8072:6;8050:29;:::i;:::-;8042:37;;8134:4;8128;8124:15;8116:23;;7839:307;;;:::o;8152:154::-;8236:6;8231:3;8226;8213:30;8298:1;8289:6;8284:3;8280:16;8273:27;8152:154;;;:::o;8312:410::-;8389:5;8414:65;8430:48;8471:6;8430:48;:::i;:::-;8414:65;:::i;:::-;8405:74;;8502:6;8495:5;8488:21;8540:4;8533:5;8529:16;8578:3;8569:6;8564:3;8560:16;8557:25;8554:112;;;8585:79;;:::i;:::-;8554:112;8675:41;8709:6;8704:3;8699;8675:41;:::i;:::-;8395:327;8312:410;;;;;:::o;8741:338::-;8796:5;8845:3;8838:4;8830:6;8826:17;8822:27;8812:122;;8853:79;;:::i;:::-;8812:122;8970:6;8957:20;8995:78;9069:3;9061:6;9054:4;9046:6;9042:17;8995:78;:::i;:::-;8986:87;;8802:277;8741:338;;;;:::o;9085:943::-;9180:6;9188;9196;9204;9253:3;9241:9;9232:7;9228:23;9224:33;9221:120;;;9260:79;;:::i;:::-;9221:120;9380:1;9405:53;9450:7;9441:6;9430:9;9426:22;9405:53;:::i;:::-;9395:63;;9351:117;9507:2;9533:53;9578:7;9569:6;9558:9;9554:22;9533:53;:::i;:::-;9523:63;;9478:118;9635:2;9661:53;9706:7;9697:6;9686:9;9682:22;9661:53;:::i;:::-;9651:63;;9606:118;9791:2;9780:9;9776:18;9763:32;9822:18;9814:6;9811:30;9808:117;;;9844:79;;:::i;:::-;9808:117;9949:62;10003:7;9994:6;9983:9;9979:22;9949:62;:::i;:::-;9939:72;;9734:287;9085:943;;;;;;;:::o;10034:474::-;10102:6;10110;10159:2;10147:9;10138:7;10134:23;10130:32;10127:119;;;10165:79;;:::i;:::-;10127:119;10285:1;10310:53;10355:7;10346:6;10335:9;10331:22;10310:53;:::i;:::-;10300:63;;10256:117;10412:2;10438:53;10483:7;10474:6;10463:9;10459:22;10438:53;:::i;:::-;10428:63;;10383:118;10034:474;;;;;:::o;10514:180::-;10562:77;10559:1;10552:88;10659:4;10656:1;10649:15;10683:4;10680:1;10673:15;10700:320;10744:6;10781:1;10775:4;10771:12;10761:22;;10828:1;10822:4;10818:12;10849:18;10839:81;;10905:4;10897:6;10893:17;10883:27;;10839:81;10967:2;10959:6;10956:14;10936:18;10933:38;10930:84;;10986:18;;:::i;:::-;10930:84;10751:269;10700:320;;;:::o;11026:220::-;11166:34;11162:1;11154:6;11150:14;11143:58;11235:3;11230:2;11222:6;11218:15;11211:28;11026:220;:::o;11252:366::-;11394:3;11415:67;11479:2;11474:3;11415:67;:::i;:::-;11408:74;;11491:93;11580:3;11491:93;:::i;:::-;11609:2;11604:3;11600:12;11593:19;;11252:366;;;:::o;11624:419::-;11790:4;11828:2;11817:9;11813:18;11805:26;;11877:9;11871:4;11867:20;11863:1;11852:9;11848:17;11841:47;11905:131;12031:4;11905:131;:::i;:::-;11897:139;;11624:419;;;:::o;12049:249::-;12189:34;12185:1;12177:6;12173:14;12166:58;12258:32;12253:2;12245:6;12241:15;12234:57;12049:249;:::o;12304:366::-;12446:3;12467:67;12531:2;12526:3;12467:67;:::i;:::-;12460:74;;12543:93;12632:3;12543:93;:::i;:::-;12661:2;12656:3;12652:12;12645:19;;12304:366;;;:::o;12676:419::-;12842:4;12880:2;12869:9;12865:18;12857:26;;12929:9;12923:4;12919:20;12915:1;12904:9;12900:17;12893:47;12957:131;13083:4;12957:131;:::i;:::-;12949:139;;12676:419;;;:::o;13101:233::-;13241:34;13237:1;13229:6;13225:14;13218:58;13310:16;13305:2;13297:6;13293:15;13286:41;13101:233;:::o;13340:366::-;13482:3;13503:67;13567:2;13562:3;13503:67;:::i;:::-;13496:74;;13579:93;13668:3;13579:93;:::i;:::-;13697:2;13692:3;13688:12;13681:19;;13340:366;;;:::o;13712:419::-;13878:4;13916:2;13905:9;13901:18;13893:26;;13965:9;13959:4;13955:20;13951:1;13940:9;13936:17;13929:47;13993:131;14119:4;13993:131;:::i;:::-;13985:139;;13712:419;;;:::o;14137:230::-;14277:34;14273:1;14265:6;14261:14;14254:58;14346:13;14341:2;14333:6;14329:15;14322:38;14137:230;:::o;14373:366::-;14515:3;14536:67;14600:2;14595:3;14536:67;:::i;:::-;14529:74;;14612:93;14701:3;14612:93;:::i;:::-;14730:2;14725:3;14721:12;14714:19;;14373:366;;;:::o;14745:419::-;14911:4;14949:2;14938:9;14934:18;14926:26;;14998:9;14992:4;14988:20;14984:1;14973:9;14969:17;14962:47;15026:131;15152:4;15026:131;:::i;:::-;15018:139;;14745:419;;;:::o;15170:231::-;15310:34;15306:1;15298:6;15294:14;15287:58;15379:14;15374:2;15366:6;15362:15;15355:39;15170:231;:::o;15407:366::-;15549:3;15570:67;15634:2;15629:3;15570:67;:::i;:::-;15563:74;;15646:93;15735:3;15646:93;:::i;:::-;15764:2;15759:3;15755:12;15748:19;;15407:366;;;:::o;15779:419::-;15945:4;15983:2;15972:9;15968:18;15960:26;;16032:9;16026:4;16022:20;16018:1;16007:9;16003:17;15996:47;16060:131;16186:4;16060:131;:::i;:::-;16052:139;;15779:419;;;:::o;16204:180::-;16252:77;16249:1;16242:88;16349:4;16346:1;16339:15;16373:4;16370:1;16363:15;16390:174;16530:26;16526:1;16518:6;16514:14;16507:50;16390:174;:::o;16570:366::-;16712:3;16733:67;16797:2;16792:3;16733:67;:::i;:::-;16726:74;;16809:93;16898:3;16809:93;:::i;:::-;16927:2;16922:3;16918:12;16911:19;;16570:366;;;:::o;16942:419::-;17108:4;17146:2;17135:9;17131:18;17123:26;;17195:9;17189:4;17185:20;17181:1;17170:9;17166:17;17159:47;17223:131;17349:4;17223:131;:::i;:::-;17215:139;;16942:419;;;:::o;17367:228::-;17507:34;17503:1;17495:6;17491:14;17484:58;17576:11;17571:2;17563:6;17559:15;17552:36;17367:228;:::o;17601:366::-;17743:3;17764:67;17828:2;17823:3;17764:67;:::i;:::-;17757:74;;17840:93;17929:3;17840:93;:::i;:::-;17958:2;17953:3;17949:12;17942:19;;17601:366;;;:::o;17973:419::-;18139:4;18177:2;18166:9;18162:18;18154:26;;18226:9;18220:4;18216:20;18212:1;18201:9;18197:17;18190:47;18254:131;18380:4;18254:131;:::i;:::-;18246:139;;17973:419;;;:::o;18398:148::-;18500:11;18537:3;18522:18;;18398:148;;;;:::o;18552:377::-;18658:3;18686:39;18719:5;18686:39;:::i;:::-;18741:89;18823:6;18818:3;18741:89;:::i;:::-;18734:96;;18839:52;18884:6;18879:3;18872:4;18865:5;18861:16;18839:52;:::i;:::-;18916:6;18911:3;18907:16;18900:23;;18662:267;18552:377;;;;:::o;18935:435::-;19115:3;19137:95;19228:3;19219:6;19137:95;:::i;:::-;19130:102;;19249:95;19340:3;19331:6;19249:95;:::i;:::-;19242:102;;19361:3;19354:10;;18935:435;;;;;:::o;19376:180::-;19424:77;19421:1;19414:88;19521:4;19518:1;19511:15;19545:4;19542:1;19535:15;19562:233;19601:3;19624:24;19642:5;19624:24;:::i;:::-;19615:33;;19670:66;19663:5;19660:77;19657:103;;19740:18;;:::i;:::-;19657:103;19787:1;19780:5;19776:13;19769:20;;19562:233;;;:::o;19801:225::-;19941:34;19937:1;19929:6;19925:14;19918:58;20010:8;20005:2;19997:6;19993:15;19986:33;19801:225;:::o;20032:366::-;20174:3;20195:67;20259:2;20254:3;20195:67;:::i;:::-;20188:74;;20271:93;20360:3;20271:93;:::i;:::-;20389:2;20384:3;20380:12;20373:19;;20032:366;;;:::o;20404:419::-;20570:4;20608:2;20597:9;20593:18;20585:26;;20657:9;20651:4;20647:20;20643:1;20632:9;20628:17;20621:47;20685:131;20811:4;20685:131;:::i;:::-;20677:139;;20404:419;;;:::o;20829:224::-;20969:34;20965:1;20957:6;20953:14;20946:58;21038:7;21033:2;21025:6;21021:15;21014:32;20829:224;:::o;21059:366::-;21201:3;21222:67;21286:2;21281:3;21222:67;:::i;:::-;21215:74;;21298:93;21387:3;21298:93;:::i;:::-;21416:2;21411:3;21407:12;21400:19;;21059:366;;;:::o;21431:419::-;21597:4;21635:2;21624:9;21620:18;21612:26;;21684:9;21678:4;21674:20;21670:1;21659:9;21655:17;21648:47;21712:131;21838:4;21712:131;:::i;:::-;21704:139;;21431:419;;;:::o;21856:223::-;21996:34;21992:1;21984:6;21980:14;21973:58;22065:6;22060:2;22052:6;22048:15;22041:31;21856:223;:::o;22085:366::-;22227:3;22248:67;22312:2;22307:3;22248:67;:::i;:::-;22241:74;;22324:93;22413:3;22324:93;:::i;:::-;22442:2;22437:3;22433:12;22426:19;;22085:366;;;:::o;22457:419::-;22623:4;22661:2;22650:9;22646:18;22638:26;;22710:9;22704:4;22700:20;22696:1;22685:9;22681:17;22674:47;22738:131;22864:4;22738:131;:::i;:::-;22730:139;;22457:419;;;:::o;22882:191::-;22922:4;22942:20;22960:1;22942:20;:::i;:::-;22937:25;;22976:20;22994:1;22976:20;:::i;:::-;22971:25;;23015:1;23012;23009:8;23006:34;;;23020:18;;:::i;:::-;23006:34;23065:1;23062;23058:9;23050:17;;22882:191;;;;:::o;23079:305::-;23119:3;23138:20;23156:1;23138:20;:::i;:::-;23133:25;;23172:20;23190:1;23172:20;:::i;:::-;23167:25;;23326:1;23258:66;23254:74;23251:1;23248:81;23245:107;;;23332:18;;:::i;:::-;23245:107;23376:1;23373;23369:9;23362:16;;23079:305;;;;:::o;23390:182::-;23530:34;23526:1;23518:6;23514:14;23507:58;23390:182;:::o;23578:366::-;23720:3;23741:67;23805:2;23800:3;23741:67;:::i;:::-;23734:74;;23817:93;23906:3;23817:93;:::i;:::-;23935:2;23930:3;23926:12;23919:19;;23578:366;;;:::o;23950:419::-;24116:4;24154:2;24143:9;24139:18;24131:26;;24203:9;24197:4;24193:20;24189:1;24178:9;24174:17;24167:47;24231:131;24357:4;24231:131;:::i;:::-;24223:139;;23950:419;;;:::o;24375:175::-;24515:27;24511:1;24503:6;24499:14;24492:51;24375:175;:::o;24556:366::-;24698:3;24719:67;24783:2;24778:3;24719:67;:::i;:::-;24712:74;;24795:93;24884:3;24795:93;:::i;:::-;24913:2;24908:3;24904:12;24897:19;;24556:366;;;:::o;24928:419::-;25094:4;25132:2;25121:9;25117:18;25109:26;;25181:9;25175:4;25171:20;25167:1;25156:9;25152:17;25145:47;25209:131;25335:4;25209:131;:::i;:::-;25201:139;;24928:419;;;:::o;25353:237::-;25493:34;25489:1;25481:6;25477:14;25470:58;25562:20;25557:2;25549:6;25545:15;25538:45;25353:237;:::o;25596:366::-;25738:3;25759:67;25823:2;25818:3;25759:67;:::i;:::-;25752:74;;25835:93;25924:3;25835:93;:::i;:::-;25953:2;25948:3;25944:12;25937:19;;25596:366;;;:::o;25968:419::-;26134:4;26172:2;26161:9;26157:18;26149:26;;26221:9;26215:4;26211:20;26207:1;26196:9;26192:17;26185:47;26249:131;26375:4;26249:131;:::i;:::-;26241:139;;25968:419;;;:::o;26393:180::-;26441:77;26438:1;26431:88;26538:4;26535:1;26528:15;26562:4;26559:1;26552:15;26579:185;26619:1;26636:20;26654:1;26636:20;:::i;:::-;26631:25;;26670:20;26688:1;26670:20;:::i;:::-;26665:25;;26709:1;26699:35;;26714:18;;:::i;:::-;26699:35;26756:1;26753;26749:9;26744:14;;26579:185;;;;:::o;26770:176::-;26802:1;26819:20;26837:1;26819:20;:::i;:::-;26814:25;;26853:20;26871:1;26853:20;:::i;:::-;26848:25;;26892:1;26882:35;;26897:18;;:::i;:::-;26882:35;26938:1;26935;26931:9;26926:14;;26770:176;;;;:::o;26952:98::-;27003:6;27037:5;27031:12;27021:22;;26952:98;;;:::o;27056:168::-;27139:11;27173:6;27168:3;27161:19;27213:4;27208:3;27204:14;27189:29;;27056:168;;;;:::o;27230:360::-;27316:3;27344:38;27376:5;27344:38;:::i;:::-;27398:70;27461:6;27456:3;27398:70;:::i;:::-;27391:77;;27477:52;27522:6;27517:3;27510:4;27503:5;27499:16;27477:52;:::i;:::-;27554:29;27576:6;27554:29;:::i;:::-;27549:3;27545:39;27538:46;;27320:270;27230:360;;;;:::o;27596:640::-;27791:4;27829:3;27818:9;27814:19;27806:27;;27843:71;27911:1;27900:9;27896:17;27887:6;27843:71;:::i;:::-;27924:72;27992:2;27981:9;27977:18;27968:6;27924:72;:::i;:::-;28006;28074:2;28063:9;28059:18;28050:6;28006:72;:::i;:::-;28125:9;28119:4;28115:20;28110:2;28099:9;28095:18;28088:48;28153:76;28224:4;28215:6;28153:76;:::i;:::-;28145:84;;27596:640;;;;;;;:::o;28242:141::-;28298:5;28329:6;28323:13;28314:22;;28345:32;28371:5;28345:32;:::i;:::-;28242:141;;;;:::o;28389:349::-;28458:6;28507:2;28495:9;28486:7;28482:23;28478:32;28475:119;;;28513:79;;:::i;:::-;28475:119;28633:1;28658:63;28713:7;28704:6;28693:9;28689:22;28658:63;:::i;:::-;28648:73;;28604:127;28389:349;;;;:::o;28744:182::-;28884:34;28880:1;28872:6;28868:14;28861:58;28744:182;:::o;28932:366::-;29074:3;29095:67;29159:2;29154:3;29095:67;:::i;:::-;29088:74;;29171:93;29260:3;29171:93;:::i;:::-;29289:2;29284:3;29280:12;29273:19;;28932:366;;;:::o;29304:419::-;29470:4;29508:2;29497:9;29493:18;29485:26;;29557:9;29551:4;29547:20;29543:1;29532:9;29528:17;29521:47;29585:131;29711:4;29585:131;:::i;:::-;29577:139;;29304:419;;;:::o;29729:178::-;29869:30;29865:1;29857:6;29853:14;29846:54;29729:178;:::o;29913:366::-;30055:3;30076:67;30140:2;30135:3;30076:67;:::i;:::-;30069:74;;30152:93;30241:3;30152:93;:::i;:::-;30270:2;30265:3;30261:12;30254:19;;29913:366;;;:::o;30285:419::-;30451:4;30489:2;30478:9;30474:18;30466:26;;30538:9;30532:4;30528:20;30524:1;30513:9;30509:17;30502:47;30566:131;30692:4;30566:131;:::i;:::-;30558:139;;30285:419;;;:::o;30710:180::-;30758:77;30755:1;30748:88;30855:4;30852:1;30845:15;30879:4;30876:1;30869:15

Swarm Source

ipfs://4d61b13a626910e89c78c856f798700eba562291d5086dabbeff845d722ca07c
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading