Polygon Sponsored slots available. Book your slot here!
ERC-721
NFT
Overview
Max Total Supply
0 GRL
Holders
36
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
GirlInHeadphones
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2023-02-03 */ pragma solidity ^0.8.9; /** * @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/[email protected]/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/[email protected]/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/[email protected]/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev See {ERC721-_burn}. This override additionally checks to see if a * token-specific URI was set for the token, and if so, it deletes the token URI from * the storage mapping. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: contract-96b0fda336.sol pragma solidity ^0.8.9; contract GirlInHeadphones is ERC721, ERC721URIStorage, Ownable { constructor() ERC721("Girl in headphones", "GRL") {} function safeMint(address to, uint256 tokenId, string memory uri) public onlyOwner { _safeMint(to, tokenId); _setTokenURI(tokenId, uri); } // The following functions are overrides required by Solidity. function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } }
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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280601281526020017f4769726c20696e206865616470686f6e657300000000000000000000000000008152506040518060400160405280600381526020017f47524c0000000000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620001a6565b508060019080519060200190620000af929190620001a6565b505050620000d2620000c6620000d860201b60201c565b620000e060201b60201c565b620002bb565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001b49062000285565b90600052602060002090601f016020900481019282620001d8576000855562000224565b82601f10620001f357805160ff191683800117855562000224565b8280016001018555821562000224579182015b828111156200022357825182559160200191906001019062000206565b5b50905062000233919062000237565b5090565b5b808211156200025257600081600090555060010162000238565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200029e57607f821691505b60208210811415620002b557620002b462000256565b5b50919050565b612e3080620002cb6000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c8063715018a6116100a2578063b88d4fde11610071578063b88d4fde146102a4578063c87b56dd146102c0578063cd279c7c146102f0578063e985e9c51461030c578063f2fde38b1461033c5761010b565b8063715018a6146102425780638da5cb5b1461024c57806395d89b411461026a578063a22cb465146102885761010b565b806323b872dd116100de57806323b872dd146101aa57806342842e0e146101c65780636352211e146101e257806370a08231146102125761010b565b806301ffc9a71461011057806306fdde0314610140578063081812fc1461015e578063095ea7b31461018e575b600080fd5b61012a60048036038101906101259190611dc9565b610358565b6040516101379190611e11565b60405180910390f35b61014861043a565b6040516101559190611ec5565b60405180910390f35b61017860048036038101906101739190611f1d565b6104cc565b6040516101859190611f8b565b60405180910390f35b6101a860048036038101906101a39190611fd2565b610512565b005b6101c460048036038101906101bf9190612012565b61062a565b005b6101e060048036038101906101db9190612012565b61068a565b005b6101fc60048036038101906101f79190611f1d565b6106aa565b6040516102099190611f8b565b60405180910390f35b61022c60048036038101906102279190612065565b610731565b60405161023991906120a1565b60405180910390f35b61024a6107e9565b005b6102546107fd565b6040516102619190611f8b565b60405180910390f35b610272610827565b60405161027f9190611ec5565b60405180910390f35b6102a2600480360381019061029d91906120e8565b6108b9565b005b6102be60048036038101906102b9919061225d565b6108cf565b005b6102da60048036038101906102d59190611f1d565b610931565b6040516102e79190611ec5565b60405180910390f35b61030a60048036038101906103059190612381565b610943565b005b610326600480360381019061032191906123f0565b610964565b6040516103339190611e11565b60405180910390f35b61035660048036038101906103519190612065565b6109f8565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061042357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610433575061043282610a7c565b5b9050919050565b6060600080546104499061245f565b80601f01602080910402602001604051908101604052809291908181526020018280546104759061245f565b80156104c25780601f10610497576101008083540402835291602001916104c2565b820191906000526020600020905b8154815290600101906020018083116104a557829003601f168201915b5050505050905090565b60006104d782610ae6565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061051d826106aa565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561058e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058590612503565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166105ad610b31565b73ffffffffffffffffffffffffffffffffffffffff1614806105dc57506105db816105d6610b31565b610964565b5b61061b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061290612595565b60405180910390fd5b6106258383610b39565b505050565b61063b610635610b31565b82610bf2565b61067a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067190612627565b60405180910390fd5b610685838383610c87565b505050565b6106a5838383604051806020016040528060008152506108cf565b505050565b6000806106b683610f81565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071f90612693565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156107a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079990612725565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6107f1610fbe565b6107fb600061103c565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546108369061245f565b80601f01602080910402602001604051908101604052809291908181526020018280546108629061245f565b80156108af5780601f10610884576101008083540402835291602001916108af565b820191906000526020600020905b81548152906001019060200180831161089257829003601f168201915b5050505050905090565b6108cb6108c4610b31565b8383611102565b5050565b6108e06108da610b31565b83610bf2565b61091f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091690612627565b60405180910390fd5b61092b8484848461126f565b50505050565b606061093c826112cb565b9050919050565b61094b610fbe565b61095583836113de565b61095f82826113fc565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610a00610fbe565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a67906127b7565b60405180910390fd5b610a798161103c565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610aef81611470565b610b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2590612693565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610bac836106aa565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610bfe836106aa565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610c405750610c3f8185610964565b5b80610c7e57508373ffffffffffffffffffffffffffffffffffffffff16610c66846104cc565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610ca7826106aa565b73ffffffffffffffffffffffffffffffffffffffff1614610cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf490612849565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d64906128db565b60405180910390fd5b610d7a83838360016114b1565b8273ffffffffffffffffffffffffffffffffffffffff16610d9a826106aa565b73ffffffffffffffffffffffffffffffffffffffff1614610df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de790612849565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f7c83838360016115d7565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610fc6610b31565b73ffffffffffffffffffffffffffffffffffffffff16610fe46107fd565b73ffffffffffffffffffffffffffffffffffffffff161461103a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103190612947565b60405180910390fd5b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611171576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611168906129b3565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112629190611e11565b60405180910390a3505050565b61127a848484610c87565b611286848484846115dd565b6112c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bc90612a45565b60405180910390fd5b50505050565b60606112d682610ae6565b60006006600084815260200190815260200160002080546112f69061245f565b80601f01602080910402602001604051908101604052809291908181526020018280546113229061245f565b801561136f5780601f106113445761010080835404028352916020019161136f565b820191906000526020600020905b81548152906001019060200180831161135257829003601f168201915b505050505090506000611380611774565b90506000815114156113965781925050506113d9565b6000825111156113cb5780826040516020016113b3929190612aa1565b604051602081830303815290604052925050506113d9565b6113d48461178b565b925050505b919050565b6113f88282604051806020016040528060008152506117f3565b5050565b61140582611470565b611444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143b90612b37565b60405180910390fd5b8060066000848152602001908152602001600020908051906020019061146b929190611cba565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661149283610f81565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60018111156115d157600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146115455780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461153d9190612b86565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146115d05780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115c89190612bba565b925050819055505b5b50505050565b50505050565b60006115fe8473ffffffffffffffffffffffffffffffffffffffff1661184e565b15611767578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611627610b31565b8786866040518563ffffffff1660e01b81526004016116499493929190612c65565b602060405180830381600087803b15801561166357600080fd5b505af192505050801561169457506040513d601f19601f820116820180604052508101906116919190612cc6565b60015b611717573d80600081146116c4576040519150601f19603f3d011682016040523d82523d6000602084013e6116c9565b606091505b5060008151141561170f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170690612a45565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061176c565b600190505b949350505050565b606060405180602001604052806000815250905090565b606061179682610ae6565b60006117a0611774565b905060008151116117c057604051806020016040528060008152506117eb565b806117ca84611871565b6040516020016117db929190612aa1565b6040516020818303038152906040525b915050919050565b6117fd8383611949565b61180a60008484846115dd565b611849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184090612a45565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606000600161188084611b67565b01905060008167ffffffffffffffff81111561189f5761189e612132565b5b6040519080825280601f01601f1916602001820160405280156118d15781602001600182028036833780820191505090505b509050600082602001820190505b60011561193e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161192857611927612cf3565b5b04945060008514156119395761193e565b6118df565b819350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b090612d6e565b60405180910390fd5b6119c281611470565b15611a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f990612dda565b60405180910390fd5b611a106000838360016114b1565b611a1981611470565b15611a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5090612dda565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b636000838360016115d7565b5050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611bc5577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611bbb57611bba612cf3565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611c02576d04ee2d6d415b85acef81000000008381611bf857611bf7612cf3565b5b0492506020810190505b662386f26fc100008310611c3157662386f26fc100008381611c2757611c26612cf3565b5b0492506010810190505b6305f5e1008310611c5a576305f5e1008381611c5057611c4f612cf3565b5b0492506008810190505b6127108310611c7f576127108381611c7557611c74612cf3565b5b0492506004810190505b60648310611ca25760648381611c9857611c97612cf3565b5b0492506002810190505b600a8310611cb1576001810190505b80915050919050565b828054611cc69061245f565b90600052602060002090601f016020900481019282611ce85760008555611d2f565b82601f10611d0157805160ff1916838001178555611d2f565b82800160010185558215611d2f579182015b82811115611d2e578251825591602001919060010190611d13565b5b509050611d3c9190611d40565b5090565b5b80821115611d59576000816000905550600101611d41565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611da681611d71565b8114611db157600080fd5b50565b600081359050611dc381611d9d565b92915050565b600060208284031215611ddf57611dde611d67565b5b6000611ded84828501611db4565b91505092915050565b60008115159050919050565b611e0b81611df6565b82525050565b6000602082019050611e266000830184611e02565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611e66578082015181840152602081019050611e4b565b83811115611e75576000848401525b50505050565b6000601f19601f8301169050919050565b6000611e9782611e2c565b611ea18185611e37565b9350611eb1818560208601611e48565b611eba81611e7b565b840191505092915050565b60006020820190508181036000830152611edf8184611e8c565b905092915050565b6000819050919050565b611efa81611ee7565b8114611f0557600080fd5b50565b600081359050611f1781611ef1565b92915050565b600060208284031215611f3357611f32611d67565b5b6000611f4184828501611f08565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611f7582611f4a565b9050919050565b611f8581611f6a565b82525050565b6000602082019050611fa06000830184611f7c565b92915050565b611faf81611f6a565b8114611fba57600080fd5b50565b600081359050611fcc81611fa6565b92915050565b60008060408385031215611fe957611fe8611d67565b5b6000611ff785828601611fbd565b925050602061200885828601611f08565b9150509250929050565b60008060006060848603121561202b5761202a611d67565b5b600061203986828701611fbd565b935050602061204a86828701611fbd565b925050604061205b86828701611f08565b9150509250925092565b60006020828403121561207b5761207a611d67565b5b600061208984828501611fbd565b91505092915050565b61209b81611ee7565b82525050565b60006020820190506120b66000830184612092565b92915050565b6120c581611df6565b81146120d057600080fd5b50565b6000813590506120e2816120bc565b92915050565b600080604083850312156120ff576120fe611d67565b5b600061210d85828601611fbd565b925050602061211e858286016120d3565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61216a82611e7b565b810181811067ffffffffffffffff8211171561218957612188612132565b5b80604052505050565b600061219c611d5d565b90506121a88282612161565b919050565b600067ffffffffffffffff8211156121c8576121c7612132565b5b6121d182611e7b565b9050602081019050919050565b82818337600083830152505050565b60006122006121fb846121ad565b612192565b90508281526020810184848401111561221c5761221b61212d565b5b6122278482856121de565b509392505050565b600082601f83011261224457612243612128565b5b81356122548482602086016121ed565b91505092915050565b6000806000806080858703121561227757612276611d67565b5b600061228587828801611fbd565b945050602061229687828801611fbd565b93505060406122a787828801611f08565b925050606085013567ffffffffffffffff8111156122c8576122c7611d6c565b5b6122d48782880161222f565b91505092959194509250565b600067ffffffffffffffff8211156122fb576122fa612132565b5b61230482611e7b565b9050602081019050919050565b600061232461231f846122e0565b612192565b9050828152602081018484840111156123405761233f61212d565b5b61234b8482856121de565b509392505050565b600082601f83011261236857612367612128565b5b8135612378848260208601612311565b91505092915050565b60008060006060848603121561239a57612399611d67565b5b60006123a886828701611fbd565b93505060206123b986828701611f08565b925050604084013567ffffffffffffffff8111156123da576123d9611d6c565b5b6123e686828701612353565b9150509250925092565b6000806040838503121561240757612406611d67565b5b600061241585828601611fbd565b925050602061242685828601611fbd565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061247757607f821691505b6020821081141561248b5761248a612430565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006124ed602183611e37565b91506124f882612491565b604082019050919050565b6000602082019050818103600083015261251c816124e0565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b600061257f603d83611e37565b915061258a82612523565b604082019050919050565b600060208201905081810360008301526125ae81612572565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000612611602d83611e37565b915061261c826125b5565b604082019050919050565b6000602082019050818103600083015261264081612604565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061267d601883611e37565b915061268882612647565b602082019050919050565b600060208201905081810360008301526126ac81612670565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061270f602983611e37565b915061271a826126b3565b604082019050919050565b6000602082019050818103600083015261273e81612702565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006127a1602683611e37565b91506127ac82612745565b604082019050919050565b600060208201905081810360008301526127d081612794565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612833602583611e37565b915061283e826127d7565b604082019050919050565b6000602082019050818103600083015261286281612826565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006128c5602483611e37565b91506128d082612869565b604082019050919050565b600060208201905081810360008301526128f4816128b8565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612931602083611e37565b915061293c826128fb565b602082019050919050565b6000602082019050818103600083015261296081612924565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061299d601983611e37565b91506129a882612967565b602082019050919050565b600060208201905081810360008301526129cc81612990565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612a2f603283611e37565b9150612a3a826129d3565b604082019050919050565b60006020820190508181036000830152612a5e81612a22565b9050919050565b600081905092915050565b6000612a7b82611e2c565b612a858185612a65565b9350612a95818560208601611e48565b80840191505092915050565b6000612aad8285612a70565b9150612ab98284612a70565b91508190509392505050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000612b21602e83611e37565b9150612b2c82612ac5565b604082019050919050565b60006020820190508181036000830152612b5081612b14565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b9182611ee7565b9150612b9c83611ee7565b925082821015612baf57612bae612b57565b5b828203905092915050565b6000612bc582611ee7565b9150612bd083611ee7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c0557612c04612b57565b5b828201905092915050565b600081519050919050565b600082825260208201905092915050565b6000612c3782612c10565b612c418185612c1b565b9350612c51818560208601611e48565b612c5a81611e7b565b840191505092915050565b6000608082019050612c7a6000830187611f7c565b612c876020830186611f7c565b612c946040830185612092565b8181036060830152612ca68184612c2c565b905095945050505050565b600081519050612cc081611d9d565b92915050565b600060208284031215612cdc57612cdb611d67565b5b6000612cea84828501612cb1565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612d58602083611e37565b9150612d6382612d22565b602082019050919050565b60006020820190508181036000830152612d8781612d4b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000612dc4601c83611e37565b9150612dcf82612d8e565b602082019050919050565b60006020820190508181036000830152612df381612db7565b905091905056fea264697066735822122076edfada72440b0d5b312960477cb53943e3866c7ea1be0b4f138259e82a5a7064736f6c63430008090033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061010b5760003560e01c8063715018a6116100a2578063b88d4fde11610071578063b88d4fde146102a4578063c87b56dd146102c0578063cd279c7c146102f0578063e985e9c51461030c578063f2fde38b1461033c5761010b565b8063715018a6146102425780638da5cb5b1461024c57806395d89b411461026a578063a22cb465146102885761010b565b806323b872dd116100de57806323b872dd146101aa57806342842e0e146101c65780636352211e146101e257806370a08231146102125761010b565b806301ffc9a71461011057806306fdde0314610140578063081812fc1461015e578063095ea7b31461018e575b600080fd5b61012a60048036038101906101259190611dc9565b610358565b6040516101379190611e11565b60405180910390f35b61014861043a565b6040516101559190611ec5565b60405180910390f35b61017860048036038101906101739190611f1d565b6104cc565b6040516101859190611f8b565b60405180910390f35b6101a860048036038101906101a39190611fd2565b610512565b005b6101c460048036038101906101bf9190612012565b61062a565b005b6101e060048036038101906101db9190612012565b61068a565b005b6101fc60048036038101906101f79190611f1d565b6106aa565b6040516102099190611f8b565b60405180910390f35b61022c60048036038101906102279190612065565b610731565b60405161023991906120a1565b60405180910390f35b61024a6107e9565b005b6102546107fd565b6040516102619190611f8b565b60405180910390f35b610272610827565b60405161027f9190611ec5565b60405180910390f35b6102a2600480360381019061029d91906120e8565b6108b9565b005b6102be60048036038101906102b9919061225d565b6108cf565b005b6102da60048036038101906102d59190611f1d565b610931565b6040516102e79190611ec5565b60405180910390f35b61030a60048036038101906103059190612381565b610943565b005b610326600480360381019061032191906123f0565b610964565b6040516103339190611e11565b60405180910390f35b61035660048036038101906103519190612065565b6109f8565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061042357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610433575061043282610a7c565b5b9050919050565b6060600080546104499061245f565b80601f01602080910402602001604051908101604052809291908181526020018280546104759061245f565b80156104c25780601f10610497576101008083540402835291602001916104c2565b820191906000526020600020905b8154815290600101906020018083116104a557829003601f168201915b5050505050905090565b60006104d782610ae6565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061051d826106aa565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561058e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058590612503565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166105ad610b31565b73ffffffffffffffffffffffffffffffffffffffff1614806105dc57506105db816105d6610b31565b610964565b5b61061b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061290612595565b60405180910390fd5b6106258383610b39565b505050565b61063b610635610b31565b82610bf2565b61067a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067190612627565b60405180910390fd5b610685838383610c87565b505050565b6106a5838383604051806020016040528060008152506108cf565b505050565b6000806106b683610f81565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071f90612693565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156107a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079990612725565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6107f1610fbe565b6107fb600061103c565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546108369061245f565b80601f01602080910402602001604051908101604052809291908181526020018280546108629061245f565b80156108af5780601f10610884576101008083540402835291602001916108af565b820191906000526020600020905b81548152906001019060200180831161089257829003601f168201915b5050505050905090565b6108cb6108c4610b31565b8383611102565b5050565b6108e06108da610b31565b83610bf2565b61091f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091690612627565b60405180910390fd5b61092b8484848461126f565b50505050565b606061093c826112cb565b9050919050565b61094b610fbe565b61095583836113de565b61095f82826113fc565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610a00610fbe565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a67906127b7565b60405180910390fd5b610a798161103c565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610aef81611470565b610b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2590612693565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610bac836106aa565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610bfe836106aa565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610c405750610c3f8185610964565b5b80610c7e57508373ffffffffffffffffffffffffffffffffffffffff16610c66846104cc565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610ca7826106aa565b73ffffffffffffffffffffffffffffffffffffffff1614610cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf490612849565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d64906128db565b60405180910390fd5b610d7a83838360016114b1565b8273ffffffffffffffffffffffffffffffffffffffff16610d9a826106aa565b73ffffffffffffffffffffffffffffffffffffffff1614610df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de790612849565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f7c83838360016115d7565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610fc6610b31565b73ffffffffffffffffffffffffffffffffffffffff16610fe46107fd565b73ffffffffffffffffffffffffffffffffffffffff161461103a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103190612947565b60405180910390fd5b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611171576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611168906129b3565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112629190611e11565b60405180910390a3505050565b61127a848484610c87565b611286848484846115dd565b6112c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bc90612a45565b60405180910390fd5b50505050565b60606112d682610ae6565b60006006600084815260200190815260200160002080546112f69061245f565b80601f01602080910402602001604051908101604052809291908181526020018280546113229061245f565b801561136f5780601f106113445761010080835404028352916020019161136f565b820191906000526020600020905b81548152906001019060200180831161135257829003601f168201915b505050505090506000611380611774565b90506000815114156113965781925050506113d9565b6000825111156113cb5780826040516020016113b3929190612aa1565b604051602081830303815290604052925050506113d9565b6113d48461178b565b925050505b919050565b6113f88282604051806020016040528060008152506117f3565b5050565b61140582611470565b611444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143b90612b37565b60405180910390fd5b8060066000848152602001908152602001600020908051906020019061146b929190611cba565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661149283610f81565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60018111156115d157600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146115455780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461153d9190612b86565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146115d05780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115c89190612bba565b925050819055505b5b50505050565b50505050565b60006115fe8473ffffffffffffffffffffffffffffffffffffffff1661184e565b15611767578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611627610b31565b8786866040518563ffffffff1660e01b81526004016116499493929190612c65565b602060405180830381600087803b15801561166357600080fd5b505af192505050801561169457506040513d601f19601f820116820180604052508101906116919190612cc6565b60015b611717573d80600081146116c4576040519150601f19603f3d011682016040523d82523d6000602084013e6116c9565b606091505b5060008151141561170f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170690612a45565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061176c565b600190505b949350505050565b606060405180602001604052806000815250905090565b606061179682610ae6565b60006117a0611774565b905060008151116117c057604051806020016040528060008152506117eb565b806117ca84611871565b6040516020016117db929190612aa1565b6040516020818303038152906040525b915050919050565b6117fd8383611949565b61180a60008484846115dd565b611849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184090612a45565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606000600161188084611b67565b01905060008167ffffffffffffffff81111561189f5761189e612132565b5b6040519080825280601f01601f1916602001820160405280156118d15781602001600182028036833780820191505090505b509050600082602001820190505b60011561193e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161192857611927612cf3565b5b04945060008514156119395761193e565b6118df565b819350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b090612d6e565b60405180910390fd5b6119c281611470565b15611a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f990612dda565b60405180910390fd5b611a106000838360016114b1565b611a1981611470565b15611a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5090612dda565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b636000838360016115d7565b5050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611bc5577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611bbb57611bba612cf3565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611c02576d04ee2d6d415b85acef81000000008381611bf857611bf7612cf3565b5b0492506020810190505b662386f26fc100008310611c3157662386f26fc100008381611c2757611c26612cf3565b5b0492506010810190505b6305f5e1008310611c5a576305f5e1008381611c5057611c4f612cf3565b5b0492506008810190505b6127108310611c7f576127108381611c7557611c74612cf3565b5b0492506004810190505b60648310611ca25760648381611c9857611c97612cf3565b5b0492506002810190505b600a8310611cb1576001810190505b80915050919050565b828054611cc69061245f565b90600052602060002090601f016020900481019282611ce85760008555611d2f565b82601f10611d0157805160ff1916838001178555611d2f565b82800160010185558215611d2f579182015b82811115611d2e578251825591602001919060010190611d13565b5b509050611d3c9190611d40565b5090565b5b80821115611d59576000816000905550600101611d41565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611da681611d71565b8114611db157600080fd5b50565b600081359050611dc381611d9d565b92915050565b600060208284031215611ddf57611dde611d67565b5b6000611ded84828501611db4565b91505092915050565b60008115159050919050565b611e0b81611df6565b82525050565b6000602082019050611e266000830184611e02565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611e66578082015181840152602081019050611e4b565b83811115611e75576000848401525b50505050565b6000601f19601f8301169050919050565b6000611e9782611e2c565b611ea18185611e37565b9350611eb1818560208601611e48565b611eba81611e7b565b840191505092915050565b60006020820190508181036000830152611edf8184611e8c565b905092915050565b6000819050919050565b611efa81611ee7565b8114611f0557600080fd5b50565b600081359050611f1781611ef1565b92915050565b600060208284031215611f3357611f32611d67565b5b6000611f4184828501611f08565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611f7582611f4a565b9050919050565b611f8581611f6a565b82525050565b6000602082019050611fa06000830184611f7c565b92915050565b611faf81611f6a565b8114611fba57600080fd5b50565b600081359050611fcc81611fa6565b92915050565b60008060408385031215611fe957611fe8611d67565b5b6000611ff785828601611fbd565b925050602061200885828601611f08565b9150509250929050565b60008060006060848603121561202b5761202a611d67565b5b600061203986828701611fbd565b935050602061204a86828701611fbd565b925050604061205b86828701611f08565b9150509250925092565b60006020828403121561207b5761207a611d67565b5b600061208984828501611fbd565b91505092915050565b61209b81611ee7565b82525050565b60006020820190506120b66000830184612092565b92915050565b6120c581611df6565b81146120d057600080fd5b50565b6000813590506120e2816120bc565b92915050565b600080604083850312156120ff576120fe611d67565b5b600061210d85828601611fbd565b925050602061211e858286016120d3565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61216a82611e7b565b810181811067ffffffffffffffff8211171561218957612188612132565b5b80604052505050565b600061219c611d5d565b90506121a88282612161565b919050565b600067ffffffffffffffff8211156121c8576121c7612132565b5b6121d182611e7b565b9050602081019050919050565b82818337600083830152505050565b60006122006121fb846121ad565b612192565b90508281526020810184848401111561221c5761221b61212d565b5b6122278482856121de565b509392505050565b600082601f83011261224457612243612128565b5b81356122548482602086016121ed565b91505092915050565b6000806000806080858703121561227757612276611d67565b5b600061228587828801611fbd565b945050602061229687828801611fbd565b93505060406122a787828801611f08565b925050606085013567ffffffffffffffff8111156122c8576122c7611d6c565b5b6122d48782880161222f565b91505092959194509250565b600067ffffffffffffffff8211156122fb576122fa612132565b5b61230482611e7b565b9050602081019050919050565b600061232461231f846122e0565b612192565b9050828152602081018484840111156123405761233f61212d565b5b61234b8482856121de565b509392505050565b600082601f83011261236857612367612128565b5b8135612378848260208601612311565b91505092915050565b60008060006060848603121561239a57612399611d67565b5b60006123a886828701611fbd565b93505060206123b986828701611f08565b925050604084013567ffffffffffffffff8111156123da576123d9611d6c565b5b6123e686828701612353565b9150509250925092565b6000806040838503121561240757612406611d67565b5b600061241585828601611fbd565b925050602061242685828601611fbd565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061247757607f821691505b6020821081141561248b5761248a612430565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006124ed602183611e37565b91506124f882612491565b604082019050919050565b6000602082019050818103600083015261251c816124e0565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b600061257f603d83611e37565b915061258a82612523565b604082019050919050565b600060208201905081810360008301526125ae81612572565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000612611602d83611e37565b915061261c826125b5565b604082019050919050565b6000602082019050818103600083015261264081612604565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061267d601883611e37565b915061268882612647565b602082019050919050565b600060208201905081810360008301526126ac81612670565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061270f602983611e37565b915061271a826126b3565b604082019050919050565b6000602082019050818103600083015261273e81612702565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006127a1602683611e37565b91506127ac82612745565b604082019050919050565b600060208201905081810360008301526127d081612794565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612833602583611e37565b915061283e826127d7565b604082019050919050565b6000602082019050818103600083015261286281612826565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006128c5602483611e37565b91506128d082612869565b604082019050919050565b600060208201905081810360008301526128f4816128b8565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612931602083611e37565b915061293c826128fb565b602082019050919050565b6000602082019050818103600083015261296081612924565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061299d601983611e37565b91506129a882612967565b602082019050919050565b600060208201905081810360008301526129cc81612990565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612a2f603283611e37565b9150612a3a826129d3565b604082019050919050565b60006020820190508181036000830152612a5e81612a22565b9050919050565b600081905092915050565b6000612a7b82611e2c565b612a858185612a65565b9350612a95818560208601611e48565b80840191505092915050565b6000612aad8285612a70565b9150612ab98284612a70565b91508190509392505050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000612b21602e83611e37565b9150612b2c82612ac5565b604082019050919050565b60006020820190508181036000830152612b5081612b14565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b9182611ee7565b9150612b9c83611ee7565b925082821015612baf57612bae612b57565b5b828203905092915050565b6000612bc582611ee7565b9150612bd083611ee7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c0557612c04612b57565b5b828201905092915050565b600081519050919050565b600082825260208201905092915050565b6000612c3782612c10565b612c418185612c1b565b9350612c51818560208601611e48565b612c5a81611e7b565b840191505092915050565b6000608082019050612c7a6000830187611f7c565b612c876020830186611f7c565b612c946040830185612092565b8181036060830152612ca68184612c2c565b905095945050505050565b600081519050612cc081611d9d565b92915050565b600060208284031215612cdc57612cdb611d67565b5b6000612cea84828501612cb1565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612d58602083611e37565b9150612d6382612d22565b602082019050919050565b60006020820190508181036000830152612d8781612d4b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000612dc4601c83611e37565b9150612dcf82612d8e565b602082019050919050565b60006020820190508181036000830152612df381612db7565b905091905056fea264697066735822122076edfada72440b0d5b312960477cb53943e3866c7ea1be0b4f138259e82a5a7064736f6c63430008090033
Deployed Bytecode Sourcemap
56351:714:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38473:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39401:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40913:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40431:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41613:335;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42019:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39111:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38842:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17862:103;;;:::i;:::-;;17214:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39570:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41156:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42275:322;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56866:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56481:184;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41382:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18120:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38473:305;38575:4;38627:25;38612:40;;;:11;:40;;;;:105;;;;38684:33;38669:48;;;:11;:48;;;;38612:105;:158;;;;38734:36;38758:11;38734:23;:36::i;:::-;38612:158;38592:178;;38473:305;;;:::o;39401:100::-;39455:13;39488:5;39481:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39401:100;:::o;40913:171::-;40989:7;41009:23;41024:7;41009:14;:23::i;:::-;41052:15;:24;41068:7;41052:24;;;;;;;;;;;;;;;;;;;;;41045:31;;40913:171;;;:::o;40431:416::-;40512:13;40528:23;40543:7;40528:14;:23::i;:::-;40512:39;;40576:5;40570:11;;:2;:11;;;;40562:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;40670:5;40654:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;40679:37;40696:5;40703:12;:10;:12::i;:::-;40679:16;:37::i;:::-;40654:62;40632:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;40818:21;40827:2;40831:7;40818:8;:21::i;:::-;40501:346;40431:416;;:::o;41613:335::-;41808:41;41827:12;:10;:12::i;:::-;41841:7;41808:18;:41::i;:::-;41800:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;41912:28;41922:4;41928:2;41932:7;41912:9;:28::i;:::-;41613:335;;;:::o;42019:185::-;42157:39;42174:4;42180:2;42184:7;42157:39;;;;;;;;;;;;:16;:39::i;:::-;42019:185;;;:::o;39111:223::-;39183:7;39203:13;39219:17;39228:7;39219:8;:17::i;:::-;39203:33;;39272:1;39255:19;;:5;:19;;;;39247:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;39321:5;39314:12;;;39111:223;;;:::o;38842:207::-;38914:7;38959:1;38942:19;;:5;:19;;;;38934:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39025:9;:16;39035:5;39025:16;;;;;;;;;;;;;;;;39018:23;;38842:207;;;:::o;17862:103::-;17100:13;:11;:13::i;:::-;17927:30:::1;17954:1;17927:18;:30::i;:::-;17862:103::o:0;17214:87::-;17260:7;17287:6;;;;;;;;;;;17280:13;;17214:87;:::o;39570:104::-;39626:13;39659:7;39652:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39570:104;:::o;41156:155::-;41251:52;41270:12;:10;:12::i;:::-;41284:8;41294;41251:18;:52::i;:::-;41156:155;;:::o;42275:322::-;42449:41;42468:12;:10;:12::i;:::-;42482:7;42449:18;:41::i;:::-;42441:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;42551:38;42565:4;42571:2;42575:7;42584:4;42551:13;:38::i;:::-;42275:322;;;;:::o;56866:196::-;56993:13;57031:23;57046:7;57031:14;:23::i;:::-;57024:30;;56866:196;;;:::o;56481:184::-;17100:13;:11;:13::i;:::-;56598:22:::1;56608:2;56612:7;56598:9;:22::i;:::-;56631:26;56644:7;56653:3;56631:12;:26::i;:::-;56481:184:::0;;;:::o;41382:164::-;41479:4;41503:18;:25;41522:5;41503:25;;;;;;;;;;;;;;;:35;41529:8;41503:35;;;;;;;;;;;;;;;;;;;;;;;;;41496:42;;41382:164;;;;:::o;18120:201::-;17100:13;:11;:13::i;:::-;18229:1:::1;18209:22;;:8;:22;;;;18201:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;18285:28;18304:8;18285:18;:28::i;:::-;18120:201:::0;:::o;30967:157::-;31052:4;31091:25;31076:40;;;:11;:40;;;;31069:47;;30967:157;;;:::o;50732:135::-;50814:16;50822:7;50814;:16::i;:::-;50806:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;50732:135;:::o;15759:98::-;15812:7;15839:10;15832:17;;15759:98;:::o;50011:174::-;50113:2;50086:15;:24;50102:7;50086:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;50169:7;50165:2;50131:46;;50140:23;50155:7;50140:14;:23::i;:::-;50131:46;;;;;;;;;;;;50011:174;;:::o;44630:264::-;44723:4;44740:13;44756:23;44771:7;44756:14;:23::i;:::-;44740:39;;44809:5;44798:16;;:7;:16;;;:52;;;;44818:32;44835:5;44842:7;44818:16;:32::i;:::-;44798:52;:87;;;;44878:7;44854:31;;:20;44866:7;44854:11;:20::i;:::-;:31;;;44798:87;44790:96;;;44630:264;;;;:::o;48629:1263::-;48788:4;48761:31;;:23;48776:7;48761:14;:23::i;:::-;:31;;;48753:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48867:1;48853:16;;:2;:16;;;;48845:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;48923:42;48944:4;48950:2;48954:7;48963:1;48923:20;:42::i;:::-;49095:4;49068:31;;:23;49083:7;49068:14;:23::i;:::-;:31;;;49060:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;49213:15;:24;49229:7;49213:24;;;;;;;;;;;;49206:31;;;;;;;;;;;49708:1;49689:9;:15;49699:4;49689:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;49741:1;49724:9;:13;49734:2;49724:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;49783:2;49764:7;:16;49772:7;49764:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;49822:7;49818:2;49803:27;;49812:4;49803:27;;;;;;;;;;;;49843:41;49863:4;49869:2;49873:7;49882:1;49843:19;:41::i;:::-;48629:1263;;;:::o;43905:117::-;43971:7;43998;:16;44006:7;43998:16;;;;;;;;;;;;;;;;;;;;;43991:23;;43905:117;;;:::o;17379:132::-;17454:12;:10;:12::i;:::-;17443:23;;:7;:5;:7::i;:::-;:23;;;17435:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17379:132::o;18481:191::-;18555:16;18574:6;;;;;;;;;;;18555:25;;18600:8;18591:6;;:17;;;;;;;;;;;;;;;;;;18655:8;18624:40;;18645:8;18624:40;;;;;;;;;;;;18544:128;18481:191;:::o;50328:315::-;50483:8;50474:17;;:5;:17;;;;50466:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;50570:8;50532:18;:25;50551:5;50532:25;;;;;;;;;;;;;;;:35;50558:8;50532:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;50616:8;50594:41;;50609:5;50594:41;;;50626:8;50594:41;;;;;;:::i;:::-;;;;;;;;50328:315;;;:::o;43478:313::-;43634:28;43644:4;43650:2;43654:7;43634:9;:28::i;:::-;43681:47;43704:4;43710:2;43714:7;43723:4;43681:22;:47::i;:::-;43673:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;43478:313;;;;:::o;54845:624::-;54918:13;54944:23;54959:7;54944:14;:23::i;:::-;54980;55006:10;:19;55017:7;55006:19;;;;;;;;;;;54980:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55036:18;55057:10;:8;:10::i;:::-;55036:31;;55165:1;55149:4;55143:18;:23;55139:72;;;55190:9;55183:16;;;;;;55139:72;55341:1;55321:9;55315:23;:27;55311:108;;;55390:4;55396:9;55373:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55359:48;;;;;;55311:108;55438:23;55453:7;55438:14;:23::i;:::-;55431:30;;;;54845:624;;;;:::o;45236:110::-;45312:26;45322:2;45326:7;45312:26;;;;;;;;;;;;:9;:26::i;:::-;45236:110;;:::o;55625:217::-;55725:16;55733:7;55725;:16::i;:::-;55717:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;55825:9;55803:10;:19;55814:7;55803:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;55625:217;;:::o;44335:128::-;44400:4;44453:1;44424:31;;:17;44433:7;44424:8;:17::i;:::-;:31;;;;44417:38;;44335:128;;;:::o;53016:410::-;53206:1;53194:9;:13;53190:229;;;53244:1;53228:18;;:4;:18;;;53224:87;;53286:9;53267;:15;53277:4;53267:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;53224:87;53343:1;53329:16;;:2;:16;;;53325:83;;53383:9;53366;:13;53376:2;53366:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;53325:83;53190:229;53016:410;;;;:::o;54148:158::-;;;;;:::o;51431:853::-;51585:4;51606:15;:2;:13;;;:15::i;:::-;51602:675;;;51658:2;51642:36;;;51679:12;:10;:12::i;:::-;51693:4;51699:7;51708:4;51642:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51638:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51900:1;51883:6;:13;:18;51879:328;;;51926:60;;;;;;;;;;:::i;:::-;;;;;;;;51879:328;52157:6;52151:13;52142:6;52138:2;52134:15;52127:38;51638:584;51774:41;;;51764:51;;;:6;:51;;;;51757:58;;;;;51602:675;52261:4;52254:11;;51431:853;;;;;;;:::o;40275:94::-;40326:13;40352:9;;;;;;;;;;;;;;40275:94;:::o;39745:281::-;39818:13;39844:23;39859:7;39844:14;:23::i;:::-;39880:21;39904:10;:8;:10::i;:::-;39880:34;;39956:1;39938:7;39932:21;:25;:86;;;;;;;;;;;;;;;;;39984:7;39993:18;:7;:16;:18::i;:::-;39967:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39932:86;39925:93;;;39745:281;;;:::o;45573:319::-;45702:18;45708:2;45712:7;45702:5;:18::i;:::-;45753:53;45784:1;45788:2;45792:7;45801:4;45753:22;:53::i;:::-;45731:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;45573:319;;;:::o;19918:326::-;19978:4;20235:1;20213:7;:19;;;:23;20206:30;;19918:326;;;:::o;13180:716::-;13236:13;13287:14;13324:1;13304:17;13315:5;13304:10;:17::i;:::-;:21;13287:38;;13340:20;13374:6;13363:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13340:41;;13396:11;13525:6;13521:2;13517:15;13509:6;13505:28;13498:35;;13562:288;13569:4;13562:288;;;13594:5;;;;;;;;13736:8;13731:2;13724:5;13720:14;13715:30;13710:3;13702:44;13792:2;13783:11;;;;;;:::i;:::-;;;;;13826:1;13817:5;:10;13813:21;;;13829:5;;13813:21;13562:288;;;13871:6;13864:13;;;;;13180:716;;;:::o;46228:942::-;46322:1;46308:16;;:2;:16;;;;46300:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;46381:16;46389:7;46381;:16::i;:::-;46380:17;46372:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;46443:48;46472:1;46476:2;46480:7;46489:1;46443:20;:48::i;:::-;46590:16;46598:7;46590;:16::i;:::-;46589:17;46581:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;47005:1;46988:9;:13;46998:2;46988:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;47049:2;47030:7;:16;47038:7;47030:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;47094:7;47090:2;47069:33;;47086:1;47069:33;;;;;;;;;;;;47115:47;47143:1;47147:2;47151:7;47160:1;47115:19;:47::i;:::-;46228:942;;:::o;10040:922::-;10093:7;10113:14;10130:1;10113:18;;10180:6;10171:5;:15;10167:102;;10216:6;10207:15;;;;;;:::i;:::-;;;;;10251:2;10241:12;;;;10167:102;10296:6;10287:5;:15;10283:102;;10332:6;10323:15;;;;;;:::i;:::-;;;;;10367:2;10357:12;;;;10283:102;10412:6;10403:5;:15;10399:102;;10448:6;10439:15;;;;;;:::i;:::-;;;;;10483:2;10473:12;;;;10399:102;10528:5;10519;:14;10515:99;;10563:5;10554:14;;;;;;:::i;:::-;;;;;10597:1;10587:11;;;;10515:99;10641:5;10632;:14;10628:99;;10676:5;10667:14;;;;;;:::i;:::-;;;;;10710:1;10700:11;;;;10628:99;10754:5;10745;:14;10741:99;;10789:5;10780:14;;;;;;:::i;:::-;;;;;10823:1;10813:11;;;;10741:99;10867:5;10858;:14;10854:66;;10903:1;10893:11;;;;10854:66;10948:6;10941:13;;;10040:922;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:619::-;5015:6;5023;5031;5080:2;5068:9;5059:7;5055:23;5051:32;5048:119;;;5086:79;;:::i;:::-;5048:119;5206:1;5231:53;5276:7;5267:6;5256:9;5252:22;5231:53;:::i;:::-;5221:63;;5177:117;5333:2;5359:53;5404:7;5395:6;5384:9;5380:22;5359:53;:::i;:::-;5349:63;;5304:118;5461:2;5487:53;5532:7;5523:6;5512:9;5508:22;5487:53;:::i;:::-;5477:63;;5432:118;4938:619;;;;;:::o;5563:329::-;5622:6;5671:2;5659:9;5650:7;5646:23;5642:32;5639:119;;;5677:79;;:::i;:::-;5639:119;5797:1;5822:53;5867:7;5858:6;5847:9;5843:22;5822:53;:::i;:::-;5812:63;;5768:117;5563:329;;;;:::o;5898:118::-;5985:24;6003:5;5985:24;:::i;:::-;5980:3;5973:37;5898:118;;:::o;6022:222::-;6115:4;6153:2;6142:9;6138:18;6130:26;;6166:71;6234:1;6223:9;6219:17;6210:6;6166:71;:::i;:::-;6022:222;;;;:::o;6250:116::-;6320:21;6335:5;6320:21;:::i;:::-;6313:5;6310:32;6300:60;;6356:1;6353;6346:12;6300:60;6250:116;:::o;6372:133::-;6415:5;6453:6;6440:20;6431:29;;6469:30;6493:5;6469:30;:::i;:::-;6372:133;;;;:::o;6511:468::-;6576:6;6584;6633:2;6621:9;6612:7;6608:23;6604:32;6601:119;;;6639:79;;:::i;:::-;6601:119;6759:1;6784:53;6829:7;6820:6;6809:9;6805:22;6784:53;:::i;:::-;6774:63;;6730:117;6886:2;6912:50;6954:7;6945:6;6934:9;6930:22;6912:50;:::i;:::-;6902:60;;6857:115;6511:468;;;;;:::o;6985:117::-;7094:1;7091;7084:12;7108:117;7217:1;7214;7207:12;7231:180;7279:77;7276:1;7269:88;7376:4;7373:1;7366:15;7400:4;7397:1;7390:15;7417:281;7500:27;7522:4;7500:27;:::i;:::-;7492:6;7488:40;7630:6;7618:10;7615:22;7594:18;7582:10;7579:34;7576:62;7573:88;;;7641:18;;:::i;:::-;7573:88;7681:10;7677:2;7670:22;7460:238;7417:281;;:::o;7704:129::-;7738:6;7765:20;;:::i;:::-;7755:30;;7794:33;7822:4;7814:6;7794:33;:::i;:::-;7704:129;;;:::o;7839:307::-;7900:4;7990:18;7982:6;7979:30;7976:56;;;8012:18;;:::i;:::-;7976:56;8050:29;8072:6;8050:29;:::i;:::-;8042:37;;8134:4;8128;8124:15;8116:23;;7839:307;;;:::o;8152:154::-;8236:6;8231:3;8226;8213:30;8298:1;8289:6;8284:3;8280:16;8273:27;8152:154;;;:::o;8312:410::-;8389:5;8414:65;8430:48;8471:6;8430:48;:::i;:::-;8414:65;:::i;:::-;8405:74;;8502:6;8495:5;8488:21;8540:4;8533:5;8529:16;8578:3;8569:6;8564:3;8560:16;8557:25;8554:112;;;8585:79;;:::i;:::-;8554:112;8675:41;8709:6;8704:3;8699;8675:41;:::i;:::-;8395:327;8312:410;;;;;:::o;8741:338::-;8796:5;8845:3;8838:4;8830:6;8826:17;8822:27;8812:122;;8853:79;;:::i;:::-;8812:122;8970:6;8957:20;8995:78;9069:3;9061:6;9054:4;9046:6;9042:17;8995:78;:::i;:::-;8986:87;;8802:277;8741:338;;;;:::o;9085:943::-;9180:6;9188;9196;9204;9253:3;9241:9;9232:7;9228:23;9224:33;9221:120;;;9260:79;;:::i;:::-;9221:120;9380:1;9405:53;9450:7;9441:6;9430:9;9426:22;9405:53;:::i;:::-;9395:63;;9351:117;9507:2;9533:53;9578:7;9569:6;9558:9;9554:22;9533:53;:::i;:::-;9523:63;;9478:118;9635:2;9661:53;9706:7;9697:6;9686:9;9682:22;9661:53;:::i;:::-;9651:63;;9606:118;9791:2;9780:9;9776:18;9763:32;9822:18;9814:6;9811:30;9808:117;;;9844:79;;:::i;:::-;9808:117;9949:62;10003:7;9994:6;9983:9;9979:22;9949:62;:::i;:::-;9939:72;;9734:287;9085:943;;;;;;;:::o;10034:308::-;10096:4;10186:18;10178:6;10175:30;10172:56;;;10208:18;;:::i;:::-;10172:56;10246:29;10268:6;10246:29;:::i;:::-;10238:37;;10330:4;10324;10320:15;10312:23;;10034:308;;;:::o;10348:412::-;10426:5;10451:66;10467:49;10509:6;10467:49;:::i;:::-;10451:66;:::i;:::-;10442:75;;10540:6;10533:5;10526:21;10578:4;10571:5;10567:16;10616:3;10607:6;10602:3;10598:16;10595:25;10592:112;;;10623:79;;:::i;:::-;10592:112;10713:41;10747:6;10742:3;10737;10713:41;:::i;:::-;10432:328;10348:412;;;;;:::o;10780:340::-;10836:5;10885:3;10878:4;10870:6;10866:17;10862:27;10852:122;;10893:79;;:::i;:::-;10852:122;11010:6;10997:20;11035:79;11110:3;11102:6;11095:4;11087:6;11083:17;11035:79;:::i;:::-;11026:88;;10842:278;10780:340;;;;:::o;11126:799::-;11213:6;11221;11229;11278:2;11266:9;11257:7;11253:23;11249:32;11246:119;;;11284:79;;:::i;:::-;11246:119;11404:1;11429:53;11474:7;11465:6;11454:9;11450:22;11429:53;:::i;:::-;11419:63;;11375:117;11531:2;11557:53;11602:7;11593:6;11582:9;11578:22;11557:53;:::i;:::-;11547:63;;11502:118;11687:2;11676:9;11672:18;11659:32;11718:18;11710:6;11707:30;11704:117;;;11740:79;;:::i;:::-;11704:117;11845:63;11900:7;11891:6;11880:9;11876:22;11845:63;:::i;:::-;11835:73;;11630:288;11126:799;;;;;:::o;11931:474::-;11999:6;12007;12056:2;12044:9;12035:7;12031:23;12027:32;12024:119;;;12062:79;;:::i;:::-;12024:119;12182:1;12207:53;12252:7;12243:6;12232:9;12228:22;12207:53;:::i;:::-;12197:63;;12153:117;12309:2;12335:53;12380:7;12371:6;12360:9;12356:22;12335:53;:::i;:::-;12325:63;;12280:118;11931:474;;;;;:::o;12411:180::-;12459:77;12456:1;12449:88;12556:4;12553:1;12546:15;12580:4;12577:1;12570:15;12597:320;12641:6;12678:1;12672:4;12668:12;12658:22;;12725:1;12719:4;12715:12;12746:18;12736:81;;12802:4;12794:6;12790:17;12780:27;;12736:81;12864:2;12856:6;12853:14;12833:18;12830:38;12827:84;;;12883:18;;:::i;:::-;12827:84;12648:269;12597:320;;;:::o;12923:220::-;13063:34;13059:1;13051:6;13047:14;13040:58;13132:3;13127:2;13119:6;13115:15;13108:28;12923:220;:::o;13149:366::-;13291:3;13312:67;13376:2;13371:3;13312:67;:::i;:::-;13305:74;;13388:93;13477:3;13388:93;:::i;:::-;13506:2;13501:3;13497:12;13490:19;;13149:366;;;:::o;13521:419::-;13687:4;13725:2;13714:9;13710:18;13702:26;;13774:9;13768:4;13764:20;13760:1;13749:9;13745:17;13738:47;13802:131;13928:4;13802:131;:::i;:::-;13794:139;;13521:419;;;:::o;13946:248::-;14086:34;14082:1;14074:6;14070:14;14063:58;14155:31;14150:2;14142:6;14138:15;14131:56;13946:248;:::o;14200:366::-;14342:3;14363:67;14427:2;14422:3;14363:67;:::i;:::-;14356:74;;14439:93;14528:3;14439:93;:::i;:::-;14557:2;14552:3;14548:12;14541:19;;14200:366;;;:::o;14572:419::-;14738:4;14776:2;14765:9;14761:18;14753:26;;14825:9;14819:4;14815:20;14811:1;14800:9;14796:17;14789:47;14853:131;14979:4;14853:131;:::i;:::-;14845:139;;14572:419;;;:::o;14997:232::-;15137:34;15133:1;15125:6;15121:14;15114:58;15206:15;15201:2;15193:6;15189:15;15182:40;14997:232;:::o;15235:366::-;15377:3;15398:67;15462:2;15457:3;15398:67;:::i;:::-;15391:74;;15474:93;15563:3;15474:93;:::i;:::-;15592:2;15587:3;15583:12;15576:19;;15235:366;;;:::o;15607:419::-;15773:4;15811:2;15800:9;15796:18;15788:26;;15860:9;15854:4;15850:20;15846:1;15835:9;15831:17;15824:47;15888:131;16014:4;15888:131;:::i;:::-;15880:139;;15607:419;;;:::o;16032:174::-;16172:26;16168:1;16160:6;16156:14;16149:50;16032:174;:::o;16212:366::-;16354:3;16375:67;16439:2;16434:3;16375:67;:::i;:::-;16368:74;;16451:93;16540:3;16451:93;:::i;:::-;16569:2;16564:3;16560:12;16553:19;;16212:366;;;:::o;16584:419::-;16750:4;16788:2;16777:9;16773:18;16765:26;;16837:9;16831:4;16827:20;16823:1;16812:9;16808:17;16801:47;16865:131;16991:4;16865:131;:::i;:::-;16857:139;;16584:419;;;:::o;17009:228::-;17149:34;17145:1;17137:6;17133:14;17126:58;17218:11;17213:2;17205:6;17201:15;17194:36;17009:228;:::o;17243:366::-;17385:3;17406:67;17470:2;17465:3;17406:67;:::i;:::-;17399:74;;17482:93;17571:3;17482:93;:::i;:::-;17600:2;17595:3;17591:12;17584:19;;17243:366;;;:::o;17615:419::-;17781:4;17819:2;17808:9;17804:18;17796:26;;17868:9;17862:4;17858:20;17854:1;17843:9;17839:17;17832:47;17896:131;18022:4;17896:131;:::i;:::-;17888:139;;17615:419;;;:::o;18040:225::-;18180:34;18176:1;18168:6;18164:14;18157:58;18249:8;18244:2;18236:6;18232:15;18225:33;18040:225;:::o;18271:366::-;18413:3;18434:67;18498:2;18493:3;18434:67;:::i;:::-;18427:74;;18510:93;18599:3;18510:93;:::i;:::-;18628:2;18623:3;18619:12;18612:19;;18271:366;;;:::o;18643:419::-;18809:4;18847:2;18836:9;18832:18;18824:26;;18896:9;18890:4;18886:20;18882:1;18871:9;18867:17;18860:47;18924:131;19050:4;18924:131;:::i;:::-;18916:139;;18643:419;;;:::o;19068:224::-;19208:34;19204:1;19196:6;19192:14;19185:58;19277:7;19272:2;19264:6;19260:15;19253:32;19068:224;:::o;19298:366::-;19440:3;19461:67;19525:2;19520:3;19461:67;:::i;:::-;19454:74;;19537:93;19626:3;19537:93;:::i;:::-;19655:2;19650:3;19646:12;19639:19;;19298:366;;;:::o;19670:419::-;19836:4;19874:2;19863:9;19859:18;19851:26;;19923:9;19917:4;19913:20;19909:1;19898:9;19894:17;19887:47;19951:131;20077:4;19951:131;:::i;:::-;19943:139;;19670:419;;;:::o;20095:223::-;20235:34;20231:1;20223:6;20219:14;20212:58;20304:6;20299:2;20291:6;20287:15;20280:31;20095:223;:::o;20324:366::-;20466:3;20487:67;20551:2;20546:3;20487:67;:::i;:::-;20480:74;;20563:93;20652:3;20563:93;:::i;:::-;20681:2;20676:3;20672:12;20665:19;;20324:366;;;:::o;20696:419::-;20862:4;20900:2;20889:9;20885:18;20877:26;;20949:9;20943:4;20939:20;20935:1;20924:9;20920:17;20913:47;20977:131;21103:4;20977:131;:::i;:::-;20969:139;;20696:419;;;:::o;21121:182::-;21261:34;21257:1;21249:6;21245:14;21238:58;21121:182;:::o;21309:366::-;21451:3;21472:67;21536:2;21531:3;21472:67;:::i;:::-;21465:74;;21548:93;21637:3;21548:93;:::i;:::-;21666:2;21661:3;21657:12;21650:19;;21309:366;;;:::o;21681:419::-;21847:4;21885:2;21874:9;21870:18;21862:26;;21934:9;21928:4;21924:20;21920:1;21909:9;21905:17;21898:47;21962:131;22088:4;21962:131;:::i;:::-;21954:139;;21681:419;;;:::o;22106:175::-;22246:27;22242:1;22234:6;22230:14;22223:51;22106:175;:::o;22287:366::-;22429:3;22450:67;22514:2;22509:3;22450:67;:::i;:::-;22443:74;;22526:93;22615:3;22526:93;:::i;:::-;22644:2;22639:3;22635:12;22628:19;;22287:366;;;:::o;22659:419::-;22825:4;22863:2;22852:9;22848:18;22840:26;;22912:9;22906:4;22902:20;22898:1;22887:9;22883:17;22876:47;22940:131;23066:4;22940:131;:::i;:::-;22932:139;;22659:419;;;:::o;23084:237::-;23224:34;23220:1;23212:6;23208:14;23201:58;23293:20;23288:2;23280:6;23276:15;23269:45;23084:237;:::o;23327:366::-;23469:3;23490:67;23554:2;23549:3;23490:67;:::i;:::-;23483:74;;23566:93;23655:3;23566:93;:::i;:::-;23684:2;23679:3;23675:12;23668:19;;23327:366;;;:::o;23699:419::-;23865:4;23903:2;23892:9;23888:18;23880:26;;23952:9;23946:4;23942:20;23938:1;23927:9;23923:17;23916:47;23980:131;24106:4;23980:131;:::i;:::-;23972:139;;23699:419;;;:::o;24124:148::-;24226:11;24263:3;24248:18;;24124:148;;;;:::o;24278:377::-;24384:3;24412:39;24445:5;24412:39;:::i;:::-;24467:89;24549:6;24544:3;24467:89;:::i;:::-;24460:96;;24565:52;24610:6;24605:3;24598:4;24591:5;24587:16;24565:52;:::i;:::-;24642:6;24637:3;24633:16;24626:23;;24388:267;24278:377;;;;:::o;24661:435::-;24841:3;24863:95;24954:3;24945:6;24863:95;:::i;:::-;24856:102;;24975:95;25066:3;25057:6;24975:95;:::i;:::-;24968:102;;25087:3;25080:10;;24661:435;;;;;:::o;25102:233::-;25242:34;25238:1;25230:6;25226:14;25219:58;25311:16;25306:2;25298:6;25294:15;25287:41;25102:233;:::o;25341:366::-;25483:3;25504:67;25568:2;25563:3;25504:67;:::i;:::-;25497:74;;25580:93;25669:3;25580:93;:::i;:::-;25698:2;25693:3;25689:12;25682:19;;25341:366;;;:::o;25713:419::-;25879:4;25917:2;25906:9;25902:18;25894:26;;25966:9;25960:4;25956:20;25952:1;25941:9;25937:17;25930:47;25994:131;26120:4;25994:131;:::i;:::-;25986:139;;25713:419;;;:::o;26138:180::-;26186:77;26183:1;26176:88;26283:4;26280:1;26273:15;26307:4;26304:1;26297:15;26324:191;26364:4;26384:20;26402:1;26384:20;:::i;:::-;26379:25;;26418:20;26436:1;26418:20;:::i;:::-;26413:25;;26457:1;26454;26451:8;26448:34;;;26462:18;;:::i;:::-;26448:34;26507:1;26504;26500:9;26492:17;;26324:191;;;;:::o;26521:305::-;26561:3;26580:20;26598:1;26580:20;:::i;:::-;26575:25;;26614:20;26632:1;26614:20;:::i;:::-;26609:25;;26768:1;26700:66;26696:74;26693:1;26690:81;26687:107;;;26774:18;;:::i;:::-;26687:107;26818:1;26815;26811:9;26804:16;;26521:305;;;;:::o;26832:98::-;26883:6;26917:5;26911:12;26901:22;;26832:98;;;:::o;26936:168::-;27019:11;27053:6;27048:3;27041:19;27093:4;27088:3;27084:14;27069:29;;26936:168;;;;:::o;27110:360::-;27196:3;27224:38;27256:5;27224:38;:::i;:::-;27278:70;27341:6;27336:3;27278:70;:::i;:::-;27271:77;;27357:52;27402:6;27397:3;27390:4;27383:5;27379:16;27357:52;:::i;:::-;27434:29;27456:6;27434:29;:::i;:::-;27429:3;27425:39;27418:46;;27200:270;27110:360;;;;:::o;27476:640::-;27671:4;27709:3;27698:9;27694:19;27686:27;;27723:71;27791:1;27780:9;27776:17;27767:6;27723:71;:::i;:::-;27804:72;27872:2;27861:9;27857:18;27848:6;27804:72;:::i;:::-;27886;27954:2;27943:9;27939:18;27930:6;27886:72;:::i;:::-;28005:9;27999:4;27995:20;27990:2;27979:9;27975:18;27968:48;28033:76;28104:4;28095:6;28033:76;:::i;:::-;28025:84;;27476:640;;;;;;;:::o;28122:141::-;28178:5;28209:6;28203:13;28194:22;;28225:32;28251:5;28225:32;:::i;:::-;28122:141;;;;:::o;28269:349::-;28338:6;28387:2;28375:9;28366:7;28362:23;28358:32;28355:119;;;28393:79;;:::i;:::-;28355:119;28513:1;28538:63;28593:7;28584:6;28573:9;28569:22;28538:63;:::i;:::-;28528:73;;28484:127;28269:349;;;;:::o;28624:180::-;28672:77;28669:1;28662:88;28769:4;28766:1;28759:15;28793:4;28790:1;28783:15;28810:182;28950:34;28946:1;28938:6;28934:14;28927:58;28810:182;:::o;28998:366::-;29140:3;29161:67;29225:2;29220:3;29161:67;:::i;:::-;29154:74;;29237:93;29326:3;29237:93;:::i;:::-;29355:2;29350:3;29346:12;29339:19;;28998:366;;;:::o;29370:419::-;29536:4;29574:2;29563:9;29559:18;29551:26;;29623:9;29617:4;29613:20;29609:1;29598:9;29594:17;29587:47;29651:131;29777:4;29651:131;:::i;:::-;29643:139;;29370:419;;;:::o;29795:178::-;29935:30;29931:1;29923:6;29919:14;29912:54;29795:178;:::o;29979:366::-;30121:3;30142:67;30206:2;30201:3;30142:67;:::i;:::-;30135:74;;30218:93;30307:3;30218:93;:::i;:::-;30336:2;30331:3;30327:12;30320:19;;29979:366;;;:::o;30351:419::-;30517:4;30555:2;30544:9;30540:18;30532:26;;30604:9;30598:4;30594:20;30590:1;30579:9;30575:17;30568:47;30632:131;30758:4;30632:131;:::i;:::-;30624:139;;30351:419;;;:::o
Swarm Source
ipfs://76edfada72440b0d5b312960477cb53943e3866c7ea1be0b4f138259e82a5a70
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.