Contract 0xF25CBa0AE45496E71117442378F820b2cf09e9f1 11
Contract Overview
[ Download CSV Export ]
Latest 2 internal transactions
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0x990da72b603456120010f7013e7c3f44af81e2d444e1a72ddcecee2a0c72a32d | 105535521 | 289 days 21 hrs ago | Quix: Exchange 2 | 0xf25cba0ae45496e71117442378f820b2cf09e9f1 | 0 ETH | ||
0x661138e410f907f05b073113e5029d59cd70812c858e858ba748592a84920d6e | 13578494 | 637 days 11 hrs ago | 0xf25cba0ae45496e71117442378f820b2cf09e9f1 | 0x813c6726e40cbcdff33d27324b9ae77a4e4d43fd | 5.77 ETH |
[ Download CSV Export ]
Contract Name:
Rockets
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Optimistic.Etherscan.io on 2022-05-02 */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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; } } // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @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); } library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } } // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol) // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol) // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) /** * @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 be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev 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); } // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) /** * @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); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) /** * @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); } // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) /** * @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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be 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 owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _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: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || 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 a {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 a {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 Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev 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 {} } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) /** * @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); } /** * @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(); } } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Burnable.sol) /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Pausable.sol) // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } /** * @dev ERC721 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC721Pausable is ERC721, Pausable { /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), "ERC721Pausable: token transfer while paused"); } } // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol) // OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol) /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); } // OpenZeppelin Contracts (last updated v4.6.0) (access/AccessControl.sol) /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/EnumerableSet.sol) /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } } /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {_grantRole} to track enumerable memberships */ function _grantRole(bytes32 role, address account) internal virtual override { super._grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {_revokeRole} to track enumerable memberships */ function _revokeRole(bytes32 role, address account) internal virtual override { super._revokeRole(role, account); _roleMembers[role].remove(account); } } // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } /** * @dev {ERC721} token, including: * * - ability for holders to burn (destroy) their tokens * - a minter role that allows for token minting (creation) * - a pauser role that allows to stop all token transfers * - token ID and URI autogeneration * * This contract uses {AccessControl} to lock permissioned functions using the * different roles - head to its documentation for details. * * The account that deploys the contract will be granted the minter and pauser * roles, as well as the default admin role, which will let it grant both minter * and pauser roles to other accounts. * * _Deprecated in favor of https://wizard.openzeppelin.com/[Contracts Wizard]._ */ contract ERC721PresetMinterPauserAutoId is Context, AccessControlEnumerable, ERC721Enumerable, ERC721Burnable, ERC721Pausable { using Counters for Counters.Counter; bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); Counters.Counter private _tokenIdTracker; string private _baseTokenURI; /** * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the * account that deploys the contract. * * Token URIs will be autogenerated based on `baseURI` and their token IDs. * See {ERC721-tokenURI}. */ constructor( string memory name, string memory symbol, string memory baseTokenURI ) ERC721(name, symbol) { _baseTokenURI = baseTokenURI; _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender()); _setupRole(PAUSER_ROLE, _msgSender()); } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } /** * @dev Creates a new token for `to`. Its token ID will be automatically * assigned (and available on the emitted {IERC721-Transfer} event), and the token * URI autogenerated based on the base URI passed at construction. * * See {ERC721-_mint}. * * Requirements: * * - the caller must have the `MINTER_ROLE`. */ function mint(address to) public virtual { require(hasRole(MINTER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have minter role to mint"); // We cannot just use balanceOf to create the new tokenId because tokens // can be burned (destroyed), so we need a separate counter. _mint(to, _tokenIdTracker.current()); _tokenIdTracker.increment(); } /** * @dev Pauses all token transfers. * * See {ERC721Pausable} and {Pausable-_pause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function pause() public virtual { require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have pauser role to pause"); _pause(); } /** * @dev Unpauses all token transfers. * * See {ERC721Pausable} and {Pausable-_unpause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function unpause() public virtual { require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have pauser role to unpause"); _unpause(); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override(ERC721, ERC721Enumerable, ERC721Pausable) { super._beforeTokenTransfer(from, to, tokenId); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControlEnumerable, ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } } contract Rockets is ERC721PresetMinterPauserAutoId { using Strings for uint256; uint256 public preCost = 0.02 ether; uint256 public maxSupply = 10277; bool public presale = false; uint256 public whiteListCount = 0; mapping(address => uint256) private whiteLists; bool public revealed = false; string public notRevealedUri; string baseURI = ""; string public baseExtension = ".json"; constructor( string memory _name, string memory _symbol, string memory _initNotRevealedUri ) ERC721PresetMinterPauserAutoId(_name, _symbol, _initNotRevealedUri) { setNotRevealedURI(_initNotRevealedUri); } // catlist mint function preMint(uint256 _mintAmount) public payable { uint256 supply = totalSupply(); uint256 cost = preCost * _mintAmount; mintCheck(_mintAmount, supply, cost); require(presale, "Presale is not active."); require( whiteLists[msg.sender] >= _mintAmount, "CL: Mint Amount is Over." ); for (uint256 i = 1; i <= _mintAmount; i++) { _safeMint(msg.sender, supply + i); whiteLists[msg.sender]--; } } function mintCheck( uint256 _mintAmount, uint256 supply, uint256 cost ) private view { require(!paused(), "Mint is not active."); require(_mintAmount > 0, "Mint amount cannot be zero"); require( supply + _mintAmount <= maxSupply, "Total supply cannot exceed maxSupply" ); require(msg.value >= cost, "Not enough funds provided for mint"); } function ownerMint(uint256 count) public onlyRole(DEFAULT_ADMIN_ROLE) { uint256 supply = totalSupply(); for (uint256 i = 1; i <= count; i++) { _safeMint(msg.sender, supply + i); } } function batchMintTo(address[] memory list) public onlyRole(DEFAULT_ADMIN_ROLE) { for (uint256 i = 0; i < list.length; i++) { mint(list[i]); } } function setPresale(bool state) public onlyRole(DEFAULT_ADMIN_ROLE) { presale = state; } function setPresaleCost(uint256 price) public onlyRole(DEFAULT_ADMIN_ROLE) { preCost = price; } function deleteWL(address addr) public virtual onlyRole(DEFAULT_ADMIN_ROLE) { whiteListCount = whiteListCount - whiteLists[addr]; delete (whiteLists[addr]); } function updateWL(address addr, uint256 maxMint) public virtual onlyRole(DEFAULT_ADMIN_ROLE) { whiteListCount = whiteListCount - whiteLists[addr]; whiteLists[addr] = maxMint; whiteListCount = whiteListCount + maxMint; } function pushMultiWL(address[] memory list) public virtual onlyRole(DEFAULT_ADMIN_ROLE) { for (uint256 i = 0; i < list.length; i++) { whiteLists[list[i]]++; whiteListCount++; } } function withdraw() public onlyRole(DEFAULT_ADMIN_ROLE) { uint256 royalty = address(this).balance; Address.sendValue(payable(msg.sender), royalty); } function whiteListCountOfOwner(address owner) public view returns (uint256) { return whiteLists[owner]; } function setNotRevealedURI(string memory _notRevealedURI) public onlyRole(DEFAULT_ADMIN_ROLE) { notRevealedUri = _notRevealedURI; } function setBaseURI(string memory _newBaseURI) public onlyRole(DEFAULT_ADMIN_ROLE) { baseURI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyRole(DEFAULT_ADMIN_ROLE) { baseExtension = _newBaseExtension; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); if (revealed == false) { return notRevealedUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, tokenId.toString(), baseExtension ) ) : ""; } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function reveal(bool state) public onlyRole(DEFAULT_ADMIN_ROLE) { revealed = state; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"list","type":"address[]"}],"name":"batchMintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"deleteWL","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":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"preMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"list","type":"address[]"}],"name":"pushMultiWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPresaleCost","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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"maxMint","type":"uint256"}],"name":"updateWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whiteListCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"whiteListCountOfOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405266470de4df820000600f556128256010556000601160006101000a81548160ff02191690831515021790555060006012556000601460006101000a81548160ff02191690831515021790555060405180602001604052806000815250601690805190602001906200007792919062000834565b506040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060179080519060200190620000c592919062000834565b50348015620000d357600080fd5b5060405162006ee838038062006ee88339818101604052810190620000f9919062000a81565b828282828281600290805190602001906200011692919062000834565b5080600390805190602001906200012f92919062000834565b5050506000600c60006101000a81548160ff02191690831515021790555080600e90805190602001906200016592919062000834565b506200018a6000801b6200017e6200022960201b60201c565b6200023160201b60201c565b620001cb7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620001bf6200022960201b60201c565b6200023160201b60201c565b6200020c7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a620002006200022960201b60201c565b6200023160201b60201c565b50505062000220816200024760201b60201c565b50505062000f0b565b600033905090565b6200024382826200027960201b60201c565b5050565b6000801b6200025c81620002c160201b60201c565b81601590805190602001906200027492919062000834565b505050565b620002908282620002e560201b62001f541760201c565b620002bc8160016000858152602001908152602001600020620003d660201b620020341790919060201c565b505050565b620002e281620002d66200022960201b60201c565b6200040e60201b60201c565b50565b620002f78282620004d260201b60201c565b620003d257600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620003776200022960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600062000406836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200053c60201b60201c565b905092915050565b620004208282620004d260201b60201c565b620004ce57620004538173ffffffffffffffffffffffffffffffffffffffff166014620005b660201b620020641760201c565b6200046e8360001c6020620005b660201b620020641760201c565b6040516020016200048192919062000c27565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004c5919062000cbb565b60405180910390fd5b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006200055083836200081160201b60201c565b620005ab578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050620005b0565b600090505b92915050565b606060006002836002620005cb919062000d18565b620005d7919062000d79565b67ffffffffffffffff811115620005f357620005f262000913565b5b6040519080825280601f01601f191660200182016040528015620006265781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811062000661576200066062000dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110620006c857620006c762000dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026200070a919062000d18565b62000716919062000d79565b90505b6001811115620007c0577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106200075c576200075b62000dd6565b5b1a60f81b82828151811062000776576200077562000dd6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080620007b89062000e05565b905062000719565b506000841462000807576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007fe9062000e84565b60405180910390fd5b8091505092915050565b600080836001016000848152602001908152602001600020541415905092915050565b828054620008429062000ed5565b90600052602060002090601f016020900481019282620008665760008555620008b2565b82601f106200088157805160ff1916838001178555620008b2565b82800160010185558215620008b2579182015b82811115620008b157825182559160200191906001019062000894565b5b509050620008c19190620008c5565b5090565b5b80821115620008e0576000816000905550600101620008c6565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200094d8262000902565b810181811067ffffffffffffffff821117156200096f576200096e62000913565b5b80604052505050565b600062000984620008e4565b905062000992828262000942565b919050565b600067ffffffffffffffff821115620009b557620009b462000913565b5b620009c08262000902565b9050602081019050919050565b60005b83811015620009ed578082015181840152602081019050620009d0565b83811115620009fd576000848401525b50505050565b600062000a1a62000a148462000997565b62000978565b90508281526020810184848401111562000a395762000a38620008fd565b5b62000a46848285620009cd565b509392505050565b600082601f83011262000a665762000a65620008f8565b5b815162000a7884826020860162000a03565b91505092915050565b60008060006060848603121562000a9d5762000a9c620008ee565b5b600084015167ffffffffffffffff81111562000abe5762000abd620008f3565b5b62000acc8682870162000a4e565b935050602084015167ffffffffffffffff81111562000af05762000aef620008f3565b5b62000afe8682870162000a4e565b925050604084015167ffffffffffffffff81111562000b225762000b21620008f3565b5b62000b308682870162000a4e565b9150509250925092565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b600062000b7d60178362000b3a565b915062000b8a8262000b45565b601782019050919050565b600081519050919050565b600062000bad8262000b95565b62000bb9818562000b3a565b935062000bcb818560208601620009cd565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b600062000c0f60118362000b3a565b915062000c1c8262000bd7565b601182019050919050565b600062000c348262000b6e565b915062000c42828562000ba0565b915062000c4f8262000c00565b915062000c5d828462000ba0565b91508190509392505050565b600082825260208201905092915050565b600062000c878262000b95565b62000c93818562000c69565b935062000ca5818560208601620009cd565b62000cb08162000902565b840191505092915050565b6000602082019050818103600083015262000cd7818462000c7a565b905092915050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d258262000cdf565b915062000d328362000cdf565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000d6e5762000d6d62000ce9565b5b828202905092915050565b600062000d868262000cdf565b915062000d938362000cdf565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000dcb5762000dca62000ce9565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600062000e128262000cdf565b9150600082141562000e295762000e2862000ce9565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600062000e6c60208362000c69565b915062000e798262000e34565b602082019050919050565b6000602082019050818103600083015262000e9f8162000e5d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000eee57607f821691505b6020821081141562000f055762000f0462000ea6565b5b50919050565b615fcd8062000f1b6000396000f3fe6080604052600436106102ff5760003560e01c80638456cb5911610190578063c6682862116100dc578063d5abeb0111610095578063e985e9c51161006f578063e985e9c514610b7b578063f19e75d414610bb8578063f2c4ce1e14610be1578063fdea8e0b14610c0a576102ff565b8063d5abeb0114610afc578063da3ef23f14610b27578063e63ab1e914610b50576102ff565b8063c6682862146109c6578063c87b56dd146109f1578063ca15c87314610a2e578063ccbe803114610a6b578063d539139314610aa8578063d547741f14610ad3576102ff565b8063940cd05b11610149578063a22cb46511610123578063a22cb46514610920578063b6374e3514610949578063b88d4fde14610974578063c54e73e31461099d576102ff565b8063940cd05b146108a157806395d89b41146108ca578063a217fddf146108f5576102ff565b80638456cb59146107a257806386e24724146107b95780638ad433ac146107e25780638fdcf942146107fe5780639010d07c1461082757806391d1485414610864576102ff565b80633ccfd60b1161024f578063518d3e7d116102085780636030c508116101e25780636030c508146106d65780636352211e146106ff5780636a6278421461073c57806370a0823114610765576102ff565b8063518d3e7d1461065957806355f804b3146106825780635c975abb146106ab576102ff565b80633ccfd60b146105715780633f4ba83a1461058857806342842e0e1461059f57806342966c68146105c85780634f6ccce7146105f1578063518302271461062e576102ff565b806318160ddd116102bc5780632f2ff15d116102965780632f2ff15d146104b75780632f745c59146104e057806336568abe1461051d578063399dccb614610546576102ff565b806318160ddd1461042657806323b872dd14610451578063248a9ca31461047a576102ff565b806301ffc9a714610304578063021f70ae1461034157806306fdde031461036a578063081812fc14610395578063081c8c44146103d2578063095ea7b3146103fd575b600080fd5b34801561031057600080fd5b5061032b60048036038101906103269190614009565b610c35565b6040516103389190614051565b60405180910390f35b34801561034d57600080fd5b50610368600480360381019061036391906140ca565b610c47565b005b34801561037657600080fd5b5061037f610cee565b60405161038c9190614190565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b791906141e8565b610d80565b6040516103c99190614224565b60405180910390f35b3480156103de57600080fd5b506103e7610e05565b6040516103f49190614190565b60405180910390f35b34801561040957600080fd5b50610424600480360381019061041f919061423f565b610e93565b005b34801561043257600080fd5b5061043b610fab565b604051610448919061428e565b60405180910390f35b34801561045d57600080fd5b50610478600480360381019061047391906142a9565b610fb8565b005b34801561048657600080fd5b506104a1600480360381019061049c9190614332565b611018565b6040516104ae919061436e565b60405180910390f35b3480156104c357600080fd5b506104de60048036038101906104d99190614389565b611037565b005b3480156104ec57600080fd5b506105076004803603810190610502919061423f565b611058565b604051610514919061428e565b60405180910390f35b34801561052957600080fd5b50610544600480360381019061053f9190614389565b6110fd565b005b34801561055257600080fd5b5061055b611180565b604051610568919061428e565b60405180910390f35b34801561057d57600080fd5b50610586611186565b005b34801561059457600080fd5b5061059d6111a6565b005b3480156105ab57600080fd5b506105c660048036038101906105c191906142a9565b611220565b005b3480156105d457600080fd5b506105ef60048036038101906105ea91906141e8565b611240565b005b3480156105fd57600080fd5b50610618600480360381019061061391906141e8565b61129c565b604051610625919061428e565b60405180910390f35b34801561063a57600080fd5b5061064361130d565b6040516106509190614051565b60405180910390f35b34801561066557600080fd5b50610680600480360381019061067b919061423f565b611320565b005b34801561068e57600080fd5b506106a960048036038101906106a491906144fe565b6113dd565b005b3480156106b757600080fd5b506106c0611405565b6040516106cd9190614051565b60405180910390f35b3480156106e257600080fd5b506106fd60048036038101906106f8919061460f565b61141c565b005b34801561070b57600080fd5b50610726600480360381019061072191906141e8565b611470565b6040516107339190614224565b60405180910390f35b34801561074857600080fd5b50610763600480360381019061075e91906140ca565b611522565b005b34801561077157600080fd5b5061078c600480360381019061078791906140ca565b6115b2565b604051610799919061428e565b60405180910390f35b3480156107ae57600080fd5b506107b761166a565b005b3480156107c557600080fd5b506107e060048036038101906107db919061460f565b6116e4565b005b6107fc60048036038101906107f791906141e8565b61179c565b005b34801561080a57600080fd5b50610825600480360381019061082091906141e8565b611927565b005b34801561083357600080fd5b5061084e60048036038101906108499190614658565b61193f565b60405161085b9190614224565b60405180910390f35b34801561087057600080fd5b5061088b60048036038101906108869190614389565b61196e565b6040516108989190614051565b60405180910390f35b3480156108ad57600080fd5b506108c860048036038101906108c391906146c4565b6119d8565b005b3480156108d657600080fd5b506108df611a03565b6040516108ec9190614190565b60405180910390f35b34801561090157600080fd5b5061090a611a95565b604051610917919061436e565b60405180910390f35b34801561092c57600080fd5b50610947600480360381019061094291906146f1565b611a9c565b005b34801561095557600080fd5b5061095e611ab2565b60405161096b919061428e565b60405180910390f35b34801561098057600080fd5b5061099b600480360381019061099691906147d2565b611ab8565b005b3480156109a957600080fd5b506109c460048036038101906109bf91906146c4565b611b1a565b005b3480156109d257600080fd5b506109db611b45565b6040516109e89190614190565b60405180910390f35b3480156109fd57600080fd5b50610a186004803603810190610a1391906141e8565b611bd3565b604051610a259190614190565b60405180910390f35b348015610a3a57600080fd5b50610a556004803603810190610a509190614332565b611d2c565b604051610a62919061428e565b60405180910390f35b348015610a7757600080fd5b50610a926004803603810190610a8d91906140ca565b611d50565b604051610a9f919061428e565b60405180910390f35b348015610ab457600080fd5b50610abd611d99565b604051610aca919061436e565b60405180910390f35b348015610adf57600080fd5b50610afa6004803603810190610af59190614389565b611dbd565b005b348015610b0857600080fd5b50610b11611dde565b604051610b1e919061428e565b60405180910390f35b348015610b3357600080fd5b50610b4e6004803603810190610b4991906144fe565b611de4565b005b348015610b5c57600080fd5b50610b65611e0c565b604051610b72919061436e565b60405180910390f35b348015610b8757600080fd5b50610ba26004803603810190610b9d9190614855565b611e30565b604051610baf9190614051565b60405180910390f35b348015610bc457600080fd5b50610bdf6004803603810190610bda91906141e8565b611ec4565b005b348015610bed57600080fd5b50610c086004803603810190610c0391906144fe565b611f19565b005b348015610c1657600080fd5b50610c1f611f41565b604051610c2c9190614051565b60405180910390f35b6000610c40826122a0565b9050919050565b6000801b610c548161231a565b601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601254610ca191906148c4565b601281905550601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090555050565b606060028054610cfd90614927565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2990614927565b8015610d765780601f10610d4b57610100808354040283529160200191610d76565b820191906000526020600020905b815481529060010190602001808311610d5957829003601f168201915b5050505050905090565b6000610d8b8261232e565b610dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc1906149cb565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60158054610e1290614927565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3e90614927565b8015610e8b5780601f10610e6057610100808354040283529160200191610e8b565b820191906000526020600020905b815481529060010190602001808311610e6e57829003601f168201915b505050505081565b6000610e9e82611470565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0690614a5d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f2e61239a565b73ffffffffffffffffffffffffffffffffffffffff161480610f5d5750610f5c81610f5761239a565b611e30565b5b610f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9390614aef565b60405180910390fd5b610fa683836123a2565b505050565b6000600a80549050905090565b610fc9610fc361239a565b8261245b565b611008576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fff90614b81565b60405180910390fd5b611013838383612539565b505050565b6000806000838152602001908152602001600020600101549050919050565b61104082611018565b6110498161231a565b61105383836127a0565b505050565b6000611063836115b2565b82106110a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109b90614c13565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61110561239a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116990614ca5565b60405180910390fd5b61117c82826127d4565b5050565b60125481565b6000801b6111938161231a565b60004790506111a23382612808565b5050565b6111d77f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6111d261239a565b61196e565b611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614d37565b60405180910390fd5b61121e6128fc565b565b61123b83838360405180602001604052806000815250611ab8565b505050565b61125161124b61239a565b8261245b565b611290576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128790614dc9565b60405180910390fd5b6112998161299e565b50565b60006112a6610fab565b82106112e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112de90614e5b565b60405180910390fd5b600a82815481106112fb576112fa614e7b565b5b90600052602060002001549050919050565b601460009054906101000a900460ff1681565b6000801b61132d8161231a565b601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460125461137a91906148c4565b60128190555081601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816012546113d29190614eaa565b601281905550505050565b6000801b6113ea8161231a565b8160169080519060200190611400929190613efa565b505050565b6000600c60009054906101000a900460ff16905090565b6000801b6114298161231a565b60005b825181101561146b5761145883828151811061144b5761144a614e7b565b5b6020026020010151611522565b808061146390614f00565b91505061142c565b505050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611519576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151090614fbb565b60405180910390fd5b80915050919050565b6115537f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661154e61239a565b61196e565b611592576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115899061504d565b60405180910390fd5b6115a5816115a0600d612abb565b612ac9565b6115af600d612ca3565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161a906150df565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61169b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61169661239a565b61196e565b6116da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d190615171565b60405180910390fd5b6116e2612cb9565b565b6000801b6116f18161231a565b60005b8251811015611797576013600084838151811061171457611713614e7b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061176790614f00565b91905055506012600081548092919061177f90614f00565b9190505550808061178f90614f00565b9150506116f4565b505050565b60006117a6610fab565b9050600082600f546117b89190615191565b90506117c5838383612d5c565b601160009054906101000a900460ff16611814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180b90615237565b60405180910390fd5b82601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906152a3565b60405180910390fd5b6000600190505b838111611921576118b93382856118b49190614eaa565b612e7f565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611909906152c3565b9190505550808061191990614f00565b91505061189d565b50505050565b6000801b6119348161231a565b81600f819055505050565b60006119668260016000868152602001908152602001600020612e9d90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b6119e58161231a565b81601460006101000a81548160ff0219169083151502179055505050565b606060038054611a1290614927565b80601f0160208091040260200160405190810160405280929190818152602001828054611a3e90614927565b8015611a8b5780601f10611a6057610100808354040283529160200191611a8b565b820191906000526020600020905b815481529060010190602001808311611a6e57829003601f168201915b5050505050905090565b6000801b81565b611aae611aa761239a565b8383612eb7565b5050565b600f5481565b611ac9611ac361239a565b8361245b565b611b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aff90614b81565b60405180910390fd5b611b1484848484613024565b50505050565b6000801b611b278161231a565b81601160006101000a81548160ff0219169083151502179055505050565b60178054611b5290614927565b80601f0160208091040260200160405190810160405280929190818152602001828054611b7e90614927565b8015611bcb5780601f10611ba057610100808354040283529160200191611bcb565b820191906000526020600020905b815481529060010190602001808311611bae57829003601f168201915b505050505081565b6060611bde8261232e565b611c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c149061535f565b60405180910390fd5b60001515601460009054906101000a900460ff1615151415611ccb5760158054611c4690614927565b80601f0160208091040260200160405190810160405280929190818152602001828054611c7290614927565b8015611cbf5780601f10611c9457610100808354040283529160200191611cbf565b820191906000526020600020905b815481529060010190602001808311611ca257829003601f168201915b50505050509050611d27565b6000611cd5613080565b90506000815111611cf55760405180602001604052806000815250611d23565b80611cff84613112565b6017604051602001611d139392919061544f565b6040516020818303038152906040525b9150505b919050565b6000611d4960016000848152602001908152602001600020613273565b9050919050565b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b611dc682611018565b611dcf8161231a565b611dd983836127d4565b505050565b60105481565b6000801b611df18161231a565b8160179080519060200190611e07929190613efa565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b611ed18161231a565b6000611edb610fab565b90506000600190505b838111611f1357611f00338284611efb9190614eaa565b612e7f565b8080611f0b90614f00565b915050611ee4565b50505050565b6000801b611f268161231a565b8160159080519060200190611f3c929190613efa565b505050565b601160009054906101000a900460ff1681565b611f5e828261196e565b61203057600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611fd561239a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600061205c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613288565b905092915050565b6060600060028360026120779190615191565b6120819190614eaa565b67ffffffffffffffff81111561209a576120996143d3565b5b6040519080825280601f01601f1916602001820160405280156120cc5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061210457612103614e7b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061216857612167614e7b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026121a89190615191565b6121b29190614eaa565b90505b6001811115612252577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106121f4576121f3614e7b565b5b1a60f81b82828151811061220b5761220a614e7b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061224b906152c3565b90506121b5565b5060008414612296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228d906154cc565b60405180910390fd5b8091505092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123135750612312826132f8565b5b9050919050565b61232b8161232661239a565b6133da565b50565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661241583611470565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006124668261232e565b6124a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249c9061555e565b60405180910390fd5b60006124b083611470565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806124f257506124f18185611e30565b5b8061253057508373ffffffffffffffffffffffffffffffffffffffff1661251884610d80565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661255982611470565b73ffffffffffffffffffffffffffffffffffffffff16146125af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a6906155f0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561261f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261690615682565b60405180910390fd5b61262a838383613477565b6126356000826123a2565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461268591906148c4565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126dc9190614eaa565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461279b838383613487565b505050565b6127aa8282611f54565b6127cf816001600085815260200190815260200160002061203490919063ffffffff16565b505050565b6127de828261348c565b612803816001600085815260200190815260200160002061356d90919063ffffffff16565b505050565b8047101561284b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612842906156ee565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516128719061573f565b60006040518083038185875af1925050503d80600081146128ae576040519150601f19603f3d011682016040523d82523d6000602084013e6128b3565b606091505b50509050806128f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ee906157c6565b60405180910390fd5b505050565b612904611405565b612943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293a90615832565b60405180910390fd5b6000600c60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61298761239a565b6040516129949190614224565b60405180910390a1565b60006129a982611470565b90506129b781600084613477565b6129c26000836123a2565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a1291906148c4565b925050819055506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ab781600084613487565b5050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b309061589e565b60405180910390fd5b612b428161232e565b15612b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b799061590a565b60405180910390fd5b612b8e60008383613477565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bde9190614eaa565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c9f60008383613487565b5050565b6001816000016000828254019250508190555050565b612cc1611405565b15612d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf890615976565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612d4561239a565b604051612d529190614224565b60405180910390a1565b612d64611405565b15612da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9b906159e2565b60405180910390fd5b60008311612de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dde90615a4e565b60405180910390fd5b6010548383612df69190614eaa565b1115612e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2e90615ae0565b60405180910390fd5b80341015612e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7190615b72565b60405180910390fd5b505050565b612e9982826040518060200160405280600081525061359d565b5050565b6000612eac83600001836135f8565b60001c905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1d90615bde565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516130179190614051565b60405180910390a3505050565b61302f848484612539565b61303b84848484613623565b61307a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307190615c70565b60405180910390fd5b50505050565b60606016805461308f90614927565b80601f01602080910402602001604051908101604052809291908181526020018280546130bb90614927565b80156131085780601f106130dd57610100808354040283529160200191613108565b820191906000526020600020905b8154815290600101906020018083116130eb57829003601f168201915b5050505050905090565b6060600082141561315a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061326e565b600082905060005b6000821461318c57808061317590614f00565b915050600a826131859190615cbf565b9150613162565b60008167ffffffffffffffff8111156131a8576131a76143d3565b5b6040519080825280601f01601f1916602001820160405280156131da5781602001600182028036833780820191505090505b5090505b60008514613267576001826131f391906148c4565b9150600a856132029190615cf0565b603061320e9190614eaa565b60f81b81838151811061322457613223614e7b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132609190615cbf565b94506131de565b8093505050505b919050565b6000613281826000016137ba565b9050919050565b600061329483836137cb565b6132ed5782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506132f2565b600090505b92915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806133c357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806133d357506133d2826137ee565b5b9050919050565b6133e4828261196e565b613473576134098173ffffffffffffffffffffffffffffffffffffffff166014612064565b6134178360001c6020612064565b604051602001613428929190615db9565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346a9190614190565b60405180910390fd5b5050565b613482838383613868565b505050565b505050565b613496828261196e565b1561356957600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061350e61239a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000613595836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6138c0565b905092915050565b6135a78383612ac9565b6135b46000848484613623565b6135f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ea90615c70565b60405180910390fd5b505050565b60008260000182815481106136105761360f614e7b565b5b9060005260206000200154905092915050565b60006136448473ffffffffffffffffffffffffffffffffffffffff166139d4565b156137ad578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261366d61239a565b8786866040518563ffffffff1660e01b815260040161368f9493929190615e48565b602060405180830381600087803b1580156136a957600080fd5b505af19250505080156136da57506040513d601f19601f820116820180604052508101906136d79190615ea9565b60015b61375d573d806000811461370a576040519150601f19603f3d011682016040523d82523d6000602084013e61370f565b606091505b50600081511415613755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374c90615c70565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506137b2565b600190505b949350505050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806138615750613860826139f7565b5b9050919050565b613873838383613a71565b61387b611405565b156138bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138b290615f48565b60405180910390fd5b505050565b600080836001016000848152602001908152602001600020549050600081146139c85760006001826138f291906148c4565b905060006001866000018054905061390a91906148c4565b905081811461397957600086600001828154811061392b5761392a614e7b565b5b906000526020600020015490508087600001848154811061394f5761394e614e7b565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061398d5761398c615f68565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506139ce565b60009150505b92915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613a6a5750613a6982613b85565b5b9050919050565b613a7c838383613bef565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613abf57613aba81613bf4565b613afe565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613afd57613afc8382613c3d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b4157613b3c81613daa565b613b80565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613b7f57613b7e8282613e7b565b5b5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613c4a846115b2565b613c5491906148c4565b9050600060096000848152602001908152602001600020549050818114613d39576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050613dbe91906148c4565b90506000600b60008481526020019081526020016000205490506000600a8381548110613dee57613ded614e7b565b5b9060005260206000200154905080600a8381548110613e1057613e0f614e7b565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480613e5f57613e5e615f68565b5b6001900381819060005260206000200160009055905550505050565b6000613e86836115b2565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b828054613f0690614927565b90600052602060002090601f016020900481019282613f285760008555613f6f565b82601f10613f4157805160ff1916838001178555613f6f565b82800160010185558215613f6f579182015b82811115613f6e578251825591602001919060010190613f53565b5b509050613f7c9190613f80565b5090565b5b80821115613f99576000816000905550600101613f81565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613fe681613fb1565b8114613ff157600080fd5b50565b60008135905061400381613fdd565b92915050565b60006020828403121561401f5761401e613fa7565b5b600061402d84828501613ff4565b91505092915050565b60008115159050919050565b61404b81614036565b82525050565b60006020820190506140666000830184614042565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006140978261406c565b9050919050565b6140a78161408c565b81146140b257600080fd5b50565b6000813590506140c48161409e565b92915050565b6000602082840312156140e0576140df613fa7565b5b60006140ee848285016140b5565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614131578082015181840152602081019050614116565b83811115614140576000848401525b50505050565b6000601f19601f8301169050919050565b6000614162826140f7565b61416c8185614102565b935061417c818560208601614113565b61418581614146565b840191505092915050565b600060208201905081810360008301526141aa8184614157565b905092915050565b6000819050919050565b6141c5816141b2565b81146141d057600080fd5b50565b6000813590506141e2816141bc565b92915050565b6000602082840312156141fe576141fd613fa7565b5b600061420c848285016141d3565b91505092915050565b61421e8161408c565b82525050565b60006020820190506142396000830184614215565b92915050565b6000806040838503121561425657614255613fa7565b5b6000614264858286016140b5565b9250506020614275858286016141d3565b9150509250929050565b614288816141b2565b82525050565b60006020820190506142a3600083018461427f565b92915050565b6000806000606084860312156142c2576142c1613fa7565b5b60006142d0868287016140b5565b93505060206142e1868287016140b5565b92505060406142f2868287016141d3565b9150509250925092565b6000819050919050565b61430f816142fc565b811461431a57600080fd5b50565b60008135905061432c81614306565b92915050565b60006020828403121561434857614347613fa7565b5b60006143568482850161431d565b91505092915050565b614368816142fc565b82525050565b6000602082019050614383600083018461435f565b92915050565b600080604083850312156143a05761439f613fa7565b5b60006143ae8582860161431d565b92505060206143bf858286016140b5565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61440b82614146565b810181811067ffffffffffffffff8211171561442a576144296143d3565b5b80604052505050565b600061443d613f9d565b90506144498282614402565b919050565b600067ffffffffffffffff821115614469576144686143d3565b5b61447282614146565b9050602081019050919050565b82818337600083830152505050565b60006144a161449c8461444e565b614433565b9050828152602081018484840111156144bd576144bc6143ce565b5b6144c884828561447f565b509392505050565b600082601f8301126144e5576144e46143c9565b5b81356144f584826020860161448e565b91505092915050565b60006020828403121561451457614513613fa7565b5b600082013567ffffffffffffffff81111561453257614531613fac565b5b61453e848285016144d0565b91505092915050565b600067ffffffffffffffff821115614562576145616143d3565b5b602082029050602081019050919050565b600080fd5b600061458b61458684614547565b614433565b905080838252602082019050602084028301858111156145ae576145ad614573565b5b835b818110156145d757806145c388826140b5565b8452602084019350506020810190506145b0565b5050509392505050565b600082601f8301126145f6576145f56143c9565b5b8135614606848260208601614578565b91505092915050565b60006020828403121561462557614624613fa7565b5b600082013567ffffffffffffffff81111561464357614642613fac565b5b61464f848285016145e1565b91505092915050565b6000806040838503121561466f5761466e613fa7565b5b600061467d8582860161431d565b925050602061468e858286016141d3565b9150509250929050565b6146a181614036565b81146146ac57600080fd5b50565b6000813590506146be81614698565b92915050565b6000602082840312156146da576146d9613fa7565b5b60006146e8848285016146af565b91505092915050565b6000806040838503121561470857614707613fa7565b5b6000614716858286016140b5565b9250506020614727858286016146af565b9150509250929050565b600067ffffffffffffffff82111561474c5761474b6143d3565b5b61475582614146565b9050602081019050919050565b600061477561477084614731565b614433565b905082815260208101848484011115614791576147906143ce565b5b61479c84828561447f565b509392505050565b600082601f8301126147b9576147b86143c9565b5b81356147c9848260208601614762565b91505092915050565b600080600080608085870312156147ec576147eb613fa7565b5b60006147fa878288016140b5565b945050602061480b878288016140b5565b935050604061481c878288016141d3565b925050606085013567ffffffffffffffff81111561483d5761483c613fac565b5b614849878288016147a4565b91505092959194509250565b6000806040838503121561486c5761486b613fa7565b5b600061487a858286016140b5565b925050602061488b858286016140b5565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148cf826141b2565b91506148da836141b2565b9250828210156148ed576148ec614895565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061493f57607f821691505b60208210811415614953576149526148f8565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006149b5602c83614102565b91506149c082614959565b604082019050919050565b600060208201905081810360008301526149e4816149a8565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614a47602183614102565b9150614a52826149eb565b604082019050919050565b60006020820190508181036000830152614a7681614a3a565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614ad9603883614102565b9150614ae482614a7d565b604082019050919050565b60006020820190508181036000830152614b0881614acc565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614b6b603183614102565b9150614b7682614b0f565b604082019050919050565b60006020820190508181036000830152614b9a81614b5e565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614bfd602b83614102565b9150614c0882614ba1565b604082019050919050565b60006020820190508181036000830152614c2c81614bf0565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000614c8f602f83614102565b9150614c9a82614c33565b604082019050919050565b60006020820190508181036000830152614cbe81614c82565b9050919050565b7f4552433732315072657365744d696e7465725061757365724175746f49643a2060008201527f6d75737420686176652070617573657220726f6c6520746f20756e7061757365602082015250565b6000614d21604083614102565b9150614d2c82614cc5565b604082019050919050565b60006020820190508181036000830152614d5081614d14565b9050919050565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b6000614db3603083614102565b9150614dbe82614d57565b604082019050919050565b60006020820190508181036000830152614de281614da6565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614e45602c83614102565b9150614e5082614de9565b604082019050919050565b60006020820190508181036000830152614e7481614e38565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614eb5826141b2565b9150614ec0836141b2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ef557614ef4614895565b5b828201905092915050565b6000614f0b826141b2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f3e57614f3d614895565b5b600182019050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614fa5602983614102565b9150614fb082614f49565b604082019050919050565b60006020820190508181036000830152614fd481614f98565b9050919050565b7f4552433732315072657365744d696e7465725061757365724175746f49643a2060008201527f6d7573742068617665206d696e74657220726f6c6520746f206d696e74000000602082015250565b6000615037603d83614102565b915061504282614fdb565b604082019050919050565b600060208201905081810360008301526150668161502a565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006150c9602a83614102565b91506150d48261506d565b604082019050919050565b600060208201905081810360008301526150f8816150bc565b9050919050565b7f4552433732315072657365744d696e7465725061757365724175746f49643a2060008201527f6d75737420686176652070617573657220726f6c6520746f2070617573650000602082015250565b600061515b603e83614102565b9150615166826150ff565b604082019050919050565b6000602082019050818103600083015261518a8161514e565b9050919050565b600061519c826141b2565b91506151a7836141b2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151e0576151df614895565b5b828202905092915050565b7f50726573616c65206973206e6f74206163746976652e00000000000000000000600082015250565b6000615221601683614102565b915061522c826151eb565b602082019050919050565b6000602082019050818103600083015261525081615214565b9050919050565b7f434c3a204d696e7420416d6f756e74206973204f7665722e0000000000000000600082015250565b600061528d601883614102565b915061529882615257565b602082019050919050565b600060208201905081810360008301526152bc81615280565b9050919050565b60006152ce826141b2565b915060008214156152e2576152e1614895565b5b600182039050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615349602f83614102565b9150615354826152ed565b604082019050919050565b600060208201905081810360008301526153788161533c565b9050919050565b600081905092915050565b6000615395826140f7565b61539f818561537f565b93506153af818560208601614113565b80840191505092915050565b60008190508160005260206000209050919050565b600081546153dd81614927565b6153e7818661537f565b94506001821660008114615402576001811461541357615446565b60ff19831686528186019350615446565b61541c856153bb565b60005b8381101561543e5781548189015260018201915060208101905061541f565b838801955050505b50505092915050565b600061545b828661538a565b9150615467828561538a565b915061547382846153d0565b9150819050949350505050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006154b6602083614102565b91506154c182615480565b602082019050919050565b600060208201905081810360008301526154e5816154a9565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000615548602c83614102565b9150615553826154ec565b604082019050919050565b600060208201905081810360008301526155778161553b565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006155da602583614102565b91506155e58261557e565b604082019050919050565b60006020820190508181036000830152615609816155cd565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061566c602483614102565b915061567782615610565b604082019050919050565b6000602082019050818103600083015261569b8161565f565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006156d8601d83614102565b91506156e3826156a2565b602082019050919050565b60006020820190508181036000830152615707816156cb565b9050919050565b600081905092915050565b50565b600061572960008361570e565b915061573482615719565b600082019050919050565b600061574a8261571c565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b60006157b0603a83614102565b91506157bb82615754565b604082019050919050565b600060208201905081810360008301526157df816157a3565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b600061581c601483614102565b9150615827826157e6565b602082019050919050565b6000602082019050818103600083015261584b8161580f565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615888602083614102565b915061589382615852565b602082019050919050565b600060208201905081810360008301526158b78161587b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006158f4601c83614102565b91506158ff826158be565b602082019050919050565b60006020820190508181036000830152615923816158e7565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000615960601083614102565b915061596b8261592a565b602082019050919050565b6000602082019050818103600083015261598f81615953565b9050919050565b7f4d696e74206973206e6f74206163746976652e00000000000000000000000000600082015250565b60006159cc601383614102565b91506159d782615996565b602082019050919050565b600060208201905081810360008301526159fb816159bf565b9050919050565b7f4d696e7420616d6f756e742063616e6e6f74206265207a65726f000000000000600082015250565b6000615a38601a83614102565b9150615a4382615a02565b602082019050919050565b60006020820190508181036000830152615a6781615a2b565b9050919050565b7f546f74616c20737570706c792063616e6e6f7420657863656564206d6178537560008201527f70706c7900000000000000000000000000000000000000000000000000000000602082015250565b6000615aca602483614102565b9150615ad582615a6e565b604082019050919050565b60006020820190508181036000830152615af981615abd565b9050919050565b7f4e6f7420656e6f7567682066756e64732070726f766964656420666f72206d6960008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b6000615b5c602283614102565b9150615b6782615b00565b604082019050919050565b60006020820190508181036000830152615b8b81615b4f565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615bc8601983614102565b9150615bd382615b92565b602082019050919050565b60006020820190508181036000830152615bf781615bbb565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615c5a603283614102565b9150615c6582615bfe565b604082019050919050565b60006020820190508181036000830152615c8981615c4d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615cca826141b2565b9150615cd5836141b2565b925082615ce557615ce4615c90565b5b828204905092915050565b6000615cfb826141b2565b9150615d06836141b2565b925082615d1657615d15615c90565b5b828206905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000615d5760178361537f565b9150615d6282615d21565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000615da360118361537f565b9150615dae82615d6d565b601182019050919050565b6000615dc482615d4a565b9150615dd0828561538a565b9150615ddb82615d96565b9150615de7828461538a565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000615e1a82615df3565b615e248185615dfe565b9350615e34818560208601614113565b615e3d81614146565b840191505092915050565b6000608082019050615e5d6000830187614215565b615e6a6020830186614215565b615e77604083018561427f565b8181036060830152615e898184615e0f565b905095945050505050565b600081519050615ea381613fdd565b92915050565b600060208284031215615ebf57615ebe613fa7565b5b6000615ecd84828501615e94565b91505092915050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b6000615f32602b83614102565b9150615f3d82615ed6565b604082019050919050565b60006020820190508181036000830152615f6181615f25565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212204acce97e47d9ae6d763a04e4f5541edc242401a8a6b44f69067ed85a7c872dc564736f6c63430008090033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000007526f636b657473000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004524b5453000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d4e5156545a757767375550524467337468657a37704d4565435a53643434527936514c615a4a6331337556410000000000000000000000
Deployed Bytecode
0x6080604052600436106102ff5760003560e01c80638456cb5911610190578063c6682862116100dc578063d5abeb0111610095578063e985e9c51161006f578063e985e9c514610b7b578063f19e75d414610bb8578063f2c4ce1e14610be1578063fdea8e0b14610c0a576102ff565b8063d5abeb0114610afc578063da3ef23f14610b27578063e63ab1e914610b50576102ff565b8063c6682862146109c6578063c87b56dd146109f1578063ca15c87314610a2e578063ccbe803114610a6b578063d539139314610aa8578063d547741f14610ad3576102ff565b8063940cd05b11610149578063a22cb46511610123578063a22cb46514610920578063b6374e3514610949578063b88d4fde14610974578063c54e73e31461099d576102ff565b8063940cd05b146108a157806395d89b41146108ca578063a217fddf146108f5576102ff565b80638456cb59146107a257806386e24724146107b95780638ad433ac146107e25780638fdcf942146107fe5780639010d07c1461082757806391d1485414610864576102ff565b80633ccfd60b1161024f578063518d3e7d116102085780636030c508116101e25780636030c508146106d65780636352211e146106ff5780636a6278421461073c57806370a0823114610765576102ff565b8063518d3e7d1461065957806355f804b3146106825780635c975abb146106ab576102ff565b80633ccfd60b146105715780633f4ba83a1461058857806342842e0e1461059f57806342966c68146105c85780634f6ccce7146105f1578063518302271461062e576102ff565b806318160ddd116102bc5780632f2ff15d116102965780632f2ff15d146104b75780632f745c59146104e057806336568abe1461051d578063399dccb614610546576102ff565b806318160ddd1461042657806323b872dd14610451578063248a9ca31461047a576102ff565b806301ffc9a714610304578063021f70ae1461034157806306fdde031461036a578063081812fc14610395578063081c8c44146103d2578063095ea7b3146103fd575b600080fd5b34801561031057600080fd5b5061032b60048036038101906103269190614009565b610c35565b6040516103389190614051565b60405180910390f35b34801561034d57600080fd5b50610368600480360381019061036391906140ca565b610c47565b005b34801561037657600080fd5b5061037f610cee565b60405161038c9190614190565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b791906141e8565b610d80565b6040516103c99190614224565b60405180910390f35b3480156103de57600080fd5b506103e7610e05565b6040516103f49190614190565b60405180910390f35b34801561040957600080fd5b50610424600480360381019061041f919061423f565b610e93565b005b34801561043257600080fd5b5061043b610fab565b604051610448919061428e565b60405180910390f35b34801561045d57600080fd5b50610478600480360381019061047391906142a9565b610fb8565b005b34801561048657600080fd5b506104a1600480360381019061049c9190614332565b611018565b6040516104ae919061436e565b60405180910390f35b3480156104c357600080fd5b506104de60048036038101906104d99190614389565b611037565b005b3480156104ec57600080fd5b506105076004803603810190610502919061423f565b611058565b604051610514919061428e565b60405180910390f35b34801561052957600080fd5b50610544600480360381019061053f9190614389565b6110fd565b005b34801561055257600080fd5b5061055b611180565b604051610568919061428e565b60405180910390f35b34801561057d57600080fd5b50610586611186565b005b34801561059457600080fd5b5061059d6111a6565b005b3480156105ab57600080fd5b506105c660048036038101906105c191906142a9565b611220565b005b3480156105d457600080fd5b506105ef60048036038101906105ea91906141e8565b611240565b005b3480156105fd57600080fd5b50610618600480360381019061061391906141e8565b61129c565b604051610625919061428e565b60405180910390f35b34801561063a57600080fd5b5061064361130d565b6040516106509190614051565b60405180910390f35b34801561066557600080fd5b50610680600480360381019061067b919061423f565b611320565b005b34801561068e57600080fd5b506106a960048036038101906106a491906144fe565b6113dd565b005b3480156106b757600080fd5b506106c0611405565b6040516106cd9190614051565b60405180910390f35b3480156106e257600080fd5b506106fd60048036038101906106f8919061460f565b61141c565b005b34801561070b57600080fd5b50610726600480360381019061072191906141e8565b611470565b6040516107339190614224565b60405180910390f35b34801561074857600080fd5b50610763600480360381019061075e91906140ca565b611522565b005b34801561077157600080fd5b5061078c600480360381019061078791906140ca565b6115b2565b604051610799919061428e565b60405180910390f35b3480156107ae57600080fd5b506107b761166a565b005b3480156107c557600080fd5b506107e060048036038101906107db919061460f565b6116e4565b005b6107fc60048036038101906107f791906141e8565b61179c565b005b34801561080a57600080fd5b50610825600480360381019061082091906141e8565b611927565b005b34801561083357600080fd5b5061084e60048036038101906108499190614658565b61193f565b60405161085b9190614224565b60405180910390f35b34801561087057600080fd5b5061088b60048036038101906108869190614389565b61196e565b6040516108989190614051565b60405180910390f35b3480156108ad57600080fd5b506108c860048036038101906108c391906146c4565b6119d8565b005b3480156108d657600080fd5b506108df611a03565b6040516108ec9190614190565b60405180910390f35b34801561090157600080fd5b5061090a611a95565b604051610917919061436e565b60405180910390f35b34801561092c57600080fd5b50610947600480360381019061094291906146f1565b611a9c565b005b34801561095557600080fd5b5061095e611ab2565b60405161096b919061428e565b60405180910390f35b34801561098057600080fd5b5061099b600480360381019061099691906147d2565b611ab8565b005b3480156109a957600080fd5b506109c460048036038101906109bf91906146c4565b611b1a565b005b3480156109d257600080fd5b506109db611b45565b6040516109e89190614190565b60405180910390f35b3480156109fd57600080fd5b50610a186004803603810190610a1391906141e8565b611bd3565b604051610a259190614190565b60405180910390f35b348015610a3a57600080fd5b50610a556004803603810190610a509190614332565b611d2c565b604051610a62919061428e565b60405180910390f35b348015610a7757600080fd5b50610a926004803603810190610a8d91906140ca565b611d50565b604051610a9f919061428e565b60405180910390f35b348015610ab457600080fd5b50610abd611d99565b604051610aca919061436e565b60405180910390f35b348015610adf57600080fd5b50610afa6004803603810190610af59190614389565b611dbd565b005b348015610b0857600080fd5b50610b11611dde565b604051610b1e919061428e565b60405180910390f35b348015610b3357600080fd5b50610b4e6004803603810190610b4991906144fe565b611de4565b005b348015610b5c57600080fd5b50610b65611e0c565b604051610b72919061436e565b60405180910390f35b348015610b8757600080fd5b50610ba26004803603810190610b9d9190614855565b611e30565b604051610baf9190614051565b60405180910390f35b348015610bc457600080fd5b50610bdf6004803603810190610bda91906141e8565b611ec4565b005b348015610bed57600080fd5b50610c086004803603810190610c0391906144fe565b611f19565b005b348015610c1657600080fd5b50610c1f611f41565b604051610c2c9190614051565b60405180910390f35b6000610c40826122a0565b9050919050565b6000801b610c548161231a565b601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601254610ca191906148c4565b601281905550601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090555050565b606060028054610cfd90614927565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2990614927565b8015610d765780601f10610d4b57610100808354040283529160200191610d76565b820191906000526020600020905b815481529060010190602001808311610d5957829003601f168201915b5050505050905090565b6000610d8b8261232e565b610dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc1906149cb565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60158054610e1290614927565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3e90614927565b8015610e8b5780601f10610e6057610100808354040283529160200191610e8b565b820191906000526020600020905b815481529060010190602001808311610e6e57829003601f168201915b505050505081565b6000610e9e82611470565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0690614a5d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f2e61239a565b73ffffffffffffffffffffffffffffffffffffffff161480610f5d5750610f5c81610f5761239a565b611e30565b5b610f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9390614aef565b60405180910390fd5b610fa683836123a2565b505050565b6000600a80549050905090565b610fc9610fc361239a565b8261245b565b611008576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fff90614b81565b60405180910390fd5b611013838383612539565b505050565b6000806000838152602001908152602001600020600101549050919050565b61104082611018565b6110498161231a565b61105383836127a0565b505050565b6000611063836115b2565b82106110a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109b90614c13565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61110561239a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116990614ca5565b60405180910390fd5b61117c82826127d4565b5050565b60125481565b6000801b6111938161231a565b60004790506111a23382612808565b5050565b6111d77f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6111d261239a565b61196e565b611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614d37565b60405180910390fd5b61121e6128fc565b565b61123b83838360405180602001604052806000815250611ab8565b505050565b61125161124b61239a565b8261245b565b611290576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128790614dc9565b60405180910390fd5b6112998161299e565b50565b60006112a6610fab565b82106112e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112de90614e5b565b60405180910390fd5b600a82815481106112fb576112fa614e7b565b5b90600052602060002001549050919050565b601460009054906101000a900460ff1681565b6000801b61132d8161231a565b601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460125461137a91906148c4565b60128190555081601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816012546113d29190614eaa565b601281905550505050565b6000801b6113ea8161231a565b8160169080519060200190611400929190613efa565b505050565b6000600c60009054906101000a900460ff16905090565b6000801b6114298161231a565b60005b825181101561146b5761145883828151811061144b5761144a614e7b565b5b6020026020010151611522565b808061146390614f00565b91505061142c565b505050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611519576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151090614fbb565b60405180910390fd5b80915050919050565b6115537f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661154e61239a565b61196e565b611592576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115899061504d565b60405180910390fd5b6115a5816115a0600d612abb565b612ac9565b6115af600d612ca3565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161a906150df565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61169b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61169661239a565b61196e565b6116da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d190615171565b60405180910390fd5b6116e2612cb9565b565b6000801b6116f18161231a565b60005b8251811015611797576013600084838151811061171457611713614e7b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061176790614f00565b91905055506012600081548092919061177f90614f00565b9190505550808061178f90614f00565b9150506116f4565b505050565b60006117a6610fab565b9050600082600f546117b89190615191565b90506117c5838383612d5c565b601160009054906101000a900460ff16611814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180b90615237565b60405180910390fd5b82601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906152a3565b60405180910390fd5b6000600190505b838111611921576118b93382856118b49190614eaa565b612e7f565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611909906152c3565b9190505550808061191990614f00565b91505061189d565b50505050565b6000801b6119348161231a565b81600f819055505050565b60006119668260016000868152602001908152602001600020612e9d90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b6119e58161231a565b81601460006101000a81548160ff0219169083151502179055505050565b606060038054611a1290614927565b80601f0160208091040260200160405190810160405280929190818152602001828054611a3e90614927565b8015611a8b5780601f10611a6057610100808354040283529160200191611a8b565b820191906000526020600020905b815481529060010190602001808311611a6e57829003601f168201915b5050505050905090565b6000801b81565b611aae611aa761239a565b8383612eb7565b5050565b600f5481565b611ac9611ac361239a565b8361245b565b611b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aff90614b81565b60405180910390fd5b611b1484848484613024565b50505050565b6000801b611b278161231a565b81601160006101000a81548160ff0219169083151502179055505050565b60178054611b5290614927565b80601f0160208091040260200160405190810160405280929190818152602001828054611b7e90614927565b8015611bcb5780601f10611ba057610100808354040283529160200191611bcb565b820191906000526020600020905b815481529060010190602001808311611bae57829003601f168201915b505050505081565b6060611bde8261232e565b611c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c149061535f565b60405180910390fd5b60001515601460009054906101000a900460ff1615151415611ccb5760158054611c4690614927565b80601f0160208091040260200160405190810160405280929190818152602001828054611c7290614927565b8015611cbf5780601f10611c9457610100808354040283529160200191611cbf565b820191906000526020600020905b815481529060010190602001808311611ca257829003601f168201915b50505050509050611d27565b6000611cd5613080565b90506000815111611cf55760405180602001604052806000815250611d23565b80611cff84613112565b6017604051602001611d139392919061544f565b6040516020818303038152906040525b9150505b919050565b6000611d4960016000848152602001908152602001600020613273565b9050919050565b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b611dc682611018565b611dcf8161231a565b611dd983836127d4565b505050565b60105481565b6000801b611df18161231a565b8160179080519060200190611e07929190613efa565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b611ed18161231a565b6000611edb610fab565b90506000600190505b838111611f1357611f00338284611efb9190614eaa565b612e7f565b8080611f0b90614f00565b915050611ee4565b50505050565b6000801b611f268161231a565b8160159080519060200190611f3c929190613efa565b505050565b601160009054906101000a900460ff1681565b611f5e828261196e565b61203057600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611fd561239a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600061205c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613288565b905092915050565b6060600060028360026120779190615191565b6120819190614eaa565b67ffffffffffffffff81111561209a576120996143d3565b5b6040519080825280601f01601f1916602001820160405280156120cc5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061210457612103614e7b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061216857612167614e7b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026121a89190615191565b6121b29190614eaa565b90505b6001811115612252577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106121f4576121f3614e7b565b5b1a60f81b82828151811061220b5761220a614e7b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061224b906152c3565b90506121b5565b5060008414612296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228d906154cc565b60405180910390fd5b8091505092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123135750612312826132f8565b5b9050919050565b61232b8161232661239a565b6133da565b50565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661241583611470565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006124668261232e565b6124a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249c9061555e565b60405180910390fd5b60006124b083611470565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806124f257506124f18185611e30565b5b8061253057508373ffffffffffffffffffffffffffffffffffffffff1661251884610d80565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661255982611470565b73ffffffffffffffffffffffffffffffffffffffff16146125af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a6906155f0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561261f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261690615682565b60405180910390fd5b61262a838383613477565b6126356000826123a2565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461268591906148c4565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126dc9190614eaa565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461279b838383613487565b505050565b6127aa8282611f54565b6127cf816001600085815260200190815260200160002061203490919063ffffffff16565b505050565b6127de828261348c565b612803816001600085815260200190815260200160002061356d90919063ffffffff16565b505050565b8047101561284b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612842906156ee565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516128719061573f565b60006040518083038185875af1925050503d80600081146128ae576040519150601f19603f3d011682016040523d82523d6000602084013e6128b3565b606091505b50509050806128f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ee906157c6565b60405180910390fd5b505050565b612904611405565b612943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293a90615832565b60405180910390fd5b6000600c60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61298761239a565b6040516129949190614224565b60405180910390a1565b60006129a982611470565b90506129b781600084613477565b6129c26000836123a2565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a1291906148c4565b925050819055506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ab781600084613487565b5050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b309061589e565b60405180910390fd5b612b428161232e565b15612b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b799061590a565b60405180910390fd5b612b8e60008383613477565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bde9190614eaa565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c9f60008383613487565b5050565b6001816000016000828254019250508190555050565b612cc1611405565b15612d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf890615976565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612d4561239a565b604051612d529190614224565b60405180910390a1565b612d64611405565b15612da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9b906159e2565b60405180910390fd5b60008311612de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dde90615a4e565b60405180910390fd5b6010548383612df69190614eaa565b1115612e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2e90615ae0565b60405180910390fd5b80341015612e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7190615b72565b60405180910390fd5b505050565b612e9982826040518060200160405280600081525061359d565b5050565b6000612eac83600001836135f8565b60001c905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1d90615bde565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516130179190614051565b60405180910390a3505050565b61302f848484612539565b61303b84848484613623565b61307a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307190615c70565b60405180910390fd5b50505050565b60606016805461308f90614927565b80601f01602080910402602001604051908101604052809291908181526020018280546130bb90614927565b80156131085780601f106130dd57610100808354040283529160200191613108565b820191906000526020600020905b8154815290600101906020018083116130eb57829003601f168201915b5050505050905090565b6060600082141561315a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061326e565b600082905060005b6000821461318c57808061317590614f00565b915050600a826131859190615cbf565b9150613162565b60008167ffffffffffffffff8111156131a8576131a76143d3565b5b6040519080825280601f01601f1916602001820160405280156131da5781602001600182028036833780820191505090505b5090505b60008514613267576001826131f391906148c4565b9150600a856132029190615cf0565b603061320e9190614eaa565b60f81b81838151811061322457613223614e7b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132609190615cbf565b94506131de565b8093505050505b919050565b6000613281826000016137ba565b9050919050565b600061329483836137cb565b6132ed5782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506132f2565b600090505b92915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806133c357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806133d357506133d2826137ee565b5b9050919050565b6133e4828261196e565b613473576134098173ffffffffffffffffffffffffffffffffffffffff166014612064565b6134178360001c6020612064565b604051602001613428929190615db9565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346a9190614190565b60405180910390fd5b5050565b613482838383613868565b505050565b505050565b613496828261196e565b1561356957600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061350e61239a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000613595836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6138c0565b905092915050565b6135a78383612ac9565b6135b46000848484613623565b6135f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ea90615c70565b60405180910390fd5b505050565b60008260000182815481106136105761360f614e7b565b5b9060005260206000200154905092915050565b60006136448473ffffffffffffffffffffffffffffffffffffffff166139d4565b156137ad578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261366d61239a565b8786866040518563ffffffff1660e01b815260040161368f9493929190615e48565b602060405180830381600087803b1580156136a957600080fd5b505af19250505080156136da57506040513d601f19601f820116820180604052508101906136d79190615ea9565b60015b61375d573d806000811461370a576040519150601f19603f3d011682016040523d82523d6000602084013e61370f565b606091505b50600081511415613755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374c90615c70565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506137b2565b600190505b949350505050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806138615750613860826139f7565b5b9050919050565b613873838383613a71565b61387b611405565b156138bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138b290615f48565b60405180910390fd5b505050565b600080836001016000848152602001908152602001600020549050600081146139c85760006001826138f291906148c4565b905060006001866000018054905061390a91906148c4565b905081811461397957600086600001828154811061392b5761392a614e7b565b5b906000526020600020015490508087600001848154811061394f5761394e614e7b565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061398d5761398c615f68565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506139ce565b60009150505b92915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613a6a5750613a6982613b85565b5b9050919050565b613a7c838383613bef565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613abf57613aba81613bf4565b613afe565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613afd57613afc8382613c3d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b4157613b3c81613daa565b613b80565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613b7f57613b7e8282613e7b565b5b5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613c4a846115b2565b613c5491906148c4565b9050600060096000848152602001908152602001600020549050818114613d39576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050613dbe91906148c4565b90506000600b60008481526020019081526020016000205490506000600a8381548110613dee57613ded614e7b565b5b9060005260206000200154905080600a8381548110613e1057613e0f614e7b565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480613e5f57613e5e615f68565b5b6001900381819060005260206000200160009055905550505050565b6000613e86836115b2565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b828054613f0690614927565b90600052602060002090601f016020900481019282613f285760008555613f6f565b82601f10613f4157805160ff1916838001178555613f6f565b82800160010185558215613f6f579182015b82811115613f6e578251825591602001919060010190613f53565b5b509050613f7c9190613f80565b5090565b5b80821115613f99576000816000905550600101613f81565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613fe681613fb1565b8114613ff157600080fd5b50565b60008135905061400381613fdd565b92915050565b60006020828403121561401f5761401e613fa7565b5b600061402d84828501613ff4565b91505092915050565b60008115159050919050565b61404b81614036565b82525050565b60006020820190506140666000830184614042565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006140978261406c565b9050919050565b6140a78161408c565b81146140b257600080fd5b50565b6000813590506140c48161409e565b92915050565b6000602082840312156140e0576140df613fa7565b5b60006140ee848285016140b5565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614131578082015181840152602081019050614116565b83811115614140576000848401525b50505050565b6000601f19601f8301169050919050565b6000614162826140f7565b61416c8185614102565b935061417c818560208601614113565b61418581614146565b840191505092915050565b600060208201905081810360008301526141aa8184614157565b905092915050565b6000819050919050565b6141c5816141b2565b81146141d057600080fd5b50565b6000813590506141e2816141bc565b92915050565b6000602082840312156141fe576141fd613fa7565b5b600061420c848285016141d3565b91505092915050565b61421e8161408c565b82525050565b60006020820190506142396000830184614215565b92915050565b6000806040838503121561425657614255613fa7565b5b6000614264858286016140b5565b9250506020614275858286016141d3565b9150509250929050565b614288816141b2565b82525050565b60006020820190506142a3600083018461427f565b92915050565b6000806000606084860312156142c2576142c1613fa7565b5b60006142d0868287016140b5565b93505060206142e1868287016140b5565b92505060406142f2868287016141d3565b9150509250925092565b6000819050919050565b61430f816142fc565b811461431a57600080fd5b50565b60008135905061432c81614306565b92915050565b60006020828403121561434857614347613fa7565b5b60006143568482850161431d565b91505092915050565b614368816142fc565b82525050565b6000602082019050614383600083018461435f565b92915050565b600080604083850312156143a05761439f613fa7565b5b60006143ae8582860161431d565b92505060206143bf858286016140b5565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61440b82614146565b810181811067ffffffffffffffff8211171561442a576144296143d3565b5b80604052505050565b600061443d613f9d565b90506144498282614402565b919050565b600067ffffffffffffffff821115614469576144686143d3565b5b61447282614146565b9050602081019050919050565b82818337600083830152505050565b60006144a161449c8461444e565b614433565b9050828152602081018484840111156144bd576144bc6143ce565b5b6144c884828561447f565b509392505050565b600082601f8301126144e5576144e46143c9565b5b81356144f584826020860161448e565b91505092915050565b60006020828403121561451457614513613fa7565b5b600082013567ffffffffffffffff81111561453257614531613fac565b5b61453e848285016144d0565b91505092915050565b600067ffffffffffffffff821115614562576145616143d3565b5b602082029050602081019050919050565b600080fd5b600061458b61458684614547565b614433565b905080838252602082019050602084028301858111156145ae576145ad614573565b5b835b818110156145d757806145c388826140b5565b8452602084019350506020810190506145b0565b5050509392505050565b600082601f8301126145f6576145f56143c9565b5b8135614606848260208601614578565b91505092915050565b60006020828403121561462557614624613fa7565b5b600082013567ffffffffffffffff81111561464357614642613fac565b5b61464f848285016145e1565b91505092915050565b6000806040838503121561466f5761466e613fa7565b5b600061467d8582860161431d565b925050602061468e858286016141d3565b9150509250929050565b6146a181614036565b81146146ac57600080fd5b50565b6000813590506146be81614698565b92915050565b6000602082840312156146da576146d9613fa7565b5b60006146e8848285016146af565b91505092915050565b6000806040838503121561470857614707613fa7565b5b6000614716858286016140b5565b9250506020614727858286016146af565b9150509250929050565b600067ffffffffffffffff82111561474c5761474b6143d3565b5b61475582614146565b9050602081019050919050565b600061477561477084614731565b614433565b905082815260208101848484011115614791576147906143ce565b5b61479c84828561447f565b509392505050565b600082601f8301126147b9576147b86143c9565b5b81356147c9848260208601614762565b91505092915050565b600080600080608085870312156147ec576147eb613fa7565b5b60006147fa878288016140b5565b945050602061480b878288016140b5565b935050604061481c878288016141d3565b925050606085013567ffffffffffffffff81111561483d5761483c613fac565b5b614849878288016147a4565b91505092959194509250565b6000806040838503121561486c5761486b613fa7565b5b600061487a858286016140b5565b925050602061488b858286016140b5565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148cf826141b2565b91506148da836141b2565b9250828210156148ed576148ec614895565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061493f57607f821691505b60208210811415614953576149526148f8565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006149b5602c83614102565b91506149c082614959565b604082019050919050565b600060208201905081810360008301526149e4816149a8565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614a47602183614102565b9150614a52826149eb565b604082019050919050565b60006020820190508181036000830152614a7681614a3a565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614ad9603883614102565b9150614ae482614a7d565b604082019050919050565b60006020820190508181036000830152614b0881614acc565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614b6b603183614102565b9150614b7682614b0f565b604082019050919050565b60006020820190508181036000830152614b9a81614b5e565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614bfd602b83614102565b9150614c0882614ba1565b604082019050919050565b60006020820190508181036000830152614c2c81614bf0565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000614c8f602f83614102565b9150614c9a82614c33565b604082019050919050565b60006020820190508181036000830152614cbe81614c82565b9050919050565b7f4552433732315072657365744d696e7465725061757365724175746f49643a2060008201527f6d75737420686176652070617573657220726f6c6520746f20756e7061757365602082015250565b6000614d21604083614102565b9150614d2c82614cc5565b604082019050919050565b60006020820190508181036000830152614d5081614d14565b9050919050565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b6000614db3603083614102565b9150614dbe82614d57565b604082019050919050565b60006020820190508181036000830152614de281614da6565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614e45602c83614102565b9150614e5082614de9565b604082019050919050565b60006020820190508181036000830152614e7481614e38565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614eb5826141b2565b9150614ec0836141b2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ef557614ef4614895565b5b828201905092915050565b6000614f0b826141b2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f3e57614f3d614895565b5b600182019050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614fa5602983614102565b9150614fb082614f49565b604082019050919050565b60006020820190508181036000830152614fd481614f98565b9050919050565b7f4552433732315072657365744d696e7465725061757365724175746f49643a2060008201527f6d7573742068617665206d696e74657220726f6c6520746f206d696e74000000602082015250565b6000615037603d83614102565b915061504282614fdb565b604082019050919050565b600060208201905081810360008301526150668161502a565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006150c9602a83614102565b91506150d48261506d565b604082019050919050565b600060208201905081810360008301526150f8816150bc565b9050919050565b7f4552433732315072657365744d696e7465725061757365724175746f49643a2060008201527f6d75737420686176652070617573657220726f6c6520746f2070617573650000602082015250565b600061515b603e83614102565b9150615166826150ff565b604082019050919050565b6000602082019050818103600083015261518a8161514e565b9050919050565b600061519c826141b2565b91506151a7836141b2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151e0576151df614895565b5b828202905092915050565b7f50726573616c65206973206e6f74206163746976652e00000000000000000000600082015250565b6000615221601683614102565b915061522c826151eb565b602082019050919050565b6000602082019050818103600083015261525081615214565b9050919050565b7f434c3a204d696e7420416d6f756e74206973204f7665722e0000000000000000600082015250565b600061528d601883614102565b915061529882615257565b602082019050919050565b600060208201905081810360008301526152bc81615280565b9050919050565b60006152ce826141b2565b915060008214156152e2576152e1614895565b5b600182039050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615349602f83614102565b9150615354826152ed565b604082019050919050565b600060208201905081810360008301526153788161533c565b9050919050565b600081905092915050565b6000615395826140f7565b61539f818561537f565b93506153af818560208601614113565b80840191505092915050565b60008190508160005260206000209050919050565b600081546153dd81614927565b6153e7818661537f565b94506001821660008114615402576001811461541357615446565b60ff19831686528186019350615446565b61541c856153bb565b60005b8381101561543e5781548189015260018201915060208101905061541f565b838801955050505b50505092915050565b600061545b828661538a565b9150615467828561538a565b915061547382846153d0565b9150819050949350505050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006154b6602083614102565b91506154c182615480565b602082019050919050565b600060208201905081810360008301526154e5816154a9565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000615548602c83614102565b9150615553826154ec565b604082019050919050565b600060208201905081810360008301526155778161553b565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006155da602583614102565b91506155e58261557e565b604082019050919050565b60006020820190508181036000830152615609816155cd565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061566c602483614102565b915061567782615610565b604082019050919050565b6000602082019050818103600083015261569b8161565f565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006156d8601d83614102565b91506156e3826156a2565b602082019050919050565b60006020820190508181036000830152615707816156cb565b9050919050565b600081905092915050565b50565b600061572960008361570e565b915061573482615719565b600082019050919050565b600061574a8261571c565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b60006157b0603a83614102565b91506157bb82615754565b604082019050919050565b600060208201905081810360008301526157df816157a3565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b600061581c601483614102565b9150615827826157e6565b602082019050919050565b6000602082019050818103600083015261584b8161580f565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615888602083614102565b915061589382615852565b602082019050919050565b600060208201905081810360008301526158b78161587b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006158f4601c83614102565b91506158ff826158be565b602082019050919050565b60006020820190508181036000830152615923816158e7565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000615960601083614102565b915061596b8261592a565b602082019050919050565b6000602082019050818103600083015261598f81615953565b9050919050565b7f4d696e74206973206e6f74206163746976652e00000000000000000000000000600082015250565b60006159cc601383614102565b91506159d782615996565b602082019050919050565b600060208201905081810360008301526159fb816159bf565b9050919050565b7f4d696e7420616d6f756e742063616e6e6f74206265207a65726f000000000000600082015250565b6000615a38601a83614102565b9150615a4382615a02565b602082019050919050565b60006020820190508181036000830152615a6781615a2b565b9050919050565b7f546f74616c20737570706c792063616e6e6f7420657863656564206d6178537560008201527f70706c7900000000000000000000000000000000000000000000000000000000602082015250565b6000615aca602483614102565b9150615ad582615a6e565b604082019050919050565b60006020820190508181036000830152615af981615abd565b9050919050565b7f4e6f7420656e6f7567682066756e64732070726f766964656420666f72206d6960008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b6000615b5c602283614102565b9150615b6782615b00565b604082019050919050565b60006020820190508181036000830152615b8b81615b4f565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615bc8601983614102565b9150615bd382615b92565b602082019050919050565b60006020820190508181036000830152615bf781615bbb565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615c5a603283614102565b9150615c6582615bfe565b604082019050919050565b60006020820190508181036000830152615c8981615c4d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615cca826141b2565b9150615cd5836141b2565b925082615ce557615ce4615c90565b5b828204905092915050565b6000615cfb826141b2565b9150615d06836141b2565b925082615d1657615d15615c90565b5b828206905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000615d5760178361537f565b9150615d6282615d21565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000615da360118361537f565b9150615dae82615d6d565b601182019050919050565b6000615dc482615d4a565b9150615dd0828561538a565b9150615ddb82615d96565b9150615de7828461538a565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000615e1a82615df3565b615e248185615dfe565b9350615e34818560208601614113565b615e3d81614146565b840191505092915050565b6000608082019050615e5d6000830187614215565b615e6a6020830186614215565b615e77604083018561427f565b8181036060830152615e898184615e0f565b905095945050505050565b600081519050615ea381613fdd565b92915050565b600060208284031215615ebf57615ebe613fa7565b5b6000615ecd84828501615e94565b91505092915050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b6000615f32602b83614102565b9150615f3d82615ed6565b604082019050919050565b60006020820190508181036000830152615f6181615f25565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212204acce97e47d9ae6d763a04e4f5541edc242401a8a6b44f69067ed85a7c872dc564736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000007526f636b657473000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004524b5453000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d4e5156545a757767375550524467337468657a37704d4565435a53643434527936514c615a4a6331337556410000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): Rockets
Arg [1] : _symbol (string): RKTS
Arg [2] : _initNotRevealedUri (string): ipfs://QmNQVTZuwg7UPRDg3thez7pMEeCZSd44Ry6QLaZJc13uVA
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [4] : 526f636b65747300000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 524b545300000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [8] : 697066733a2f2f516d4e5156545a757767375550524467337468657a37704d45
Arg [9] : 65435a53643434527936514c615a4a6331337556410000000000000000000000
Deployed ByteCode Sourcemap
141707:4958:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;141434:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;144069:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88419:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89979:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;142042:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89502:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;103113:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90729:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;118008:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;118401:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102781:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;119449:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;141914:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;144848:172;;;;;;;;;;;;;:::i;:::-;;140930:185;;;;;;;;;;;;;:::i;:::-;;91139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;109057:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;103303:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;142007:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;144290:283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;145363:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;110451:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;143652:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88113:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;139910:407;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87843:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;140532:179;;;;;;;;;;;;;:::i;:::-;;144581:259;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;142428:525;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;143952:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;135267:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;116468:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;146561:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88588:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;115573:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90272:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;141799:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91395:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;143842:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;142103:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;145695:725;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;135594:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;145028:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;138573:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;118793:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;141841:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;145517:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;138642:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90498:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;143416:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;145187:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;141880:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;141434:254;141615:4;141644:36;141668:11;141644:23;:36::i;:::-;141637:43;;141434:254;;;:::o;144069:213::-;115618:4;144152:18;;116064:16;116075:4;116064:10;:16::i;:::-;144222:10:::1;:16;144233:4;144222:16;;;;;;;;;;;;;;;;144205:14;;:33;;;;:::i;:::-;144188:14;:50;;;;144257:10;:16;144268:4;144257:16;;;;;;;;;;;;;;;144249:25;;;144069:213:::0;;:::o;88419:100::-;88473:13;88506:5;88499:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88419:100;:::o;89979:221::-;90055:7;90083:16;90091:7;90083;:16::i;:::-;90075:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;90168:15;:24;90184:7;90168:24;;;;;;;;;;;;;;;;;;;;;90161:31;;89979:221;;;:::o;142042:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;89502:411::-;89583:13;89599:23;89614:7;89599:14;:23::i;:::-;89583:39;;89647:5;89641:11;;:2;:11;;;;89633:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;89741:5;89725:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;89750:37;89767:5;89774:12;:10;:12::i;:::-;89750:16;:37::i;:::-;89725:62;89703:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;89884:21;89893:2;89897:7;89884:8;:21::i;:::-;89572:341;89502:411;;:::o;103113:113::-;103174:7;103201:10;:17;;;;103194:24;;103113:113;:::o;90729:339::-;90924:41;90943:12;:10;:12::i;:::-;90957:7;90924:18;:41::i;:::-;90916:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;91032:28;91042:4;91048:2;91052:7;91032:9;:28::i;:::-;90729:339;;;:::o;118008:131::-;118082:7;118109:6;:12;118116:4;118109:12;;;;;;;;;;;:22;;;118102:29;;118008:131;;;:::o;118401:147::-;118484:18;118497:4;118484:12;:18::i;:::-;116064:16;116075:4;116064:10;:16::i;:::-;118515:25:::1;118526:4;118532:7;118515:10;:25::i;:::-;118401:147:::0;;;:::o;102781:256::-;102878:7;102914:23;102931:5;102914:16;:23::i;:::-;102906:5;:31;102898:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;103003:12;:19;103016:5;103003:19;;;;;;;;;;;;;;;:26;103023:5;103003:26;;;;;;;;;;;;102996:33;;102781:256;;;;:::o;119449:218::-;119556:12;:10;:12::i;:::-;119545:23;;:7;:23;;;119537:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;119633:26;119645:4;119651:7;119633:11;:26::i;:::-;119449:218;;:::o;141914:33::-;;;;:::o;144848:172::-;115618:4;144884:18;;116064:16;116075:4;116064:10;:16::i;:::-;144915:15:::1;144933:21;144915:39;;144965:47;144991:10;145004:7;144965:17;:47::i;:::-;144904:116;144848:172:::0;:::o;140930:185::-;140983:34;138680:24;141004:12;:10;:12::i;:::-;140983:7;:34::i;:::-;140975:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;141097:10;:8;:10::i;:::-;140930:185::o;91139:::-;91277:39;91294:4;91300:2;91304:7;91277:39;;;;;;;;;;;;:16;:39::i;:::-;91139:185;;;:::o;109057:245::-;109175:41;109194:12;:10;:12::i;:::-;109208:7;109175:18;:41::i;:::-;109167:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;109280:14;109286:7;109280:5;:14::i;:::-;109057:245;:::o;103303:233::-;103378:7;103414:30;:28;:30::i;:::-;103406:5;:38;103398:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;103511:10;103522:5;103511:17;;;;;;;;:::i;:::-;;;;;;;;;;103504:24;;103303:233;;;:::o;142007:28::-;;;;;;;;;;;;;:::o;144290:283::-;115618:4;144390:18;;116064:16;116075:4;116064:10;:16::i;:::-;144460:10:::1;:16;144471:4;144460:16;;;;;;;;;;;;;;;;144443:14;;:33;;;;:::i;:::-;144426:14;:50;;;;144506:7;144487:10;:16;144498:4;144487:16;;;;;;;;;;;;;;;:26;;;;144558:7;144541:14;;:24;;;;:::i;:::-;144524:14;:41;;;;144290:283:::0;;;:::o;145363:146::-;115618:4;145444:18;;116064:16;116075:4;116064:10;:16::i;:::-;145490:11:::1;145480:7;:21;;;;;;;;;;;;:::i;:::-;;145363:146:::0;;:::o;110451:86::-;110498:4;110522:7;;;;;;;;;;;110515:14;;110451:86;:::o;143652:182::-;115618:4;143712:18;;116064:16;116075:4;116064:10;:16::i;:::-;143750:9:::1;143745:82;143769:4;:11;143765:1;:15;143745:82;;;143802:13;143807:4;143812:1;143807:7;;;;;;;;:::i;:::-;;;;;;;;143802:4;:13::i;:::-;143782:3;;;;;:::i;:::-;;;;143745:82;;;;143652:182:::0;;:::o;88113:239::-;88185:7;88205:13;88221:7;:16;88229:7;88221:16;;;;;;;;;;;;;;;;;;;;;88205:32;;88273:1;88256:19;;:5;:19;;;;88248:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;88339:5;88332:12;;;88113:239;;;:::o;139910:407::-;139970:34;138611:24;139991:12;:10;:12::i;:::-;139970:7;:34::i;:::-;139962:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;140235:36;140241:2;140245:25;:15;:23;:25::i;:::-;140235:5;:36::i;:::-;140282:27;:15;:25;:27::i;:::-;139910:407;:::o;87843:208::-;87915:7;87960:1;87943:19;;:5;:19;;;;87935:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;88027:9;:16;88037:5;88027:16;;;;;;;;;;;;;;;;88020:23;;87843:208;;;:::o;140532:179::-;140583:34;138680:24;140604:12;:10;:12::i;:::-;140583:7;:34::i;:::-;140575:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;140695:8;:6;:8::i;:::-;140532:179::o;144581:259::-;115618:4;144676:18;;116064:16;116075:4;116064:10;:16::i;:::-;144717:9:::1;144712:121;144736:4;:11;144732:1;:15;144712:121;;;144769:10;:19;144780:4;144785:1;144780:7;;;;;;;;:::i;:::-;;;;;;;;144769:19;;;;;;;;;;;;;;;;:21;;;;;;;;;:::i;:::-;;;;;;144805:14;;:16;;;;;;;;;:::i;:::-;;;;;;144749:3;;;;;:::i;:::-;;;;144712:121;;;;144581:259:::0;;:::o;142428:525::-;142492:14;142509:13;:11;:13::i;:::-;142492:30;;142533:12;142558:11;142548:7;;:21;;;;:::i;:::-;142533:36;;142580;142590:11;142603:6;142611:4;142580:9;:36::i;:::-;142635:7;;;;;;;;;;;142627:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;142728:11;142702:10;:22;142713:10;142702:22;;;;;;;;;;;;;;;;:37;;142680:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;142809:9;142821:1;142809:13;;142804:142;142829:11;142824:1;:16;142804:142;;142862:33;142872:10;142893:1;142884:6;:10;;;;:::i;:::-;142862:9;:33::i;:::-;142910:10;:22;142921:10;142910:22;;;;;;;;;;;;;;;;:24;;;;;;;;;:::i;:::-;;;;;;142842:3;;;;;:::i;:::-;;;;142804:142;;;;142481:472;;142428:525;:::o;143952:109::-;115618:4;144007:18;;116064:16;116075:4;116064:10;:16::i;:::-;144048:5:::1;144038:7;:15;;;;143952:109:::0;;:::o;135267:153::-;135357:7;135384:28;135406:5;135384:12;:18;135397:4;135384:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;135377:35;;135267:153;;;;:::o;116468:147::-;116554:4;116578:6;:12;116585:4;116578:12;;;;;;;;;;;:20;;:29;116599:7;116578:29;;;;;;;;;;;;;;;;;;;;;;;;;116571:36;;116468:147;;;;:::o;146561:99::-;115618:4;146605:18;;116064:16;116075:4;116064:10;:16::i;:::-;146647:5:::1;146636:8;;:16;;;;;;;;;;;;;;;;;;146561:99:::0;;:::o;88588:104::-;88644:13;88677:7;88670:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88588:104;:::o;115573:49::-;115618:4;115573:49;;;:::o;90272:155::-;90367:52;90386:12;:10;:12::i;:::-;90400:8;90410;90367:18;:52::i;:::-;90272:155;;:::o;141799:35::-;;;;:::o;91395:328::-;91570:41;91589:12;:10;:12::i;:::-;91603:7;91570:18;:41::i;:::-;91562:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;91676:39;91690:4;91696:2;91700:7;91709:5;91676:13;:39::i;:::-;91395:328;;;;:::o;143842:102::-;115618:4;143890:18;;116064:16;116075:4;116064:10;:16::i;:::-;143931:5:::1;143921:7;;:15;;;;;;;;;;;;;;;;;;143842:102:::0;;:::o;142103:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;145695:725::-;145813:13;145866:16;145874:7;145866;:16::i;:::-;145844:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;145986:5;145974:17;;:8;;;;;;;;;;;:17;;;145970:71;;;146015:14;146008:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;145970:71;146053:28;146084:10;:8;:10::i;:::-;146053:41;;146156:1;146131:14;146125:28;:32;:287;;;;;;;;;;;;;;;;;146249:14;146290:18;:7;:16;:18::i;:::-;146335:13;146206:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;146125:287;146105:307;;;145695:725;;;;:::o;135594:142::-;135674:7;135701:27;:12;:18;135714:4;135701:18;;;;;;;;;;;:25;:27::i;:::-;135694:34;;135594:142;;;:::o;145028:151::-;145122:7;145154:10;:17;145165:5;145154:17;;;;;;;;;;;;;;;;145147:24;;145028:151;;;:::o;138573:62::-;138611:24;138573:62;:::o;118793:149::-;118877:18;118890:4;118877:12;:18::i;:::-;116064:16;116075:4;116064:10;:16::i;:::-;118908:26:::1;118920:4;118926:7;118908:11;:26::i;:::-;118793:149:::0;;;:::o;141841:32::-;;;;:::o;145517:170::-;115618:4;145610:18;;116064:16;116075:4;116064:10;:16::i;:::-;145662:17:::1;145646:13;:33;;;;;;;;;;;;:::i;:::-;;145517:170:::0;;:::o;138642:62::-;138680:24;138642:62;:::o;90498:164::-;90595:4;90619:18;:25;90638:5;90619:25;;;;;;;;;;;;;;;:35;90645:8;90619:35;;;;;;;;;;;;;;;;;;;;;;;;;90612:42;;90498:164;;;;:::o;143416:228::-;115618:4;143466:18;;116064:16;116075:4;116064:10;:16::i;:::-;143497:14:::1;143514:13;:11;:13::i;:::-;143497:30;;143545:9;143557:1;143545:13;;143540:97;143565:5;143560:1;:10;143540:97;;143592:33;143602:10;143623:1;143614:6;:10;;;;:::i;:::-;143592:9;:33::i;:::-;143572:3;;;;;:::i;:::-;;;;143540:97;;;;143486:158;143416:228:::0;;:::o;145187:168::-;115618:4;145279:18;;116064:16;116075:4;116064:10;:16::i;:::-;145332:15:::1;145315:14;:32;;;;;;;;;;;;:::i;:::-;;145187:168:::0;;:::o;141880:27::-;;;;;;;;;;;;;:::o;120950:238::-;121034:22;121042:4;121048:7;121034;:22::i;:::-;121029:152;;121105:4;121073:6;:12;121080:4;121073:12;;;;;;;;;;;:20;;:29;121094:7;121073:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;121156:12;:10;:12::i;:::-;121129:40;;121147:7;121129:40;;121141:4;121129:40;;;;;;;;;;121029:152;120950:238;;:::o;129362:152::-;129432:4;129456:50;129461:3;:10;;129497:5;129481:23;;129473:32;;129456:4;:50::i;:::-;129449:57;;129362:152;;;;:::o;1643:451::-;1718:13;1744:19;1789:1;1780:6;1776:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1766:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1744:47;;1802:15;:6;1809:1;1802:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1828;:6;1835:1;1828:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1859:9;1884:1;1875:6;1871:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1859:26;;1854:135;1891:1;1887;:5;1854:135;;;1926:12;1947:3;1939:5;:11;1926:25;;;;;;;:::i;:::-;;;;;1914:6;1921:1;1914:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;1976:1;1966:11;;;;;1894:3;;;;:::i;:::-;;;1854:135;;;;2016:1;2007:5;:10;1999:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2079:6;2065:21;;;1643:451;;;;:::o;102473:224::-;102575:4;102614:35;102599:50;;;:11;:50;;;;:90;;;;102653:36;102677:11;102653:23;:36::i;:::-;102599:90;102592:97;;102473:224;;;:::o;116919:105::-;116986:30;116997:4;117003:12;:10;:12::i;:::-;116986:10;:30::i;:::-;116919:105;:::o;93233:127::-;93298:4;93350:1;93322:30;;:7;:16;93330:7;93322:16;;;;;;;;;;;;;;;;;;;;;:30;;;;93315:37;;93233:127;;;:::o;2701:98::-;2754:7;2781:10;2774:17;;2701:98;:::o;97379:174::-;97481:2;97454:15;:24;97470:7;97454:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;97537:7;97533:2;97499:46;;97508:23;97523:7;97508:14;:23::i;:::-;97499:46;;;;;;;;;;;;97379:174;;:::o;93527:348::-;93620:4;93645:16;93653:7;93645;:16::i;:::-;93637:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;93721:13;93737:23;93752:7;93737:14;:23::i;:::-;93721:39;;93790:5;93779:16;;:7;:16;;;:52;;;;93799:32;93816:5;93823:7;93799:16;:32::i;:::-;93779:52;:87;;;;93859:7;93835:31;;:20;93847:7;93835:11;:20::i;:::-;:31;;;93779:87;93771:96;;;93527:348;;;;:::o;96636:625::-;96795:4;96768:31;;:23;96783:7;96768:14;:23::i;:::-;:31;;;96760:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;96874:1;96860:16;;:2;:16;;;;96852:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;96930:39;96951:4;96957:2;96961:7;96930:20;:39::i;:::-;97034:29;97051:1;97055:7;97034:8;:29::i;:::-;97095:1;97076:9;:15;97086:4;97076:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;97124:1;97107:9;:13;97117:2;97107:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;97155:2;97136:7;:16;97144:7;97136:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;97194:7;97190:2;97175:27;;97184:4;97175:27;;;;;;;;;;;;97215:38;97235:4;97241:2;97245:7;97215:19;:38::i;:::-;96636:625;;;:::o;135829:169::-;135917:31;135934:4;135940:7;135917:16;:31::i;:::-;135959;135982:7;135959:12;:18;135972:4;135959:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;135829:169;;:::o;136092:174::-;136181:32;136199:4;136205:7;136181:17;:32::i;:::-;136224:34;136250:7;136224:12;:18;136237:4;136224:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;136092:174;;:::o;79291:317::-;79406:6;79381:21;:31;;79373:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;79460:12;79478:9;:14;;79500:6;79478:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79459:52;;;79530:7;79522:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;79362:246;79291:317;;:::o;111510:120::-;111054:8;:6;:8::i;:::-;111046:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;111579:5:::1;111569:7;;:15;;;;;;;;;;;;;;;;;;111600:22;111609:12;:10;:12::i;:::-;111600:22;;;;;;:::i;:::-;;;;;;;;111510:120::o:0;95879:420::-;95939:13;95955:23;95970:7;95955:14;:23::i;:::-;95939:39;;95991:48;96012:5;96027:1;96031:7;95991:20;:48::i;:::-;96080:29;96097:1;96101:7;96080:8;:29::i;:::-;96142:1;96122:9;:16;96132:5;96122:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;96161:7;:16;96169:7;96161:16;;;;;;;;;;;;96154:23;;;;;;;;;;;96223:7;96219:1;96195:36;;96204:5;96195:36;;;;;;;;;;;;96244:47;96264:5;96279:1;96283:7;96244:19;:47::i;:::-;95928:371;95879:420;:::o;137069:114::-;137134:7;137161;:14;;;137154:21;;137069:114;;;:::o;95211:439::-;95305:1;95291:16;;:2;:16;;;;95283:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;95364:16;95372:7;95364;:16::i;:::-;95363:17;95355:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;95426:45;95455:1;95459:2;95463:7;95426:20;:45::i;:::-;95501:1;95484:9;:13;95494:2;95484:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;95532:2;95513:7;:16;95521:7;95513:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;95577:7;95573:2;95552:33;;95569:1;95552:33;;;;;;;;;;;;95598:44;95626:1;95630:2;95634:7;95598:19;:44::i;:::-;95211:439;;:::o;137191:127::-;137298:1;137280:7;:14;;;:19;;;;;;;;;;;137191:127;:::o;111251:118::-;110777:8;:6;:8::i;:::-;110776:9;110768:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;111321:4:::1;111311:7;;:14;;;;;;;;;;;;;;;;;;111341:20;111348:12;:10;:12::i;:::-;111341:20;;;;;;:::i;:::-;;;;;;;;111251:118::o:0;142961:447::-;143098:8;:6;:8::i;:::-;143097:9;143089:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;143163:1;143149:11;:15;143141:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;143252:9;;143237:11;143228:6;:20;;;;:::i;:::-;:33;;143206:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;143357:4;143344:9;:17;;143336:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;142961:447;;;:::o;94217:110::-;94293:26;94303:2;94307:7;94293:26;;;;;;;;;;;;:9;:26::i;:::-;94217:110;;:::o;130658:158::-;130732:7;130783:22;130787:3;:10;;130799:5;130783:3;:22::i;:::-;130775:31;;130752:56;;130658:158;;;;:::o;97695:315::-;97850:8;97841:17;;:5;:17;;;;97833:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;97937:8;97899:18;:25;97918:5;97899:25;;;;;;;;;;;;;;;:35;97925:8;97899:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;97983:8;97961:41;;97976:5;97961:41;;;97993:8;97961:41;;;;;;:::i;:::-;;;;;;;;97695:315;;;:::o;92605:::-;92762:28;92772:4;92778:2;92782:7;92762:9;:28::i;:::-;92809:48;92832:4;92838:2;92842:7;92851:5;92809:22;:48::i;:::-;92801:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;92605:315;;;;:::o;146445:108::-;146505:13;146538:7;146531:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;146445:108;:::o;342:723::-;398:13;628:1;619:5;:10;615:53;;;646:10;;;;;;;;;;;;;;;;;;;;;615:53;678:12;693:5;678:20;;709:14;734:78;749:1;741:4;:9;734:78;;767:8;;;;;:::i;:::-;;;;798:2;790:10;;;;;:::i;:::-;;;734:78;;;822:19;854:6;844:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;822:39;;872:154;888:1;879:5;:10;872:154;;916:1;906:11;;;;;:::i;:::-;;;983:2;975:5;:10;;;;:::i;:::-;962:2;:24;;;;:::i;:::-;949:39;;932:6;939;932:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1012:2;1003:11;;;;;:::i;:::-;;;872:154;;;1050:6;1036:21;;;;;342:723;;;;:::o;130187:117::-;130250:7;130277:19;130285:3;:10;;130277:7;:19::i;:::-;130270:26;;130187:117;;;:::o;123277:414::-;123340:4;123362:21;123372:3;123377:5;123362:9;:21::i;:::-;123357:327;;123400:3;:11;;123417:5;123400:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;123583:3;:11;;:18;;;;123561:3;:12;;:19;123574:5;123561:19;;;;;;;;;;;:40;;;;123623:4;123616:11;;;;123357:327;123667:5;123660:12;;123277:414;;;;;:::o;87474:305::-;87576:4;87628:25;87613:40;;;:11;:40;;;;:105;;;;87685:33;87670:48;;;:11;:48;;;;87613:105;:158;;;;87735:36;87759:11;87735:23;:36::i;:::-;87613:158;87593:178;;87474:305;;;:::o;117314:505::-;117403:22;117411:4;117417:7;117403;:22::i;:::-;117398:414;;117591:41;117619:7;117591:41;;117629:2;117591:19;:41::i;:::-;117705:38;117733:4;117725:13;;117740:2;117705:19;:38::i;:::-;117496:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;117442:358;;;;;;;;;;;:::i;:::-;;;;;;;;117398:414;117314:505;;:::o;141123:239::-;141309:45;141336:4;141342:2;141346:7;141309:26;:45::i;:::-;141123:239;;;:::o;100457:125::-;;;;:::o;121320:239::-;121404:22;121412:4;121418:7;121404;:22::i;:::-;121400:152;;;121475:5;121443:6;:12;121450:4;121443:12;;;;;;;;;;;:20;;:29;121464:7;121443:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;121527:12;:10;:12::i;:::-;121500:40;;121518:7;121500:40;;121512:4;121500:40;;;;;;;;;;121400:152;121320:239;;:::o;129690:158::-;129763:4;129787:53;129795:3;:10;;129831:5;129815:23;;129807:32;;129787:7;:53::i;:::-;129780:60;;129690:158;;;;:::o;94554:321::-;94684:18;94690:2;94694:7;94684:5;:18::i;:::-;94735:54;94766:1;94770:2;94774:7;94783:5;94735:22;:54::i;:::-;94713:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;94554:321;;;:::o;126051:120::-;126118:7;126145:3;:11;;126157:5;126145:18;;;;;;;;:::i;:::-;;;;;;;;;;126138:25;;126051:120;;;;:::o;98575:799::-;98730:4;98751:15;:2;:13;;;:15::i;:::-;98747:620;;;98803:2;98787:36;;;98824:12;:10;:12::i;:::-;98838:4;98844:7;98853:5;98787:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;98783:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;99046:1;99029:6;:13;:18;99025:272;;;99072:60;;;;;;;;;;:::i;:::-;;;;;;;;99025:272;99247:6;99241:13;99232:6;99228:2;99224:15;99217:38;98783:529;98920:41;;;98910:51;;;:6;:51;;;;98903:58;;;;;98747:620;99351:4;99344:11;;98575:799;;;;;;;:::o;125588:109::-;125644:7;125671:3;:11;;:18;;;;125664:25;;125588:109;;;:::o;125373:129::-;125446:4;125493:1;125470:3;:12;;:19;125483:5;125470:19;;;;;;;;;;;;:24;;125463:31;;125373:129;;;;:::o;134454:214::-;134539:4;134578:42;134563:57;;;:11;:57;;;;:97;;;;134624:36;134648:11;134624:23;:36::i;:::-;134563:97;134556:104;;134454:214;;;:::o;112124:275::-;112268:45;112295:4;112301:2;112305:7;112268:26;:45::i;:::-;112335:8;:6;:8::i;:::-;112334:9;112326:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;112124:275;;;:::o;123867:1420::-;123933:4;124051:18;124072:3;:12;;:19;124085:5;124072:19;;;;;;;;;;;;124051:40;;124122:1;124108:10;:15;124104:1176;;124483:21;124520:1;124507:10;:14;;;;:::i;:::-;124483:38;;124536:17;124577:1;124556:3;:11;;:18;;;;:22;;;;:::i;:::-;124536:42;;124612:13;124599:9;:26;124595:405;;124646:17;124666:3;:11;;124678:9;124666:22;;;;;;;;:::i;:::-;;;;;;;;;;124646:42;;124820:9;124791:3;:11;;124803:13;124791:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;124931:10;124905:3;:12;;:23;124918:9;124905:23;;;;;;;;;;;:36;;;;124627:373;124595:405;125081:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;125176:3;:12;;:19;125189:5;125176:19;;;;;;;;;;;125169:26;;;125219:4;125212:11;;;;;;;124104:1176;125263:5;125256:12;;;123867:1420;;;;;:::o;78030:326::-;78090:4;78347:1;78325:7;:19;;;:23;78318:30;;78030:326;;;:::o;116172:204::-;116257:4;116296:32;116281:47;;;:11;:47;;;;:87;;;;116332:36;116356:11;116332:23;:36::i;:::-;116281:87;116274:94;;116172:204;;;:::o;104149:589::-;104293:45;104320:4;104326:2;104330:7;104293:26;:45::i;:::-;104371:1;104355:18;;:4;:18;;;104351:187;;;104390:40;104422:7;104390:31;:40::i;:::-;104351:187;;;104460:2;104452:10;;:4;:10;;;104448:90;;104479:47;104512:4;104518:7;104479:32;:47::i;:::-;104448:90;104351:187;104566:1;104552:16;;:2;:16;;;104548:183;;;104585:45;104622:7;104585:36;:45::i;:::-;104548:183;;;104658:4;104652:10;;:2;:10;;;104648:83;;104679:40;104707:2;104711:7;104679:27;:40::i;:::-;104648:83;104548:183;104149:589;;;:::o;86081:157::-;86166:4;86205:25;86190:40;;;:11;:40;;;;86183:47;;86081:157;;;:::o;99946:126::-;;;;:::o;105461:164::-;105565:10;:17;;;;105538:15;:24;105554:7;105538:24;;;;;;;;;;;:44;;;;105593:10;105609:7;105593:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;105461:164;:::o;106252:988::-;106518:22;106568:1;106543:22;106560:4;106543:16;:22::i;:::-;:26;;;;:::i;:::-;106518:51;;106580:18;106601:17;:26;106619:7;106601:26;;;;;;;;;;;;106580:47;;106748:14;106734:10;:28;106730:328;;106779:19;106801:12;:18;106814:4;106801:18;;;;;;;;;;;;;;;:34;106820:14;106801:34;;;;;;;;;;;;106779:56;;106885:11;106852:12;:18;106865:4;106852:18;;;;;;;;;;;;;;;:30;106871:10;106852:30;;;;;;;;;;;:44;;;;107002:10;106969:17;:30;106987:11;106969:30;;;;;;;;;;;:43;;;;106764:294;106730:328;107154:17;:26;107172:7;107154:26;;;;;;;;;;;107147:33;;;107198:12;:18;107211:4;107198:18;;;;;;;;;;;;;;;:34;107217:14;107198:34;;;;;;;;;;;107191:41;;;106333:907;;106252:988;;:::o;107535:1079::-;107788:22;107833:1;107813:10;:17;;;;:21;;;;:::i;:::-;107788:46;;107845:18;107866:15;:24;107882:7;107866:24;;;;;;;;;;;;107845:45;;108217:19;108239:10;108250:14;108239:26;;;;;;;;:::i;:::-;;;;;;;;;;108217:48;;108303:11;108278:10;108289;108278:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;108414:10;108383:15;:28;108399:11;108383:28;;;;;;;;;;;:41;;;;108555:15;:24;108571:7;108555:24;;;;;;;;;;;108548:31;;;108590:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;107606:1008;;;107535:1079;:::o;105039:221::-;105124:14;105141:20;105158:2;105141:16;:20::i;:::-;105124:37;;105199:7;105172:12;:16;105185:2;105172:16;;;;;;;;;;;;;;;:24;105189:6;105172:24;;;;;;;;;;;:34;;;;105246:6;105217:17;:26;105235:7;105217:26;;;;;;;;;;;:35;;;;105113:147;105039:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::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:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:329::-;2084:6;2133:2;2121:9;2112:7;2108:23;2104:32;2101:119;;;2139:79;;:::i;:::-;2101:119;2259:1;2284:53;2329:7;2320:6;2309:9;2305:22;2284:53;:::i;:::-;2274:63;;2230:117;2025:329;;;;:::o;2360:99::-;2412:6;2446:5;2440:12;2430:22;;2360:99;;;:::o;2465:169::-;2549:11;2583:6;2578:3;2571:19;2623:4;2618:3;2614:14;2599:29;;2465:169;;;;:::o;2640:307::-;2708:1;2718:113;2732:6;2729:1;2726:13;2718:113;;;2817:1;2812:3;2808:11;2802:18;2798:1;2793:3;2789:11;2782:39;2754:2;2751:1;2747:10;2742:15;;2718:113;;;2849:6;2846:1;2843:13;2840:101;;;2929:1;2920:6;2915:3;2911:16;2904:27;2840:101;2689:258;2640:307;;;:::o;2953:102::-;2994:6;3045:2;3041:7;3036:2;3029:5;3025:14;3021:28;3011:38;;2953:102;;;:::o;3061:364::-;3149:3;3177:39;3210:5;3177:39;:::i;:::-;3232:71;3296:6;3291:3;3232:71;:::i;:::-;3225:78;;3312:52;3357:6;3352:3;3345:4;3338:5;3334:16;3312:52;:::i;:::-;3389:29;3411:6;3389:29;:::i;:::-;3384:3;3380:39;3373:46;;3153:272;3061:364;;;;:::o;3431:313::-;3544:4;3582:2;3571:9;3567:18;3559:26;;3631:9;3625:4;3621:20;3617:1;3606:9;3602:17;3595:47;3659:78;3732:4;3723:6;3659:78;:::i;:::-;3651:86;;3431:313;;;;:::o;3750:77::-;3787:7;3816:5;3805:16;;3750:77;;;:::o;3833:122::-;3906:24;3924:5;3906:24;:::i;:::-;3899:5;3896:35;3886:63;;3945:1;3942;3935:12;3886:63;3833:122;:::o;3961:139::-;4007:5;4045:6;4032:20;4023:29;;4061:33;4088:5;4061:33;:::i;:::-;3961:139;;;;:::o;4106:329::-;4165:6;4214:2;4202:9;4193:7;4189:23;4185:32;4182:119;;;4220:79;;:::i;:::-;4182:119;4340:1;4365:53;4410:7;4401:6;4390:9;4386:22;4365:53;:::i;:::-;4355:63;;4311:117;4106:329;;;;:::o;4441:118::-;4528:24;4546:5;4528:24;:::i;:::-;4523:3;4516:37;4441:118;;:::o;4565:222::-;4658:4;4696:2;4685:9;4681:18;4673:26;;4709:71;4777:1;4766:9;4762:17;4753:6;4709:71;:::i;:::-;4565:222;;;;:::o;4793:474::-;4861:6;4869;4918:2;4906:9;4897:7;4893:23;4889:32;4886:119;;;4924:79;;:::i;:::-;4886:119;5044:1;5069:53;5114:7;5105:6;5094:9;5090:22;5069:53;:::i;:::-;5059:63;;5015:117;5171:2;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5142:118;4793:474;;;;;:::o;5273:118::-;5360:24;5378:5;5360:24;:::i;:::-;5355:3;5348:37;5273:118;;:::o;5397:222::-;5490:4;5528:2;5517:9;5513:18;5505:26;;5541:71;5609:1;5598:9;5594:17;5585:6;5541:71;:::i;:::-;5397:222;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:77::-;6287:7;6316:5;6305:16;;6250:77;;;:::o;6333:122::-;6406:24;6424:5;6406:24;:::i;:::-;6399:5;6396:35;6386:63;;6445:1;6442;6435:12;6386:63;6333:122;:::o;6461:139::-;6507:5;6545:6;6532:20;6523:29;;6561:33;6588:5;6561:33;:::i;:::-;6461:139;;;;:::o;6606:329::-;6665:6;6714:2;6702:9;6693:7;6689:23;6685:32;6682:119;;;6720:79;;:::i;:::-;6682:119;6840:1;6865:53;6910:7;6901:6;6890:9;6886:22;6865:53;:::i;:::-;6855:63;;6811:117;6606:329;;;;:::o;6941:118::-;7028:24;7046:5;7028:24;:::i;:::-;7023:3;7016:37;6941:118;;:::o;7065:222::-;7158:4;7196:2;7185:9;7181:18;7173:26;;7209:71;7277:1;7266:9;7262:17;7253:6;7209:71;:::i;:::-;7065:222;;;;:::o;7293:474::-;7361:6;7369;7418:2;7406:9;7397:7;7393:23;7389:32;7386:119;;;7424:79;;:::i;:::-;7386:119;7544:1;7569:53;7614:7;7605:6;7594:9;7590:22;7569:53;:::i;:::-;7559:63;;7515:117;7671:2;7697:53;7742:7;7733:6;7722:9;7718:22;7697:53;:::i;:::-;7687:63;;7642:118;7293:474;;;;;:::o;7773:117::-;7882:1;7879;7872:12;7896:117;8005:1;8002;7995:12;8019:180;8067:77;8064:1;8057:88;8164:4;8161:1;8154:15;8188:4;8185:1;8178:15;8205:281;8288:27;8310:4;8288:27;:::i;:::-;8280:6;8276:40;8418:6;8406:10;8403:22;8382:18;8370:10;8367:34;8364:62;8361:88;;;8429:18;;:::i;:::-;8361:88;8469:10;8465:2;8458:22;8248:238;8205:281;;:::o;8492:129::-;8526:6;8553:20;;:::i;:::-;8543:30;;8582:33;8610:4;8602:6;8582:33;:::i;:::-;8492:129;;;:::o;8627:308::-;8689:4;8779:18;8771:6;8768:30;8765:56;;;8801:18;;:::i;:::-;8765:56;8839:29;8861:6;8839:29;:::i;:::-;8831:37;;8923:4;8917;8913:15;8905:23;;8627:308;;;:::o;8941:154::-;9025:6;9020:3;9015;9002:30;9087:1;9078:6;9073:3;9069:16;9062:27;8941:154;;;:::o;9101:412::-;9179:5;9204:66;9220:49;9262:6;9220:49;:::i;:::-;9204:66;:::i;:::-;9195:75;;9293:6;9286:5;9279:21;9331:4;9324:5;9320:16;9369:3;9360:6;9355:3;9351:16;9348:25;9345:112;;;9376:79;;:::i;:::-;9345:112;9466:41;9500:6;9495:3;9490;9466:41;:::i;:::-;9185:328;9101:412;;;;;:::o;9533:340::-;9589:5;9638:3;9631:4;9623:6;9619:17;9615:27;9605:122;;9646:79;;:::i;:::-;9605:122;9763:6;9750:20;9788:79;9863:3;9855:6;9848:4;9840:6;9836:17;9788:79;:::i;:::-;9779:88;;9595:278;9533:340;;;;:::o;9879:509::-;9948:6;9997:2;9985:9;9976:7;9972:23;9968:32;9965:119;;;10003:79;;:::i;:::-;9965:119;10151:1;10140:9;10136:17;10123:31;10181:18;10173:6;10170:30;10167:117;;;10203:79;;:::i;:::-;10167:117;10308:63;10363:7;10354:6;10343:9;10339:22;10308:63;:::i;:::-;10298:73;;10094:287;9879:509;;;;:::o;10394:311::-;10471:4;10561:18;10553:6;10550:30;10547:56;;;10583:18;;:::i;:::-;10547:56;10633:4;10625:6;10621:17;10613:25;;10693:4;10687;10683:15;10675:23;;10394:311;;;:::o;10711:117::-;10820:1;10817;10810:12;10851:710;10947:5;10972:81;10988:64;11045:6;10988:64;:::i;:::-;10972:81;:::i;:::-;10963:90;;11073:5;11102:6;11095:5;11088:21;11136:4;11129:5;11125:16;11118:23;;11189:4;11181:6;11177:17;11169:6;11165:30;11218:3;11210:6;11207:15;11204:122;;;11237:79;;:::i;:::-;11204:122;11352:6;11335:220;11369:6;11364:3;11361:15;11335:220;;;11444:3;11473:37;11506:3;11494:10;11473:37;:::i;:::-;11468:3;11461:50;11540:4;11535:3;11531:14;11524:21;;11411:144;11395:4;11390:3;11386:14;11379:21;;11335:220;;;11339:21;10953:608;;10851:710;;;;;:::o;11584:370::-;11655:5;11704:3;11697:4;11689:6;11685:17;11681:27;11671:122;;11712:79;;:::i;:::-;11671:122;11829:6;11816:20;11854:94;11944:3;11936:6;11929:4;11921:6;11917:17;11854:94;:::i;:::-;11845:103;;11661:293;11584:370;;;;:::o;11960:539::-;12044:6;12093:2;12081:9;12072:7;12068:23;12064:32;12061:119;;;12099:79;;:::i;:::-;12061:119;12247:1;12236:9;12232:17;12219:31;12277:18;12269:6;12266:30;12263:117;;;12299:79;;:::i;:::-;12263:117;12404:78;12474:7;12465:6;12454:9;12450:22;12404:78;:::i;:::-;12394:88;;12190:302;11960:539;;;;:::o;12505:474::-;12573:6;12581;12630:2;12618:9;12609:7;12605:23;12601:32;12598:119;;;12636:79;;:::i;:::-;12598:119;12756:1;12781:53;12826:7;12817:6;12806:9;12802:22;12781:53;:::i;:::-;12771:63;;12727:117;12883:2;12909:53;12954:7;12945:6;12934:9;12930:22;12909:53;:::i;:::-;12899:63;;12854:118;12505:474;;;;;:::o;12985:116::-;13055:21;13070:5;13055:21;:::i;:::-;13048:5;13045:32;13035:60;;13091:1;13088;13081:12;13035:60;12985:116;:::o;13107:133::-;13150:5;13188:6;13175:20;13166:29;;13204:30;13228:5;13204:30;:::i;:::-;13107:133;;;;:::o;13246:323::-;13302:6;13351:2;13339:9;13330:7;13326:23;13322:32;13319:119;;;13357:79;;:::i;:::-;13319:119;13477:1;13502:50;13544:7;13535:6;13524:9;13520:22;13502:50;:::i;:::-;13492:60;;13448:114;13246:323;;;;:::o;13575:468::-;13640:6;13648;13697:2;13685:9;13676:7;13672:23;13668:32;13665:119;;;13703:79;;:::i;:::-;13665:119;13823:1;13848:53;13893:7;13884:6;13873:9;13869:22;13848:53;:::i;:::-;13838:63;;13794:117;13950:2;13976:50;14018:7;14009:6;13998:9;13994:22;13976:50;:::i;:::-;13966:60;;13921:115;13575:468;;;;;:::o;14049:307::-;14110:4;14200:18;14192:6;14189:30;14186:56;;;14222:18;;:::i;:::-;14186:56;14260:29;14282:6;14260:29;:::i;:::-;14252:37;;14344:4;14338;14334:15;14326:23;;14049:307;;;:::o;14362:410::-;14439:5;14464:65;14480:48;14521:6;14480:48;:::i;:::-;14464:65;:::i;:::-;14455:74;;14552:6;14545:5;14538:21;14590:4;14583:5;14579:16;14628:3;14619:6;14614:3;14610:16;14607:25;14604:112;;;14635:79;;:::i;:::-;14604:112;14725:41;14759:6;14754:3;14749;14725:41;:::i;:::-;14445:327;14362:410;;;;;:::o;14791:338::-;14846:5;14895:3;14888:4;14880:6;14876:17;14872:27;14862:122;;14903:79;;:::i;:::-;14862:122;15020:6;15007:20;15045:78;15119:3;15111:6;15104:4;15096:6;15092:17;15045:78;:::i;:::-;15036:87;;14852:277;14791:338;;;;:::o;15135:943::-;15230:6;15238;15246;15254;15303:3;15291:9;15282:7;15278:23;15274:33;15271:120;;;15310:79;;:::i;:::-;15271:120;15430:1;15455:53;15500:7;15491:6;15480:9;15476:22;15455:53;:::i;:::-;15445:63;;15401:117;15557:2;15583:53;15628:7;15619:6;15608:9;15604:22;15583:53;:::i;:::-;15573:63;;15528:118;15685:2;15711:53;15756:7;15747:6;15736:9;15732:22;15711:53;:::i;:::-;15701:63;;15656:118;15841:2;15830:9;15826:18;15813:32;15872:18;15864:6;15861:30;15858:117;;;15894:79;;:::i;:::-;15858:117;15999:62;16053:7;16044:6;16033:9;16029:22;15999:62;:::i;:::-;15989:72;;15784:287;15135:943;;;;;;;:::o;16084:474::-;16152:6;16160;16209:2;16197:9;16188:7;16184:23;16180:32;16177:119;;;16215:79;;:::i;:::-;16177:119;16335:1;16360:53;16405:7;16396:6;16385:9;16381:22;16360:53;:::i;:::-;16350:63;;16306:117;16462:2;16488:53;16533:7;16524:6;16513:9;16509:22;16488:53;:::i;:::-;16478:63;;16433:118;16084:474;;;;;:::o;16564:180::-;16612:77;16609:1;16602:88;16709:4;16706:1;16699:15;16733:4;16730:1;16723:15;16750:191;16790:4;16810:20;16828:1;16810:20;:::i;:::-;16805:25;;16844:20;16862:1;16844:20;:::i;:::-;16839:25;;16883:1;16880;16877:8;16874:34;;;16888:18;;:::i;:::-;16874:34;16933:1;16930;16926:9;16918:17;;16750:191;;;;:::o;16947:180::-;16995:77;16992:1;16985:88;17092:4;17089:1;17082:15;17116:4;17113:1;17106:15;17133:320;17177:6;17214:1;17208:4;17204:12;17194:22;;17261:1;17255:4;17251:12;17282:18;17272:81;;17338:4;17330:6;17326:17;17316:27;;17272:81;17400:2;17392:6;17389:14;17369:18;17366:38;17363:84;;;17419:18;;:::i;:::-;17363:84;17184:269;17133:320;;;:::o;17459:231::-;17599:34;17595:1;17587:6;17583:14;17576:58;17668:14;17663:2;17655:6;17651:15;17644:39;17459:231;:::o;17696:366::-;17838:3;17859:67;17923:2;17918:3;17859:67;:::i;:::-;17852:74;;17935:93;18024:3;17935:93;:::i;:::-;18053:2;18048:3;18044:12;18037:19;;17696:366;;;:::o;18068:419::-;18234:4;18272:2;18261:9;18257:18;18249:26;;18321:9;18315:4;18311:20;18307:1;18296:9;18292:17;18285:47;18349:131;18475:4;18349:131;:::i;:::-;18341:139;;18068:419;;;:::o;18493:220::-;18633:34;18629:1;18621:6;18617:14;18610:58;18702:3;18697:2;18689:6;18685:15;18678:28;18493:220;:::o;18719:366::-;18861:3;18882:67;18946:2;18941:3;18882:67;:::i;:::-;18875:74;;18958:93;19047:3;18958:93;:::i;:::-;19076:2;19071:3;19067:12;19060:19;;18719:366;;;:::o;19091:419::-;19257:4;19295:2;19284:9;19280:18;19272:26;;19344:9;19338:4;19334:20;19330:1;19319:9;19315:17;19308:47;19372:131;19498:4;19372:131;:::i;:::-;19364:139;;19091:419;;;:::o;19516:243::-;19656:34;19652:1;19644:6;19640:14;19633:58;19725:26;19720:2;19712:6;19708:15;19701:51;19516:243;:::o;19765:366::-;19907:3;19928:67;19992:2;19987:3;19928:67;:::i;:::-;19921:74;;20004:93;20093:3;20004:93;:::i;:::-;20122:2;20117:3;20113:12;20106:19;;19765:366;;;:::o;20137:419::-;20303:4;20341:2;20330:9;20326:18;20318:26;;20390:9;20384:4;20380:20;20376:1;20365:9;20361:17;20354:47;20418:131;20544:4;20418:131;:::i;:::-;20410:139;;20137:419;;;:::o;20562:236::-;20702:34;20698:1;20690:6;20686:14;20679:58;20771:19;20766:2;20758:6;20754:15;20747:44;20562:236;:::o;20804:366::-;20946:3;20967:67;21031:2;21026:3;20967:67;:::i;:::-;20960:74;;21043:93;21132:3;21043:93;:::i;:::-;21161:2;21156:3;21152:12;21145:19;;20804:366;;;:::o;21176:419::-;21342:4;21380:2;21369:9;21365:18;21357:26;;21429:9;21423:4;21419:20;21415:1;21404:9;21400:17;21393:47;21457:131;21583:4;21457:131;:::i;:::-;21449:139;;21176:419;;;:::o;21601:230::-;21741:34;21737:1;21729:6;21725:14;21718:58;21810:13;21805:2;21797:6;21793:15;21786:38;21601:230;:::o;21837:366::-;21979:3;22000:67;22064:2;22059:3;22000:67;:::i;:::-;21993:74;;22076:93;22165:3;22076:93;:::i;:::-;22194:2;22189:3;22185:12;22178:19;;21837:366;;;:::o;22209:419::-;22375:4;22413:2;22402:9;22398:18;22390:26;;22462:9;22456:4;22452:20;22448:1;22437:9;22433:17;22426:47;22490:131;22616:4;22490:131;:::i;:::-;22482:139;;22209:419;;;:::o;22634:234::-;22774:34;22770:1;22762:6;22758:14;22751:58;22843:17;22838:2;22830:6;22826:15;22819:42;22634:234;:::o;22874:366::-;23016:3;23037:67;23101:2;23096:3;23037:67;:::i;:::-;23030:74;;23113:93;23202:3;23113:93;:::i;:::-;23231:2;23226:3;23222:12;23215:19;;22874:366;;;:::o;23246:419::-;23412:4;23450:2;23439:9;23435:18;23427:26;;23499:9;23493:4;23489:20;23485:1;23474:9;23470:17;23463:47;23527:131;23653:4;23527:131;:::i;:::-;23519:139;;23246:419;;;:::o;23671:251::-;23811:34;23807:1;23799:6;23795:14;23788:58;23880:34;23875:2;23867:6;23863:15;23856:59;23671:251;:::o;23928:366::-;24070:3;24091:67;24155:2;24150:3;24091:67;:::i;:::-;24084:74;;24167:93;24256:3;24167:93;:::i;:::-;24285:2;24280:3;24276:12;24269:19;;23928:366;;;:::o;24300:419::-;24466:4;24504:2;24493:9;24489:18;24481:26;;24553:9;24547:4;24543:20;24539:1;24528:9;24524:17;24517:47;24581:131;24707:4;24581:131;:::i;:::-;24573:139;;24300:419;;;:::o;24725:235::-;24865:34;24861:1;24853:6;24849:14;24842:58;24934:18;24929:2;24921:6;24917:15;24910:43;24725:235;:::o;24966:366::-;25108:3;25129:67;25193:2;25188:3;25129:67;:::i;:::-;25122:74;;25205:93;25294:3;25205:93;:::i;:::-;25323:2;25318:3;25314:12;25307:19;;24966:366;;;:::o;25338:419::-;25504:4;25542:2;25531:9;25527:18;25519:26;;25591:9;25585:4;25581:20;25577:1;25566:9;25562:17;25555:47;25619:131;25745:4;25619:131;:::i;:::-;25611:139;;25338:419;;;:::o;25763:231::-;25903:34;25899:1;25891:6;25887:14;25880:58;25972:14;25967:2;25959:6;25955:15;25948:39;25763:231;:::o;26000:366::-;26142:3;26163:67;26227:2;26222:3;26163:67;:::i;:::-;26156:74;;26239:93;26328:3;26239:93;:::i;:::-;26357:2;26352:3;26348:12;26341:19;;26000:366;;;:::o;26372:419::-;26538:4;26576:2;26565:9;26561:18;26553:26;;26625:9;26619:4;26615:20;26611:1;26600:9;26596:17;26589:47;26653:131;26779:4;26653:131;:::i;:::-;26645:139;;26372:419;;;:::o;26797:180::-;26845:77;26842:1;26835:88;26942:4;26939:1;26932:15;26966:4;26963:1;26956:15;26983:305;27023:3;27042:20;27060:1;27042:20;:::i;:::-;27037:25;;27076:20;27094:1;27076:20;:::i;:::-;27071:25;;27230:1;27162:66;27158:74;27155:1;27152:81;27149:107;;;27236:18;;:::i;:::-;27149:107;27280:1;27277;27273:9;27266:16;;26983:305;;;;:::o;27294:233::-;27333:3;27356:24;27374:5;27356:24;:::i;:::-;27347:33;;27402:66;27395:5;27392:77;27389:103;;;27472:18;;:::i;:::-;27389:103;27519:1;27512:5;27508:13;27501:20;;27294:233;;;:::o;27533:228::-;27673:34;27669:1;27661:6;27657:14;27650:58;27742:11;27737:2;27729:6;27725:15;27718:36;27533:228;:::o;27767:366::-;27909:3;27930:67;27994:2;27989:3;27930:67;:::i;:::-;27923:74;;28006:93;28095:3;28006:93;:::i;:::-;28124:2;28119:3;28115:12;28108:19;;27767:366;;;:::o;28139:419::-;28305:4;28343:2;28332:9;28328:18;28320:26;;28392:9;28386:4;28382:20;28378:1;28367:9;28363:17;28356:47;28420:131;28546:4;28420:131;:::i;:::-;28412:139;;28139:419;;;:::o;28564:248::-;28704:34;28700:1;28692:6;28688:14;28681:58;28773:31;28768:2;28760:6;28756:15;28749:56;28564:248;:::o;28818:366::-;28960:3;28981:67;29045:2;29040:3;28981:67;:::i;:::-;28974:74;;29057:93;29146:3;29057:93;:::i;:::-;29175:2;29170:3;29166:12;29159:19;;28818:366;;;:::o;29190:419::-;29356:4;29394:2;29383:9;29379:18;29371:26;;29443:9;29437:4;29433:20;29429:1;29418:9;29414:17;29407:47;29471:131;29597:4;29471:131;:::i;:::-;29463:139;;29190:419;;;:::o;29615:229::-;29755:34;29751:1;29743:6;29739:14;29732:58;29824:12;29819:2;29811:6;29807:15;29800:37;29615:229;:::o;29850:366::-;29992:3;30013:67;30077:2;30072:3;30013:67;:::i;:::-;30006:74;;30089:93;30178:3;30089:93;:::i;:::-;30207:2;30202:3;30198:12;30191:19;;29850:366;;;:::o;30222:419::-;30388:4;30426:2;30415:9;30411:18;30403:26;;30475:9;30469:4;30465:20;30461:1;30450:9;30446:17;30439:47;30503:131;30629:4;30503:131;:::i;:::-;30495:139;;30222:419;;;:::o;30647:249::-;30787:34;30783:1;30775:6;30771:14;30764:58;30856:32;30851:2;30843:6;30839:15;30832:57;30647:249;:::o;30902:366::-;31044:3;31065:67;31129:2;31124:3;31065:67;:::i;:::-;31058:74;;31141:93;31230:3;31141:93;:::i;:::-;31259:2;31254:3;31250:12;31243:19;;30902:366;;;:::o;31274:419::-;31440:4;31478:2;31467:9;31463:18;31455:26;;31527:9;31521:4;31517:20;31513:1;31502:9;31498:17;31491:47;31555:131;31681:4;31555:131;:::i;:::-;31547:139;;31274:419;;;:::o;31699:348::-;31739:7;31762:20;31780:1;31762:20;:::i;:::-;31757:25;;31796:20;31814:1;31796:20;:::i;:::-;31791:25;;31984:1;31916:66;31912:74;31909:1;31906:81;31901:1;31894:9;31887:17;31883:105;31880:131;;;31991:18;;:::i;:::-;31880:131;32039:1;32036;32032:9;32021:20;;31699:348;;;;:::o;32053:172::-;32193:24;32189:1;32181:6;32177:14;32170:48;32053:172;:::o;32231:366::-;32373:3;32394:67;32458:2;32453:3;32394:67;:::i;:::-;32387:74;;32470:93;32559:3;32470:93;:::i;:::-;32588:2;32583:3;32579:12;32572:19;;32231:366;;;:::o;32603:419::-;32769:4;32807:2;32796:9;32792:18;32784:26;;32856:9;32850:4;32846:20;32842:1;32831:9;32827:17;32820:47;32884:131;33010:4;32884:131;:::i;:::-;32876:139;;32603:419;;;:::o;33028:174::-;33168:26;33164:1;33156:6;33152:14;33145:50;33028:174;:::o;33208:366::-;33350:3;33371:67;33435:2;33430:3;33371:67;:::i;:::-;33364:74;;33447:93;33536:3;33447:93;:::i;:::-;33565:2;33560:3;33556:12;33549:19;;33208:366;;;:::o;33580:419::-;33746:4;33784:2;33773:9;33769:18;33761:26;;33833:9;33827:4;33823:20;33819:1;33808:9;33804:17;33797:47;33861:131;33987:4;33861:131;:::i;:::-;33853:139;;33580:419;;;:::o;34005:171::-;34044:3;34067:24;34085:5;34067:24;:::i;:::-;34058:33;;34113:4;34106:5;34103:15;34100:41;;;34121:18;;:::i;:::-;34100:41;34168:1;34161:5;34157:13;34150:20;;34005:171;;;:::o;34182:234::-;34322:34;34318:1;34310:6;34306:14;34299:58;34391:17;34386:2;34378:6;34374:15;34367:42;34182:234;:::o;34422:366::-;34564:3;34585:67;34649:2;34644:3;34585:67;:::i;:::-;34578:74;;34661:93;34750:3;34661:93;:::i;:::-;34779:2;34774:3;34770:12;34763:19;;34422:366;;;:::o;34794:419::-;34960:4;34998:2;34987:9;34983:18;34975:26;;35047:9;35041:4;35037:20;35033:1;35022:9;35018:17;35011:47;35075:131;35201:4;35075:131;:::i;:::-;35067:139;;34794:419;;;:::o;35219:148::-;35321:11;35358:3;35343:18;;35219:148;;;;:::o;35373:377::-;35479:3;35507:39;35540:5;35507:39;:::i;:::-;35562:89;35644:6;35639:3;35562:89;:::i;:::-;35555:96;;35660:52;35705:6;35700:3;35693:4;35686:5;35682:16;35660:52;:::i;:::-;35737:6;35732:3;35728:16;35721:23;;35483:267;35373:377;;;;:::o;35756:141::-;35805:4;35828:3;35820:11;;35851:3;35848:1;35841:14;35885:4;35882:1;35872:18;35864:26;;35756:141;;;:::o;35927:845::-;36030:3;36067:5;36061:12;36096:36;36122:9;36096:36;:::i;:::-;36148:89;36230:6;36225:3;36148:89;:::i;:::-;36141:96;;36268:1;36257:9;36253:17;36284:1;36279:137;;;;36430:1;36425:341;;;;36246:520;;36279:137;36363:4;36359:9;36348;36344:25;36339:3;36332:38;36399:6;36394:3;36390:16;36383:23;;36279:137;;36425:341;36492:38;36524:5;36492:38;:::i;:::-;36552:1;36566:154;36580:6;36577:1;36574:13;36566:154;;;36654:7;36648:14;36644:1;36639:3;36635:11;36628:35;36704:1;36695:7;36691:15;36680:26;;36602:4;36599:1;36595:12;36590:17;;36566:154;;;36749:6;36744:3;36740:16;36733:23;;36432:334;;36246:520;;36034:738;;35927:845;;;;:::o;36778:589::-;37003:3;37025:95;37116:3;37107:6;37025:95;:::i;:::-;37018:102;;37137:95;37228:3;37219:6;37137:95;:::i;:::-;37130:102;;37249:92;37337:3;37328:6;37249:92;:::i;:::-;37242:99;;37358:3;37351:10;;36778:589;;;;;;:::o;37373:182::-;37513:34;37509:1;37501:6;37497:14;37490:58;37373:182;:::o;37561:366::-;37703:3;37724:67;37788:2;37783:3;37724:67;:::i;:::-;37717:74;;37800:93;37889:3;37800:93;:::i;:::-;37918:2;37913:3;37909:12;37902:19;;37561:366;;;:::o;37933:419::-;38099:4;38137:2;38126:9;38122:18;38114:26;;38186:9;38180:4;38176:20;38172:1;38161:9;38157:17;38150:47;38214:131;38340:4;38214:131;:::i;:::-;38206:139;;37933:419;;;:::o;38358:231::-;38498:34;38494:1;38486:6;38482:14;38475:58;38567:14;38562:2;38554:6;38550:15;38543:39;38358:231;:::o;38595:366::-;38737:3;38758:67;38822:2;38817:3;38758:67;:::i;:::-;38751:74;;38834:93;38923:3;38834:93;:::i;:::-;38952:2;38947:3;38943:12;38936:19;;38595:366;;;:::o;38967:419::-;39133:4;39171:2;39160:9;39156:18;39148:26;;39220:9;39214:4;39210:20;39206:1;39195:9;39191:17;39184:47;39248:131;39374:4;39248:131;:::i;:::-;39240:139;;38967:419;;;:::o;39392:224::-;39532:34;39528:1;39520:6;39516:14;39509:58;39601:7;39596:2;39588:6;39584:15;39577:32;39392:224;:::o;39622:366::-;39764:3;39785:67;39849:2;39844:3;39785:67;:::i;:::-;39778:74;;39861:93;39950:3;39861:93;:::i;:::-;39979:2;39974:3;39970:12;39963:19;;39622:366;;;:::o;39994:419::-;40160:4;40198:2;40187:9;40183:18;40175:26;;40247:9;40241:4;40237:20;40233:1;40222:9;40218:17;40211:47;40275:131;40401:4;40275:131;:::i;:::-;40267:139;;39994:419;;;:::o;40419:223::-;40559:34;40555:1;40547:6;40543:14;40536:58;40628:6;40623:2;40615:6;40611:15;40604:31;40419:223;:::o;40648:366::-;40790:3;40811:67;40875:2;40870:3;40811:67;:::i;:::-;40804:74;;40887:93;40976:3;40887:93;:::i;:::-;41005:2;41000:3;40996:12;40989:19;;40648:366;;;:::o;41020:419::-;41186:4;41224:2;41213:9;41209:18;41201:26;;41273:9;41267:4;41263:20;41259:1;41248:9;41244:17;41237:47;41301:131;41427:4;41301:131;:::i;:::-;41293:139;;41020:419;;;:::o;41445:179::-;41585:31;41581:1;41573:6;41569:14;41562:55;41445:179;:::o;41630:366::-;41772:3;41793:67;41857:2;41852:3;41793:67;:::i;:::-;41786:74;;41869:93;41958:3;41869:93;:::i;:::-;41987:2;41982:3;41978:12;41971:19;;41630:366;;;:::o;42002:419::-;42168:4;42206:2;42195:9;42191:18;42183:26;;42255:9;42249:4;42245:20;42241:1;42230:9;42226:17;42219:47;42283:131;42409:4;42283:131;:::i;:::-;42275:139;;42002:419;;;:::o;42427:147::-;42528:11;42565:3;42550:18;;42427:147;;;;:::o;42580:114::-;;:::o;42700:398::-;42859:3;42880:83;42961:1;42956:3;42880:83;:::i;:::-;42873:90;;42972:93;43061:3;42972:93;:::i;:::-;43090:1;43085:3;43081:11;43074:18;;42700:398;;;:::o;43104:379::-;43288:3;43310:147;43453:3;43310:147;:::i;:::-;43303:154;;43474:3;43467:10;;43104:379;;;:::o;43489:245::-;43629:34;43625:1;43617:6;43613:14;43606:58;43698:28;43693:2;43685:6;43681:15;43674:53;43489:245;:::o;43740:366::-;43882:3;43903:67;43967:2;43962:3;43903:67;:::i;:::-;43896:74;;43979:93;44068:3;43979:93;:::i;:::-;44097:2;44092:3;44088:12;44081:19;;43740:366;;;:::o;44112:419::-;44278:4;44316:2;44305:9;44301:18;44293:26;;44365:9;44359:4;44355:20;44351:1;44340:9;44336:17;44329:47;44393:131;44519:4;44393:131;:::i;:::-;44385:139;;44112:419;;;:::o;44537:170::-;44677:22;44673:1;44665:6;44661:14;44654:46;44537:170;:::o;44713:366::-;44855:3;44876:67;44940:2;44935:3;44876:67;:::i;:::-;44869:74;;44952:93;45041:3;44952:93;:::i;:::-;45070:2;45065:3;45061:12;45054:19;;44713:366;;;:::o;45085:419::-;45251:4;45289:2;45278:9;45274:18;45266:26;;45338:9;45332:4;45328:20;45324:1;45313:9;45309:17;45302:47;45366:131;45492:4;45366:131;:::i;:::-;45358:139;;45085:419;;;:::o;45510:182::-;45650:34;45646:1;45638:6;45634:14;45627:58;45510:182;:::o;45698:366::-;45840:3;45861:67;45925:2;45920:3;45861:67;:::i;:::-;45854:74;;45937:93;46026:3;45937:93;:::i;:::-;46055:2;46050:3;46046:12;46039:19;;45698:366;;;:::o;46070:419::-;46236:4;46274:2;46263:9;46259:18;46251:26;;46323:9;46317:4;46313:20;46309:1;46298:9;46294:17;46287:47;46351:131;46477:4;46351:131;:::i;:::-;46343:139;;46070:419;;;:::o;46495:178::-;46635:30;46631:1;46623:6;46619:14;46612:54;46495:178;:::o;46679:366::-;46821:3;46842:67;46906:2;46901:3;46842:67;:::i;:::-;46835:74;;46918:93;47007:3;46918:93;:::i;:::-;47036:2;47031:3;47027:12;47020:19;;46679:366;;;:::o;47051:419::-;47217:4;47255:2;47244:9;47240:18;47232:26;;47304:9;47298:4;47294:20;47290:1;47279:9;47275:17;47268:47;47332:131;47458:4;47332:131;:::i;:::-;47324:139;;47051:419;;;:::o;47476:166::-;47616:18;47612:1;47604:6;47600:14;47593:42;47476:166;:::o;47648:366::-;47790:3;47811:67;47875:2;47870:3;47811:67;:::i;:::-;47804:74;;47887:93;47976:3;47887:93;:::i;:::-;48005:2;48000:3;47996:12;47989:19;;47648:366;;;:::o;48020:419::-;48186:4;48224:2;48213:9;48209:18;48201:26;;48273:9;48267:4;48263:20;48259:1;48248:9;48244:17;48237:47;48301:131;48427:4;48301:131;:::i;:::-;48293:139;;48020:419;;;:::o;48445:169::-;48585:21;48581:1;48573:6;48569:14;48562:45;48445:169;:::o;48620:366::-;48762:3;48783:67;48847:2;48842:3;48783:67;:::i;:::-;48776:74;;48859:93;48948:3;48859:93;:::i;:::-;48977:2;48972:3;48968:12;48961:19;;48620:366;;;:::o;48992:419::-;49158:4;49196:2;49185:9;49181:18;49173:26;;49245:9;49239:4;49235:20;49231:1;49220:9;49216:17;49209:47;49273:131;49399:4;49273:131;:::i;:::-;49265:139;;48992:419;;;:::o;49417:176::-;49557:28;49553:1;49545:6;49541:14;49534:52;49417:176;:::o;49599:366::-;49741:3;49762:67;49826:2;49821:3;49762:67;:::i;:::-;49755:74;;49838:93;49927:3;49838:93;:::i;:::-;49956:2;49951:3;49947:12;49940:19;;49599:366;;;:::o;49971:419::-;50137:4;50175:2;50164:9;50160:18;50152:26;;50224:9;50218:4;50214:20;50210:1;50199:9;50195:17;50188:47;50252:131;50378:4;50252:131;:::i;:::-;50244:139;;49971:419;;;:::o;50396:223::-;50536:34;50532:1;50524:6;50520:14;50513:58;50605:6;50600:2;50592:6;50588:15;50581:31;50396:223;:::o;50625:366::-;50767:3;50788:67;50852:2;50847:3;50788:67;:::i;:::-;50781:74;;50864:93;50953:3;50864:93;:::i;:::-;50982:2;50977:3;50973:12;50966:19;;50625:366;;;:::o;50997:419::-;51163:4;51201:2;51190:9;51186:18;51178:26;;51250:9;51244:4;51240:20;51236:1;51225:9;51221:17;51214:47;51278:131;51404:4;51278:131;:::i;:::-;51270:139;;50997:419;;;:::o;51422:221::-;51562:34;51558:1;51550:6;51546:14;51539:58;51631:4;51626:2;51618:6;51614:15;51607:29;51422:221;:::o;51649:366::-;51791:3;51812:67;51876:2;51871:3;51812:67;:::i;:::-;51805:74;;51888:93;51977:3;51888:93;:::i;:::-;52006:2;52001:3;51997:12;51990:19;;51649:366;;;:::o;52021:419::-;52187:4;52225:2;52214:9;52210:18;52202:26;;52274:9;52268:4;52264:20;52260:1;52249:9;52245:17;52238:47;52302:131;52428:4;52302:131;:::i;:::-;52294:139;;52021:419;;;:::o;52446:175::-;52586:27;52582:1;52574:6;52570:14;52563:51;52446:175;:::o;52627:366::-;52769:3;52790:67;52854:2;52849:3;52790:67;:::i;:::-;52783:74;;52866:93;52955:3;52866:93;:::i;:::-;52984:2;52979:3;52975:12;52968:19;;52627:366;;;:::o;52999:419::-;53165:4;53203:2;53192:9;53188:18;53180:26;;53252:9;53246:4;53242:20;53238:1;53227:9;53223:17;53216:47;53280:131;53406:4;53280:131;:::i;:::-;53272:139;;52999:419;;;:::o;53424:237::-;53564:34;53560:1;53552:6;53548:14;53541:58;53633:20;53628:2;53620:6;53616:15;53609:45;53424:237;:::o;53667:366::-;53809:3;53830:67;53894:2;53889:3;53830:67;:::i;:::-;53823:74;;53906:93;53995:3;53906:93;:::i;:::-;54024:2;54019:3;54015:12;54008:19;;53667:366;;;:::o;54039:419::-;54205:4;54243:2;54232:9;54228:18;54220:26;;54292:9;54286:4;54282:20;54278:1;54267:9;54263:17;54256:47;54320:131;54446:4;54320:131;:::i;:::-;54312:139;;54039:419;;;:::o;54464:180::-;54512:77;54509:1;54502:88;54609:4;54606:1;54599:15;54633:4;54630:1;54623:15;54650:185;54690:1;54707:20;54725:1;54707:20;:::i;:::-;54702:25;;54741:20;54759:1;54741:20;:::i;:::-;54736:25;;54780:1;54770:35;;54785:18;;:::i;:::-;54770:35;54827:1;54824;54820:9;54815:14;;54650:185;;;;:::o;54841:176::-;54873:1;54890:20;54908:1;54890:20;:::i;:::-;54885:25;;54924:20;54942:1;54924:20;:::i;:::-;54919:25;;54963:1;54953:35;;54968:18;;:::i;:::-;54953:35;55009:1;55006;55002:9;54997:14;;54841:176;;;;:::o;55023:173::-;55163:25;55159:1;55151:6;55147:14;55140:49;55023:173;:::o;55202:402::-;55362:3;55383:85;55465:2;55460:3;55383:85;:::i;:::-;55376:92;;55477:93;55566:3;55477:93;:::i;:::-;55595:2;55590:3;55586:12;55579:19;;55202:402;;;:::o;55610:167::-;55750:19;55746:1;55738:6;55734:14;55727:43;55610:167;:::o;55783:402::-;55943:3;55964:85;56046:2;56041:3;55964:85;:::i;:::-;55957:92;;56058:93;56147:3;56058:93;:::i;:::-;56176:2;56171:3;56167:12;56160:19;;55783:402;;;:::o;56191:967::-;56573:3;56595:148;56739:3;56595:148;:::i;:::-;56588:155;;56760:95;56851:3;56842:6;56760:95;:::i;:::-;56753:102;;56872:148;57016:3;56872:148;:::i;:::-;56865:155;;57037:95;57128:3;57119:6;57037:95;:::i;:::-;57030:102;;57149:3;57142:10;;56191:967;;;;;:::o;57164:98::-;57215:6;57249:5;57243:12;57233:22;;57164:98;;;:::o;57268:168::-;57351:11;57385:6;57380:3;57373:19;57425:4;57420:3;57416:14;57401:29;;57268:168;;;;:::o;57442:360::-;57528:3;57556:38;57588:5;57556:38;:::i;:::-;57610:70;57673:6;57668:3;57610:70;:::i;:::-;57603:77;;57689:52;57734:6;57729:3;57722:4;57715:5;57711:16;57689:52;:::i;:::-;57766:29;57788:6;57766:29;:::i;:::-;57761:3;57757:39;57750:46;;57532:270;57442:360;;;;:::o;57808:640::-;58003:4;58041:3;58030:9;58026:19;58018:27;;58055:71;58123:1;58112:9;58108:17;58099:6;58055:71;:::i;:::-;58136:72;58204:2;58193:9;58189:18;58180:6;58136:72;:::i;:::-;58218;58286:2;58275:9;58271:18;58262:6;58218:72;:::i;:::-;58337:9;58331:4;58327:20;58322:2;58311:9;58307:18;58300:48;58365:76;58436:4;58427:6;58365:76;:::i;:::-;58357:84;;57808:640;;;;;;;:::o;58454:141::-;58510:5;58541:6;58535:13;58526:22;;58557:32;58583:5;58557:32;:::i;:::-;58454:141;;;;:::o;58601:349::-;58670:6;58719:2;58707:9;58698:7;58694:23;58690:32;58687:119;;;58725:79;;:::i;:::-;58687:119;58845:1;58870:63;58925:7;58916:6;58905:9;58901:22;58870:63;:::i;:::-;58860:73;;58816:127;58601:349;;;;:::o;58956:230::-;59096:34;59092:1;59084:6;59080:14;59073:58;59165:13;59160:2;59152:6;59148:15;59141:38;58956:230;:::o;59192:366::-;59334:3;59355:67;59419:2;59414:3;59355:67;:::i;:::-;59348:74;;59431:93;59520:3;59431:93;:::i;:::-;59549:2;59544:3;59540:12;59533:19;;59192:366;;;:::o;59564:419::-;59730:4;59768:2;59757:9;59753:18;59745:26;;59817:9;59811:4;59807:20;59803:1;59792:9;59788:17;59781:47;59845:131;59971:4;59845:131;:::i;:::-;59837:139;;59564:419;;;:::o;59989:180::-;60037:77;60034:1;60027:88;60134:4;60131:1;60124:15;60158:4;60155:1;60148:15
Swarm Source
ipfs://4acce97e47d9ae6d763a04e4f5541edc242401a8a6b44f69067ed85a7c872dc5
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.