Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
0 APV
Holders
5
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
62 APVLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
ArtPacksVessel
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-09-21 */ // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @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: * * ```solidity * 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}: * * ```solidity * 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. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ 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(account), " 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. * * May emit a {RoleGranted} event. */ 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. * * May emit a {RoleRevoked} event. */ 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`. * * May emit a {RoleRevoked} event. */ 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. * * May emit a {RoleGranted} event. * * [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. * * May emit a {RoleGranted} event. */ 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. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @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 _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @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, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256, /* firstTokenId */ uint256 batchSize ) internal virtual { if (batchSize > 1) { if (from != address(0)) { _balances[from] -= batchSize; } if (to != address(0)) { _balances[to] += batchSize; } } } /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @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; } } // File: ArtPacksVessel.sol pragma solidity 0.8.17; /* * @author 0xtp * @title ArtPacks Vessel * * █████╗ ██████╗ ████████╗ ██████╗ █████╗ ██████╗ ██╗ ██╗ ███████╗ * ██╔══██╗ ██╔══██╗ ╚══██╔══╝ ██╔══██╗ ██╔══██╗ ██╔════╝ ██║ ██╔╝ ██╔════╝ * ███████║ ██████╔╝ ██║ ██████╔╝ ███████║ ██║ █████╔╝ ███████╗ * ██╔══██║ ██╔══██╗ ██║ ██╔═══╝ ██╔══██║ ██║ ██╔═██╗ ╚════██║ * ██║ ██║ ██║ ██║ ██║ ██║ ██║ ██║ ╚██████╗ ██║ ██╗ ███████║ * ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚══════╝ * */ contract ArtPacksVessel is ERC721, AccessControl { using Counters for Counters.Counter; Counters.Counter private _packId; /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ S T A T E @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ string public _baseTokenURI; uint256 public _currentSupply; uint256 public _mintedPacksCount; uint256 public _mintedReserveCount; uint256 public _maxPerMint; uint256 public _maxPackSupply; uint256 public _maxReserveSupply; bool public _isPublicSaleActive; bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); // RoleID = 1 bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); // RoleID = 2 bytes32 public constant AIRDROP_ROLE = keccak256("AIRDROP_ROLE"); // RoleID = 3 mapping(string => uint256) public price; mapping(address => uint256) public minted; mapping(uint256 => address) public ownerOfPack; mapping(uint256 => bool) public packOpenedStatus; mapping(address => uint256[]) public mintedPacks; mapping(address => uint256[]) public mintedArtWorks; /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ E V E N T S @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ event MintedArtWorks(address indexed account, uint256[] tokenIds); event MintAndOpenedPack(address indexed account, uint256[] packIds); event MintedReservePacks(address indexed account, uint256[] packIds); event MintPacksAndArtWorks(address indexed account, uint256[] tokenIds); event AridroppedArtWorks(address[] indexed accounts, uint256[] tokenIds); constructor() public ERC721("ArtPacks Vessel", "APV") { _init(); } function _init() internal { _maxPerMint = 5; _maxPackSupply = 150; _maxReserveSupply = 110; _isPublicSaleActive = true; price["public"] = 0.12 ether; _grantRole(ADMIN_ROLE, msg.sender); _grantRole(MINTER_ROLE, msg.sender); _grantRole(AIRDROP_ROLE, msg.sender); _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); _grantRole(ADMIN_ROLE, 0x9385eb301b34700E7E497C70d7937d8DDca688b0); _grantRole(MINTER_ROLE, 0x9385eb301b34700E7E497C70d7937d8DDca688b0); } function mintAndOpenPack( uint256 quantity) external payable returns (uint256[] memory) { require(_isPublicSaleActive, "Sale Not Active"); require(_maxPerMint >= quantity, "Exceeding Max Per Mint"); require(_maxPackSupply >= _mintedPacksCount + quantity, "Exceeding Max Pack Supply"); require(msg.value == price["public"] * quantity, "Public Sale - Incorrect ETH value"); uint256[] memory packIds = new uint256[](quantity); _mintedPacksCount += quantity; for (uint256 i; i < quantity; i++) { _packId.increment(); uint256 newPackId = _packId.current(); packIds[i] = newPackId; ownerOfPack[newPackId] = msg.sender; packOpenedStatus[newPackId] = false; mintedPacks[msg.sender].push(newPackId); } emit MintAndOpenedPack(msg.sender, packIds); return packIds; } function mintArtWorks( address to, uint256[] calldata packIds, uint256[] calldata tokenIds) external onlyRole(MINTER_ROLE) { uint256 quantity = tokenIds.length; _currentSupply += quantity; minted[to] += quantity; for (uint256 i; i < packIds.length; i++) { require(ownerOfPack[packIds[i]] == to, "Address is not Owner of the Pack"); require(!packOpenedStatus[packIds[i]], "Pack already opened.!"); packOpenedStatus[packIds[i]] = true; } for (uint256 i; i < quantity; i++) { mintedArtWorks[to].push(tokenIds[i]); _mint(to, tokenIds[i]); } emit MintedArtWorks(to, tokenIds); } function mintPacksAndArtWorks( address to, uint256 noOfPacks, uint256[] calldata tokenIds) external onlyRole(MINTER_ROLE) { uint256 tokenQuantity = tokenIds.length; _currentSupply += tokenQuantity; minted[to] += tokenQuantity; _mintedPacksCount += noOfPacks; for (uint256 i; i < noOfPacks; i++) { _packId.increment(); uint256 newPackId = _packId.current(); ownerOfPack[newPackId] = to; packOpenedStatus[newPackId] = true; mintedPacks[to].push(newPackId); } for (uint256 i; i < tokenQuantity; i++) { mintedArtWorks[to].push(tokenIds[i]); _mint(to, tokenIds[i]); } emit MintPacksAndArtWorks(to, tokenIds); } function mintReservePacks( address to, uint256 quantity) external onlyRole(ADMIN_ROLE) returns (uint256[] memory) { require(_maxReserveSupply >= _mintedReserveCount + quantity, "Exceeding Max Reserve Supply"); uint256[] memory packIds = new uint256[](quantity); _mintedReserveCount += quantity; for (uint256 i; i < quantity; i++) { _packId.increment(); uint256 newPackId = _packId.current(); packIds[i] = newPackId; ownerOfPack[newPackId] = to; packOpenedStatus[newPackId] = false; mintedPacks[to].push(newPackId); } emit MintedReservePacks(to, packIds); return packIds; } function airdropArtWorks( address[] calldata recipients, uint256[] calldata tokenIds) external onlyRole(AIRDROP_ROLE) { uint256 quantity = tokenIds.length; require(recipients.length == quantity, "Invalid Arguments"); _currentSupply += quantity; for (uint256 i; i < quantity; i++) { uint256 tokenId = tokenIds[i]; address to = recipients[i]; minted[to] += 1; mintedArtWorks[to].push(tokenId); _mint(to, tokenId); } emit AridroppedArtWorks(recipients, tokenIds); } function getMintedArtWorks(address _account) public view returns (uint256[] memory) { return mintedArtWorks[_account]; } function getMintedPacks(address _account) public view returns (uint256[] memory) { return mintedPacks[_account]; } function getTotalMintedPacks() public view returns (uint256) { return _mintedPacksCount + _mintedReserveCount; } function setPackMaxSupply(uint256 newPackSupply) public onlyRole(ADMIN_ROLE) { _maxPackSupply = newPackSupply; } function setPackReserveSupply(uint256 newReserveSupply) public onlyRole(ADMIN_ROLE) { _maxReserveSupply = newReserveSupply; } function setSaleStatus(bool publicSaleStatus) public onlyRole(ADMIN_ROLE) { _isPublicSaleActive = publicSaleStatus; } function setPrice(string memory priceType, uint256 mintPrice) public onlyRole(ADMIN_ROLE) { price[priceType] = mintPrice; } function setBaseURI(string memory baseURI) public onlyRole(ADMIN_ROLE) { _baseTokenURI = baseURI; } function _baseURI() internal view override returns (string memory) { return _baseTokenURI; } function tokenURI(uint256 tokenId) public view override returns (string memory) { string memory tokenUri = string.concat(super.tokenURI(tokenId), ".json"); return tokenUri; } function assignRole(address account, uint256 roleId) public onlyRole(DEFAULT_ADMIN_ROLE) { if(roleId == 1){ _grantRole(ADMIN_ROLE, account); } else if(roleId == 2){ _grantRole(MINTER_ROLE, account); } else if(roleId == 3){ _grantRole(AIRDROP_ROLE, account); } } function withdraw() external onlyRole(DEFAULT_ADMIN_ROLE) { require(payable(msg.sender).send(address(this).balance)); } function recoverERC20( IERC20 tokenContract, address to ) external onlyRole(DEFAULT_ADMIN_ROLE) { tokenContract.transfer(to, tokenContract.balanceOf(address(this))); } // The following functions are overrides required by Solidity. function _beforeTokenTransfer( address from, address to, uint256 tokenId, uint256 batchSize ) internal override(ERC721) { super._beforeTokenTransfer(from, to, tokenId, batchSize); } function supportsInterface( bytes4 interfaceId ) public view override(ERC721, AccessControl) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"AridroppedArtWorks","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"packIds","type":"uint256[]"}],"name":"MintAndOpenedPack","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"MintPacksAndArtWorks","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"MintedArtWorks","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"packIds","type":"uint256[]"}],"name":"MintedReservePacks","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AIRDROP_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"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":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_currentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxPackSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxPerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxReserveSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mintedPacksCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mintedReserveCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"airdropArtWorks","outputs":[],"stateMutability":"nonpayable","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":"account","type":"address"},{"internalType":"uint256","name":"roleId","type":"uint256"}],"name":"assignRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getMintedArtWorks","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getMintedPacks","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalMintedPacks","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":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintAndOpenPack","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"packIds","type":"uint256[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"mintArtWorks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"noOfPacks","type":"uint256"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"mintPacksAndArtWorks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintReservePacks","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintedArtWorks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintedPacks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerOfPack","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"packOpenedStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"tokenContract","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"recoverERC20","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":"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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPackSupply","type":"uint256"}],"name":"setPackMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newReserveSupply","type":"uint256"}],"name":"setPackReserveSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"priceType","type":"string"},{"internalType":"uint256","name":"mintPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"publicSaleStatus","type":"bool"}],"name":"setSaleStatus","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600f81526020017f4172745061636b732056657373656c00000000000000000000000000000000008152506040518060400160405280600381526020017f415056000000000000000000000000000000000000000000000000000000000081525081600090816200008f919062000630565b508060019081620000a1919062000630565b505050620000b4620000ba60201b60201c565b62000789565b6005600c819055506096600d81905550606e600e819055506001600f60006101000a81548160ff0219169083151502179055506701aa535d3d0c00006010604051620001069062000772565b9081526020016040518091039020819055506200014a7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775336200025160201b60201c565b6200017c7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6336200025160201b60201c565b620001ae7f3a2f235c9daaf33349d300aadff2f15078a89df81bcfdd45ba11c8f816bddc6f336200025160201b60201c565b620001c36000801b336200025160201b60201c565b620002097fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775739385eb301b34700e7e497c70d7937d8ddca688b06200025160201b60201c565b6200024f7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6739385eb301b34700e7e497c70d7937d8ddca688b06200025160201b60201c565b565b6200026382826200034360201b60201c565b6200033f5760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002e4620003ae60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200043857607f821691505b6020821081036200044e576200044d620003f0565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004b87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000479565b620004c4868362000479565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005116200050b6200050584620004dc565b620004e6565b620004dc565b9050919050565b6000819050919050565b6200052d83620004f0565b620005456200053c8262000518565b84845462000486565b825550505050565b600090565b6200055c6200054d565b6200056981848462000522565b505050565b5b8181101562000591576200058560008262000552565b6001810190506200056f565b5050565b601f821115620005e057620005aa8162000454565b620005b58462000469565b81016020851015620005c5578190505b620005dd620005d48562000469565b8301826200056e565b50505b505050565b600082821c905092915050565b60006200060560001984600802620005e5565b1980831691505092915050565b6000620006208383620005f2565b9150826002028217905092915050565b6200063b82620003b6565b67ffffffffffffffff811115620006575762000656620003c1565b5b6200066382546200041f565b6200067082828562000595565b600060209050601f831160018114620006a8576000841562000693578287015190505b6200069f858262000612565b8655506200070f565b601f198416620006b88662000454565b60005b82811015620006e257848901518255600182019150602085019450602081019050620006bb565b86831015620007025784890151620006fe601f891682620005f2565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b7f7075626c69630000000000000000000000000000000000000000000000000000600082015250565b60006200075a60068362000717565b9150620007678262000722565b600682019050919050565b60006200077f826200074b565b9150819050919050565b615dab80620007996000396000f3fe6080604052600436106102ff5760003560e01c806374ade6d711610190578063c254e261116100dc578063d539139311610095578063e17dce341161006f578063e17dce3414610bdd578063e985e9c514610c08578063ecf92d3414610c45578063fe2c619814610c82576102ff565b8063d539139314610b60578063d547741f14610b8b578063d897833e14610bb4576102ff565b8063c254e26114610a4e578063c596bc6414610a79578063c87b56dd14610aa4578063ccde9e5b14610ae1578063cfc86f7b14610b0a578063d41b737514610b35576102ff565b806395d89b4111610149578063a4fefad611610123578063a4fefad614610980578063a8499e9d146109ab578063b88d4fde146109e8578063c0288a3714610a11576102ff565b806395d89b4114610901578063a217fddf1461092c578063a22cb46514610957576102ff565b806374ade6d7146107c657806375b238fc146108035780637c3d84a51461082e578063867838731461086b578063886f039a1461089b57806391d14854146108c4576102ff565b806336568abe1161024f57806345275f93116102085780635d10fe2b116101e25780635d10fe2b146106f85780636352211e1461072157806368b3af671461075e57806370a0823114610789576102ff565b806345275f931461067b57806355f804b3146106a65780635682a755146106cf576102ff565b806336568abe1461056f5780633a4ca9a7146105985780633ccfd60b146105d55780633f978d48146105ec57806342842e0e1461062957806342b7fc1d14610652576102ff565b80631e0fbfa2116102bc57806323b872dd1161029657806323b872dd146104b7578063248a9ca3146104e05780632e3036c71461051d5780632f2ff15d14610546576102ff565b80631e0fbfa2146104265780631e7269c51461045157806322e011921461048e576102ff565b806301f0d1771461030457806301ffc9a71461032f57806306fdde031461036c578063081812fc14610397578063095ea7b3146103d45780631234d519146103fd575b600080fd5b34801561031057600080fd5b50610319610cbf565b6040516103269190613e54565b60405180910390f35b34801561033b57600080fd5b5061035660048036038101906103519190613edb565b610cc5565b6040516103639190613f23565b60405180910390f35b34801561037857600080fd5b50610381610cd7565b60405161038e9190613fce565b60405180910390f35b3480156103a357600080fd5b506103be60048036038101906103b9919061401c565b610d69565b6040516103cb919061408a565b60405180910390f35b3480156103e057600080fd5b506103fb60048036038101906103f691906140d1565b610daf565b005b34801561040957600080fd5b50610424600480360381019061041f9190614176565b610ec6565b005b34801561043257600080fd5b5061043b6111b5565b6040516104489190614203565b60405180910390f35b34801561045d57600080fd5b506104786004803603810190610473919061421e565b6111d9565b6040516104859190613e54565b60405180910390f35b34801561049a57600080fd5b506104b560048036038101906104b0919061437b565b6111f1565b005b3480156104c357600080fd5b506104de60048036038101906104d991906143d7565b611243565b005b3480156104ec57600080fd5b5061050760048036038101906105029190614456565b6112a3565b6040516105149190614203565b60405180910390f35b34801561052957600080fd5b50610544600480360381019061053f91906140d1565b6112c3565b005b34801561055257600080fd5b5061056d60048036038101906105689190614483565b611378565b005b34801561057b57600080fd5b5061059660048036038101906105919190614483565b611399565b005b3480156105a457600080fd5b506105bf60048036038101906105ba919061401c565b61141c565b6040516105cc9190613f23565b60405180910390f35b3480156105e157600080fd5b506105ea61143c565b005b3480156105f857600080fd5b50610613600480360381019061060e91906140d1565b61148a565b6040516106209190613e54565b60405180910390f35b34801561063557600080fd5b50610650600480360381019061064b91906143d7565b6114bb565b005b34801561065e57600080fd5b50610679600480360381019061067491906144c3565b6114db565b005b34801561068757600080fd5b50610690611831565b60405161069d9190613e54565b60405180910390f35b3480156106b257600080fd5b506106cd60048036038101906106c89190614558565b611848565b005b3480156106db57600080fd5b506106f660048036038101906106f1919061401c565b611886565b005b34801561070457600080fd5b5061071f600480360381019061071a919061401c565b6118bb565b005b34801561072d57600080fd5b506107486004803603810190610743919061401c565b6118f0565b604051610755919061408a565b60405180910390f35b34801561076a57600080fd5b50610773611976565b6040516107809190613e54565b60405180910390f35b34801561079557600080fd5b506107b060048036038101906107ab919061421e565b61197c565b6040516107bd9190613e54565b60405180910390f35b3480156107d257600080fd5b506107ed60048036038101906107e8919061421e565b611a33565b6040516107fa919061465f565b60405180910390f35b34801561080f57600080fd5b50610818611aca565b6040516108259190614203565b60405180910390f35b34801561083a57600080fd5b50610855600480360381019061085091906140d1565b611aee565b6040516108629190613e54565b60405180910390f35b6108856004803603810190610880919061401c565b611b1f565b604051610892919061465f565b60405180910390f35b3480156108a757600080fd5b506108c260048036038101906108bd91906146bf565b611e69565b005b3480156108d057600080fd5b506108eb60048036038101906108e69190614483565b611f73565b6040516108f89190613f23565b60405180910390f35b34801561090d57600080fd5b50610916611fde565b6040516109239190613fce565b60405180910390f35b34801561093857600080fd5b50610941612070565b60405161094e9190614203565b60405180910390f35b34801561096357600080fd5b5061097e6004803603810190610979919061472b565b612077565b005b34801561098c57600080fd5b5061099561208d565b6040516109a29190613e54565b60405180910390f35b3480156109b757600080fd5b506109d260048036038101906109cd919061421e565b612093565b6040516109df919061465f565b60405180910390f35b3480156109f457600080fd5b50610a0f6004803603810190610a0a919061480c565b61212a565b005b348015610a1d57600080fd5b50610a386004803603810190610a33919061401c565b61218c565b604051610a45919061408a565b60405180910390f35b348015610a5a57600080fd5b50610a636121bf565b604051610a709190613e54565b60405180910390f35b348015610a8557600080fd5b50610a8e6121c5565b604051610a9b9190613e54565b60405180910390f35b348015610ab057600080fd5b50610acb6004803603810190610ac6919061401c565b6121cb565b604051610ad89190613fce565b60405180910390f35b348015610aed57600080fd5b50610b086004803603810190610b0391906148e5565b612202565b005b348015610b1657600080fd5b50610b1f61241d565b604051610b2c9190613fce565b60405180910390f35b348015610b4157600080fd5b50610b4a6124ab565b604051610b579190613f23565b60405180910390f35b348015610b6c57600080fd5b50610b756124be565b604051610b829190614203565b60405180910390f35b348015610b9757600080fd5b50610bb26004803603810190610bad9190614483565b6124e2565b005b348015610bc057600080fd5b50610bdb6004803603810190610bd69190614966565b612503565b005b348015610be957600080fd5b50610bf261254b565b604051610bff9190613e54565b60405180910390f35b348015610c1457600080fd5b50610c2f6004803603810190610c2a9190614993565b612551565b604051610c3c9190613f23565b60405180910390f35b348015610c5157600080fd5b50610c6c6004803603810190610c6791906140d1565b6125e5565b604051610c79919061465f565b60405180910390f35b348015610c8e57600080fd5b50610ca96004803603810190610ca49190614558565b61285e565b604051610cb69190613e54565b60405180910390f35b600e5481565b6000610cd08261288c565b9050919050565b606060008054610ce690614a02565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1290614a02565b8015610d5f5780601f10610d3457610100808354040283529160200191610d5f565b820191906000526020600020905b815481529060010190602001808311610d4257829003601f168201915b5050505050905090565b6000610d7482612906565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610dba826118f0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2190614aa5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e49612951565b73ffffffffffffffffffffffffffffffffffffffff161480610e785750610e7781610e72612951565b612551565b5b610eb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eae90614b37565b60405180910390fd5b610ec18383612959565b505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610ef081612a12565b60008383905090508060096000828254610f0a9190614b86565b9250508190555080601160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f609190614b86565b9250508190555084600a6000828254610f799190614b86565b9250508190555060005b8581101561109b57610f956007612a26565b6000610fa16007612a3c565b9050876012600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060016013600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081908060018154018082558091505060019003906000526020600020016000909190919091505550808061109390614bba565b915050610f83565b5060005b8181101561115c57601560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208585838181106110f9576110f8614c02565b5b9050602002013590806001815401808255809150506001900390600052602060002001600090919091909150556111498786868481811061113d5761113c614c02565b5b90506020020135612a4a565b808061115490614bba565b91505061109f565b508573ffffffffffffffffffffffffffffffffffffffff167f73bd478488c9cf6eb0c72af547bc5f4cd0804f4ea5468961d88ba35936cebcc185856040516111a5929190614c9b565b60405180910390a2505050505050565b7f3a2f235c9daaf33349d300aadff2f15078a89df81bcfdd45ba11c8f816bddc6f81565b60116020528060005260406000206000915090505481565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561121b81612a12565b8160108460405161122c9190614cfb565b908152602001604051809103902081905550505050565b61125461124e612951565b82612c67565b611293576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128a90614d84565b60405180910390fd5b61129e838383612cfc565b505050565b600060066000838152602001908152602001600020600101549050919050565b6000801b6112d081612a12565b60018203611307576113027fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177584612ff5565b611373565b6002820361133e576113397f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a684612ff5565b611372565b60038203611371576113707f3a2f235c9daaf33349d300aadff2f15078a89df81bcfdd45ba11c8f816bddc6f84612ff5565b5b5b5b505050565b611381826112a3565b61138a81612a12565b6113948383612ff5565b505050565b6113a1612951565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461140e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140590614e16565b60405180910390fd5b61141882826130d6565b5050565b60136020528060005260406000206000915054906101000a900460ff1681565b6000801b61144981612a12565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061148757600080fd5b50565b601560205281600052604060002081815481106114a657600080fd5b90600052602060002001600091509150505481565b6114d68383836040518060200160405280600081525061212a565b505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661150581612a12565b6000838390509050806009600082825461151f9190614b86565b9250508190555080601160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115759190614b86565b9250508190555060005b86869050811015611716578773ffffffffffffffffffffffffffffffffffffffff16601260008989858181106115b8576115b7614c02565b5b90506020020135815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163b90614e82565b60405180910390fd5b6013600088888481811061165b5761165a614c02565b5b90506020020135815260200190815260200160002060009054906101000a900460ff16156116be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b590614eee565b60405180910390fd5b6001601360008989858181106116d7576116d6614c02565b5b90506020020135815260200190815260200160002060006101000a81548160ff021916908315150217905550808061170e90614bba565b91505061157f565b5060005b818110156117d757601560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085858381811061177457611773614c02565b5b9050602002013590806001815401808255809150506001900390600052602060002001600090919091909150556117c4888686848181106117b8576117b7614c02565b5b90506020020135612a4a565b80806117cf90614bba565b91505061171a565b508673ffffffffffffffffffffffffffffffffffffffff167fa3d49ae59ff4a027682c30f8d6d7a36d1f6429580990612d5f7aacb2a684edf68585604051611820929190614c9b565b60405180910390a250505050505050565b6000600b54600a546118439190614b86565b905090565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561187281612a12565b816008908161188191906150ba565b505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756118b081612a12565b81600e819055505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756118e581612a12565b81600d819055505050565b6000806118fc836131b8565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361196d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611964906151d8565b60405180910390fd5b80915050919050565b600a5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e39061526a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611abe57602002820191906000526020600020905b815481526020019060010190808311611aaa575b50505050509050919050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b60146020528160005260406000208181548110611b0a57600080fd5b90600052602060002001600091509150505481565b6060600f60009054906101000a900460ff16611b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b67906152d6565b60405180910390fd5b81600c541015611bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bac90615342565b60405180910390fd5b81600a54611bc39190614b86565b600d541015611c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfe906153ae565b60405180910390fd5b816010604051611c169061541a565b908152602001604051809103902054611c2f919061542f565b3414611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c67906154e3565b60405180910390fd5b60008267ffffffffffffffff811115611c8c57611c8b614250565b5b604051908082528060200260200182016040528015611cba5781602001602082028036833780820191505090505b50905082600a6000828254611ccf9190614b86565b9250508190555060005b83811015611e1157611ceb6007612a26565b6000611cf76007612a3c565b905080838381518110611d0d57611d0c614c02565b5b602002602001018181525050336012600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006013600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915055508080611e0990614bba565b915050611cd9565b503373ffffffffffffffffffffffffffffffffffffffff167f0a312657e65f428f98de6abe374013a6e3f1c6005cb8e358d7e5af9f06bcda5382604051611e58919061465f565b60405180910390a280915050919050565b6000801b611e7681612a12565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb838573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611ecc919061408a565b602060405180830381865afa158015611ee9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0d9190615518565b6040518363ffffffff1660e01b8152600401611f2a929190615545565b6020604051808303816000875af1158015611f49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f6d9190615583565b50505050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060018054611fed90614a02565b80601f016020809104026020016040519081016040528092919081815260200182805461201990614a02565b80156120665780601f1061203b57610100808354040283529160200191612066565b820191906000526020600020905b81548152906001019060200180831161204957829003601f168201915b5050505050905090565b6000801b81565b612089612082612951565b83836131f5565b5050565b60095481565b6060601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561211e57602002820191906000526020600020905b81548152602001906001019080831161210a575b50505050509050919050565b61213b612135612951565b83612c67565b61217a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217190614d84565b60405180910390fd5b61218684848484613361565b50505050565b60126020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b600c5481565b606060006121d8836133bd565b6040516020016121e891906155d6565b604051602081830303815290604052905080915050919050565b7f3a2f235c9daaf33349d300aadff2f15078a89df81bcfdd45ba11c8f816bddc6f61222c81612a12565b6000838390509050808686905014612279576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227090615648565b60405180910390fd5b806009600082825461228b9190614b86565b9250508190555060005b818110156123c35760008585838181106122b2576122b1614c02565b5b90506020020135905060008888848181106122d0576122cf614c02565b5b90506020020160208101906122e5919061421e565b90506001601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123379190614b86565b92505081905550601560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208290806001815401808255809150506001900390600052602060002001600090919091909150556123ae8183612a4a565b505080806123bb90614bba565b915050612295565b5085856040516123d4929190615725565b60405180910390207f81b633cabc4dc1d79778f008fcb93c72d8e2c74bb2b8da0735ca9cef385703bc858560405161240d929190614c9b565b60405180910390a2505050505050565b6008805461242a90614a02565b80601f016020809104026020016040519081016040528092919081815260200182805461245690614a02565b80156124a35780601f10612478576101008083540402835291602001916124a3565b820191906000526020600020905b81548152906001019060200180831161248657829003601f168201915b505050505081565b600f60009054906101000a900460ff1681565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6124eb826112a3565b6124f481612a12565b6124fe83836130d6565b505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561252d81612a12565b81600f60006101000a81548160ff0219169083151502179055505050565b600d5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60607fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561261181612a12565b82600b5461261f9190614b86565b600e541015612663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265a9061578a565b60405180910390fd5b60008367ffffffffffffffff81111561267f5761267e614250565b5b6040519080825280602002602001820160405280156126ad5781602001602082028036833780820191505090505b50905083600b60008282546126c29190614b86565b9250508190555060005b84811015612804576126de6007612a26565b60006126ea6007612a3c565b905080838381518110612700576126ff614c02565b5b602002602001018181525050866012600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006013600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150555080806127fc90614bba565b9150506126cc565b508473ffffffffffffffffffffffffffffffffffffffff167ffd2f69110f6542e2663e4b976c68334029b412c4c8657adacc16c801fe5ff1128260405161284b919061465f565b60405180910390a2809250505092915050565b6010818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128ff57506128fe82613425565b5b9050919050565b61290f81613507565b61294e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612945906151d8565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129cc836118f0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612a2381612a1e612951565b613548565b50565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab0906157f6565b60405180910390fd5b612ac281613507565b15612b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af990615862565b60405180910390fd5b612b106000838360016135cd565b612b1981613507565b15612b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5090615862565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c636000838360016135df565b5050565b600080612c73836118f0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612cb55750612cb48185612551565b5b80612cf357508373ffffffffffffffffffffffffffffffffffffffff16612cdb84610d69565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612d1c826118f0565b73ffffffffffffffffffffffffffffffffffffffff1614612d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d69906158f4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd890615986565b60405180910390fd5b612dee83838360016135cd565b8273ffffffffffffffffffffffffffffffffffffffff16612e0e826118f0565b73ffffffffffffffffffffffffffffffffffffffff1614612e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5b906158f4565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ff083838360016135df565b505050565b612fff8282611f73565b6130d25760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550613077612951565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6130e08282611f73565b156131b45760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550613159612951565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325a906159f2565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516133549190613f23565b60405180910390a3505050565b61336c848484612cfc565b613378848484846135e5565b6133b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ae90615a84565b60405180910390fd5b50505050565b60606133c882612906565b60006133d261376c565b905060008151116133f2576040518060200160405280600081525061341d565b806133fc846137fe565b60405160200161340d929190615aa4565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806134f057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061350057506134ff826138cc565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16613529836131b8565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6135528282611f73565b6135c95761355f81613936565b61356d8360001c6020613963565b60405160200161357e929190615b60565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135c09190613fce565b60405180910390fd5b5050565b6135d984848484613b9f565b50505050565b50505050565b60006136068473ffffffffffffffffffffffffffffffffffffffff16613cc5565b1561375f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261362f612951565b8786866040518563ffffffff1660e01b81526004016136519493929190615bef565b6020604051808303816000875af192505050801561368d57506040513d601f19601f8201168201806040525081019061368a9190615c50565b60015b61370f573d80600081146136bd576040519150601f19603f3d011682016040523d82523d6000602084013e6136c2565b606091505b506000815103613707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136fe90615a84565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613764565b600190505b949350505050565b60606008805461377b90614a02565b80601f01602080910402602001604051908101604052809291908181526020018280546137a790614a02565b80156137f45780601f106137c9576101008083540402835291602001916137f4565b820191906000526020600020905b8154815290600101906020018083116137d757829003601f168201915b5050505050905090565b60606000600161380d84613ce8565b01905060008167ffffffffffffffff81111561382c5761382b614250565b5b6040519080825280601f01601f19166020018201604052801561385e5781602001600182028036833780820191505090505b509050600082602001820190505b6001156138c1578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816138b5576138b4615c7d565b5b0494506000850361386c575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b606061395c8273ffffffffffffffffffffffffffffffffffffffff16601460ff16613963565b9050919050565b606060006002836002613976919061542f565b6139809190614b86565b67ffffffffffffffff81111561399957613998614250565b5b6040519080825280601f01601f1916602001820160405280156139cb5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613a0357613a02614c02565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110613a6757613a66614c02565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002613aa7919061542f565b613ab19190614b86565b90505b6001811115613b51577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110613af357613af2614c02565b5b1a60f81b828281518110613b0a57613b09614c02565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080613b4a90615cac565b9050613ab4565b5060008414613b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b8c90615d21565b60405180910390fd5b8091505092915050565b6001811115613cbf57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614613c335780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c2b9190615d41565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613cbe5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613cb69190614b86565b925050819055505b5b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613d46577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381613d3c57613d3b615c7d565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613d83576d04ee2d6d415b85acef81000000008381613d7957613d78615c7d565b5b0492506020810190505b662386f26fc100008310613db257662386f26fc100008381613da857613da7615c7d565b5b0492506010810190505b6305f5e1008310613ddb576305f5e1008381613dd157613dd0615c7d565b5b0492506008810190505b6127108310613e00576127108381613df657613df5615c7d565b5b0492506004810190505b60648310613e235760648381613e1957613e18615c7d565b5b0492506002810190505b600a8310613e32576001810190505b80915050919050565b6000819050919050565b613e4e81613e3b565b82525050565b6000602082019050613e696000830184613e45565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613eb881613e83565b8114613ec357600080fd5b50565b600081359050613ed581613eaf565b92915050565b600060208284031215613ef157613ef0613e79565b5b6000613eff84828501613ec6565b91505092915050565b60008115159050919050565b613f1d81613f08565b82525050565b6000602082019050613f386000830184613f14565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f78578082015181840152602081019050613f5d565b60008484015250505050565b6000601f19601f8301169050919050565b6000613fa082613f3e565b613faa8185613f49565b9350613fba818560208601613f5a565b613fc381613f84565b840191505092915050565b60006020820190508181036000830152613fe88184613f95565b905092915050565b613ff981613e3b565b811461400457600080fd5b50565b60008135905061401681613ff0565b92915050565b60006020828403121561403257614031613e79565b5b600061404084828501614007565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061407482614049565b9050919050565b61408481614069565b82525050565b600060208201905061409f600083018461407b565b92915050565b6140ae81614069565b81146140b957600080fd5b50565b6000813590506140cb816140a5565b92915050565b600080604083850312156140e8576140e7613e79565b5b60006140f6858286016140bc565b925050602061410785828601614007565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f84011261413657614135614111565b5b8235905067ffffffffffffffff81111561415357614152614116565b5b60208301915083602082028301111561416f5761416e61411b565b5b9250929050565b600080600080606085870312156141905761418f613e79565b5b600061419e878288016140bc565b94505060206141af87828801614007565b935050604085013567ffffffffffffffff8111156141d0576141cf613e7e565b5b6141dc87828801614120565b925092505092959194509250565b6000819050919050565b6141fd816141ea565b82525050565b600060208201905061421860008301846141f4565b92915050565b60006020828403121561423457614233613e79565b5b6000614242848285016140bc565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61428882613f84565b810181811067ffffffffffffffff821117156142a7576142a6614250565b5b80604052505050565b60006142ba613e6f565b90506142c6828261427f565b919050565b600067ffffffffffffffff8211156142e6576142e5614250565b5b6142ef82613f84565b9050602081019050919050565b82818337600083830152505050565b600061431e614319846142cb565b6142b0565b90508281526020810184848401111561433a5761433961424b565b5b6143458482856142fc565b509392505050565b600082601f83011261436257614361614111565b5b813561437284826020860161430b565b91505092915050565b6000806040838503121561439257614391613e79565b5b600083013567ffffffffffffffff8111156143b0576143af613e7e565b5b6143bc8582860161434d565b92505060206143cd85828601614007565b9150509250929050565b6000806000606084860312156143f0576143ef613e79565b5b60006143fe868287016140bc565b935050602061440f868287016140bc565b925050604061442086828701614007565b9150509250925092565b614433816141ea565b811461443e57600080fd5b50565b6000813590506144508161442a565b92915050565b60006020828403121561446c5761446b613e79565b5b600061447a84828501614441565b91505092915050565b6000806040838503121561449a57614499613e79565b5b60006144a885828601614441565b92505060206144b9858286016140bc565b9150509250929050565b6000806000806000606086880312156144df576144de613e79565b5b60006144ed888289016140bc565b955050602086013567ffffffffffffffff81111561450e5761450d613e7e565b5b61451a88828901614120565b9450945050604086013567ffffffffffffffff81111561453d5761453c613e7e565b5b61454988828901614120565b92509250509295509295909350565b60006020828403121561456e5761456d613e79565b5b600082013567ffffffffffffffff81111561458c5761458b613e7e565b5b6145988482850161434d565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6145d681613e3b565b82525050565b60006145e883836145cd565b60208301905092915050565b6000602082019050919050565b600061460c826145a1565b61461681856145ac565b9350614621836145bd565b8060005b8381101561465257815161463988826145dc565b9750614644836145f4565b925050600181019050614625565b5085935050505092915050565b600060208201905081810360008301526146798184614601565b905092915050565b600061468c82614069565b9050919050565b61469c81614681565b81146146a757600080fd5b50565b6000813590506146b981614693565b92915050565b600080604083850312156146d6576146d5613e79565b5b60006146e4858286016146aa565b92505060206146f5858286016140bc565b9150509250929050565b61470881613f08565b811461471357600080fd5b50565b600081359050614725816146ff565b92915050565b6000806040838503121561474257614741613e79565b5b6000614750858286016140bc565b925050602061476185828601614716565b9150509250929050565b600067ffffffffffffffff82111561478657614785614250565b5b61478f82613f84565b9050602081019050919050565b60006147af6147aa8461476b565b6142b0565b9050828152602081018484840111156147cb576147ca61424b565b5b6147d68482856142fc565b509392505050565b600082601f8301126147f3576147f2614111565b5b813561480384826020860161479c565b91505092915050565b6000806000806080858703121561482657614825613e79565b5b6000614834878288016140bc565b9450506020614845878288016140bc565b935050604061485687828801614007565b925050606085013567ffffffffffffffff81111561487757614876613e7e565b5b614883878288016147de565b91505092959194509250565b60008083601f8401126148a5576148a4614111565b5b8235905067ffffffffffffffff8111156148c2576148c1614116565b5b6020830191508360208202830111156148de576148dd61411b565b5b9250929050565b600080600080604085870312156148ff576148fe613e79565b5b600085013567ffffffffffffffff81111561491d5761491c613e7e565b5b6149298782880161488f565b9450945050602085013567ffffffffffffffff81111561494c5761494b613e7e565b5b61495887828801614120565b925092505092959194509250565b60006020828403121561497c5761497b613e79565b5b600061498a84828501614716565b91505092915050565b600080604083850312156149aa576149a9613e79565b5b60006149b8858286016140bc565b92505060206149c9858286016140bc565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614a1a57607f821691505b602082108103614a2d57614a2c6149d3565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614a8f602183613f49565b9150614a9a82614a33565b604082019050919050565b60006020820190508181036000830152614abe81614a82565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000614b21603d83613f49565b9150614b2c82614ac5565b604082019050919050565b60006020820190508181036000830152614b5081614b14565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614b9182613e3b565b9150614b9c83613e3b565b9250828201905080821115614bb457614bb3614b57565b5b92915050565b6000614bc582613e3b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614bf757614bf6614b57565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b82818337505050565b6000614c4b83856145ac565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115614c7e57614c7d614c31565b5b602083029250614c8f838584614c36565b82840190509392505050565b60006020820190508181036000830152614cb6818486614c3f565b90509392505050565b600081905092915050565b6000614cd582613f3e565b614cdf8185614cbf565b9350614cef818560208601613f5a565b80840191505092915050565b6000614d078284614cca565b915081905092915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000614d6e602d83613f49565b9150614d7982614d12565b604082019050919050565b60006020820190508181036000830152614d9d81614d61565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000614e00602f83613f49565b9150614e0b82614da4565b604082019050919050565b60006020820190508181036000830152614e2f81614df3565b9050919050565b7f41646472657373206973206e6f74204f776e6572206f6620746865205061636b600082015250565b6000614e6c602083613f49565b9150614e7782614e36565b602082019050919050565b60006020820190508181036000830152614e9b81614e5f565b9050919050565b7f5061636b20616c7265616479206f70656e65642e210000000000000000000000600082015250565b6000614ed8601583613f49565b9150614ee382614ea2565b602082019050919050565b60006020820190508181036000830152614f0781614ecb565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614f707fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614f33565b614f7a8683614f33565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614fb7614fb2614fad84613e3b565b614f92565b613e3b565b9050919050565b6000819050919050565b614fd183614f9c565b614fe5614fdd82614fbe565b848454614f40565b825550505050565b600090565b614ffa614fed565b615005818484614fc8565b505050565b5b818110156150295761501e600082614ff2565b60018101905061500b565b5050565b601f82111561506e5761503f81614f0e565b61504884614f23565b81016020851015615057578190505b61506b61506385614f23565b83018261500a565b50505b505050565b600082821c905092915050565b600061509160001984600802615073565b1980831691505092915050565b60006150aa8383615080565b9150826002028217905092915050565b6150c382613f3e565b67ffffffffffffffff8111156150dc576150db614250565b5b6150e68254614a02565b6150f182828561502d565b600060209050601f8311600181146151245760008415615112578287015190505b61511c858261509e565b865550615184565b601f19841661513286614f0e565b60005b8281101561515a57848901518255600182019150602085019450602081019050615135565b868310156151775784890151615173601f891682615080565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006151c2601883613f49565b91506151cd8261518c565b602082019050919050565b600060208201905081810360008301526151f1816151b5565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000615254602983613f49565b915061525f826151f8565b604082019050919050565b6000602082019050818103600083015261528381615247565b9050919050565b7f53616c65204e6f74204163746976650000000000000000000000000000000000600082015250565b60006152c0600f83613f49565b91506152cb8261528a565b602082019050919050565b600060208201905081810360008301526152ef816152b3565b9050919050565b7f457863656564696e67204d617820506572204d696e7400000000000000000000600082015250565b600061532c601683613f49565b9150615337826152f6565b602082019050919050565b6000602082019050818103600083015261535b8161531f565b9050919050565b7f457863656564696e67204d6178205061636b20537570706c7900000000000000600082015250565b6000615398601983613f49565b91506153a382615362565b602082019050919050565b600060208201905081810360008301526153c78161538b565b9050919050565b7f7075626c69630000000000000000000000000000000000000000000000000000600082015250565b6000615404600683614cbf565b915061540f826153ce565b600682019050919050565b6000615425826153f7565b9150819050919050565b600061543a82613e3b565b915061544583613e3b565b925082820261545381613e3b565b9150828204841483151761546a57615469614b57565b5b5092915050565b7f5075626c69632053616c65202d20496e636f7272656374204554482076616c7560008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006154cd602183613f49565b91506154d882615471565b604082019050919050565b600060208201905081810360008301526154fc816154c0565b9050919050565b60008151905061551281613ff0565b92915050565b60006020828403121561552e5761552d613e79565b5b600061553c84828501615503565b91505092915050565b600060408201905061555a600083018561407b565b6155676020830184613e45565b9392505050565b60008151905061557d816146ff565b92915050565b60006020828403121561559957615598613e79565b5b60006155a78482850161556e565b91505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815250565b60006155e28284614cca565b91506155ed826155b0565b60058201915081905092915050565b7f496e76616c696420417267756d656e7473000000000000000000000000000000600082015250565b6000615632601183613f49565b915061563d826155fc565b602082019050919050565b6000602082019050818103600083015261566181615625565b9050919050565b600081905092915050565b6000819050919050565b61568681614069565b82525050565b6000615698838361567d565b60208301905092915050565b60006156b360208401846140bc565b905092915050565b6000602082019050919050565b60006156d48385615668565b93506156df82615673565b8060005b85811015615718576156f582846156a4565b6156ff888261568c565b975061570a836156bb565b9250506001810190506156e3565b5085925050509392505050565b60006157328284866156c8565b91508190509392505050565b7f457863656564696e67204d6178205265736572766520537570706c7900000000600082015250565b6000615774601c83613f49565b915061577f8261573e565b602082019050919050565b600060208201905081810360008301526157a381615767565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006157e0602083613f49565b91506157eb826157aa565b602082019050919050565b6000602082019050818103600083015261580f816157d3565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061584c601c83613f49565b915061585782615816565b602082019050919050565b6000602082019050818103600083015261587b8161583f565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006158de602583613f49565b91506158e982615882565b604082019050919050565b6000602082019050818103600083015261590d816158d1565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615970602483613f49565b915061597b82615914565b604082019050919050565b6000602082019050818103600083015261599f81615963565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006159dc601983613f49565b91506159e7826159a6565b602082019050919050565b60006020820190508181036000830152615a0b816159cf565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615a6e603283613f49565b9150615a7982615a12565b604082019050919050565b60006020820190508181036000830152615a9d81615a61565b9050919050565b6000615ab08285614cca565b9150615abc8284614cca565b91508190509392505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000615afe601783614cbf565b9150615b0982615ac8565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000615b4a601183614cbf565b9150615b5582615b14565b601182019050919050565b6000615b6b82615af1565b9150615b778285614cca565b9150615b8282615b3d565b9150615b8e8284614cca565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000615bc182615b9a565b615bcb8185615ba5565b9350615bdb818560208601613f5a565b615be481613f84565b840191505092915050565b6000608082019050615c04600083018761407b565b615c11602083018661407b565b615c1e6040830185613e45565b8181036060830152615c308184615bb6565b905095945050505050565b600081519050615c4a81613eaf565b92915050565b600060208284031215615c6657615c65613e79565b5b6000615c7484828501615c3b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615cb782613e3b565b915060008203615cca57615cc9614b57565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000615d0b602083613f49565b9150615d1682615cd5565b602082019050919050565b60006020820190508181036000830152615d3a81615cfe565b9050919050565b6000615d4c82613e3b565b9150615d5783613e3b565b9250828203905081811115615d6f57615d6e614b57565b5b9291505056fea264697066735822122092cba29ca86427aade7566c5ead3047970fd273afde1d67f630f8fbc67badb5564736f6c63430008110033
Deployed Bytecode
0x6080604052600436106102ff5760003560e01c806374ade6d711610190578063c254e261116100dc578063d539139311610095578063e17dce341161006f578063e17dce3414610bdd578063e985e9c514610c08578063ecf92d3414610c45578063fe2c619814610c82576102ff565b8063d539139314610b60578063d547741f14610b8b578063d897833e14610bb4576102ff565b8063c254e26114610a4e578063c596bc6414610a79578063c87b56dd14610aa4578063ccde9e5b14610ae1578063cfc86f7b14610b0a578063d41b737514610b35576102ff565b806395d89b4111610149578063a4fefad611610123578063a4fefad614610980578063a8499e9d146109ab578063b88d4fde146109e8578063c0288a3714610a11576102ff565b806395d89b4114610901578063a217fddf1461092c578063a22cb46514610957576102ff565b806374ade6d7146107c657806375b238fc146108035780637c3d84a51461082e578063867838731461086b578063886f039a1461089b57806391d14854146108c4576102ff565b806336568abe1161024f57806345275f93116102085780635d10fe2b116101e25780635d10fe2b146106f85780636352211e1461072157806368b3af671461075e57806370a0823114610789576102ff565b806345275f931461067b57806355f804b3146106a65780635682a755146106cf576102ff565b806336568abe1461056f5780633a4ca9a7146105985780633ccfd60b146105d55780633f978d48146105ec57806342842e0e1461062957806342b7fc1d14610652576102ff565b80631e0fbfa2116102bc57806323b872dd1161029657806323b872dd146104b7578063248a9ca3146104e05780632e3036c71461051d5780632f2ff15d14610546576102ff565b80631e0fbfa2146104265780631e7269c51461045157806322e011921461048e576102ff565b806301f0d1771461030457806301ffc9a71461032f57806306fdde031461036c578063081812fc14610397578063095ea7b3146103d45780631234d519146103fd575b600080fd5b34801561031057600080fd5b50610319610cbf565b6040516103269190613e54565b60405180910390f35b34801561033b57600080fd5b5061035660048036038101906103519190613edb565b610cc5565b6040516103639190613f23565b60405180910390f35b34801561037857600080fd5b50610381610cd7565b60405161038e9190613fce565b60405180910390f35b3480156103a357600080fd5b506103be60048036038101906103b9919061401c565b610d69565b6040516103cb919061408a565b60405180910390f35b3480156103e057600080fd5b506103fb60048036038101906103f691906140d1565b610daf565b005b34801561040957600080fd5b50610424600480360381019061041f9190614176565b610ec6565b005b34801561043257600080fd5b5061043b6111b5565b6040516104489190614203565b60405180910390f35b34801561045d57600080fd5b506104786004803603810190610473919061421e565b6111d9565b6040516104859190613e54565b60405180910390f35b34801561049a57600080fd5b506104b560048036038101906104b0919061437b565b6111f1565b005b3480156104c357600080fd5b506104de60048036038101906104d991906143d7565b611243565b005b3480156104ec57600080fd5b5061050760048036038101906105029190614456565b6112a3565b6040516105149190614203565b60405180910390f35b34801561052957600080fd5b50610544600480360381019061053f91906140d1565b6112c3565b005b34801561055257600080fd5b5061056d60048036038101906105689190614483565b611378565b005b34801561057b57600080fd5b5061059660048036038101906105919190614483565b611399565b005b3480156105a457600080fd5b506105bf60048036038101906105ba919061401c565b61141c565b6040516105cc9190613f23565b60405180910390f35b3480156105e157600080fd5b506105ea61143c565b005b3480156105f857600080fd5b50610613600480360381019061060e91906140d1565b61148a565b6040516106209190613e54565b60405180910390f35b34801561063557600080fd5b50610650600480360381019061064b91906143d7565b6114bb565b005b34801561065e57600080fd5b50610679600480360381019061067491906144c3565b6114db565b005b34801561068757600080fd5b50610690611831565b60405161069d9190613e54565b60405180910390f35b3480156106b257600080fd5b506106cd60048036038101906106c89190614558565b611848565b005b3480156106db57600080fd5b506106f660048036038101906106f1919061401c565b611886565b005b34801561070457600080fd5b5061071f600480360381019061071a919061401c565b6118bb565b005b34801561072d57600080fd5b506107486004803603810190610743919061401c565b6118f0565b604051610755919061408a565b60405180910390f35b34801561076a57600080fd5b50610773611976565b6040516107809190613e54565b60405180910390f35b34801561079557600080fd5b506107b060048036038101906107ab919061421e565b61197c565b6040516107bd9190613e54565b60405180910390f35b3480156107d257600080fd5b506107ed60048036038101906107e8919061421e565b611a33565b6040516107fa919061465f565b60405180910390f35b34801561080f57600080fd5b50610818611aca565b6040516108259190614203565b60405180910390f35b34801561083a57600080fd5b50610855600480360381019061085091906140d1565b611aee565b6040516108629190613e54565b60405180910390f35b6108856004803603810190610880919061401c565b611b1f565b604051610892919061465f565b60405180910390f35b3480156108a757600080fd5b506108c260048036038101906108bd91906146bf565b611e69565b005b3480156108d057600080fd5b506108eb60048036038101906108e69190614483565b611f73565b6040516108f89190613f23565b60405180910390f35b34801561090d57600080fd5b50610916611fde565b6040516109239190613fce565b60405180910390f35b34801561093857600080fd5b50610941612070565b60405161094e9190614203565b60405180910390f35b34801561096357600080fd5b5061097e6004803603810190610979919061472b565b612077565b005b34801561098c57600080fd5b5061099561208d565b6040516109a29190613e54565b60405180910390f35b3480156109b757600080fd5b506109d260048036038101906109cd919061421e565b612093565b6040516109df919061465f565b60405180910390f35b3480156109f457600080fd5b50610a0f6004803603810190610a0a919061480c565b61212a565b005b348015610a1d57600080fd5b50610a386004803603810190610a33919061401c565b61218c565b604051610a45919061408a565b60405180910390f35b348015610a5a57600080fd5b50610a636121bf565b604051610a709190613e54565b60405180910390f35b348015610a8557600080fd5b50610a8e6121c5565b604051610a9b9190613e54565b60405180910390f35b348015610ab057600080fd5b50610acb6004803603810190610ac6919061401c565b6121cb565b604051610ad89190613fce565b60405180910390f35b348015610aed57600080fd5b50610b086004803603810190610b0391906148e5565b612202565b005b348015610b1657600080fd5b50610b1f61241d565b604051610b2c9190613fce565b60405180910390f35b348015610b4157600080fd5b50610b4a6124ab565b604051610b579190613f23565b60405180910390f35b348015610b6c57600080fd5b50610b756124be565b604051610b829190614203565b60405180910390f35b348015610b9757600080fd5b50610bb26004803603810190610bad9190614483565b6124e2565b005b348015610bc057600080fd5b50610bdb6004803603810190610bd69190614966565b612503565b005b348015610be957600080fd5b50610bf261254b565b604051610bff9190613e54565b60405180910390f35b348015610c1457600080fd5b50610c2f6004803603810190610c2a9190614993565b612551565b604051610c3c9190613f23565b60405180910390f35b348015610c5157600080fd5b50610c6c6004803603810190610c6791906140d1565b6125e5565b604051610c79919061465f565b60405180910390f35b348015610c8e57600080fd5b50610ca96004803603810190610ca49190614558565b61285e565b604051610cb69190613e54565b60405180910390f35b600e5481565b6000610cd08261288c565b9050919050565b606060008054610ce690614a02565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1290614a02565b8015610d5f5780601f10610d3457610100808354040283529160200191610d5f565b820191906000526020600020905b815481529060010190602001808311610d4257829003601f168201915b5050505050905090565b6000610d7482612906565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610dba826118f0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2190614aa5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e49612951565b73ffffffffffffffffffffffffffffffffffffffff161480610e785750610e7781610e72612951565b612551565b5b610eb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eae90614b37565b60405180910390fd5b610ec18383612959565b505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610ef081612a12565b60008383905090508060096000828254610f0a9190614b86565b9250508190555080601160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f609190614b86565b9250508190555084600a6000828254610f799190614b86565b9250508190555060005b8581101561109b57610f956007612a26565b6000610fa16007612a3c565b9050876012600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060016013600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081908060018154018082558091505060019003906000526020600020016000909190919091505550808061109390614bba565b915050610f83565b5060005b8181101561115c57601560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208585838181106110f9576110f8614c02565b5b9050602002013590806001815401808255809150506001900390600052602060002001600090919091909150556111498786868481811061113d5761113c614c02565b5b90506020020135612a4a565b808061115490614bba565b91505061109f565b508573ffffffffffffffffffffffffffffffffffffffff167f73bd478488c9cf6eb0c72af547bc5f4cd0804f4ea5468961d88ba35936cebcc185856040516111a5929190614c9b565b60405180910390a2505050505050565b7f3a2f235c9daaf33349d300aadff2f15078a89df81bcfdd45ba11c8f816bddc6f81565b60116020528060005260406000206000915090505481565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561121b81612a12565b8160108460405161122c9190614cfb565b908152602001604051809103902081905550505050565b61125461124e612951565b82612c67565b611293576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128a90614d84565b60405180910390fd5b61129e838383612cfc565b505050565b600060066000838152602001908152602001600020600101549050919050565b6000801b6112d081612a12565b60018203611307576113027fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177584612ff5565b611373565b6002820361133e576113397f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a684612ff5565b611372565b60038203611371576113707f3a2f235c9daaf33349d300aadff2f15078a89df81bcfdd45ba11c8f816bddc6f84612ff5565b5b5b5b505050565b611381826112a3565b61138a81612a12565b6113948383612ff5565b505050565b6113a1612951565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461140e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140590614e16565b60405180910390fd5b61141882826130d6565b5050565b60136020528060005260406000206000915054906101000a900460ff1681565b6000801b61144981612a12565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061148757600080fd5b50565b601560205281600052604060002081815481106114a657600080fd5b90600052602060002001600091509150505481565b6114d68383836040518060200160405280600081525061212a565b505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661150581612a12565b6000838390509050806009600082825461151f9190614b86565b9250508190555080601160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115759190614b86565b9250508190555060005b86869050811015611716578773ffffffffffffffffffffffffffffffffffffffff16601260008989858181106115b8576115b7614c02565b5b90506020020135815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163b90614e82565b60405180910390fd5b6013600088888481811061165b5761165a614c02565b5b90506020020135815260200190815260200160002060009054906101000a900460ff16156116be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b590614eee565b60405180910390fd5b6001601360008989858181106116d7576116d6614c02565b5b90506020020135815260200190815260200160002060006101000a81548160ff021916908315150217905550808061170e90614bba565b91505061157f565b5060005b818110156117d757601560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085858381811061177457611773614c02565b5b9050602002013590806001815401808255809150506001900390600052602060002001600090919091909150556117c4888686848181106117b8576117b7614c02565b5b90506020020135612a4a565b80806117cf90614bba565b91505061171a565b508673ffffffffffffffffffffffffffffffffffffffff167fa3d49ae59ff4a027682c30f8d6d7a36d1f6429580990612d5f7aacb2a684edf68585604051611820929190614c9b565b60405180910390a250505050505050565b6000600b54600a546118439190614b86565b905090565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561187281612a12565b816008908161188191906150ba565b505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756118b081612a12565b81600e819055505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756118e581612a12565b81600d819055505050565b6000806118fc836131b8565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361196d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611964906151d8565b60405180910390fd5b80915050919050565b600a5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e39061526a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611abe57602002820191906000526020600020905b815481526020019060010190808311611aaa575b50505050509050919050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b60146020528160005260406000208181548110611b0a57600080fd5b90600052602060002001600091509150505481565b6060600f60009054906101000a900460ff16611b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b67906152d6565b60405180910390fd5b81600c541015611bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bac90615342565b60405180910390fd5b81600a54611bc39190614b86565b600d541015611c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfe906153ae565b60405180910390fd5b816010604051611c169061541a565b908152602001604051809103902054611c2f919061542f565b3414611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c67906154e3565b60405180910390fd5b60008267ffffffffffffffff811115611c8c57611c8b614250565b5b604051908082528060200260200182016040528015611cba5781602001602082028036833780820191505090505b50905082600a6000828254611ccf9190614b86565b9250508190555060005b83811015611e1157611ceb6007612a26565b6000611cf76007612a3c565b905080838381518110611d0d57611d0c614c02565b5b602002602001018181525050336012600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006013600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915055508080611e0990614bba565b915050611cd9565b503373ffffffffffffffffffffffffffffffffffffffff167f0a312657e65f428f98de6abe374013a6e3f1c6005cb8e358d7e5af9f06bcda5382604051611e58919061465f565b60405180910390a280915050919050565b6000801b611e7681612a12565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb838573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611ecc919061408a565b602060405180830381865afa158015611ee9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0d9190615518565b6040518363ffffffff1660e01b8152600401611f2a929190615545565b6020604051808303816000875af1158015611f49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f6d9190615583565b50505050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060018054611fed90614a02565b80601f016020809104026020016040519081016040528092919081815260200182805461201990614a02565b80156120665780601f1061203b57610100808354040283529160200191612066565b820191906000526020600020905b81548152906001019060200180831161204957829003601f168201915b5050505050905090565b6000801b81565b612089612082612951565b83836131f5565b5050565b60095481565b6060601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561211e57602002820191906000526020600020905b81548152602001906001019080831161210a575b50505050509050919050565b61213b612135612951565b83612c67565b61217a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217190614d84565b60405180910390fd5b61218684848484613361565b50505050565b60126020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b600c5481565b606060006121d8836133bd565b6040516020016121e891906155d6565b604051602081830303815290604052905080915050919050565b7f3a2f235c9daaf33349d300aadff2f15078a89df81bcfdd45ba11c8f816bddc6f61222c81612a12565b6000838390509050808686905014612279576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227090615648565b60405180910390fd5b806009600082825461228b9190614b86565b9250508190555060005b818110156123c35760008585838181106122b2576122b1614c02565b5b90506020020135905060008888848181106122d0576122cf614c02565b5b90506020020160208101906122e5919061421e565b90506001601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123379190614b86565b92505081905550601560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208290806001815401808255809150506001900390600052602060002001600090919091909150556123ae8183612a4a565b505080806123bb90614bba565b915050612295565b5085856040516123d4929190615725565b60405180910390207f81b633cabc4dc1d79778f008fcb93c72d8e2c74bb2b8da0735ca9cef385703bc858560405161240d929190614c9b565b60405180910390a2505050505050565b6008805461242a90614a02565b80601f016020809104026020016040519081016040528092919081815260200182805461245690614a02565b80156124a35780601f10612478576101008083540402835291602001916124a3565b820191906000526020600020905b81548152906001019060200180831161248657829003601f168201915b505050505081565b600f60009054906101000a900460ff1681565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6124eb826112a3565b6124f481612a12565b6124fe83836130d6565b505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561252d81612a12565b81600f60006101000a81548160ff0219169083151502179055505050565b600d5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60607fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561261181612a12565b82600b5461261f9190614b86565b600e541015612663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265a9061578a565b60405180910390fd5b60008367ffffffffffffffff81111561267f5761267e614250565b5b6040519080825280602002602001820160405280156126ad5781602001602082028036833780820191505090505b50905083600b60008282546126c29190614b86565b9250508190555060005b84811015612804576126de6007612a26565b60006126ea6007612a3c565b905080838381518110612700576126ff614c02565b5b602002602001018181525050866012600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006013600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150555080806127fc90614bba565b9150506126cc565b508473ffffffffffffffffffffffffffffffffffffffff167ffd2f69110f6542e2663e4b976c68334029b412c4c8657adacc16c801fe5ff1128260405161284b919061465f565b60405180910390a2809250505092915050565b6010818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128ff57506128fe82613425565b5b9050919050565b61290f81613507565b61294e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612945906151d8565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129cc836118f0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612a2381612a1e612951565b613548565b50565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab0906157f6565b60405180910390fd5b612ac281613507565b15612b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af990615862565b60405180910390fd5b612b106000838360016135cd565b612b1981613507565b15612b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5090615862565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c636000838360016135df565b5050565b600080612c73836118f0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612cb55750612cb48185612551565b5b80612cf357508373ffffffffffffffffffffffffffffffffffffffff16612cdb84610d69565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612d1c826118f0565b73ffffffffffffffffffffffffffffffffffffffff1614612d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d69906158f4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd890615986565b60405180910390fd5b612dee83838360016135cd565b8273ffffffffffffffffffffffffffffffffffffffff16612e0e826118f0565b73ffffffffffffffffffffffffffffffffffffffff1614612e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5b906158f4565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ff083838360016135df565b505050565b612fff8282611f73565b6130d25760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550613077612951565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6130e08282611f73565b156131b45760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550613159612951565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325a906159f2565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516133549190613f23565b60405180910390a3505050565b61336c848484612cfc565b613378848484846135e5565b6133b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ae90615a84565b60405180910390fd5b50505050565b60606133c882612906565b60006133d261376c565b905060008151116133f2576040518060200160405280600081525061341d565b806133fc846137fe565b60405160200161340d929190615aa4565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806134f057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061350057506134ff826138cc565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16613529836131b8565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6135528282611f73565b6135c95761355f81613936565b61356d8360001c6020613963565b60405160200161357e929190615b60565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135c09190613fce565b60405180910390fd5b5050565b6135d984848484613b9f565b50505050565b50505050565b60006136068473ffffffffffffffffffffffffffffffffffffffff16613cc5565b1561375f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261362f612951565b8786866040518563ffffffff1660e01b81526004016136519493929190615bef565b6020604051808303816000875af192505050801561368d57506040513d601f19601f8201168201806040525081019061368a9190615c50565b60015b61370f573d80600081146136bd576040519150601f19603f3d011682016040523d82523d6000602084013e6136c2565b606091505b506000815103613707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136fe90615a84565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613764565b600190505b949350505050565b60606008805461377b90614a02565b80601f01602080910402602001604051908101604052809291908181526020018280546137a790614a02565b80156137f45780601f106137c9576101008083540402835291602001916137f4565b820191906000526020600020905b8154815290600101906020018083116137d757829003601f168201915b5050505050905090565b60606000600161380d84613ce8565b01905060008167ffffffffffffffff81111561382c5761382b614250565b5b6040519080825280601f01601f19166020018201604052801561385e5781602001600182028036833780820191505090505b509050600082602001820190505b6001156138c1578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816138b5576138b4615c7d565b5b0494506000850361386c575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b606061395c8273ffffffffffffffffffffffffffffffffffffffff16601460ff16613963565b9050919050565b606060006002836002613976919061542f565b6139809190614b86565b67ffffffffffffffff81111561399957613998614250565b5b6040519080825280601f01601f1916602001820160405280156139cb5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613a0357613a02614c02565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110613a6757613a66614c02565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002613aa7919061542f565b613ab19190614b86565b90505b6001811115613b51577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110613af357613af2614c02565b5b1a60f81b828281518110613b0a57613b09614c02565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080613b4a90615cac565b9050613ab4565b5060008414613b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b8c90615d21565b60405180910390fd5b8091505092915050565b6001811115613cbf57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614613c335780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c2b9190615d41565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613cbe5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613cb69190614b86565b925050819055505b5b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613d46577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381613d3c57613d3b615c7d565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613d83576d04ee2d6d415b85acef81000000008381613d7957613d78615c7d565b5b0492506020810190505b662386f26fc100008310613db257662386f26fc100008381613da857613da7615c7d565b5b0492506010810190505b6305f5e1008310613ddb576305f5e1008381613dd157613dd0615c7d565b5b0492506008810190505b6127108310613e00576127108381613df657613df5615c7d565b5b0492506004810190505b60648310613e235760648381613e1957613e18615c7d565b5b0492506002810190505b600a8310613e32576001810190505b80915050919050565b6000819050919050565b613e4e81613e3b565b82525050565b6000602082019050613e696000830184613e45565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613eb881613e83565b8114613ec357600080fd5b50565b600081359050613ed581613eaf565b92915050565b600060208284031215613ef157613ef0613e79565b5b6000613eff84828501613ec6565b91505092915050565b60008115159050919050565b613f1d81613f08565b82525050565b6000602082019050613f386000830184613f14565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f78578082015181840152602081019050613f5d565b60008484015250505050565b6000601f19601f8301169050919050565b6000613fa082613f3e565b613faa8185613f49565b9350613fba818560208601613f5a565b613fc381613f84565b840191505092915050565b60006020820190508181036000830152613fe88184613f95565b905092915050565b613ff981613e3b565b811461400457600080fd5b50565b60008135905061401681613ff0565b92915050565b60006020828403121561403257614031613e79565b5b600061404084828501614007565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061407482614049565b9050919050565b61408481614069565b82525050565b600060208201905061409f600083018461407b565b92915050565b6140ae81614069565b81146140b957600080fd5b50565b6000813590506140cb816140a5565b92915050565b600080604083850312156140e8576140e7613e79565b5b60006140f6858286016140bc565b925050602061410785828601614007565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f84011261413657614135614111565b5b8235905067ffffffffffffffff81111561415357614152614116565b5b60208301915083602082028301111561416f5761416e61411b565b5b9250929050565b600080600080606085870312156141905761418f613e79565b5b600061419e878288016140bc565b94505060206141af87828801614007565b935050604085013567ffffffffffffffff8111156141d0576141cf613e7e565b5b6141dc87828801614120565b925092505092959194509250565b6000819050919050565b6141fd816141ea565b82525050565b600060208201905061421860008301846141f4565b92915050565b60006020828403121561423457614233613e79565b5b6000614242848285016140bc565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61428882613f84565b810181811067ffffffffffffffff821117156142a7576142a6614250565b5b80604052505050565b60006142ba613e6f565b90506142c6828261427f565b919050565b600067ffffffffffffffff8211156142e6576142e5614250565b5b6142ef82613f84565b9050602081019050919050565b82818337600083830152505050565b600061431e614319846142cb565b6142b0565b90508281526020810184848401111561433a5761433961424b565b5b6143458482856142fc565b509392505050565b600082601f83011261436257614361614111565b5b813561437284826020860161430b565b91505092915050565b6000806040838503121561439257614391613e79565b5b600083013567ffffffffffffffff8111156143b0576143af613e7e565b5b6143bc8582860161434d565b92505060206143cd85828601614007565b9150509250929050565b6000806000606084860312156143f0576143ef613e79565b5b60006143fe868287016140bc565b935050602061440f868287016140bc565b925050604061442086828701614007565b9150509250925092565b614433816141ea565b811461443e57600080fd5b50565b6000813590506144508161442a565b92915050565b60006020828403121561446c5761446b613e79565b5b600061447a84828501614441565b91505092915050565b6000806040838503121561449a57614499613e79565b5b60006144a885828601614441565b92505060206144b9858286016140bc565b9150509250929050565b6000806000806000606086880312156144df576144de613e79565b5b60006144ed888289016140bc565b955050602086013567ffffffffffffffff81111561450e5761450d613e7e565b5b61451a88828901614120565b9450945050604086013567ffffffffffffffff81111561453d5761453c613e7e565b5b61454988828901614120565b92509250509295509295909350565b60006020828403121561456e5761456d613e79565b5b600082013567ffffffffffffffff81111561458c5761458b613e7e565b5b6145988482850161434d565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6145d681613e3b565b82525050565b60006145e883836145cd565b60208301905092915050565b6000602082019050919050565b600061460c826145a1565b61461681856145ac565b9350614621836145bd565b8060005b8381101561465257815161463988826145dc565b9750614644836145f4565b925050600181019050614625565b5085935050505092915050565b600060208201905081810360008301526146798184614601565b905092915050565b600061468c82614069565b9050919050565b61469c81614681565b81146146a757600080fd5b50565b6000813590506146b981614693565b92915050565b600080604083850312156146d6576146d5613e79565b5b60006146e4858286016146aa565b92505060206146f5858286016140bc565b9150509250929050565b61470881613f08565b811461471357600080fd5b50565b600081359050614725816146ff565b92915050565b6000806040838503121561474257614741613e79565b5b6000614750858286016140bc565b925050602061476185828601614716565b9150509250929050565b600067ffffffffffffffff82111561478657614785614250565b5b61478f82613f84565b9050602081019050919050565b60006147af6147aa8461476b565b6142b0565b9050828152602081018484840111156147cb576147ca61424b565b5b6147d68482856142fc565b509392505050565b600082601f8301126147f3576147f2614111565b5b813561480384826020860161479c565b91505092915050565b6000806000806080858703121561482657614825613e79565b5b6000614834878288016140bc565b9450506020614845878288016140bc565b935050604061485687828801614007565b925050606085013567ffffffffffffffff81111561487757614876613e7e565b5b614883878288016147de565b91505092959194509250565b60008083601f8401126148a5576148a4614111565b5b8235905067ffffffffffffffff8111156148c2576148c1614116565b5b6020830191508360208202830111156148de576148dd61411b565b5b9250929050565b600080600080604085870312156148ff576148fe613e79565b5b600085013567ffffffffffffffff81111561491d5761491c613e7e565b5b6149298782880161488f565b9450945050602085013567ffffffffffffffff81111561494c5761494b613e7e565b5b61495887828801614120565b925092505092959194509250565b60006020828403121561497c5761497b613e79565b5b600061498a84828501614716565b91505092915050565b600080604083850312156149aa576149a9613e79565b5b60006149b8858286016140bc565b92505060206149c9858286016140bc565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614a1a57607f821691505b602082108103614a2d57614a2c6149d3565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614a8f602183613f49565b9150614a9a82614a33565b604082019050919050565b60006020820190508181036000830152614abe81614a82565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000614b21603d83613f49565b9150614b2c82614ac5565b604082019050919050565b60006020820190508181036000830152614b5081614b14565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614b9182613e3b565b9150614b9c83613e3b565b9250828201905080821115614bb457614bb3614b57565b5b92915050565b6000614bc582613e3b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614bf757614bf6614b57565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b82818337505050565b6000614c4b83856145ac565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115614c7e57614c7d614c31565b5b602083029250614c8f838584614c36565b82840190509392505050565b60006020820190508181036000830152614cb6818486614c3f565b90509392505050565b600081905092915050565b6000614cd582613f3e565b614cdf8185614cbf565b9350614cef818560208601613f5a565b80840191505092915050565b6000614d078284614cca565b915081905092915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000614d6e602d83613f49565b9150614d7982614d12565b604082019050919050565b60006020820190508181036000830152614d9d81614d61565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000614e00602f83613f49565b9150614e0b82614da4565b604082019050919050565b60006020820190508181036000830152614e2f81614df3565b9050919050565b7f41646472657373206973206e6f74204f776e6572206f6620746865205061636b600082015250565b6000614e6c602083613f49565b9150614e7782614e36565b602082019050919050565b60006020820190508181036000830152614e9b81614e5f565b9050919050565b7f5061636b20616c7265616479206f70656e65642e210000000000000000000000600082015250565b6000614ed8601583613f49565b9150614ee382614ea2565b602082019050919050565b60006020820190508181036000830152614f0781614ecb565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614f707fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614f33565b614f7a8683614f33565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614fb7614fb2614fad84613e3b565b614f92565b613e3b565b9050919050565b6000819050919050565b614fd183614f9c565b614fe5614fdd82614fbe565b848454614f40565b825550505050565b600090565b614ffa614fed565b615005818484614fc8565b505050565b5b818110156150295761501e600082614ff2565b60018101905061500b565b5050565b601f82111561506e5761503f81614f0e565b61504884614f23565b81016020851015615057578190505b61506b61506385614f23565b83018261500a565b50505b505050565b600082821c905092915050565b600061509160001984600802615073565b1980831691505092915050565b60006150aa8383615080565b9150826002028217905092915050565b6150c382613f3e565b67ffffffffffffffff8111156150dc576150db614250565b5b6150e68254614a02565b6150f182828561502d565b600060209050601f8311600181146151245760008415615112578287015190505b61511c858261509e565b865550615184565b601f19841661513286614f0e565b60005b8281101561515a57848901518255600182019150602085019450602081019050615135565b868310156151775784890151615173601f891682615080565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006151c2601883613f49565b91506151cd8261518c565b602082019050919050565b600060208201905081810360008301526151f1816151b5565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000615254602983613f49565b915061525f826151f8565b604082019050919050565b6000602082019050818103600083015261528381615247565b9050919050565b7f53616c65204e6f74204163746976650000000000000000000000000000000000600082015250565b60006152c0600f83613f49565b91506152cb8261528a565b602082019050919050565b600060208201905081810360008301526152ef816152b3565b9050919050565b7f457863656564696e67204d617820506572204d696e7400000000000000000000600082015250565b600061532c601683613f49565b9150615337826152f6565b602082019050919050565b6000602082019050818103600083015261535b8161531f565b9050919050565b7f457863656564696e67204d6178205061636b20537570706c7900000000000000600082015250565b6000615398601983613f49565b91506153a382615362565b602082019050919050565b600060208201905081810360008301526153c78161538b565b9050919050565b7f7075626c69630000000000000000000000000000000000000000000000000000600082015250565b6000615404600683614cbf565b915061540f826153ce565b600682019050919050565b6000615425826153f7565b9150819050919050565b600061543a82613e3b565b915061544583613e3b565b925082820261545381613e3b565b9150828204841483151761546a57615469614b57565b5b5092915050565b7f5075626c69632053616c65202d20496e636f7272656374204554482076616c7560008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006154cd602183613f49565b91506154d882615471565b604082019050919050565b600060208201905081810360008301526154fc816154c0565b9050919050565b60008151905061551281613ff0565b92915050565b60006020828403121561552e5761552d613e79565b5b600061553c84828501615503565b91505092915050565b600060408201905061555a600083018561407b565b6155676020830184613e45565b9392505050565b60008151905061557d816146ff565b92915050565b60006020828403121561559957615598613e79565b5b60006155a78482850161556e565b91505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815250565b60006155e28284614cca565b91506155ed826155b0565b60058201915081905092915050565b7f496e76616c696420417267756d656e7473000000000000000000000000000000600082015250565b6000615632601183613f49565b915061563d826155fc565b602082019050919050565b6000602082019050818103600083015261566181615625565b9050919050565b600081905092915050565b6000819050919050565b61568681614069565b82525050565b6000615698838361567d565b60208301905092915050565b60006156b360208401846140bc565b905092915050565b6000602082019050919050565b60006156d48385615668565b93506156df82615673565b8060005b85811015615718576156f582846156a4565b6156ff888261568c565b975061570a836156bb565b9250506001810190506156e3565b5085925050509392505050565b60006157328284866156c8565b91508190509392505050565b7f457863656564696e67204d6178205265736572766520537570706c7900000000600082015250565b6000615774601c83613f49565b915061577f8261573e565b602082019050919050565b600060208201905081810360008301526157a381615767565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006157e0602083613f49565b91506157eb826157aa565b602082019050919050565b6000602082019050818103600083015261580f816157d3565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061584c601c83613f49565b915061585782615816565b602082019050919050565b6000602082019050818103600083015261587b8161583f565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006158de602583613f49565b91506158e982615882565b604082019050919050565b6000602082019050818103600083015261590d816158d1565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615970602483613f49565b915061597b82615914565b604082019050919050565b6000602082019050818103600083015261599f81615963565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006159dc601983613f49565b91506159e7826159a6565b602082019050919050565b60006020820190508181036000830152615a0b816159cf565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615a6e603283613f49565b9150615a7982615a12565b604082019050919050565b60006020820190508181036000830152615a9d81615a61565b9050919050565b6000615ab08285614cca565b9150615abc8284614cca565b91508190509392505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000615afe601783614cbf565b9150615b0982615ac8565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000615b4a601183614cbf565b9150615b5582615b14565b601182019050919050565b6000615b6b82615af1565b9150615b778285614cca565b9150615b8282615b3d565b9150615b8e8284614cca565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000615bc182615b9a565b615bcb8185615ba5565b9350615bdb818560208601613f5a565b615be481613f84565b840191505092915050565b6000608082019050615c04600083018761407b565b615c11602083018661407b565b615c1e6040830185613e45565b8181036060830152615c308184615bb6565b905095945050505050565b600081519050615c4a81613eaf565b92915050565b600060208284031215615c6657615c65613e79565b5b6000615c7484828501615c3b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615cb782613e3b565b915060008203615cca57615cc9614b57565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000615d0b602083613f49565b9150615d1682615cd5565b602082019050919050565b60006020820190508181036000830152615d3a81615cfe565b9050919050565b6000615d4c82613e3b565b9150615d5783613e3b565b9250828203905081811115615d6f57615d6e614b57565b5b9291505056fea264697066735822122092cba29ca86427aade7566c5ead3047970fd273afde1d67f630f8fbc67badb5564736f6c63430008110033
Deployed Bytecode Sourcemap
68808:9214:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69271:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77794:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48186:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49698:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49216:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72832:842;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69527:64;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69662:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76106:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50398:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36088:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76755:364;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36529:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37673:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69763:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77127:133;;;;;;;;;;;;;:::i;:::-;;69873:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50804:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72051:773;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75451:158;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76274:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75774:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75617:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47896:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69120:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47627:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75109:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69353:60;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69818:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71064:979;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77268:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34561:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48355:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33666:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49941:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69084:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75283:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51060:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69710:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69159:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69202:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76509:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74466:635;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69049:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69310:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69440:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36969:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75944:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69235:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50167:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73682:776;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69616:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69271:32;;;;:::o;77794:225::-;77946:4;77975:36;77999:11;77975:23;:36::i;:::-;77968:43;;77794:225;;;:::o;48186:100::-;48240:13;48273:5;48266:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48186:100;:::o;49698:171::-;49774:7;49794:23;49809:7;49794:14;:23::i;:::-;49837:15;:24;49853:7;49837:24;;;;;;;;;;;;;;;;;;;;;49830:31;;49698:171;;;:::o;49216:416::-;49297:13;49313:23;49328:7;49313:14;:23::i;:::-;49297:39;;49361:5;49355:11;;:2;:11;;;49347:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;49455:5;49439:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;49464:37;49481:5;49488:12;:10;:12::i;:::-;49464:16;:37::i;:::-;49439:62;49417:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;49603:21;49612:2;49616:7;49603:8;:21::i;:::-;49286:346;49216:416;;:::o;72832:842::-;69478:24;34157:16;34168:4;34157:10;:16::i;:::-;73019:21:::1;73043:8;;:15;;73019:39;;73087:13;73069:14;;:31;;;;;;;:::i;:::-;;;;;;;;73125:13;73111:6;:10;73118:2;73111:10;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;73170:9;73149:17;;:30;;;;;;;:::i;:::-;;;;;;;;73197:9;73192:271;73212:9;73208:1;:13;73192:271;;;73243:19;:7;:17;:19::i;:::-;73277:17;73297;:7;:15;:17::i;:::-;73277:37;;73354:2;73329:11;:22;73341:9;73329:22;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;73401:4;73371:16;:27;73388:9;73371:27;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;73420:11;:15;73432:2;73420:15;;;;;;;;;;;;;;;73441:9;73420:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73228:235;73223:3;;;;;:::i;:::-;;;;73192:271;;;;73480:9;73475:140;73495:13;73491:1;:17;73475:140;;;73530:14;:18;73545:2;73530:18;;;;;;;;;;;;;;;73554:8;;73563:1;73554:11;;;;;;;:::i;:::-;;;;;;;;73530:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73581:22;73587:2;73591:8;;73600:1;73591:11;;;;;;;:::i;:::-;;;;;;;;73581:5;:22::i;:::-;73510:3;;;;;:::i;:::-;;;;73475:140;;;;73653:2;73632:34;;;73657:8;;73632:34;;;;;;;:::i;:::-;;;;;;;;73008:666;72832:842:::0;;;;;:::o;69527:64::-;69566:25;69527:64;:::o;69662:41::-;;;;;;;;;;;;;;;;;:::o;76106:160::-;69390:23;34157:16;34168:4;34157:10;:16::i;:::-;76249:9:::1;76230:5;76236:9;76230:16;;;;;;:::i;:::-;;;;;;;;;;;;;:28;;;;76106:160:::0;;;:::o;50398:335::-;50593:41;50612:12;:10;:12::i;:::-;50626:7;50593:18;:41::i;:::-;50585:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;50697:28;50707:4;50713:2;50717:7;50697:9;:28::i;:::-;50398:335;;;:::o;36088:131::-;36162:7;36189:6;:12;36196:4;36189:12;;;;;;;;;;;:22;;;36182:29;;36088:131;;;:::o;76755:364::-;33711:4;76824:18;;34157:16;34168:4;34157:10;:16::i;:::-;76873:1:::1;76863:6;:11:::0;76860:252:::1;;76890:31;69390:23;76913:7;76890:10;:31::i;:::-;76860:252;;;76961:1;76951:6;:11:::0;76948:164:::1;;76978:32;69478:24;77002:7;76978:10;:32::i;:::-;76948:164;;;77050:1;77040:6;:11:::0;77037:75:::1;;77067:33;69566:25;77092:7;77067:10;:33::i;:::-;77037:75;76948:164;76860:252;76755:364:::0;;;:::o;36529:147::-;36612:18;36625:4;36612:12;:18::i;:::-;34157:16;34168:4;34157:10;:16::i;:::-;36643:25:::1;36654:4;36660:7;36643:10;:25::i;:::-;36529:147:::0;;;:::o;37673:218::-;37780:12;:10;:12::i;:::-;37769:23;;:7;:23;;;37761:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;37857:26;37869:4;37875:7;37857:11;:26::i;:::-;37673:218;;:::o;69763:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;77127:133::-;33711:4;77165:18;;34157:16;34168:4;34157:10;:16::i;:::-;77212:10:::1;77204:24;;:47;77229:21;77204:47;;;;;;;;;;;;;;;;;;;;;;;77196:56;;;::::0;::::1;;77127:133:::0;:::o;69873:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50804:185::-;50942:39;50959:4;50965:2;50969:7;50942:39;;;;;;;;;;;;:16;:39::i;:::-;50804:185;;;:::o;72051:773::-;69478:24;34157:16;34168:4;34157:10;:16::i;:::-;72237::::1;72256:8;;:15;;72237:34;;72300:8;72282:14;;:26;;;;;;;:::i;:::-;;;;;;;;72333:8;72319:6;:10;72326:2;72319:10;;;;;;;;;;;;;;;;:22;;;;;;;:::i;:::-;;;;;;;;72359:9;72354:270;72374:7;;:14;;72370:1;:18;72354:270;;;72445:2;72418:29;;:11;:23;72430:7;;72438:1;72430:10;;;;;;;:::i;:::-;;;;;;;;72418:23;;;;;;;;;;;;;;;;;;;;;:29;;;72410:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;72508:16;:28;72525:7;;72533:1;72525:10;;;;;;;:::i;:::-;;;;;;;;72508:28;;;;;;;;;;;;;;;;;;;;;72507:29;72499:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;72608:4;72577:16;:28;72594:7;;72602:1;72594:10;;;;;;;:::i;:::-;;;;;;;;72577:28;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;72390:3;;;;;:::i;:::-;;;;72354:270;;;;72641:9;72636:135;72656:8;72652:1;:12;72636:135;;;72686:14;:18;72701:2;72686:18;;;;;;;;;;;;;;;72710:8;;72719:1;72710:11;;;;;;;:::i;:::-;;;;;;;;72686:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72737:22;72743:2;72747:8;;72756:1;72747:11;;;;;;;:::i;:::-;;;;;;;;72737:5;:22::i;:::-;72666:3;;;;;:::i;:::-;;;;72636:135;;;;72803:2;72788:28;;;72807:8;;72788:28;;;;;;;:::i;:::-;;;;;;;;72226:598;72051:773:::0;;;;;;:::o;75451:158::-;75530:7;75582:19;;75562:17;;:39;;;;:::i;:::-;75555:46;;75451:158;:::o;76274:113::-;69390:23;34157:16;34168:4;34157:10;:16::i;:::-;76372:7:::1;76356:13;:23;;;;;;:::i;:::-;;76274:113:::0;;:::o;75774:162::-;69390:23;34157:16;34168:4;34157:10;:16::i;:::-;75912::::1;75892:17;:36;;;;75774:162:::0;;:::o;75617:149::-;69390:23;34157:16;34168:4;34157:10;:16::i;:::-;75745:13:::1;75728:14;:30;;;;75617:149:::0;;:::o;47896:223::-;47968:7;47988:13;48004:17;48013:7;48004:8;:17::i;:::-;47988:33;;48057:1;48040:19;;:5;:19;;;48032:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;48106:5;48099:12;;;47896:223;;;:::o;69120:32::-;;;;:::o;47627:207::-;47699:7;47744:1;47727:19;;:5;:19;;;47719:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47810:9;:16;47820:5;47810:16;;;;;;;;;;;;;;;;47803:23;;47627:207;;;:::o;75109:166::-;75202:16;75243:14;:24;75258:8;75243:24;;;;;;;;;;;;;;;75236:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75109:166;;;:::o;69353:60::-;69390:23;69353:60;:::o;69818:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;71064:979::-;71173:16;71216:19;;;;;;;;;;;71208:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;71289:8;71274:11;;:23;;71266:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;71381:8;71361:17;;:28;;;;:::i;:::-;71343:14;;:46;;71335:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;71469:8;71451:5;:15;;;;;:::i;:::-;;;;;;;;;;;;;;:26;;;;:::i;:::-;71438:9;:39;71430:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;71528:24;71569:8;71555:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71528:50;;71610:8;71589:17;;:29;;;;;;;:::i;:::-;;;;;;;;71636:9;71631:324;71651:8;71647:1;:12;71631:324;;;71681:19;:7;:17;:19::i;:::-;71715:17;71735;:7;:15;:17::i;:::-;71715:37;;71780:9;71767:7;71775:1;71767:10;;;;;;;;:::i;:::-;;;;;;;:22;;;;;71829:10;71804:11;:22;71816:9;71804:22;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;71884:5;71854:16;:27;71871:9;71854:27;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;71904:11;:23;71916:10;71904:23;;;;;;;;;;;;;;;71933:9;71904:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71666:289;71661:3;;;;;:::i;:::-;;;;71631:324;;;;71990:10;71972:38;;;72002:7;71972:38;;;;;;:::i;:::-;;;;;;;;72028:7;72021:14;;;71064:979;;;:::o;77268:204::-;33711:4;77367:18;;34157:16;34168:4;34157:10;:16::i;:::-;77398:13:::1;:22;;;77421:2;77425:13;:23;;;77457:4;77425:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77398:66;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;77268:204:::0;;;:::o;34561:147::-;34647:4;34671:6;:12;34678:4;34671:12;;;;;;;;;;;:20;;:29;34692:7;34671:29;;;;;;;;;;;;;;;;;;;;;;;;;34664:36;;34561:147;;;;:::o;48355:104::-;48411:13;48444:7;48437:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48355:104;:::o;33666:49::-;33711:4;33666:49;;;:::o;49941:155::-;50036:52;50055:12;:10;:12::i;:::-;50069:8;50079;50036:18;:52::i;:::-;49941:155;;:::o;69084:29::-;;;;:::o;75283:160::-;75373:16;75414:11;:21;75426:8;75414:21;;;;;;;;;;;;;;;75407:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75283:160;;;:::o;51060:322::-;51234:41;51253:12;:10;:12::i;:::-;51267:7;51234:18;:41::i;:::-;51226:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;51336:38;51350:4;51356:2;51360:7;51369:4;51336:13;:38::i;:::-;51060:322;;;;:::o;69710:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;69159:34::-;;;;:::o;69202:26::-;;;;:::o;76509:238::-;76610:13;76641:22;76680:23;76695:7;76680:14;:23::i;:::-;76666:47;;;;;;;;:::i;:::-;;;;;;;;;;;;;76641:72;;76731:8;76724:15;;;76509:238;;;:::o;74466:635::-;69566:25;34157:16;34168:4;34157:10;:16::i;:::-;74638::::1;74657:8;;:15;;74638:34;;74712:8;74691:10;;:17;;:29;74683:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;74773:8;74755:14;;:26;;;;;;;:::i;:::-;;;;;;;;74799:9;74794:242;74814:8;74810:1;:12;74794:242;;;74844:15;74862:8;;74871:1;74862:11;;;;;;;:::i;:::-;;;;;;;;74844:29;;74888:10;74901;;74912:1;74901:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;74888:26;;74943:1;74929:6;:10;74936:2;74929:10;;;;;;;;;;;;;;;;:15;;;;;;;:::i;:::-;;;;;;;;74959:14;:18;74974:2;74959:18;;;;;;;;;;;;;;;74983:7;74959:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75006:18;75012:2;75016:7;75006:5;:18::i;:::-;74829:207;;74824:3;;;;;:::i;:::-;;;;74794:242;;;;75072:10;;75053:40;;;;;;;:::i;:::-;;;;;;;;;75084:8;;75053:40;;;;;;;:::i;:::-;;;;;;;;74627:474;74466:635:::0;;;;;:::o;69049:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;69310:34::-;;;;;;;;;;;;;:::o;69440:62::-;69478:24;69440:62;:::o;36969:149::-;37053:18;37066:4;37053:12;:18::i;:::-;34157:16;34168:4;34157:10;:16::i;:::-;37084:26:::1;37096:4;37102:7;37084:11;:26::i;:::-;36969:149:::0;;;:::o;75944:154::-;69390:23;34157:16;34168:4;34157:10;:16::i;:::-;76074::::1;76052:19;;:38;;;;;;;;;;;;;;;;;;75944:154:::0;;:::o;69235:29::-;;;;:::o;50167:164::-;50264:4;50288:18;:25;50307:5;50288:25;;;;;;;;;;;;;;;:35;50314:8;50288:35;;;;;;;;;;;;;;;;;;;;;;;;;50281:42;;50167:164;;;;:::o;73682:776::-;73825:16;69390:23;34157:16;34168:4;34157:10;:16::i;:::-;73912:8:::1;73890:19;;:30;;;;:::i;:::-;73869:17;;:51;;73861:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;73966:24;74007:8;73993:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73966:50;;74050:8;74027:19;;:31;;;;;;;:::i;:::-;;;;;;;;74076:9;74071:308;74091:8;74087:1;:12;74071:308;;;74121:19;:7;:17;:19::i;:::-;74155:17;74175;:7;:15;:17::i;:::-;74155:37;;74220:9;74207:7;74215:1;74207:10;;;;;;;;:::i;:::-;;;;;;;:22;;;::::0;::::1;74269:2;74244:11;:22;74256:9;74244:22;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;74316:5;74286:16;:27;74303:9;74286:27;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;74336:11;:15;74348:2;74336:15;;;;;;;;;;;;;;;74357:9;74336:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74106:273;74101:3;;;;;:::i;:::-;;;;74071:308;;;;74413:2;74394:31;;;74417:7;74394:31;;;;;;:::i;:::-;;;;;;;;74443:7;74436:14;;;73682:776:::0;;;;;:::o;69616:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34265:204::-;34350:4;34389:32;34374:47;;;:11;:47;;;;:87;;;;34425:36;34449:11;34425:23;:36::i;:::-;34374:87;34367:94;;34265:204;;;:::o;59517:135::-;59599:16;59607:7;59599;:16::i;:::-;59591:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;59517:135;:::o;18919:98::-;18972:7;18999:10;18992:17;;18919:98;:::o;58796:174::-;58898:2;58871:15;:24;58887:7;58871:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;58954:7;58950:2;58916:46;;58925:23;58940:7;58925:14;:23::i;:::-;58916:46;;;;;;;;;;;;58796:174;;:::o;35012:105::-;35079:30;35090:4;35096:12;:10;:12::i;:::-;35079:10;:30::i;:::-;35012:105;:::o;66971:127::-;67078:1;67060:7;:14;;;:19;;;;;;;;;;;66971:127;:::o;66849:114::-;66914:7;66941;:14;;;66934:21;;66849:114;;;:::o;55013:942::-;55107:1;55093:16;;:2;:16;;;55085:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;55166:16;55174:7;55166;:16::i;:::-;55165:17;55157:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;55228:48;55257:1;55261:2;55265:7;55274:1;55228:20;:48::i;:::-;55375:16;55383:7;55375;:16::i;:::-;55374:17;55366:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;55790:1;55773:9;:13;55783:2;55773:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;55834:2;55815:7;:16;55823:7;55815:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;55879:7;55875:2;55854:33;;55871:1;55854:33;;;;;;;;;;;;55900:47;55928:1;55932:2;55936:7;55945:1;55900:19;:47::i;:::-;55013:942;;:::o;53415:264::-;53508:4;53525:13;53541:23;53556:7;53541:14;:23::i;:::-;53525:39;;53594:5;53583:16;;:7;:16;;;:52;;;;53603:32;53620:5;53627:7;53603:16;:32::i;:::-;53583:52;:87;;;;53663:7;53639:31;;:20;53651:7;53639:11;:20::i;:::-;:31;;;53583:87;53575:96;;;53415:264;;;;:::o;57414:1263::-;57573:4;57546:31;;:23;57561:7;57546:14;:23::i;:::-;:31;;;57538:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;57652:1;57638:16;;:2;:16;;;57630:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;57708:42;57729:4;57735:2;57739:7;57748:1;57708:20;:42::i;:::-;57880:4;57853:31;;:23;57868:7;57853:14;:23::i;:::-;:31;;;57845:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;57998:15;:24;58014:7;57998:24;;;;;;;;;;;;57991:31;;;;;;;;;;;58493:1;58474:9;:15;58484:4;58474:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;58526:1;58509:9;:13;58519:2;58509:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;58568:2;58549:7;:16;58557:7;58549:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;58607:7;58603:2;58588:27;;58597:4;58588:27;;;;;;;;;;;;58628:41;58648:4;58654:2;58658:7;58667:1;58628:19;:41::i;:::-;57414:1263;;;:::o;39270:238::-;39354:22;39362:4;39368:7;39354;:22::i;:::-;39349:152;;39425:4;39393:6;:12;39400:4;39393:12;;;;;;;;;;;:20;;:29;39414:7;39393:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;39476:12;:10;:12::i;:::-;39449:40;;39467:7;39449:40;;39461:4;39449:40;;;;;;;;;;39349:152;39270:238;;:::o;39688:239::-;39772:22;39780:4;39786:7;39772;:22::i;:::-;39768:152;;;39843:5;39811:6;:12;39818:4;39811:12;;;;;;;;;;;:20;;:29;39832:7;39811:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;39895:12;:10;:12::i;:::-;39868:40;;39886:7;39868:40;;39880:4;39868:40;;;;;;;;;;39768:152;39688:239;;:::o;52690:117::-;52756:7;52783;:16;52791:7;52783:16;;;;;;;;;;;;;;;;;;;;;52776:23;;52690:117;;;:::o;59113:315::-;59268:8;59259:17;;:5;:17;;;59251:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;59355:8;59317:18;:25;59336:5;59317:25;;;;;;;;;;;;;;;:35;59343:8;59317:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;59401:8;59379:41;;59394:5;59379:41;;;59411:8;59379:41;;;;;;:::i;:::-;;;;;;;;59113:315;;;:::o;52263:313::-;52419:28;52429:4;52435:2;52439:7;52419:9;:28::i;:::-;52466:47;52489:4;52495:2;52499:7;52508:4;52466:22;:47::i;:::-;52458:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;52263:313;;;;:::o;48530:281::-;48603:13;48629:23;48644:7;48629:14;:23::i;:::-;48665:21;48689:10;:8;:10::i;:::-;48665:34;;48741:1;48723:7;48717:21;:25;:86;;;;;;;;;;;;;;;;;48769:7;48778:18;:7;:16;:18::i;:::-;48752:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48717:86;48710:93;;;48530:281;;;:::o;47258:305::-;47360:4;47412:25;47397:40;;;:11;:40;;;;:105;;;;47469:33;47454:48;;;:11;:48;;;;47397:105;:158;;;;47519:36;47543:11;47519:23;:36::i;:::-;47397:158;47377:178;;47258:305;;;:::o;53120:128::-;53185:4;53238:1;53209:31;;:17;53218:7;53209:8;:17::i;:::-;:31;;;;53202:38;;53120:128;;;:::o;35407:492::-;35496:22;35504:4;35510:7;35496;:22::i;:::-;35491:401;;35684:28;35704:7;35684:19;:28::i;:::-;35785:38;35813:4;35805:13;;35820:2;35785:19;:38::i;:::-;35589:257;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35535:345;;;;;;;;;;;:::i;:::-;;;;;;;;35491:401;35407:492;;:::o;77550:236::-;77722:56;77749:4;77755:2;77759:7;77768:9;77722:26;:56::i;:::-;77550:236;;;;:::o;62933:158::-;;;;;:::o;60216:853::-;60370:4;60391:15;:2;:13;;;:15::i;:::-;60387:675;;;60443:2;60427:36;;;60464:12;:10;:12::i;:::-;60478:4;60484:7;60493:4;60427:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;60423:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60685:1;60668:6;:13;:18;60664:328;;60711:60;;;;;;;;;;:::i;:::-;;;;;;;;60664:328;60942:6;60936:13;60927:6;60923:2;60919:15;60912:38;60423:584;60559:41;;;60549:51;;;:6;:51;;;;60542:58;;;;;60387:675;61046:4;61039:11;;60216:853;;;;;;;:::o;76395:106::-;76447:13;76480;76473:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76395:106;:::o;16346:716::-;16402:13;16453:14;16490:1;16470:17;16481:5;16470:10;:17::i;:::-;:21;16453:38;;16506:20;16540:6;16529:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16506:41;;16562:11;16691:6;16687:2;16683:15;16675:6;16671:28;16664:35;;16728:288;16735:4;16728:288;;;16760:5;;;;;;;;16902:8;16897:2;16890:5;16886:14;16881:30;16876:3;16868:44;16958:2;16949:11;;;;;;:::i;:::-;;;;;16992:1;16983:5;:10;16728:288;16979:21;16728:288;17037:6;17030:13;;;;;16346:716;;;:::o;31397:157::-;31482:4;31521:25;31506:40;;;:11;:40;;;;31499:47;;31397:157;;;:::o;18082:151::-;18140:13;18173:52;18201:4;18185:22;;16237:2;18173:52;;:11;:52::i;:::-;18166:59;;18082:151;;;:::o;17478:447::-;17553:13;17579:19;17624:1;17615:6;17611:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;17601:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17579:47;;17637:15;:6;17644:1;17637:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;17663;:6;17670:1;17663:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;17694:9;17719:1;17710:6;17706:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;17694:26;;17689:131;17726:1;17722;:5;17689:131;;;17761:8;17778:3;17770:5;:11;17761:21;;;;;;;:::i;:::-;;;;;17749:6;17756:1;17749:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;17807:1;17797:11;;;;;17729:3;;;;:::i;:::-;;;17689:131;;;;17847:1;17838:5;:10;17830:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;17910:6;17896:21;;;17478:447;;;;:::o;61801:410::-;61991:1;61979:9;:13;61975:229;;;62029:1;62013:18;;:4;:18;;;62009:87;;62071:9;62052;:15;62062:4;62052:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;62009:87;62128:1;62114:16;;:2;:16;;;62110:83;;62168:9;62151;:13;62161:2;62151:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;62110:83;61975:229;61801:410;;;;:::o;20366:326::-;20426:4;20683:1;20661:7;:19;;;:23;20654:30;;20366:326;;;:::o;13212:922::-;13265:7;13285:14;13302:1;13285:18;;13352:6;13343:5;:15;13339:102;;13388:6;13379:15;;;;;;:::i;:::-;;;;;13423:2;13413:12;;;;13339:102;13468:6;13459:5;:15;13455:102;;13504:6;13495:15;;;;;;:::i;:::-;;;;;13539:2;13529:12;;;;13455:102;13584:6;13575:5;:15;13571:102;;13620:6;13611:15;;;;;;:::i;:::-;;;;;13655:2;13645:12;;;;13571:102;13700:5;13691;:14;13687:99;;13735:5;13726:14;;;;;;:::i;:::-;;;;;13769:1;13759:11;;;;13687:99;13813:5;13804;:14;13800:99;;13848:5;13839:14;;;;;;:::i;:::-;;;;;13882:1;13872:11;;;;13800:99;13926:5;13917;:14;13913:99;;13961:5;13952:14;;;;;;:::i;:::-;;;;;13995:1;13985:11;;;;13913:99;14039:5;14030;:14;14026:66;;14075:1;14065:11;;;;14026:66;14120:6;14113:13;;;13212:922;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:149;805:7;845:66;838:5;834:78;823:89;;769:149;;;:::o;924:120::-;996:23;1013:5;996:23;:::i;:::-;989:5;986:34;976:62;;1034:1;1031;1024:12;976:62;924:120;:::o;1050:137::-;1095:5;1133:6;1120:20;1111:29;;1149:32;1175:5;1149:32;:::i;:::-;1050:137;;;;:::o;1193:327::-;1251:6;1300:2;1288:9;1279:7;1275:23;1271:32;1268:119;;;1306:79;;:::i;:::-;1268:119;1426:1;1451:52;1495:7;1486:6;1475:9;1471:22;1451:52;:::i;:::-;1441:62;;1397:116;1193:327;;;;:::o;1526:90::-;1560:7;1603:5;1596:13;1589:21;1578:32;;1526:90;;;:::o;1622:109::-;1703:21;1718:5;1703:21;:::i;:::-;1698:3;1691:34;1622:109;;:::o;1737:210::-;1824:4;1862:2;1851:9;1847:18;1839:26;;1875:65;1937:1;1926:9;1922:17;1913:6;1875:65;:::i;:::-;1737:210;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:246::-;2314:1;2324:113;2338:6;2335:1;2332:13;2324:113;;;2423:1;2418:3;2414:11;2408:18;2404:1;2399:3;2395:11;2388:39;2360:2;2357:1;2353:10;2348:15;;2324:113;;;2471:1;2462:6;2457:3;2453:16;2446:27;2295:184;2233:246;;;:::o;2485:102::-;2526:6;2577:2;2573:7;2568:2;2561:5;2557:14;2553:28;2543:38;;2485:102;;;:::o;2593:377::-;2681:3;2709:39;2742:5;2709:39;:::i;:::-;2764:71;2828:6;2823:3;2764:71;:::i;:::-;2757:78;;2844:65;2902:6;2897:3;2890:4;2883:5;2879:16;2844:65;:::i;:::-;2934:29;2956:6;2934:29;:::i;:::-;2929:3;2925:39;2918:46;;2685:285;2593:377;;;;:::o;2976:313::-;3089:4;3127:2;3116:9;3112:18;3104:26;;3176:9;3170:4;3166:20;3162:1;3151:9;3147:17;3140:47;3204:78;3277:4;3268:6;3204:78;:::i;:::-;3196:86;;2976:313;;;;:::o;3295:122::-;3368:24;3386:5;3368:24;:::i;:::-;3361:5;3358:35;3348:63;;3407:1;3404;3397:12;3348:63;3295:122;:::o;3423:139::-;3469:5;3507:6;3494:20;3485:29;;3523:33;3550:5;3523:33;:::i;:::-;3423:139;;;;:::o;3568:329::-;3627:6;3676:2;3664:9;3655:7;3651:23;3647:32;3644:119;;;3682:79;;:::i;:::-;3644:119;3802:1;3827:53;3872:7;3863:6;3852:9;3848:22;3827:53;:::i;:::-;3817:63;;3773:117;3568:329;;;;:::o;3903:126::-;3940:7;3980:42;3973:5;3969:54;3958:65;;3903:126;;;:::o;4035:96::-;4072:7;4101:24;4119:5;4101:24;:::i;:::-;4090:35;;4035:96;;;:::o;4137:118::-;4224:24;4242:5;4224:24;:::i;:::-;4219:3;4212:37;4137:118;;:::o;4261:222::-;4354:4;4392:2;4381:9;4377:18;4369:26;;4405:71;4473:1;4462:9;4458:17;4449:6;4405:71;:::i;:::-;4261:222;;;;:::o;4489:122::-;4562:24;4580:5;4562:24;:::i;:::-;4555:5;4552:35;4542:63;;4601:1;4598;4591:12;4542:63;4489:122;:::o;4617:139::-;4663:5;4701:6;4688:20;4679:29;;4717:33;4744:5;4717:33;:::i;:::-;4617:139;;;;:::o;4762:474::-;4830:6;4838;4887:2;4875:9;4866:7;4862:23;4858:32;4855:119;;;4893:79;;:::i;:::-;4855:119;5013:1;5038:53;5083:7;5074:6;5063:9;5059:22;5038:53;:::i;:::-;5028:63;;4984:117;5140:2;5166:53;5211:7;5202:6;5191:9;5187:22;5166:53;:::i;:::-;5156:63;;5111:118;4762:474;;;;;:::o;5242:117::-;5351:1;5348;5341:12;5365:117;5474:1;5471;5464:12;5488:117;5597:1;5594;5587:12;5628:568;5701:8;5711:6;5761:3;5754:4;5746:6;5742:17;5738:27;5728:122;;5769:79;;:::i;:::-;5728:122;5882:6;5869:20;5859:30;;5912:18;5904:6;5901:30;5898:117;;;5934:79;;:::i;:::-;5898:117;6048:4;6040:6;6036:17;6024:29;;6102:3;6094:4;6086:6;6082:17;6072:8;6068:32;6065:41;6062:128;;;6109:79;;:::i;:::-;6062:128;5628:568;;;;;:::o;6202:849::-;6306:6;6314;6322;6330;6379:2;6367:9;6358:7;6354:23;6350:32;6347:119;;;6385:79;;:::i;:::-;6347:119;6505:1;6530:53;6575:7;6566:6;6555:9;6551:22;6530:53;:::i;:::-;6520:63;;6476:117;6632:2;6658:53;6703:7;6694:6;6683:9;6679:22;6658:53;:::i;:::-;6648:63;;6603:118;6788:2;6777:9;6773:18;6760:32;6819:18;6811:6;6808:30;6805:117;;;6841:79;;:::i;:::-;6805:117;6954:80;7026:7;7017:6;7006:9;7002:22;6954:80;:::i;:::-;6936:98;;;;6731:313;6202:849;;;;;;;:::o;7057:77::-;7094:7;7123:5;7112:16;;7057:77;;;:::o;7140:118::-;7227:24;7245:5;7227:24;:::i;:::-;7222:3;7215:37;7140:118;;:::o;7264:222::-;7357:4;7395:2;7384:9;7380:18;7372:26;;7408:71;7476:1;7465:9;7461:17;7452:6;7408:71;:::i;:::-;7264:222;;;;:::o;7492:329::-;7551:6;7600:2;7588:9;7579:7;7575:23;7571:32;7568:119;;;7606:79;;:::i;:::-;7568:119;7726:1;7751:53;7796:7;7787:6;7776:9;7772:22;7751:53;:::i;:::-;7741:63;;7697:117;7492:329;;;;:::o;7827:117::-;7936:1;7933;7926:12;7950:180;7998:77;7995:1;7988:88;8095:4;8092:1;8085:15;8119:4;8116:1;8109:15;8136:281;8219:27;8241:4;8219:27;:::i;:::-;8211:6;8207:40;8349:6;8337:10;8334:22;8313:18;8301:10;8298:34;8295:62;8292:88;;;8360:18;;:::i;:::-;8292:88;8400:10;8396:2;8389:22;8179:238;8136:281;;:::o;8423:129::-;8457:6;8484:20;;:::i;:::-;8474:30;;8513:33;8541:4;8533:6;8513:33;:::i;:::-;8423:129;;;:::o;8558:308::-;8620:4;8710:18;8702:6;8699:30;8696:56;;;8732:18;;:::i;:::-;8696:56;8770:29;8792:6;8770:29;:::i;:::-;8762:37;;8854:4;8848;8844:15;8836:23;;8558:308;;;:::o;8872:146::-;8969:6;8964:3;8959;8946:30;9010:1;9001:6;8996:3;8992:16;8985:27;8872:146;;;:::o;9024:425::-;9102:5;9127:66;9143:49;9185:6;9143:49;:::i;:::-;9127:66;:::i;:::-;9118:75;;9216:6;9209:5;9202:21;9254:4;9247:5;9243:16;9292:3;9283:6;9278:3;9274:16;9271:25;9268:112;;;9299:79;;:::i;:::-;9268:112;9389:54;9436:6;9431:3;9426;9389:54;:::i;:::-;9108:341;9024:425;;;;;:::o;9469:340::-;9525:5;9574:3;9567:4;9559:6;9555:17;9551:27;9541:122;;9582:79;;:::i;:::-;9541:122;9699:6;9686:20;9724:79;9799:3;9791:6;9784:4;9776:6;9772:17;9724:79;:::i;:::-;9715:88;;9531:278;9469:340;;;;:::o;9815:654::-;9893:6;9901;9950:2;9938:9;9929:7;9925:23;9921:32;9918:119;;;9956:79;;:::i;:::-;9918:119;10104:1;10093:9;10089:17;10076:31;10134:18;10126:6;10123:30;10120:117;;;10156:79;;:::i;:::-;10120:117;10261:63;10316:7;10307:6;10296:9;10292:22;10261:63;:::i;:::-;10251:73;;10047:287;10373:2;10399:53;10444:7;10435:6;10424:9;10420:22;10399:53;:::i;:::-;10389:63;;10344:118;9815:654;;;;;:::o;10475:619::-;10552:6;10560;10568;10617:2;10605:9;10596:7;10592:23;10588:32;10585:119;;;10623:79;;:::i;:::-;10585:119;10743:1;10768:53;10813:7;10804:6;10793:9;10789:22;10768:53;:::i;:::-;10758:63;;10714:117;10870:2;10896:53;10941:7;10932:6;10921:9;10917:22;10896:53;:::i;:::-;10886:63;;10841:118;10998:2;11024:53;11069:7;11060:6;11049:9;11045:22;11024:53;:::i;:::-;11014:63;;10969:118;10475:619;;;;;:::o;11100:122::-;11173:24;11191:5;11173:24;:::i;:::-;11166:5;11163:35;11153:63;;11212:1;11209;11202:12;11153:63;11100:122;:::o;11228:139::-;11274:5;11312:6;11299:20;11290:29;;11328:33;11355:5;11328:33;:::i;:::-;11228:139;;;;:::o;11373:329::-;11432:6;11481:2;11469:9;11460:7;11456:23;11452:32;11449:119;;;11487:79;;:::i;:::-;11449:119;11607:1;11632:53;11677:7;11668:6;11657:9;11653:22;11632:53;:::i;:::-;11622:63;;11578:117;11373:329;;;;:::o;11708:474::-;11776:6;11784;11833:2;11821:9;11812:7;11808:23;11804:32;11801:119;;;11839:79;;:::i;:::-;11801:119;11959:1;11984:53;12029:7;12020:6;12009:9;12005:22;11984:53;:::i;:::-;11974:63;;11930:117;12086:2;12112:53;12157:7;12148:6;12137:9;12133:22;12112:53;:::i;:::-;12102:63;;12057:118;11708:474;;;;;:::o;12188:1079::-;12319:6;12327;12335;12343;12351;12400:2;12388:9;12379:7;12375:23;12371:32;12368:119;;;12406:79;;:::i;:::-;12368:119;12526:1;12551:53;12596:7;12587:6;12576:9;12572:22;12551:53;:::i;:::-;12541:63;;12497:117;12681:2;12670:9;12666:18;12653:32;12712:18;12704:6;12701:30;12698:117;;;12734:79;;:::i;:::-;12698:117;12847:80;12919:7;12910:6;12899:9;12895:22;12847:80;:::i;:::-;12829:98;;;;12624:313;13004:2;12993:9;12989:18;12976:32;13035:18;13027:6;13024:30;13021:117;;;13057:79;;:::i;:::-;13021:117;13170:80;13242:7;13233:6;13222:9;13218:22;13170:80;:::i;:::-;13152:98;;;;12947:313;12188:1079;;;;;;;;:::o;13273:509::-;13342:6;13391:2;13379:9;13370:7;13366:23;13362:32;13359:119;;;13397:79;;:::i;:::-;13359:119;13545:1;13534:9;13530:17;13517:31;13575:18;13567:6;13564:30;13561:117;;;13597:79;;:::i;:::-;13561:117;13702:63;13757:7;13748:6;13737:9;13733:22;13702:63;:::i;:::-;13692:73;;13488:287;13273:509;;;;:::o;13788:114::-;13855:6;13889:5;13883:12;13873:22;;13788:114;;;:::o;13908:184::-;14007:11;14041:6;14036:3;14029:19;14081:4;14076:3;14072:14;14057:29;;13908:184;;;;:::o;14098:132::-;14165:4;14188:3;14180:11;;14218:4;14213:3;14209:14;14201:22;;14098:132;;;:::o;14236:108::-;14313:24;14331:5;14313:24;:::i;:::-;14308:3;14301:37;14236:108;;:::o;14350:179::-;14419:10;14440:46;14482:3;14474:6;14440:46;:::i;:::-;14518:4;14513:3;14509:14;14495:28;;14350:179;;;;:::o;14535:113::-;14605:4;14637;14632:3;14628:14;14620:22;;14535:113;;;:::o;14684:732::-;14803:3;14832:54;14880:5;14832:54;:::i;:::-;14902:86;14981:6;14976:3;14902:86;:::i;:::-;14895:93;;15012:56;15062:5;15012:56;:::i;:::-;15091:7;15122:1;15107:284;15132:6;15129:1;15126:13;15107:284;;;15208:6;15202:13;15235:63;15294:3;15279:13;15235:63;:::i;:::-;15228:70;;15321:60;15374:6;15321:60;:::i;:::-;15311:70;;15167:224;15154:1;15151;15147:9;15142:14;;15107:284;;;15111:14;15407:3;15400:10;;14808:608;;;14684:732;;;;:::o;15422:373::-;15565:4;15603:2;15592:9;15588:18;15580:26;;15652:9;15646:4;15642:20;15638:1;15627:9;15623:17;15616:47;15680:108;15783:4;15774:6;15680:108;:::i;:::-;15672:116;;15422:373;;;;:::o;15801:111::-;15853:7;15882:24;15900:5;15882:24;:::i;:::-;15871:35;;15801:111;;;:::o;15918:152::-;16006:39;16039:5;16006:39;:::i;:::-;15999:5;15996:50;15986:78;;16060:1;16057;16050:12;15986:78;15918:152;:::o;16076:169::-;16137:5;16175:6;16162:20;16153:29;;16191:48;16233:5;16191:48;:::i;:::-;16076:169;;;;:::o;16251:504::-;16334:6;16342;16391:2;16379:9;16370:7;16366:23;16362:32;16359:119;;;16397:79;;:::i;:::-;16359:119;16517:1;16542:68;16602:7;16593:6;16582:9;16578:22;16542:68;:::i;:::-;16532:78;;16488:132;16659:2;16685:53;16730:7;16721:6;16710:9;16706:22;16685:53;:::i;:::-;16675:63;;16630:118;16251:504;;;;;:::o;16761:116::-;16831:21;16846:5;16831:21;:::i;:::-;16824:5;16821:32;16811:60;;16867:1;16864;16857:12;16811:60;16761:116;:::o;16883:133::-;16926:5;16964:6;16951:20;16942:29;;16980:30;17004:5;16980:30;:::i;:::-;16883:133;;;;:::o;17022:468::-;17087:6;17095;17144:2;17132:9;17123:7;17119:23;17115:32;17112:119;;;17150:79;;:::i;:::-;17112:119;17270:1;17295:53;17340:7;17331:6;17320:9;17316:22;17295:53;:::i;:::-;17285:63;;17241:117;17397:2;17423:50;17465:7;17456:6;17445:9;17441:22;17423:50;:::i;:::-;17413:60;;17368:115;17022:468;;;;;:::o;17496:307::-;17557:4;17647:18;17639:6;17636:30;17633:56;;;17669:18;;:::i;:::-;17633:56;17707:29;17729:6;17707:29;:::i;:::-;17699:37;;17791:4;17785;17781:15;17773:23;;17496:307;;;:::o;17809:423::-;17886:5;17911:65;17927:48;17968:6;17927:48;:::i;:::-;17911:65;:::i;:::-;17902:74;;17999:6;17992:5;17985:21;18037:4;18030:5;18026:16;18075:3;18066:6;18061:3;18057:16;18054:25;18051:112;;;18082:79;;:::i;:::-;18051:112;18172:54;18219:6;18214:3;18209;18172:54;:::i;:::-;17892:340;17809:423;;;;;:::o;18251:338::-;18306:5;18355:3;18348:4;18340:6;18336:17;18332:27;18322:122;;18363:79;;:::i;:::-;18322:122;18480:6;18467:20;18505:78;18579:3;18571:6;18564:4;18556:6;18552:17;18505:78;:::i;:::-;18496:87;;18312:277;18251:338;;;;:::o;18595:943::-;18690:6;18698;18706;18714;18763:3;18751:9;18742:7;18738:23;18734:33;18731:120;;;18770:79;;:::i;:::-;18731:120;18890:1;18915:53;18960:7;18951:6;18940:9;18936:22;18915:53;:::i;:::-;18905:63;;18861:117;19017:2;19043:53;19088:7;19079:6;19068:9;19064:22;19043:53;:::i;:::-;19033:63;;18988:118;19145:2;19171:53;19216:7;19207:6;19196:9;19192:22;19171:53;:::i;:::-;19161:63;;19116:118;19301:2;19290:9;19286:18;19273:32;19332:18;19324:6;19321:30;19318:117;;;19354:79;;:::i;:::-;19318:117;19459:62;19513:7;19504:6;19493:9;19489:22;19459:62;:::i;:::-;19449:72;;19244:287;18595:943;;;;;;;:::o;19561:568::-;19634:8;19644:6;19694:3;19687:4;19679:6;19675:17;19671:27;19661:122;;19702:79;;:::i;:::-;19661:122;19815:6;19802:20;19792:30;;19845:18;19837:6;19834:30;19831:117;;;19867:79;;:::i;:::-;19831:117;19981:4;19973:6;19969:17;19957:29;;20035:3;20027:4;20019:6;20015:17;20005:8;20001:32;19998:41;19995:128;;;20042:79;;:::i;:::-;19995:128;19561:568;;;;;:::o;20135:934::-;20257:6;20265;20273;20281;20330:2;20318:9;20309:7;20305:23;20301:32;20298:119;;;20336:79;;:::i;:::-;20298:119;20484:1;20473:9;20469:17;20456:31;20514:18;20506:6;20503:30;20500:117;;;20536:79;;:::i;:::-;20500:117;20649:80;20721:7;20712:6;20701:9;20697:22;20649:80;:::i;:::-;20631:98;;;;20427:312;20806:2;20795:9;20791:18;20778:32;20837:18;20829:6;20826:30;20823:117;;;20859:79;;:::i;:::-;20823:117;20972:80;21044:7;21035:6;21024:9;21020:22;20972:80;:::i;:::-;20954:98;;;;20749:313;20135:934;;;;;;;:::o;21075:323::-;21131:6;21180:2;21168:9;21159:7;21155:23;21151:32;21148:119;;;21186:79;;:::i;:::-;21148:119;21306:1;21331:50;21373:7;21364:6;21353:9;21349:22;21331:50;:::i;:::-;21321:60;;21277:114;21075:323;;;;:::o;21404:474::-;21472:6;21480;21529:2;21517:9;21508:7;21504:23;21500:32;21497:119;;;21535:79;;:::i;:::-;21497:119;21655:1;21680:53;21725:7;21716:6;21705:9;21701:22;21680:53;:::i;:::-;21670:63;;21626:117;21782:2;21808:53;21853:7;21844:6;21833:9;21829:22;21808:53;:::i;:::-;21798:63;;21753:118;21404:474;;;;;:::o;21884:180::-;21932:77;21929:1;21922:88;22029:4;22026:1;22019:15;22053:4;22050:1;22043:15;22070:320;22114:6;22151:1;22145:4;22141:12;22131:22;;22198:1;22192:4;22188:12;22219:18;22209:81;;22275:4;22267:6;22263:17;22253:27;;22209:81;22337:2;22329:6;22326:14;22306:18;22303:38;22300:84;;22356:18;;:::i;:::-;22300:84;22121:269;22070:320;;;:::o;22396:220::-;22536:34;22532:1;22524:6;22520:14;22513:58;22605:3;22600:2;22592:6;22588:15;22581:28;22396:220;:::o;22622:366::-;22764:3;22785:67;22849:2;22844:3;22785:67;:::i;:::-;22778:74;;22861:93;22950:3;22861:93;:::i;:::-;22979:2;22974:3;22970:12;22963:19;;22622:366;;;:::o;22994:419::-;23160:4;23198:2;23187:9;23183:18;23175:26;;23247:9;23241:4;23237:20;23233:1;23222:9;23218:17;23211:47;23275:131;23401:4;23275:131;:::i;:::-;23267:139;;22994:419;;;:::o;23419:248::-;23559:34;23555:1;23547:6;23543:14;23536:58;23628:31;23623:2;23615:6;23611:15;23604:56;23419:248;:::o;23673:366::-;23815:3;23836:67;23900:2;23895:3;23836:67;:::i;:::-;23829:74;;23912:93;24001:3;23912:93;:::i;:::-;24030:2;24025:3;24021:12;24014:19;;23673:366;;;:::o;24045:419::-;24211:4;24249:2;24238:9;24234:18;24226:26;;24298:9;24292:4;24288:20;24284:1;24273:9;24269:17;24262:47;24326:131;24452:4;24326:131;:::i;:::-;24318:139;;24045:419;;;:::o;24470:180::-;24518:77;24515:1;24508:88;24615:4;24612:1;24605:15;24639:4;24636:1;24629:15;24656:191;24696:3;24715:20;24733:1;24715:20;:::i;:::-;24710:25;;24749:20;24767:1;24749:20;:::i;:::-;24744:25;;24792:1;24789;24785:9;24778:16;;24813:3;24810:1;24807:10;24804:36;;;24820:18;;:::i;:::-;24804:36;24656:191;;;;:::o;24853:233::-;24892:3;24915:24;24933:5;24915:24;:::i;:::-;24906:33;;24961:66;24954:5;24951:77;24948:103;;25031:18;;:::i;:::-;24948:103;25078:1;25071:5;25067:13;25060:20;;24853:233;;;:::o;25092:180::-;25140:77;25137:1;25130:88;25237:4;25234:1;25227:15;25261:4;25258:1;25251:15;25278:117;25387:1;25384;25377:12;25401:98;25485:6;25480:3;25475;25462:30;25401:98;;;:::o;25535:537::-;25663:3;25684:86;25763:6;25758:3;25684:86;:::i;:::-;25677:93;;25794:66;25786:6;25783:78;25780:165;;;25864:79;;:::i;:::-;25780:165;25976:4;25968:6;25964:17;25954:27;;25991:43;26027:6;26022:3;26015:5;25991:43;:::i;:::-;26059:6;26054:3;26050:16;26043:23;;25535:537;;;;;:::o;26078:393::-;26231:4;26269:2;26258:9;26254:18;26246:26;;26318:9;26312:4;26308:20;26304:1;26293:9;26289:17;26282:47;26346:118;26459:4;26450:6;26442;26346:118;:::i;:::-;26338:126;;26078:393;;;;;:::o;26477:148::-;26579:11;26616:3;26601:18;;26477:148;;;;:::o;26631:390::-;26737:3;26765:39;26798:5;26765:39;:::i;:::-;26820:89;26902:6;26897:3;26820:89;:::i;:::-;26813:96;;26918:65;26976:6;26971:3;26964:4;26957:5;26953:16;26918:65;:::i;:::-;27008:6;27003:3;26999:16;26992:23;;26741:280;26631:390;;;;:::o;27027:275::-;27159:3;27181:95;27272:3;27263:6;27181:95;:::i;:::-;27174:102;;27293:3;27286:10;;27027:275;;;;:::o;27308:232::-;27448:34;27444:1;27436:6;27432:14;27425:58;27517:15;27512:2;27504:6;27500:15;27493:40;27308:232;:::o;27546:366::-;27688:3;27709:67;27773:2;27768:3;27709:67;:::i;:::-;27702:74;;27785:93;27874:3;27785:93;:::i;:::-;27903:2;27898:3;27894:12;27887:19;;27546:366;;;:::o;27918:419::-;28084:4;28122:2;28111:9;28107:18;28099:26;;28171:9;28165:4;28161:20;28157:1;28146:9;28142:17;28135:47;28199:131;28325:4;28199:131;:::i;:::-;28191:139;;27918:419;;;:::o;28343:234::-;28483:34;28479:1;28471:6;28467:14;28460:58;28552:17;28547:2;28539:6;28535:15;28528:42;28343:234;:::o;28583:366::-;28725:3;28746:67;28810:2;28805:3;28746:67;:::i;:::-;28739:74;;28822:93;28911:3;28822:93;:::i;:::-;28940:2;28935:3;28931:12;28924:19;;28583:366;;;:::o;28955:419::-;29121:4;29159:2;29148:9;29144:18;29136:26;;29208:9;29202:4;29198:20;29194:1;29183:9;29179:17;29172:47;29236:131;29362:4;29236:131;:::i;:::-;29228:139;;28955:419;;;:::o;29380:182::-;29520:34;29516:1;29508:6;29504:14;29497:58;29380:182;:::o;29568:366::-;29710:3;29731:67;29795:2;29790:3;29731:67;:::i;:::-;29724:74;;29807:93;29896:3;29807:93;:::i;:::-;29925:2;29920:3;29916:12;29909:19;;29568:366;;;:::o;29940:419::-;30106:4;30144:2;30133:9;30129:18;30121:26;;30193:9;30187:4;30183:20;30179:1;30168:9;30164:17;30157:47;30221:131;30347:4;30221:131;:::i;:::-;30213:139;;29940:419;;;:::o;30365:171::-;30505:23;30501:1;30493:6;30489:14;30482:47;30365:171;:::o;30542:366::-;30684:3;30705:67;30769:2;30764:3;30705:67;:::i;:::-;30698:74;;30781:93;30870:3;30781:93;:::i;:::-;30899:2;30894:3;30890:12;30883:19;;30542:366;;;:::o;30914:419::-;31080:4;31118:2;31107:9;31103:18;31095:26;;31167:9;31161:4;31157:20;31153:1;31142:9;31138:17;31131:47;31195:131;31321:4;31195:131;:::i;:::-;31187:139;;30914:419;;;:::o;31339:141::-;31388:4;31411:3;31403:11;;31434:3;31431:1;31424:14;31468:4;31465:1;31455:18;31447:26;;31339:141;;;:::o;31486:93::-;31523:6;31570:2;31565;31558:5;31554:14;31550:23;31540:33;;31486:93;;;:::o;31585:107::-;31629:8;31679:5;31673:4;31669:16;31648:37;;31585:107;;;;:::o;31698:393::-;31767:6;31817:1;31805:10;31801:18;31840:97;31870:66;31859:9;31840:97;:::i;:::-;31958:39;31988:8;31977:9;31958:39;:::i;:::-;31946:51;;32030:4;32026:9;32019:5;32015:21;32006:30;;32079:4;32069:8;32065:19;32058:5;32055:30;32045:40;;31774:317;;31698:393;;;;;:::o;32097:60::-;32125:3;32146:5;32139:12;;32097:60;;;:::o;32163:142::-;32213:9;32246:53;32264:34;32273:24;32291:5;32273:24;:::i;:::-;32264:34;:::i;:::-;32246:53;:::i;:::-;32233:66;;32163:142;;;:::o;32311:75::-;32354:3;32375:5;32368:12;;32311:75;;;:::o;32392:269::-;32502:39;32533:7;32502:39;:::i;:::-;32563:91;32612:41;32636:16;32612:41;:::i;:::-;32604:6;32597:4;32591:11;32563:91;:::i;:::-;32557:4;32550:105;32468:193;32392:269;;;:::o;32667:73::-;32712:3;32667:73;:::o;32746:189::-;32823:32;;:::i;:::-;32864:65;32922:6;32914;32908:4;32864:65;:::i;:::-;32799:136;32746:189;;:::o;32941:186::-;33001:120;33018:3;33011:5;33008:14;33001:120;;;33072:39;33109:1;33102:5;33072:39;:::i;:::-;33045:1;33038:5;33034:13;33025:22;;33001:120;;;32941:186;;:::o;33133:543::-;33234:2;33229:3;33226:11;33223:446;;;33268:38;33300:5;33268:38;:::i;:::-;33352:29;33370:10;33352:29;:::i;:::-;33342:8;33338:44;33535:2;33523:10;33520:18;33517:49;;;33556:8;33541:23;;33517:49;33579:80;33635:22;33653:3;33635:22;:::i;:::-;33625:8;33621:37;33608:11;33579:80;:::i;:::-;33238:431;;33223:446;33133:543;;;:::o;33682:117::-;33736:8;33786:5;33780:4;33776:16;33755:37;;33682:117;;;;:::o;33805:169::-;33849:6;33882:51;33930:1;33926:6;33918:5;33915:1;33911:13;33882:51;:::i;:::-;33878:56;33963:4;33957;33953:15;33943:25;;33856:118;33805:169;;;;:::o;33979:295::-;34055:4;34201:29;34226:3;34220:4;34201:29;:::i;:::-;34193:37;;34263:3;34260:1;34256:11;34250:4;34247:21;34239:29;;33979:295;;;;:::o;34279:1395::-;34396:37;34429:3;34396:37;:::i;:::-;34498:18;34490:6;34487:30;34484:56;;;34520:18;;:::i;:::-;34484:56;34564:38;34596:4;34590:11;34564:38;:::i;:::-;34649:67;34709:6;34701;34695:4;34649:67;:::i;:::-;34743:1;34767:4;34754:17;;34799:2;34791:6;34788:14;34816:1;34811:618;;;;35473:1;35490:6;35487:77;;;35539:9;35534:3;35530:19;35524:26;35515:35;;35487:77;35590:67;35650:6;35643:5;35590:67;:::i;:::-;35584:4;35577:81;35446:222;34781:887;;34811:618;34863:4;34859:9;34851:6;34847:22;34897:37;34929:4;34897:37;:::i;:::-;34956:1;34970:208;34984:7;34981:1;34978:14;34970:208;;;35063:9;35058:3;35054:19;35048:26;35040:6;35033:42;35114:1;35106:6;35102:14;35092:24;;35161:2;35150:9;35146:18;35133:31;;35007:4;35004:1;35000:12;34995:17;;34970:208;;;35206:6;35197:7;35194:19;35191:179;;;35264:9;35259:3;35255:19;35249:26;35307:48;35349:4;35341:6;35337:17;35326:9;35307:48;:::i;:::-;35299:6;35292:64;35214:156;35191:179;35416:1;35412;35404:6;35400:14;35396:22;35390:4;35383:36;34818:611;;;34781:887;;34371:1303;;;34279:1395;;:::o;35680:174::-;35820:26;35816:1;35808:6;35804:14;35797:50;35680:174;:::o;35860:366::-;36002:3;36023:67;36087:2;36082:3;36023:67;:::i;:::-;36016:74;;36099:93;36188:3;36099:93;:::i;:::-;36217:2;36212:3;36208:12;36201:19;;35860:366;;;:::o;36232:419::-;36398:4;36436:2;36425:9;36421:18;36413:26;;36485:9;36479:4;36475:20;36471:1;36460:9;36456:17;36449:47;36513:131;36639:4;36513:131;:::i;:::-;36505:139;;36232:419;;;:::o;36657:228::-;36797:34;36793:1;36785:6;36781:14;36774:58;36866:11;36861:2;36853:6;36849:15;36842:36;36657:228;:::o;36891:366::-;37033:3;37054:67;37118:2;37113:3;37054:67;:::i;:::-;37047:74;;37130:93;37219:3;37130:93;:::i;:::-;37248:2;37243:3;37239:12;37232:19;;36891:366;;;:::o;37263:419::-;37429:4;37467:2;37456:9;37452:18;37444:26;;37516:9;37510:4;37506:20;37502:1;37491:9;37487:17;37480:47;37544:131;37670:4;37544:131;:::i;:::-;37536:139;;37263:419;;;:::o;37688:165::-;37828:17;37824:1;37816:6;37812:14;37805:41;37688:165;:::o;37859:366::-;38001:3;38022:67;38086:2;38081:3;38022:67;:::i;:::-;38015:74;;38098:93;38187:3;38098:93;:::i;:::-;38216:2;38211:3;38207:12;38200:19;;37859:366;;;:::o;38231:419::-;38397:4;38435:2;38424:9;38420:18;38412:26;;38484:9;38478:4;38474:20;38470:1;38459:9;38455:17;38448:47;38512:131;38638:4;38512:131;:::i;:::-;38504:139;;38231:419;;;:::o;38656:172::-;38796:24;38792:1;38784:6;38780:14;38773:48;38656:172;:::o;38834:366::-;38976:3;38997:67;39061:2;39056:3;38997:67;:::i;:::-;38990:74;;39073:93;39162:3;39073:93;:::i;:::-;39191:2;39186:3;39182:12;39175:19;;38834:366;;;:::o;39206:419::-;39372:4;39410:2;39399:9;39395:18;39387:26;;39459:9;39453:4;39449:20;39445:1;39434:9;39430:17;39423:47;39487:131;39613:4;39487:131;:::i;:::-;39479:139;;39206:419;;;:::o;39631:175::-;39771:27;39767:1;39759:6;39755:14;39748:51;39631:175;:::o;39812:366::-;39954:3;39975:67;40039:2;40034:3;39975:67;:::i;:::-;39968:74;;40051:93;40140:3;40051:93;:::i;:::-;40169:2;40164:3;40160:12;40153:19;;39812:366;;;:::o;40184:419::-;40350:4;40388:2;40377:9;40373:18;40365:26;;40437:9;40431:4;40427:20;40423:1;40412:9;40408:17;40401:47;40465:131;40591:4;40465:131;:::i;:::-;40457:139;;40184:419;;;:::o;40609:156::-;40749:8;40745:1;40737:6;40733:14;40726:32;40609:156;:::o;40771:400::-;40931:3;40952:84;41034:1;41029:3;40952:84;:::i;:::-;40945:91;;41045:93;41134:3;41045:93;:::i;:::-;41163:1;41158:3;41154:11;41147:18;;40771:400;;;:::o;41177:381::-;41362:3;41384:148;41528:3;41384:148;:::i;:::-;41377:155;;41549:3;41542:10;;41177:381;;;:::o;41564:410::-;41604:7;41627:20;41645:1;41627:20;:::i;:::-;41622:25;;41661:20;41679:1;41661:20;:::i;:::-;41656:25;;41716:1;41713;41709:9;41738:30;41756:11;41738:30;:::i;:::-;41727:41;;41917:1;41908:7;41904:15;41901:1;41898:22;41878:1;41871:9;41851:83;41828:139;;41947:18;;:::i;:::-;41828:139;41612:362;41564:410;;;;:::o;41980:220::-;42120:34;42116:1;42108:6;42104:14;42097:58;42189:3;42184:2;42176:6;42172:15;42165:28;41980:220;:::o;42206:366::-;42348:3;42369:67;42433:2;42428:3;42369:67;:::i;:::-;42362:74;;42445:93;42534:3;42445:93;:::i;:::-;42563:2;42558:3;42554:12;42547:19;;42206:366;;;:::o;42578:419::-;42744:4;42782:2;42771:9;42767:18;42759:26;;42831:9;42825:4;42821:20;42817:1;42806:9;42802:17;42795:47;42859:131;42985:4;42859:131;:::i;:::-;42851:139;;42578:419;;;:::o;43003:143::-;43060:5;43091:6;43085:13;43076:22;;43107:33;43134:5;43107:33;:::i;:::-;43003:143;;;;:::o;43152:351::-;43222:6;43271:2;43259:9;43250:7;43246:23;43242:32;43239:119;;;43277:79;;:::i;:::-;43239:119;43397:1;43422:64;43478:7;43469:6;43458:9;43454:22;43422:64;:::i;:::-;43412:74;;43368:128;43152:351;;;;:::o;43509:332::-;43630:4;43668:2;43657:9;43653:18;43645:26;;43681:71;43749:1;43738:9;43734:17;43725:6;43681:71;:::i;:::-;43762:72;43830:2;43819:9;43815:18;43806:6;43762:72;:::i;:::-;43509:332;;;;;:::o;43847:137::-;43901:5;43932:6;43926:13;43917:22;;43948:30;43972:5;43948:30;:::i;:::-;43847:137;;;;:::o;43990:345::-;44057:6;44106:2;44094:9;44085:7;44081:23;44077:32;44074:119;;;44112:79;;:::i;:::-;44074:119;44232:1;44257:61;44310:7;44301:6;44290:9;44286:22;44257:61;:::i;:::-;44247:71;;44203:125;43990:345;;;;:::o;44341:182::-;44509:7;44504:3;44497:20;44341:182;:::o;44529:539::-;44751:3;44773:95;44864:3;44855:6;44773:95;:::i;:::-;44766:102;;44878:137;45011:3;44878:137;:::i;:::-;45040:1;45035:3;45031:11;45024:18;;45059:3;45052:10;;44529:539;;;;:::o;45074:167::-;45214:19;45210:1;45202:6;45198:14;45191:43;45074:167;:::o;45247:366::-;45389:3;45410:67;45474:2;45469:3;45410:67;:::i;:::-;45403:74;;45486:93;45575:3;45486:93;:::i;:::-;45604:2;45599:3;45595:12;45588:19;;45247:366;;;:::o;45619:419::-;45785:4;45823:2;45812:9;45808:18;45800:26;;45872:9;45866:4;45862:20;45858:1;45847:9;45843:17;45836:47;45900:131;46026:4;45900:131;:::i;:::-;45892:139;;45619:419;;;:::o;46044:163::-;46161:11;46198:3;46183:18;;46044:163;;;;:::o;46213:102::-;46282:4;46305:3;46297:11;;46213:102;;;:::o;46321:116::-;46406:24;46424:5;46406:24;:::i;:::-;46401:3;46394:37;46321:116;;:::o;46443:195::-;46520:10;46541:54;46591:3;46583:6;46541:54;:::i;:::-;46627:4;46622:3;46618:14;46604:28;;46443:195;;;;:::o;46644:122::-;46696:5;46721:39;46756:2;46751:3;46747:12;46742:3;46721:39;:::i;:::-;46712:48;;46644:122;;;;:::o;46772:115::-;46844:4;46876;46871:3;46867:14;46859:22;;46772:115;;;:::o;46923:743::-;47070:3;47093:104;47190:6;47185:3;47093:104;:::i;:::-;47086:111;;47221:58;47273:5;47221:58;:::i;:::-;47302:7;47333:1;47318:323;47343:6;47340:1;47337:13;47318:323;;;47413:42;47448:6;47439:7;47413:42;:::i;:::-;47475:71;47542:3;47527:13;47475:71;:::i;:::-;47468:78;;47569:62;47624:6;47569:62;:::i;:::-;47559:72;;47378:263;47365:1;47362;47358:9;47353:14;;47318:323;;;47322:14;47657:3;47650:10;;47075:591;;46923:743;;;;;:::o;47672:355::-;47844:3;47866:135;47997:3;47988:6;47980;47866:135;:::i;:::-;47859:142;;48018:3;48011:10;;47672:355;;;;;:::o;48033:178::-;48173:30;48169:1;48161:6;48157:14;48150:54;48033:178;:::o;48217:366::-;48359:3;48380:67;48444:2;48439:3;48380:67;:::i;:::-;48373:74;;48456:93;48545:3;48456:93;:::i;:::-;48574:2;48569:3;48565:12;48558:19;;48217:366;;;:::o;48589:419::-;48755:4;48793:2;48782:9;48778:18;48770:26;;48842:9;48836:4;48832:20;48828:1;48817:9;48813:17;48806:47;48870:131;48996:4;48870:131;:::i;:::-;48862:139;;48589:419;;;:::o;49014:182::-;49154:34;49150:1;49142:6;49138:14;49131:58;49014:182;:::o;49202:366::-;49344:3;49365:67;49429:2;49424:3;49365:67;:::i;:::-;49358:74;;49441:93;49530:3;49441:93;:::i;:::-;49559:2;49554:3;49550:12;49543:19;;49202:366;;;:::o;49574:419::-;49740:4;49778:2;49767:9;49763:18;49755:26;;49827:9;49821:4;49817:20;49813:1;49802:9;49798:17;49791:47;49855:131;49981:4;49855:131;:::i;:::-;49847:139;;49574:419;;;:::o;49999:178::-;50139:30;50135:1;50127:6;50123:14;50116:54;49999:178;:::o;50183:366::-;50325:3;50346:67;50410:2;50405:3;50346:67;:::i;:::-;50339:74;;50422:93;50511:3;50422:93;:::i;:::-;50540:2;50535:3;50531:12;50524:19;;50183:366;;;:::o;50555:419::-;50721:4;50759:2;50748:9;50744:18;50736:26;;50808:9;50802:4;50798:20;50794:1;50783:9;50779:17;50772:47;50836:131;50962:4;50836:131;:::i;:::-;50828:139;;50555:419;;;:::o;50980:224::-;51120:34;51116:1;51108:6;51104:14;51097:58;51189:7;51184:2;51176:6;51172:15;51165:32;50980:224;:::o;51210:366::-;51352:3;51373:67;51437:2;51432:3;51373:67;:::i;:::-;51366:74;;51449:93;51538:3;51449:93;:::i;:::-;51567:2;51562:3;51558:12;51551:19;;51210:366;;;:::o;51582:419::-;51748:4;51786:2;51775:9;51771:18;51763:26;;51835:9;51829:4;51825:20;51821:1;51810:9;51806:17;51799:47;51863:131;51989:4;51863:131;:::i;:::-;51855:139;;51582:419;;;:::o;52007:223::-;52147:34;52143:1;52135:6;52131:14;52124:58;52216:6;52211:2;52203:6;52199:15;52192:31;52007:223;:::o;52236:366::-;52378:3;52399:67;52463:2;52458:3;52399:67;:::i;:::-;52392:74;;52475:93;52564:3;52475:93;:::i;:::-;52593:2;52588:3;52584:12;52577:19;;52236:366;;;:::o;52608:419::-;52774:4;52812:2;52801:9;52797:18;52789:26;;52861:9;52855:4;52851:20;52847:1;52836:9;52832:17;52825:47;52889:131;53015:4;52889:131;:::i;:::-;52881:139;;52608:419;;;:::o;53033:175::-;53173:27;53169:1;53161:6;53157:14;53150:51;53033:175;:::o;53214:366::-;53356:3;53377:67;53441:2;53436:3;53377:67;:::i;:::-;53370:74;;53453:93;53542:3;53453:93;:::i;:::-;53571:2;53566:3;53562:12;53555:19;;53214:366;;;:::o;53586:419::-;53752:4;53790:2;53779:9;53775:18;53767:26;;53839:9;53833:4;53829:20;53825:1;53814:9;53810:17;53803:47;53867:131;53993:4;53867:131;:::i;:::-;53859:139;;53586:419;;;:::o;54011:237::-;54151:34;54147:1;54139:6;54135:14;54128:58;54220:20;54215:2;54207:6;54203:15;54196:45;54011:237;:::o;54254:366::-;54396:3;54417:67;54481:2;54476:3;54417:67;:::i;:::-;54410:74;;54493:93;54582:3;54493:93;:::i;:::-;54611:2;54606:3;54602:12;54595:19;;54254:366;;;:::o;54626:419::-;54792:4;54830:2;54819:9;54815:18;54807:26;;54879:9;54873:4;54869:20;54865:1;54854:9;54850:17;54843:47;54907:131;55033:4;54907:131;:::i;:::-;54899:139;;54626:419;;;:::o;55051:435::-;55231:3;55253:95;55344:3;55335:6;55253:95;:::i;:::-;55246:102;;55365:95;55456:3;55447:6;55365:95;:::i;:::-;55358:102;;55477:3;55470:10;;55051:435;;;;;:::o;55492:173::-;55632:25;55628:1;55620:6;55616:14;55609:49;55492:173;:::o;55671:402::-;55831:3;55852:85;55934:2;55929:3;55852:85;:::i;:::-;55845:92;;55946:93;56035:3;55946:93;:::i;:::-;56064:2;56059:3;56055:12;56048:19;;55671:402;;;:::o;56079:167::-;56219:19;56215:1;56207:6;56203:14;56196:43;56079:167;:::o;56252:402::-;56412:3;56433:85;56515:2;56510:3;56433:85;:::i;:::-;56426:92;;56527:93;56616:3;56527:93;:::i;:::-;56645:2;56640:3;56636:12;56629:19;;56252:402;;;:::o;56660:967::-;57042:3;57064:148;57208:3;57064:148;:::i;:::-;57057:155;;57229:95;57320:3;57311:6;57229:95;:::i;:::-;57222:102;;57341:148;57485:3;57341:148;:::i;:::-;57334:155;;57506:95;57597:3;57588:6;57506:95;:::i;:::-;57499:102;;57618:3;57611:10;;56660:967;;;;;:::o;57633:98::-;57684:6;57718:5;57712:12;57702:22;;57633:98;;;:::o;57737:168::-;57820:11;57854:6;57849:3;57842:19;57894:4;57889:3;57885:14;57870:29;;57737:168;;;;:::o;57911:373::-;57997:3;58025:38;58057:5;58025:38;:::i;:::-;58079:70;58142:6;58137:3;58079:70;:::i;:::-;58072:77;;58158:65;58216:6;58211:3;58204:4;58197:5;58193:16;58158:65;:::i;:::-;58248:29;58270:6;58248:29;:::i;:::-;58243:3;58239:39;58232:46;;58001:283;57911:373;;;;:::o;58290:640::-;58485:4;58523:3;58512:9;58508:19;58500:27;;58537:71;58605:1;58594:9;58590:17;58581:6;58537:71;:::i;:::-;58618:72;58686:2;58675:9;58671:18;58662:6;58618:72;:::i;:::-;58700;58768:2;58757:9;58753:18;58744:6;58700:72;:::i;:::-;58819:9;58813:4;58809:20;58804:2;58793:9;58789:18;58782:48;58847:76;58918:4;58909:6;58847:76;:::i;:::-;58839:84;;58290:640;;;;;;;:::o;58936:141::-;58992:5;59023:6;59017:13;59008:22;;59039:32;59065:5;59039:32;:::i;:::-;58936:141;;;;:::o;59083:349::-;59152:6;59201:2;59189:9;59180:7;59176:23;59172:32;59169:119;;;59207:79;;:::i;:::-;59169:119;59327:1;59352:63;59407:7;59398:6;59387:9;59383:22;59352:63;:::i;:::-;59342:73;;59298:127;59083:349;;;;:::o;59438:180::-;59486:77;59483:1;59476:88;59583:4;59580:1;59573:15;59607:4;59604:1;59597:15;59624:171;59663:3;59686:24;59704:5;59686:24;:::i;:::-;59677:33;;59732:4;59725:5;59722:15;59719:41;;59740:18;;:::i;:::-;59719:41;59787:1;59780:5;59776:13;59769:20;;59624:171;;;:::o;59801:182::-;59941:34;59937:1;59929:6;59925:14;59918:58;59801:182;:::o;59989:366::-;60131:3;60152:67;60216:2;60211:3;60152:67;:::i;:::-;60145:74;;60228:93;60317:3;60228:93;:::i;:::-;60346:2;60341:3;60337:12;60330:19;;59989:366;;;:::o;60361:419::-;60527:4;60565:2;60554:9;60550:18;60542:26;;60614:9;60608:4;60604:20;60600:1;60589:9;60585:17;60578:47;60642:131;60768:4;60642:131;:::i;:::-;60634:139;;60361:419;;;:::o;60786:194::-;60826:4;60846:20;60864:1;60846:20;:::i;:::-;60841:25;;60880:20;60898:1;60880:20;:::i;:::-;60875:25;;60924:1;60921;60917:9;60909:17;;60948:1;60942:4;60939:11;60936:37;;;60953:18;;:::i;:::-;60936:37;60786:194;;;;:::o
Swarm Source
ipfs://92cba29ca86427aade7566c5ead3047970fd273afde1d67f630f8fbc67badb55
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.