Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
5,555 LAJ
Holders
1,798
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 LAJLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
LifesAJoke
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-02 */ // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/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/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: erc721b/contracts/ERC721B.sol pragma solidity ^0.8.0; error InvalidCall(); error BalanceQueryZeroAddress(); error NonExistentToken(); error ApprovalToCurrentOwner(); error ApprovalOwnerIsOperator(); error NotERC721Receiver(); error ERC721ReceiverNotReceived(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] * Non-Fungible Token Standard, including the Metadata extension and * token Auto-ID generation. * * You must provide `name()` `symbol()` and `tokenURI(uint256 tokenId)` * to conform with IERC721Metadata */ abstract contract ERC721B is Context, ERC165, IERC721 { // ============ Storage ============ // The last token id minted uint256 private _lastTokenId; // Mapping from token ID to owner address mapping(uint256 => address) internal _owners; // Mapping owner address to token count mapping(address => uint256) internal _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; // ============ Read Methods ============ /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns(uint256) { if (owner == address(0)) revert BalanceQueryZeroAddress(); return _balances[owner]; } /** * @dev Shows the overall amount of tokens generated in the contract */ function totalSupply() public view virtual returns(uint256) { return _lastTokenId; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns(address) { unchecked { //this is the situation when _owners normalized uint256 id = tokenId; if (_owners[id] != address(0)) { return _owners[id]; } //this is the situation when _owners is not normalized if (id > 0 && id <= _lastTokenId) { //there will never be a case where token 1 is address(0) while(true) { id--; if (id == 0) { break; } else if (_owners[id] != address(0)) { return _owners[id]; } } } } revert NonExistentToken(); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns(bool) { return interfaceId == type(IERC721).interfaceId || super.supportsInterface(interfaceId); } // ============ Approval Methods ============ /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721B.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); address sender = _msgSender(); if (sender != owner && !isApprovedForAll(owner, sender)) revert ApprovalToCurrentOwner(); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns(address) { if (!_exists(tokenId)) revert NonExistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId, address owner) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev transfers token considering approvals */ function _approveTransfer( address spender, address from, address to, uint256 tokenId ) internal virtual { if (!_isApprovedOrOwner(spender, tokenId, from)) revert InvalidCall(); _transfer(from, to, tokenId); } /** * @dev Safely transfers token considering approvals */ function _approveSafeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _approveTransfer(_msgSender(), from, to, tokenId); //see: @openzep/utils/Address.sol if (to.code.length > 0 && !_checkOnERC721Received(from, to, tokenId, _data) ) revert ERC721ReceiverNotReceived(); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner( address spender, uint256 tokenId, address owner ) internal view virtual returns(bool) { return spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { if (owner == operator) revert ApprovalOwnerIsOperator(); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } // ============ Mint Methods ============ /** * @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 amount, bytes memory _data, bool safeCheck ) private { if(amount == 0 || to == address(0)) revert InvalidCall(); uint256 startTokenId = _lastTokenId + 1; _beforeTokenTransfers(address(0), to, startTokenId, amount); unchecked { _lastTokenId += amount; _balances[to] += amount; _owners[startTokenId] = to; _afterTokenTransfers(address(0), to, startTokenId, amount); uint256 updatedIndex = startTokenId; uint256 endIndex = updatedIndex + amount; //if do safe check and, //check if contract one time (instead of loop) //see: @openzep/utils/Address.sol if (safeCheck && to.code.length > 0) { //loop emit transfer and received check do { emit Transfer(address(0), to, updatedIndex); if (!_checkOnERC721Received(address(0), to, updatedIndex++, _data)) revert ERC721ReceiverNotReceived(); } while (updatedIndex != endIndex); return; } do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != endIndex); } } /** * @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 amount) internal virtual { _safeMint(to, amount, ""); } /** * @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 amount, bytes memory _data ) internal virtual { _mint(to, amount, _data, true); } // ============ Transfer Methods ============ /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _approveTransfer(_msgSender(), 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 { _approveSafeTransfer(from, to, tokenId, _data); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} * on a target address. The call is not executed if the target address * is not a contract. */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { 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 NotERC721Receiver(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @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 tokenId > 0 && tokenId <= _lastTokenId; } /** * @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); //see: @openzep/utils/Address.sol if (to.code.length > 0 && !_checkOnERC721Received(from, to, tokenId, _data) ) revert ERC721ReceiverNotReceived(); } /** * @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) private { //if transfer to null or not the owner if (to == address(0) || from != ERC721B.ownerOf(tokenId)) revert InvalidCall(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); unchecked { //this is the situation when _owners are normalized _balances[to] += 1; _balances[from] -= 1; _owners[tokenId] = to; //this is the situation when _owners are not normalized uint256 nextTokenId = tokenId + 1; if (nextTokenId <= _lastTokenId && _owners[nextTokenId] == address(0)) { _owners[nextTokenId] = from; } } _afterTokenTransfers(from, to, tokenId, 1); emit Transfer(from, to, tokenId); } // ============ TODO Methods ============ /** * @dev Hook that is called before a set of serially-ordered token ids * are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * amount - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` * will be transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 amount ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids * have been transferred. This includes minting. * * startTokenId - the first token id to be transferred * amount - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 amount ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: lifesajoke.sol pragma solidity ^0.8.0; contract LifesAJoke is Ownable,AccessControl,ReentrancyGuard,ERC721B,IERC721Metadata{ using Strings for uint256; bytes32 private constant _MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 private constant _APPROVED_ROLE = keccak256("APPROVED_ROLE"); bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; uint16 public constant MAX_SUPPLY = 5555; string private notRevealURI = "ipfs://bafkreiek6ux4f5rsgcomruroxlldosakkrvs74l74njui4m3bjka3fjyvy"; mapping(address => uint256) public minted; bool public isStartPublicSale = false; bool public isStartWhiteListSale = false; string private _baseTokenURI; string private _CONTRACT_URI = "ipfs://bafkreicih7gxqyngcsk7ip6wcoccfbz3wh6ecfabfgzmpybtkh7fiwg6vu"; uint256 public maxPerWallet = 1; uint256 public mintPrice = 0 ether; uint256 public creatorFees = 1000; address public treasury = 0xfa83B36104cbB964a001B91bc4154C673408FeD2; constructor() { _setupRole(DEFAULT_ADMIN_ROLE, 0xb98325778f105A6B57b9Ed79F563b26a88c5A0A3); } function isApprovedForAll( address owner, address operator ) public view override(ERC721B, IERC721) returns(bool) { return hasRole(_APPROVED_ROLE, operator) || super.isApprovedForAll(owner, operator); } function name() external pure override returns(string memory) { return "LifesAJokeNFT"; } function symbol() external pure override returns(string memory) { return "LAJ"; } function contractURI() external view returns(string memory) { return _CONTRACT_URI; } function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns ( address receiver, uint256 royaltyAmount ) { if (treasury == address(0) || !_exists(tokenId)) revert InvalidCall(); return ( payable(treasury), (salePrice * creatorFees) / 10000 ); } function tokenURI(uint256 tokenId) external view override returns(string memory) { if(!_exists(tokenId)) revert InvalidCall(); return bytes(_baseTokenURI).length > 0 ? string( abi.encodePacked(_baseTokenURI, tokenId.toString(), ".json") ) : notRevealURI; } function mint(uint256 quantity) external payable nonReentrant { address recipient = _msgSender(); if (recipient.code.length > 0 || !isStartPublicSale || quantity == 0 || (quantity + minted[recipient]) > maxPerWallet || (quantity * mintPrice) > msg.value || (totalSupply() + quantity) > MAX_SUPPLY ) revert InvalidCall(); minted[recipient] += quantity; _safeMint(recipient, quantity); } function whiteListMint( uint256 quantity, bytes memory proof ) external payable nonReentrant { address recipient = _msgSender(); if (quantity == 0 || !isStartWhiteListSale || (quantity + minted[recipient]) > maxPerWallet || (quantity * mintPrice) > msg.value || (totalSupply() + quantity) > MAX_SUPPLY || !hasRole(_MINTER_ROLE, ECDSA.recover( ECDSA.toEthSignedMessageHash( keccak256(abi.encodePacked("whiteListMint", recipient)) ), proof )) ) revert InvalidCall(); minted[recipient] += quantity; _safeMint(recipient, quantity); } function mintForAddress( address recipient, uint256 quantity ) external onlyOwner nonReentrant { if (quantity == 0 || (totalSupply() + quantity) > MAX_SUPPLY ) revert InvalidCall(); _safeMint(recipient, quantity); } function setBaseURI(string memory uri) external onlyOwner { _baseTokenURI = uri; } function setContractURI(string memory _uri) external onlyOwner { _CONTRACT_URI = _uri; } function setMaxPerWallet(uint256 max) external onlyOwner { maxPerWallet = max; } function setNotRevealURI(string memory _notRevealURI) external onlyOwner { notRevealURI = _notRevealURI; } function setMintPrice(uint256 price) external onlyOwner { mintPrice = price; } function setPausesStates(bool _isStartPublicSale,bool _isStartWhiteListSale) external onlyOwner { isStartPublicSale = _isStartPublicSale; isStartWhiteListSale = _isStartWhiteListSale; } function withdraw(address to) external onlyOwner nonReentrant { payable(to).transfer(address(this).balance); } function updateFees(uint256 percent) external onlyOwner { if (percent > 1000) revert InvalidCall(); creatorFees = percent; } function supportsInterface( bytes4 interfaceId ) public view override(AccessControl, ERC721B, IERC165) returns(bool) { return interfaceId == type(IERC721Metadata).interfaceId || interfaceId == _INTERFACE_ID_ERC2981 || super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalOwnerIsOperator","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"BalanceQueryZeroAddress","type":"error"},{"inputs":[],"name":"ERC721ReceiverNotReceived","type":"error"},{"inputs":[],"name":"InvalidCall","type":"error"},{"inputs":[],"name":"NonExistentToken","type":"error"},{"inputs":[],"name":"NotERC721Receiver","type":"error"},{"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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creatorFees","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":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isStartPublicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isStartWhiteListSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealURI","type":"string"}],"name":"setNotRevealURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isStartPublicSale","type":"bool"},{"internalType":"bool","name":"_isStartWhiteListSale","type":"bool"}],"name":"setPausesStates","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":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes","name":"proof","type":"bytes"}],"name":"whiteListMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
610100604052604260808181529062002b6060a03980516200002a91600891602090910190620001c9565b50600a805461ffff191690556040805160808101909152604280825262002ba2602083013980516200006591600c91602090910190620001c9565b506001600d556000600e556103e8600f55601080546001600160a01b03191673fa83b36104cbb964a001b91bc4154c673408fed2179055348015620000a957600080fd5b50620000b533620000e1565b6001600255620000db600073b98325778f105a6b57b9ed79f563b26a88c5a0a362000131565b620002ac565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6200013d828262000141565b5050565b60008281526001602090815260408083206001600160a01b038516845290915290205460ff166200013d5760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b828054620001d7906200026f565b90600052602060002090601f016020900481019282620001fb576000855562000246565b82601f106200021657805160ff191683800117855562000246565b8280016001018555821562000246579182015b828111156200024657825182559160200191906001019062000229565b506200025492915062000258565b5090565b5b8082111562000254576000815560010162000259565b600181811c908216806200028457607f821691505b60208210811415620002a657634e487b7160e01b600052602260045260246000fd5b50919050565b6128a480620002bc6000396000f3fe6080604052600436106102675760003560e01c806370a0823111610144578063bff0412e116100b6578063e8a3d4851161007a578063e8a3d4851461077a578063e985e9c51461078f578063f254933d146107af578063f2fde38b146107cf578063f4a0a528146107ef578063ff29fdaf1461080f57600080fd5b8063bff0412e146106e7578063c87b56dd14610707578063ca6b507614610727578063d547741f1461073a578063e268e4d31461075a57600080fd5b8063938e3d7b11610108578063938e3d7b1461063357806395d89b4114610653578063a0712d681461067f578063a217fddf14610692578063a22cb465146106a7578063b88d4fde146106c757600080fd5b806370a08231146105a0578063715018a6146105c057806378dacee1146105d55780638da5cb5b146105f557806391d148541461061357600080fd5b806332cb6b0c116101dd57806355f804b3116101a157806355f804b3146104f45780635accac991461051457806361d027b3146105345780636352211e146105545780636694ba61146105745780636817c76c1461058a57600080fd5b806332cb6b0c1461045557806336568abe1461047e57806342842e0e1461049e578063453c2310146104be57806351cff8d9146104d457600080fd5b80631e7269c51161022f5780631e7269c5146103595780631fe4d4841461038657806323b872dd146103a5578063248a9ca3146103c55780632a55205a146103f65780632f2ff15d1461043557600080fd5b806301ffc9a71461026c57806306fdde03146102a1578063081812fc146102e0578063095ea7b31461031857806318160ddd1461033a575b600080fd5b34801561027857600080fd5b5061028c6102873660046123f0565b610829565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b5060408051808201909152600d81526c131a59995cd0529bdad9539195609a1b60208201525b6040516102989190612691565b3480156102ec57600080fd5b506103006102fb3660046123b4565b61086f565b6040516001600160a01b039091168152602001610298565b34801561032457600080fd5b5061033861033336600461236e565b6108b3565b005b34801561034657600080fd5b506003545b604051908152602001610298565b34801561036557600080fd5b5061034b610374366004612252565b60096020526000908152604090205481565b34801561039257600080fd5b50600a5461028c90610100900460ff1681565b3480156103b157600080fd5b506103386103c03660046122a0565b610943565b3480156103d157600080fd5b5061034b6103e03660046123b4565b6000908152600160208190526040909120015490565b34801561040257600080fd5b506104166104113660046124ba565b610954565b604080516001600160a01b039093168352602083019190915201610298565b34801561044157600080fd5b506103386104503660046123cd565b6109cb565b34801561046157600080fd5b5061046b6115b381565b60405161ffff9091168152602001610298565b34801561048a57600080fd5b506103386104993660046123cd565b6109f1565b3480156104aa57600080fd5b506103386104b93660046122a0565b610a74565b3480156104ca57600080fd5b5061034b600d5481565b3480156104e057600080fd5b506103386104ef366004612252565b610a8f565b34801561050057600080fd5b5061033861050f36600461242a565b610afb565b34801561052057600080fd5b5061033861052f36600461242a565b610b16565b34801561054057600080fd5b50601054610300906001600160a01b031681565b34801561056057600080fd5b5061030061056f3660046123b4565b610b31565b34801561058057600080fd5b5061034b600f5481565b34801561059657600080fd5b5061034b600e5481565b3480156105ac57600080fd5b5061034b6105bb366004612252565b610bee565b3480156105cc57600080fd5b50610338610c33565b3480156105e157600080fd5b506103386105f03660046123b4565b610c47565b34801561060157600080fd5b506000546001600160a01b0316610300565b34801561061f57600080fd5b5061028c61062e3660046123cd565b610c77565b34801561063f57600080fd5b5061033861064e36600461242a565b610ca2565b34801561065f57600080fd5b506040805180820190915260038152622620a560e91b60208201526102d3565b61033861068d3660046123b4565b610cbd565b34801561069e57600080fd5b5061034b600081565b3480156106b357600080fd5b506103386106c2366004612344565b610db9565b3480156106d357600080fd5b506103386106e23660046122dc565b610dc4565b3480156106f357600080fd5b50610338610702366004612398565b610dd0565b34801561071357600080fd5b506102d36107223660046123b4565b610dfc565b610338610735366004612473565b610efb565b34801561074657600080fd5b506103386107553660046123cd565b6110c6565b34801561076657600080fd5b506103386107753660046123b4565b6110ec565b34801561078657600080fd5b506102d36110f9565b34801561079b57600080fd5b5061028c6107aa36600461226d565b61118b565b3480156107bb57600080fd5b506103386107ca36600461236e565b6111ee565b3480156107db57600080fd5b506103386107ea366004612252565b611265565b3480156107fb57600080fd5b5061033861080a3660046123b4565b6112de565b34801561081b57600080fd5b50600a5461028c9060ff1681565b60006001600160e01b03198216635b5e139f60e01b148061085a57506001600160e01b0319821663152a902d60e11b145b806108695750610869826112eb565b92915050565b600061087a82611310565b61089757604051634a1850bf60e11b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006108be82610b31565b9050806001600160a01b0316836001600160a01b031614156108f35760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821681148015906109145750610912828261118b565b155b156109325760405163250fdee360e21b815260040160405180910390fd5b61093d848484611325565b50505050565b61094f33848484611381565b505050565b60105460009081906001600160a01b03161580610977575061097584611310565b155b156109955760405163574b16a760e11b815260040160405180910390fd5b601054600f546001600160a01b0390911690612710906109b59086612707565b6109bf91906126f3565b915091505b9250929050565b600082815260016020819052604090912001546109e7816113b4565b61094f83836113be565b6001600160a01b0381163314610a665760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b610a708282611429565b5050565b61094f83838360405180602001604052806000815250610dc4565b610a97611490565b600280541415610ab95760405162461bcd60e51b8152600401610a5d906126a4565b600280556040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610af2573d6000803e3d6000fd5b50506001600255565b610b03611490565b8051610a7090600b9060208401906120f7565b610b1e611490565b8051610a709060089060208401906120f7565b60008181526004602052604081205482906001600160a01b031615610b6e576000908152600460205260409020546001600160a01b031692915050565b600081118015610b8057506003548111155b15610bd4575b6000190180610b9457610bd4565b6000818152600460205260409020546001600160a01b031615610bcf576000908152600460205260409020546001600160a01b031692915050565b610b86565b50604051634a1850bf60e11b815260040160405180910390fd5b60006001600160a01b038216610c17576040516316285dcb60e11b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205490565b610c3b611490565b610c4560006114ea565b565b610c4f611490565b6103e8811115610c725760405163574b16a760e11b815260040160405180910390fd5b600f55565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b610caa611490565b8051610a7090600c9060208401906120f7565b600280541415610cdf5760405162461bcd60e51b8152600401610a5d906126a4565b6002805533803b151580610cf65750600a5460ff16155b80610cff575081155b80610d2d5750600d546001600160a01b038216600090815260096020526040902054610d2b90846126db565b115b80610d44575034600e5483610d429190612707565b115b80610d6357506115b382610d5760035490565b610d6191906126db565b115b15610d815760405163574b16a760e11b815260040160405180910390fd5b6001600160a01b03811660009081526009602052604081208054849290610da99084906126db565b90915550610af29050818361153a565b610a70338383611554565b61093d848484846115f4565b610dd8611490565b600a805461ffff191692151561ff0019169290921761010091151591909102179055565b6060610e0782611310565b610e245760405163574b16a760e11b815260040160405180910390fd5b6000600b8054610e3390612780565b905011610eca5760088054610e4790612780565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7390612780565b8015610ec05780601f10610e9557610100808354040283529160200191610ec0565b820191906000526020600020905b815481529060010190602001808311610ea357829003601f168201915b5050505050610869565b600b610ed583611641565b604051602001610ee6929190612524565b60405160208183030381529060405292915050565b600280541415610f1d5760405162461bcd60e51b8152600401610a5d906126a4565b6002805533821580610f375750600a54610100900460ff16155b80610f655750600d546001600160a01b038216600090815260096020526040902054610f6390856126db565b115b80610f7c575034600e5484610f7a9190612707565b115b80610f9b57506115b383610f8f60035490565b610f9991906126db565b115b806110665750604080516c1dda1a5d19531a5cdd135a5b9d609a1b602080830191909152606084901b6bffffffffffffffffffffffff1916602d830152825160218184030181526041830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006061840152607d8084019190915283518084039091018152609d9092019092528051910120611064907f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a69061062e9085611747565b155b156110845760405163574b16a760e11b815260040160405180910390fd5b6001600160a01b038116600090815260096020526040812080548592906110ac9084906126db565b909155506110bc9050818461153a565b5050600160025550565b600082815260016020819052604090912001546110e2816113b4565b61094f8383611429565b6110f4611490565b600d55565b6060600c805461110890612780565b80601f016020809104026020016040519081016040528092919081815260200182805461113490612780565b80156111815780601f1061115657610100808354040283529160200191611181565b820191906000526020600020905b81548152906001019060200180831161116457829003601f168201915b5050505050905090565b60006111b77f4a0c3698e72495f6d49f6ef074f2b34cac5b153c817a7cc37789cccbb873cf5d83610c77565b806111e757506001600160a01b0380841660009081526007602090815260408083209386168352929052205460ff165b9392505050565b6111f6611490565b6002805414156112185760405162461bcd60e51b8152600401610a5d906126a4565b6002805580158061123d57506115b38161123160035490565b61123b91906126db565b115b1561125b5760405163574b16a760e11b815260040160405180910390fd5b610af2828261153a565b61126d611490565b6001600160a01b0381166112d25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a5d565b6112db816114ea565b50565b6112e6611490565b600e55565b60006001600160e01b031982166380ac58cd60e01b148061086957506108698261176b565b60008082118015610869575050600354101590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b61138c8482856117a0565b6113a95760405163574b16a760e11b815260040160405180910390fd5b61093d8383836117eb565b6112db8133611935565b6113c88282610c77565b610a705760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6114338282610c77565b15610a705760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000546001600160a01b03163314610c455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a5d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a70828260405180602001604052806000815250611999565b816001600160a01b0316836001600160a01b031614156115875760405163079f14e360e51b815260040160405180910390fd5b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61160033858585611381565b6000836001600160a01b03163b1180156116235750611621848484846119a6565b155b1561093d57604051631f11849560e21b815260040160405180910390fd5b6060816116655750506040805180820190915260018152600360fc1b602082015290565b8160005b811561168f5780611679816127bb565b91506116889050600a836126f3565b9150611669565b60008167ffffffffffffffff8111156116aa576116aa612842565b6040519080825280601f01601f1916602001820160405280156116d4576020820181803683370190505b5090505b841561173f576116e9600183612726565b91506116f6600a866127d6565b6117019060306126db565b60f81b8183815181106117165761171661282c565b60200101906001600160f81b031916908160001a905350611738600a866126f3565b94506116d8565b949350505050565b60008060006117568585611a9d565b9150915061176381611b0a565b509392505050565b60006001600160e01b03198216637965db0b60e01b148061086957506301ffc9a760e01b6001600160e01b0319831614610869565b6000816001600160a01b0316846001600160a01b031614806117db5750836001600160a01b03166117d08461086f565b6001600160a01b0316145b8061173f575061173f828561118b565b6001600160a01b038216158061181b575061180581610b31565b6001600160a01b0316836001600160a01b031614155b156118395760405163574b16a760e11b815260040160405180910390fd5b61184560008285611325565b6001600160a01b03808316600081815260056020908152604080832080546001908101909155948816835280832080546000190190558583526004909152902080546001600160a01b03191690911790556003549082019081118015906118c157506000818152600460205260409020546001600160a01b0316155b156118ee57600081815260046020526040902080546001600160a01b0319166001600160a01b0386161790555b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61193f8282610c77565b610a7057611957816001600160a01b03166014611cc5565b611962836020611cc5565b6040516020016119739291906125df565b60408051601f198184030181529082905262461bcd60e51b8252610a5d91600401612691565b61094f8383836001611e61565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906119db903390899088908890600401612654565b602060405180830381600087803b1580156119f557600080fd5b505af1925050508015611a25575060408051601f3d908101601f19168201909252611a229181019061240d565b60015b611a80573d808015611a53576040519150601f19603f3d011682016040523d82523d6000602084013e611a58565b606091505b508051611a7857604051630568cbab60e01b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b600080825160411415611ad45760208301516040840151606085015160001a611ac887828585611fd1565b945094505050506109c4565b825160401415611afe5760208301516040840151611af38683836120be565b9350935050506109c4565b506000905060026109c4565b6000816004811115611b1e57611b1e612816565b1415611b275750565b6001816004811115611b3b57611b3b612816565b1415611b895760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610a5d565b6002816004811115611b9d57611b9d612816565b1415611beb5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610a5d565b6003816004811115611bff57611bff612816565b1415611c585760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610a5d565b6004816004811115611c6c57611c6c612816565b14156112db5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610a5d565b60606000611cd4836002612707565b611cdf9060026126db565b67ffffffffffffffff811115611cf757611cf7612842565b6040519080825280601f01601f191660200182016040528015611d21576020820181803683370190505b509050600360fc1b81600081518110611d3c57611d3c61282c565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611d6b57611d6b61282c565b60200101906001600160f81b031916908160001a9053506000611d8f846002612707565b611d9a9060016126db565b90505b6001811115611e12576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611dce57611dce61282c565b1a60f81b828281518110611de457611de461282c565b60200101906001600160f81b031916908160001a90535060049490941c93611e0b81612769565b9050611d9d565b5083156111e75760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a5d565b821580611e7557506001600160a01b038416155b15611e935760405163574b16a760e11b815260040160405180910390fd5b60006003546001611ea491906126db565b905060038054850190556001600160a01b03851660008181526005602090815260408083208054890190558483526004909152902080546001600160a01b031916909117905580848101838015611f0557506000876001600160a01b03163b115b15611f83575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611f5660008884806001019550886119a6565b611f7357604051631f11849560e21b815260040160405180910390fd5b80821415611f0b5750505061093d565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415611f845750505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561200857506000905060036120b5565b8460ff16601b1415801561202057508460ff16601c14155b1561203157506000905060046120b5565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612085573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166120ae576000600192509250506120b5565b9150600090505b94509492505050565b6000806001600160ff1b038316816120db60ff86901c601b6126db565b90506120e987828885611fd1565b935093505050935093915050565b82805461210390612780565b90600052602060002090601f016020900481019282612125576000855561216b565b82601f1061213e57805160ff191683800117855561216b565b8280016001018555821561216b579182015b8281111561216b578251825591602001919060010190612150565b5061217792915061217b565b5090565b5b80821115612177576000815560010161217c565b600067ffffffffffffffff808411156121ab576121ab612842565b604051601f8501601f19908116603f011681019082821181831017156121d3576121d3612842565b816040528093508581528686860111156121ec57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461221d57600080fd5b919050565b8035801515811461221d57600080fd5b600082601f83011261224357600080fd5b6111e783833560208501612190565b60006020828403121561226457600080fd5b6111e782612206565b6000806040838503121561228057600080fd5b61228983612206565b915061229760208401612206565b90509250929050565b6000806000606084860312156122b557600080fd5b6122be84612206565b92506122cc60208501612206565b9150604084013590509250925092565b600080600080608085870312156122f257600080fd5b6122fb85612206565b935061230960208601612206565b925060408501359150606085013567ffffffffffffffff81111561232c57600080fd5b61233887828801612232565b91505092959194509250565b6000806040838503121561235757600080fd5b61236083612206565b915061229760208401612222565b6000806040838503121561238157600080fd5b61238a83612206565b946020939093013593505050565b600080604083850312156123ab57600080fd5b61236083612222565b6000602082840312156123c657600080fd5b5035919050565b600080604083850312156123e057600080fd5b8235915061229760208401612206565b60006020828403121561240257600080fd5b81356111e781612858565b60006020828403121561241f57600080fd5b81516111e781612858565b60006020828403121561243c57600080fd5b813567ffffffffffffffff81111561245357600080fd5b8201601f8101841361246457600080fd5b61173f84823560208401612190565b6000806040838503121561248657600080fd5b82359150602083013567ffffffffffffffff8111156124a457600080fd5b6124b085828601612232565b9150509250929050565b600080604083850312156124cd57600080fd5b50508035926020909101359150565b600081518084526124f481602086016020860161273d565b601f01601f19169290920160200192915050565b6000815161251a81856020860161273d565b9290920192915050565b600080845481600182811c91508083168061254057607f831692505b602080841082141561256057634e487b7160e01b86526022600452602486fd5b8180156125745760018114612585576125b2565b60ff198616895284890196506125b2565b60008b81526020902060005b868110156125aa5781548b820152908501908301612591565b505084890196505b5050505050506125d66125c58286612508565b64173539b7b760d91b815260050190565b95945050505050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161261781601785016020880161273d565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161264881602884016020880161273d565b01602801949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612687908301846124dc565b9695505050505050565b6020815260006111e760208301846124dc565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082198211156126ee576126ee6127ea565b500190565b60008261270257612702612800565b500490565b6000816000190483118215151615612721576127216127ea565b500290565b600082821015612738576127386127ea565b500390565b60005b83811015612758578181015183820152602001612740565b8381111561093d5750506000910152565b600081612778576127786127ea565b506000190190565b600181811c9082168061279457607f821691505b602082108114156127b557634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127cf576127cf6127ea565b5060010190565b6000826127e5576127e5612800565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146112db57600080fdfea2646970667358221220d3f0b10d8b44bb57a84778cc7b9827fd9bd0545f3bde5751e5326dcd4c7299d964736f6c63430008070033697066733a2f2f6261666b726569656b367578346635727367636f6d7275726f786c6c646f73616b6b72767337346c37346e6a7569346d33626a6b6133666a797679697066733a2f2f6261666b72656963696837677871796e6763736b3769703677636f636366627a33776836656366616266677a6d707962746b683766697767367675
Deployed Bytecode
0x6080604052600436106102675760003560e01c806370a0823111610144578063bff0412e116100b6578063e8a3d4851161007a578063e8a3d4851461077a578063e985e9c51461078f578063f254933d146107af578063f2fde38b146107cf578063f4a0a528146107ef578063ff29fdaf1461080f57600080fd5b8063bff0412e146106e7578063c87b56dd14610707578063ca6b507614610727578063d547741f1461073a578063e268e4d31461075a57600080fd5b8063938e3d7b11610108578063938e3d7b1461063357806395d89b4114610653578063a0712d681461067f578063a217fddf14610692578063a22cb465146106a7578063b88d4fde146106c757600080fd5b806370a08231146105a0578063715018a6146105c057806378dacee1146105d55780638da5cb5b146105f557806391d148541461061357600080fd5b806332cb6b0c116101dd57806355f804b3116101a157806355f804b3146104f45780635accac991461051457806361d027b3146105345780636352211e146105545780636694ba61146105745780636817c76c1461058a57600080fd5b806332cb6b0c1461045557806336568abe1461047e57806342842e0e1461049e578063453c2310146104be57806351cff8d9146104d457600080fd5b80631e7269c51161022f5780631e7269c5146103595780631fe4d4841461038657806323b872dd146103a5578063248a9ca3146103c55780632a55205a146103f65780632f2ff15d1461043557600080fd5b806301ffc9a71461026c57806306fdde03146102a1578063081812fc146102e0578063095ea7b31461031857806318160ddd1461033a575b600080fd5b34801561027857600080fd5b5061028c6102873660046123f0565b610829565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b5060408051808201909152600d81526c131a59995cd0529bdad9539195609a1b60208201525b6040516102989190612691565b3480156102ec57600080fd5b506103006102fb3660046123b4565b61086f565b6040516001600160a01b039091168152602001610298565b34801561032457600080fd5b5061033861033336600461236e565b6108b3565b005b34801561034657600080fd5b506003545b604051908152602001610298565b34801561036557600080fd5b5061034b610374366004612252565b60096020526000908152604090205481565b34801561039257600080fd5b50600a5461028c90610100900460ff1681565b3480156103b157600080fd5b506103386103c03660046122a0565b610943565b3480156103d157600080fd5b5061034b6103e03660046123b4565b6000908152600160208190526040909120015490565b34801561040257600080fd5b506104166104113660046124ba565b610954565b604080516001600160a01b039093168352602083019190915201610298565b34801561044157600080fd5b506103386104503660046123cd565b6109cb565b34801561046157600080fd5b5061046b6115b381565b60405161ffff9091168152602001610298565b34801561048a57600080fd5b506103386104993660046123cd565b6109f1565b3480156104aa57600080fd5b506103386104b93660046122a0565b610a74565b3480156104ca57600080fd5b5061034b600d5481565b3480156104e057600080fd5b506103386104ef366004612252565b610a8f565b34801561050057600080fd5b5061033861050f36600461242a565b610afb565b34801561052057600080fd5b5061033861052f36600461242a565b610b16565b34801561054057600080fd5b50601054610300906001600160a01b031681565b34801561056057600080fd5b5061030061056f3660046123b4565b610b31565b34801561058057600080fd5b5061034b600f5481565b34801561059657600080fd5b5061034b600e5481565b3480156105ac57600080fd5b5061034b6105bb366004612252565b610bee565b3480156105cc57600080fd5b50610338610c33565b3480156105e157600080fd5b506103386105f03660046123b4565b610c47565b34801561060157600080fd5b506000546001600160a01b0316610300565b34801561061f57600080fd5b5061028c61062e3660046123cd565b610c77565b34801561063f57600080fd5b5061033861064e36600461242a565b610ca2565b34801561065f57600080fd5b506040805180820190915260038152622620a560e91b60208201526102d3565b61033861068d3660046123b4565b610cbd565b34801561069e57600080fd5b5061034b600081565b3480156106b357600080fd5b506103386106c2366004612344565b610db9565b3480156106d357600080fd5b506103386106e23660046122dc565b610dc4565b3480156106f357600080fd5b50610338610702366004612398565b610dd0565b34801561071357600080fd5b506102d36107223660046123b4565b610dfc565b610338610735366004612473565b610efb565b34801561074657600080fd5b506103386107553660046123cd565b6110c6565b34801561076657600080fd5b506103386107753660046123b4565b6110ec565b34801561078657600080fd5b506102d36110f9565b34801561079b57600080fd5b5061028c6107aa36600461226d565b61118b565b3480156107bb57600080fd5b506103386107ca36600461236e565b6111ee565b3480156107db57600080fd5b506103386107ea366004612252565b611265565b3480156107fb57600080fd5b5061033861080a3660046123b4565b6112de565b34801561081b57600080fd5b50600a5461028c9060ff1681565b60006001600160e01b03198216635b5e139f60e01b148061085a57506001600160e01b0319821663152a902d60e11b145b806108695750610869826112eb565b92915050565b600061087a82611310565b61089757604051634a1850bf60e11b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006108be82610b31565b9050806001600160a01b0316836001600160a01b031614156108f35760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821681148015906109145750610912828261118b565b155b156109325760405163250fdee360e21b815260040160405180910390fd5b61093d848484611325565b50505050565b61094f33848484611381565b505050565b60105460009081906001600160a01b03161580610977575061097584611310565b155b156109955760405163574b16a760e11b815260040160405180910390fd5b601054600f546001600160a01b0390911690612710906109b59086612707565b6109bf91906126f3565b915091505b9250929050565b600082815260016020819052604090912001546109e7816113b4565b61094f83836113be565b6001600160a01b0381163314610a665760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b610a708282611429565b5050565b61094f83838360405180602001604052806000815250610dc4565b610a97611490565b600280541415610ab95760405162461bcd60e51b8152600401610a5d906126a4565b600280556040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610af2573d6000803e3d6000fd5b50506001600255565b610b03611490565b8051610a7090600b9060208401906120f7565b610b1e611490565b8051610a709060089060208401906120f7565b60008181526004602052604081205482906001600160a01b031615610b6e576000908152600460205260409020546001600160a01b031692915050565b600081118015610b8057506003548111155b15610bd4575b6000190180610b9457610bd4565b6000818152600460205260409020546001600160a01b031615610bcf576000908152600460205260409020546001600160a01b031692915050565b610b86565b50604051634a1850bf60e11b815260040160405180910390fd5b60006001600160a01b038216610c17576040516316285dcb60e11b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205490565b610c3b611490565b610c4560006114ea565b565b610c4f611490565b6103e8811115610c725760405163574b16a760e11b815260040160405180910390fd5b600f55565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b610caa611490565b8051610a7090600c9060208401906120f7565b600280541415610cdf5760405162461bcd60e51b8152600401610a5d906126a4565b6002805533803b151580610cf65750600a5460ff16155b80610cff575081155b80610d2d5750600d546001600160a01b038216600090815260096020526040902054610d2b90846126db565b115b80610d44575034600e5483610d429190612707565b115b80610d6357506115b382610d5760035490565b610d6191906126db565b115b15610d815760405163574b16a760e11b815260040160405180910390fd5b6001600160a01b03811660009081526009602052604081208054849290610da99084906126db565b90915550610af29050818361153a565b610a70338383611554565b61093d848484846115f4565b610dd8611490565b600a805461ffff191692151561ff0019169290921761010091151591909102179055565b6060610e0782611310565b610e245760405163574b16a760e11b815260040160405180910390fd5b6000600b8054610e3390612780565b905011610eca5760088054610e4790612780565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7390612780565b8015610ec05780601f10610e9557610100808354040283529160200191610ec0565b820191906000526020600020905b815481529060010190602001808311610ea357829003601f168201915b5050505050610869565b600b610ed583611641565b604051602001610ee6929190612524565b60405160208183030381529060405292915050565b600280541415610f1d5760405162461bcd60e51b8152600401610a5d906126a4565b6002805533821580610f375750600a54610100900460ff16155b80610f655750600d546001600160a01b038216600090815260096020526040902054610f6390856126db565b115b80610f7c575034600e5484610f7a9190612707565b115b80610f9b57506115b383610f8f60035490565b610f9991906126db565b115b806110665750604080516c1dda1a5d19531a5cdd135a5b9d609a1b602080830191909152606084901b6bffffffffffffffffffffffff1916602d830152825160218184030181526041830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006061840152607d8084019190915283518084039091018152609d9092019092528051910120611064907f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a69061062e9085611747565b155b156110845760405163574b16a760e11b815260040160405180910390fd5b6001600160a01b038116600090815260096020526040812080548592906110ac9084906126db565b909155506110bc9050818461153a565b5050600160025550565b600082815260016020819052604090912001546110e2816113b4565b61094f8383611429565b6110f4611490565b600d55565b6060600c805461110890612780565b80601f016020809104026020016040519081016040528092919081815260200182805461113490612780565b80156111815780601f1061115657610100808354040283529160200191611181565b820191906000526020600020905b81548152906001019060200180831161116457829003601f168201915b5050505050905090565b60006111b77f4a0c3698e72495f6d49f6ef074f2b34cac5b153c817a7cc37789cccbb873cf5d83610c77565b806111e757506001600160a01b0380841660009081526007602090815260408083209386168352929052205460ff165b9392505050565b6111f6611490565b6002805414156112185760405162461bcd60e51b8152600401610a5d906126a4565b6002805580158061123d57506115b38161123160035490565b61123b91906126db565b115b1561125b5760405163574b16a760e11b815260040160405180910390fd5b610af2828261153a565b61126d611490565b6001600160a01b0381166112d25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a5d565b6112db816114ea565b50565b6112e6611490565b600e55565b60006001600160e01b031982166380ac58cd60e01b148061086957506108698261176b565b60008082118015610869575050600354101590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b61138c8482856117a0565b6113a95760405163574b16a760e11b815260040160405180910390fd5b61093d8383836117eb565b6112db8133611935565b6113c88282610c77565b610a705760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6114338282610c77565b15610a705760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000546001600160a01b03163314610c455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a5d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a70828260405180602001604052806000815250611999565b816001600160a01b0316836001600160a01b031614156115875760405163079f14e360e51b815260040160405180910390fd5b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61160033858585611381565b6000836001600160a01b03163b1180156116235750611621848484846119a6565b155b1561093d57604051631f11849560e21b815260040160405180910390fd5b6060816116655750506040805180820190915260018152600360fc1b602082015290565b8160005b811561168f5780611679816127bb565b91506116889050600a836126f3565b9150611669565b60008167ffffffffffffffff8111156116aa576116aa612842565b6040519080825280601f01601f1916602001820160405280156116d4576020820181803683370190505b5090505b841561173f576116e9600183612726565b91506116f6600a866127d6565b6117019060306126db565b60f81b8183815181106117165761171661282c565b60200101906001600160f81b031916908160001a905350611738600a866126f3565b94506116d8565b949350505050565b60008060006117568585611a9d565b9150915061176381611b0a565b509392505050565b60006001600160e01b03198216637965db0b60e01b148061086957506301ffc9a760e01b6001600160e01b0319831614610869565b6000816001600160a01b0316846001600160a01b031614806117db5750836001600160a01b03166117d08461086f565b6001600160a01b0316145b8061173f575061173f828561118b565b6001600160a01b038216158061181b575061180581610b31565b6001600160a01b0316836001600160a01b031614155b156118395760405163574b16a760e11b815260040160405180910390fd5b61184560008285611325565b6001600160a01b03808316600081815260056020908152604080832080546001908101909155948816835280832080546000190190558583526004909152902080546001600160a01b03191690911790556003549082019081118015906118c157506000818152600460205260409020546001600160a01b0316155b156118ee57600081815260046020526040902080546001600160a01b0319166001600160a01b0386161790555b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61193f8282610c77565b610a7057611957816001600160a01b03166014611cc5565b611962836020611cc5565b6040516020016119739291906125df565b60408051601f198184030181529082905262461bcd60e51b8252610a5d91600401612691565b61094f8383836001611e61565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906119db903390899088908890600401612654565b602060405180830381600087803b1580156119f557600080fd5b505af1925050508015611a25575060408051601f3d908101601f19168201909252611a229181019061240d565b60015b611a80573d808015611a53576040519150601f19603f3d011682016040523d82523d6000602084013e611a58565b606091505b508051611a7857604051630568cbab60e01b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b600080825160411415611ad45760208301516040840151606085015160001a611ac887828585611fd1565b945094505050506109c4565b825160401415611afe5760208301516040840151611af38683836120be565b9350935050506109c4565b506000905060026109c4565b6000816004811115611b1e57611b1e612816565b1415611b275750565b6001816004811115611b3b57611b3b612816565b1415611b895760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610a5d565b6002816004811115611b9d57611b9d612816565b1415611beb5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610a5d565b6003816004811115611bff57611bff612816565b1415611c585760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610a5d565b6004816004811115611c6c57611c6c612816565b14156112db5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610a5d565b60606000611cd4836002612707565b611cdf9060026126db565b67ffffffffffffffff811115611cf757611cf7612842565b6040519080825280601f01601f191660200182016040528015611d21576020820181803683370190505b509050600360fc1b81600081518110611d3c57611d3c61282c565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611d6b57611d6b61282c565b60200101906001600160f81b031916908160001a9053506000611d8f846002612707565b611d9a9060016126db565b90505b6001811115611e12576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611dce57611dce61282c565b1a60f81b828281518110611de457611de461282c565b60200101906001600160f81b031916908160001a90535060049490941c93611e0b81612769565b9050611d9d565b5083156111e75760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a5d565b821580611e7557506001600160a01b038416155b15611e935760405163574b16a760e11b815260040160405180910390fd5b60006003546001611ea491906126db565b905060038054850190556001600160a01b03851660008181526005602090815260408083208054890190558483526004909152902080546001600160a01b031916909117905580848101838015611f0557506000876001600160a01b03163b115b15611f83575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611f5660008884806001019550886119a6565b611f7357604051631f11849560e21b815260040160405180910390fd5b80821415611f0b5750505061093d565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415611f845750505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561200857506000905060036120b5565b8460ff16601b1415801561202057508460ff16601c14155b1561203157506000905060046120b5565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612085573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166120ae576000600192509250506120b5565b9150600090505b94509492505050565b6000806001600160ff1b038316816120db60ff86901c601b6126db565b90506120e987828885611fd1565b935093505050935093915050565b82805461210390612780565b90600052602060002090601f016020900481019282612125576000855561216b565b82601f1061213e57805160ff191683800117855561216b565b8280016001018555821561216b579182015b8281111561216b578251825591602001919060010190612150565b5061217792915061217b565b5090565b5b80821115612177576000815560010161217c565b600067ffffffffffffffff808411156121ab576121ab612842565b604051601f8501601f19908116603f011681019082821181831017156121d3576121d3612842565b816040528093508581528686860111156121ec57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461221d57600080fd5b919050565b8035801515811461221d57600080fd5b600082601f83011261224357600080fd5b6111e783833560208501612190565b60006020828403121561226457600080fd5b6111e782612206565b6000806040838503121561228057600080fd5b61228983612206565b915061229760208401612206565b90509250929050565b6000806000606084860312156122b557600080fd5b6122be84612206565b92506122cc60208501612206565b9150604084013590509250925092565b600080600080608085870312156122f257600080fd5b6122fb85612206565b935061230960208601612206565b925060408501359150606085013567ffffffffffffffff81111561232c57600080fd5b61233887828801612232565b91505092959194509250565b6000806040838503121561235757600080fd5b61236083612206565b915061229760208401612222565b6000806040838503121561238157600080fd5b61238a83612206565b946020939093013593505050565b600080604083850312156123ab57600080fd5b61236083612222565b6000602082840312156123c657600080fd5b5035919050565b600080604083850312156123e057600080fd5b8235915061229760208401612206565b60006020828403121561240257600080fd5b81356111e781612858565b60006020828403121561241f57600080fd5b81516111e781612858565b60006020828403121561243c57600080fd5b813567ffffffffffffffff81111561245357600080fd5b8201601f8101841361246457600080fd5b61173f84823560208401612190565b6000806040838503121561248657600080fd5b82359150602083013567ffffffffffffffff8111156124a457600080fd5b6124b085828601612232565b9150509250929050565b600080604083850312156124cd57600080fd5b50508035926020909101359150565b600081518084526124f481602086016020860161273d565b601f01601f19169290920160200192915050565b6000815161251a81856020860161273d565b9290920192915050565b600080845481600182811c91508083168061254057607f831692505b602080841082141561256057634e487b7160e01b86526022600452602486fd5b8180156125745760018114612585576125b2565b60ff198616895284890196506125b2565b60008b81526020902060005b868110156125aa5781548b820152908501908301612591565b505084890196505b5050505050506125d66125c58286612508565b64173539b7b760d91b815260050190565b95945050505050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161261781601785016020880161273d565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161264881602884016020880161273d565b01602801949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612687908301846124dc565b9695505050505050565b6020815260006111e760208301846124dc565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082198211156126ee576126ee6127ea565b500190565b60008261270257612702612800565b500490565b6000816000190483118215151615612721576127216127ea565b500290565b600082821015612738576127386127ea565b500390565b60005b83811015612758578181015183820152602001612740565b8381111561093d5750506000910152565b600081612778576127786127ea565b506000190190565b600181811c9082168061279457607f821691505b602082108114156127b557634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127cf576127cf6127ea565b5060010190565b6000826127e5576127e5612800565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146112db57600080fdfea2646970667358221220d3f0b10d8b44bb57a84778cc7b9827fd9bd0545f3bde5751e5326dcd4c7299d964736f6c63430008070033
Deployed Bytecode Sourcemap
52166:4925:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56798:290;;;;;;;;;;-1:-1:-1;56798:290:0;;;;;:::i;:::-;;:::i;:::-;;;10132:14:1;;10125:22;10107:41;;10095:2;10080:18;56798:290:0;;;;;;;;53473:98;;;;;;;;;;-1:-1:-1;53542:22:0;;;;;;;;;;;;-1:-1:-1;;;53542:22:0;;;;53473:98;;;;;;;:::i;40857:193::-;;;;;;;;;;-1:-1:-1;40857:193:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9151:32:1;;;9133:51;;9121:2;9106:18;40857:193:0;8987:203:1;40443:356:0;;;;;;;;;;-1:-1:-1;40443:356:0;;;;;:::i;:::-;;:::i;:::-;;39214:92;;;;;;;;;;-1:-1:-1;39288:12:0;;39214:92;;;10305:25:1;;;10293:2;10278:18;39214:92:0;10159:177:1;52652:41:0;;;;;;;;;;-1:-1:-1;52652:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;52742:40;;;;;;;;;;-1:-1:-1;52742:40:0;;;;;;;;;;;45857:171;;;;;;;;;;-1:-1:-1;45857:171:0;;;;;:::i;:::-;;:::i;28933:131::-;;;;;;;;;;-1:-1:-1;28933:131:0;;;;;:::i;:::-;29007:7;29034:12;;;:6;:12;;;;;;;;:22;;;28933:131;53775:337;;;;;;;;;;-1:-1:-1;53775:337:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;9880:32:1;;;9862:51;;9944:2;9929:18;;9922:34;;;;9835:18;53775:337:0;9688:274:1;29374:147:0;;;;;;;;;;-1:-1:-1;29374:147:0;;;;;:::i;:::-;;:::i;52498:40::-;;;;;;;;;;;;52534:4;52498:40;;;;;14566:6:1;14554:19;;;14536:38;;14524:2;14509:18;52498:40:0;14392:188:1;30518:218:0;;;;;;;;;;-1:-1:-1;30518:218:0;;;;;:::i;:::-;;:::i;46091:165::-;;;;;;;;;;-1:-1:-1;46091:165:0;;;;;:::i;:::-;;:::i;52928:31::-;;;;;;;;;;;;;;;;56524:120;;;;;;;;;;-1:-1:-1;56524:120:0;;;;;:::i;:::-;;:::i;55803:90::-;;;;;;;;;;-1:-1:-1;55803:90:0;;;;;:::i;:::-;;:::i;56102:114::-;;;;;;;;;;-1:-1:-1;56102:114:0;;;;;:::i;:::-;;:::i;53046:68::-;;;;;;;;;;-1:-1:-1;53046:68:0;;;;-1:-1:-1;;;;;53046:68:0;;;39360:690;;;;;;;;;;-1:-1:-1;39360:690:0;;;;;:::i;:::-;;:::i;53007:33::-;;;;;;;;;;;;;;;;52965:34;;;;;;;;;;;;;;;;38932:190;;;;;;;;;;-1:-1:-1;38932:190:0;;;;;:::i;:::-;;:::i;20703:103::-;;;;;;;;;;;;;:::i;56654:137::-;;;;;;;;;;-1:-1:-1;56654:137:0;;;;;:::i;:::-;;:::i;20055:87::-;;;;;;;;;;-1:-1:-1;20101:7:0;20128:6;-1:-1:-1;;;;;20128:6:0;20055:87;;27393:147;;;;;;;;;;-1:-1:-1;27393:147:0;;;;;:::i;:::-;;:::i;55901:96::-;;;;;;;;;;-1:-1:-1;55901:96:0;;;;;:::i;:::-;;:::i;53579:91::-;;;;;;;;;;-1:-1:-1;53650:12:0;;;;;;;;;;;;-1:-1:-1;;;53650:12:0;;;;53579:91;;54407:456;;;;;;:::i;:::-;;:::i;26498:49::-;;;;;;;;;;-1:-1:-1;26498:49:0;26543:4;26498:49;;41345:159;;;;;;;;;;-1:-1:-1;41345:159:0;;;;;:::i;:::-;;:::i;46319:197::-;;;;;;;;;;-1:-1:-1;46319:197:0;;;;;:::i;:::-;;:::i;56316:198::-;;;;;;;;;;-1:-1:-1;56316:198:0;;;;;:::i;:::-;;:::i;54119:281::-;;;;;;;;;;-1:-1:-1;54119:281:0;;;;;:::i;:::-;;:::i;54870:659::-;;;;;;:::i;:::-;;:::i;29814:149::-;;;;;;;;;;-1:-1:-1;29814:149:0;;;;;:::i;:::-;;:::i;56005:88::-;;;;;;;;;;-1:-1:-1;56005:88:0;;;;;:::i;:::-;;:::i;53676:93::-;;;;;;;;;;;;;:::i;53232:232::-;;;;;;;;;;-1:-1:-1;53232:232:0;;;;;:::i;:::-;;:::i;55537:258::-;;;;;;;;;;-1:-1:-1;55537:258:0;;;;;:::i;:::-;;:::i;20961:201::-;;;;;;;;;;-1:-1:-1;20961:201:0;;;;;:::i;:::-;;:::i;56223:86::-;;;;;;;;;;-1:-1:-1;56223:86:0;;;;;:::i;:::-;;:::i;52699:37::-;;;;;;;;;;-1:-1:-1;52699:37:0;;;;;;;;56798:290;56917:4;-1:-1:-1;;;;;;56938:48:0;;-1:-1:-1;;;56938:48:0;;:96;;-1:-1:-1;;;;;;;56998:36:0;;-1:-1:-1;;;56998:36:0;56938:96;:144;;;;57046:36;57070:11;57046:23;:36::i;:::-;56931:151;56798:290;-1:-1:-1;;56798:290:0:o;40857:193::-;40938:7;40963:16;40971:7;40963;:16::i;:::-;40958:48;;40988:18;;-1:-1:-1;;;40988:18:0;;;;;;;;;;;40958:48;-1:-1:-1;41020:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;41020:24:0;;40857:193::o;40443:356::-;40520:13;40536:24;40552:7;40536:15;:24::i;:::-;40520:40;;40577:5;-1:-1:-1;;;;;40571:11:0;:2;-1:-1:-1;;;;;40571:11:0;;40567:48;;;40591:24;;-1:-1:-1;;;40591:24:0;;;;;;;;;;;40567:48;18686:10;-1:-1:-1;;;;;40664:15:0;;;;;;;:51;;;40684:31;40701:5;40708:6;40684:16;:31::i;:::-;40683:32;40664:51;40660:96;;;40732:24;;-1:-1:-1;;;40732:24:0;;;;;;;;;;;40660:96;40765:28;40774:2;40778:7;40787:5;40765:8;:28::i;:::-;40513:286;;40443:356;;:::o;45857:171::-;45973:49;18686:10;46004:4;46010:2;46014:7;45973:16;:49::i;:::-;45857:171;;;:::o;53775:337::-;53937:8;;53876:16;;;;-1:-1:-1;;;;;53937:8:0;:22;;:43;;;53964:16;53972:7;53964;:16::i;:::-;53963:17;53937:43;53933:77;;;53997:13;;-1:-1:-1;;;53997:13:0;;;;;;;;;;;53933:77;54047:8;;54079:11;;-1:-1:-1;;;;;54047:8:0;;;;54094:5;;54067:23;;:9;:23;:::i;:::-;54066:33;;;;:::i;:::-;54023:83;;;;53775:337;;;;;;:::o;29374:147::-;29007:7;29034:12;;;:6;:12;;;;;;;;:22;;26989:16;27000:4;26989:10;:16::i;:::-;29488:25:::1;29499:4;29505:7;29488:10;:25::i;30518:218::-:0;-1:-1:-1;;;;;30614:23:0;;18686:10;30614:23;30606:83;;;;-1:-1:-1;;;30606:83:0;;14178:2:1;30606:83:0;;;14160:21:1;14217:2;14197:18;;;14190:30;14256:34;14236:18;;;14229:62;-1:-1:-1;;;14307:18:1;;;14300:45;14362:19;;30606:83:0;;;;;;;;;30702:26;30714:4;30720:7;30702:11;:26::i;:::-;30518:218;;:::o;46091:165::-;46211:39;46228:4;46234:2;46238:7;46211:39;;;;;;;;;;;;:16;:39::i;56524:120::-;19941:13;:11;:13::i;:::-;1812:1:::1;2410:7:::0;::::1;:19;;2402:63;;;;-1:-1:-1::0;;;2402:63:0::1;;;;;;;:::i;:::-;1812:1;2543:18:::0;;56595:43:::2;::::0;-1:-1:-1;;;;;56595:20:0;::::2;::::0;56616:21:::2;56595:43:::0;::::2;;;::::0;::::2;::::0;;;56616:21;56595:20;:43;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;1768:1:0::1;2722:7;:22:::0;56524:120::o;55803:90::-;19941:13;:11;:13::i;:::-;55868:19;;::::1;::::0;:13:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;56102:114::-:0;19941:13;:11;:13::i;:::-;56182:28;;::::1;::::0;:12:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;39360:690::-:0;39437:7;39564:11;;;:7;:11;;;;;;39544:7;;-1:-1:-1;;;;;39564:11:0;:25;39560:70;;39609:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;39609:11:0;;39360:690;-1:-1:-1;;39360:690:0:o;39560:70::-;39709:1;39704:2;:6;:28;;;;;39720:12;;39714:2;:18;;39704:28;39700:304;;;39811:184;-1:-1:-1;;39836:4:0;39857:7;39853:131;;39881:5;;39853:131;39933:1;39910:11;;;:7;:11;;;;;;-1:-1:-1;;;;;39910:11:0;:25;39906:78;;39959:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;39959:11:0;;39360:690;-1:-1:-1;;39360:690:0:o;39906:78::-;39811:184;;;39457:554;40026:18;;-1:-1:-1;;;40026:18:0;;;;;;;;;;;38932:190;39009:7;-1:-1:-1;;;;;39033:19:0;;39029:57;;39061:25;;-1:-1:-1;;;39061:25:0;;;;;;;;;;;39029:57;-1:-1:-1;;;;;;39100:16:0;;;;;:9;:16;;;;;;;38932:190::o;20703:103::-;19941:13;:11;:13::i;:::-;20768:30:::1;20795:1;20768:18;:30::i;:::-;20703:103::o:0;56654:137::-;19941:13;:11;:13::i;:::-;56731:4:::1;56721:7;:14;56717:40;;;56744:13;;-1:-1:-1::0;;;56744:13:0::1;;;;;;;;;;;56717:40;56764:11;:21:::0;56654:137::o;27393:147::-;27479:4;27503:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;27503:29:0;;;;;;;;;;;;;;;27393:147::o;55901:96::-;19941:13;:11;:13::i;:::-;55971:20;;::::1;::::0;:13:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;54407:456::-:0;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;1812:1;2543:18;;18686:10;54520:21;::::1;:25:::0;;;:55:::1;;-1:-1:-1::0;54558:17:0::1;::::0;::::1;;54557:18;54520:55;:80;;;-1:-1:-1::0;54587:13:0;;54520:80:::1;:138;;;-1:-1:-1::0;54646:12:0::1;::::0;-1:-1:-1;;;;;54625:17:0;::::1;;::::0;;;:6:::1;:17;::::0;;;;;54614:28:::1;::::0;:8;:28:::1;:::i;:::-;54613:45;54520:138;:184;;;;54695:9;54682;;54671:8;:20;;;;:::i;:::-;54670:34;54520:184;:235;;;-1:-1:-1::0;52534:4:0::1;54733:8:::0;54717:13:::1;39288:12:::0;;;39214:92;54717:13:::1;:24;;;;:::i;:::-;54716:39;54520:235;54516:267;;;54770:13;;-1:-1:-1::0;;;54770:13:0::1;;;;;;;;;;;54516:267;-1:-1:-1::0;;;;;54791:17:0;::::1;;::::0;;;:6:::1;:17;::::0;;;;:29;;54812:8;;54791:17;:29:::1;::::0;54812:8;;54791:29:::1;:::i;:::-;::::0;;;-1:-1:-1;54827:30:0::1;::::0;-1:-1:-1;54837:9:0;54848:8;54827:9:::1;:30::i;41345:159::-:0;41446:52;18686:10;41479:8;41489;41446:18;:52::i;46319:197::-;46464:46;46485:4;46491:2;46495:7;46504:5;46464:20;:46::i;56316:198::-;19941:13;:11;:13::i;:::-;56419:17:::1;:38:::0;;-1:-1:-1;;56464:44:0;56419:38;::::1;;-1:-1:-1::0;;56464:44:0;;;;;56419:38:::1;56464:44:::0;::::1;;::::0;;;::::1;;::::0;;56316:198::o;54119:281::-;54185:13;54211:16;54219:7;54211;:16::i;:::-;54207:42;;54236:13;;-1:-1:-1;;;54236:13:0;;;;;;;;;;;54207:42;54293:1;54269:13;54263:27;;;;;:::i;:::-;;;:31;:131;;54382:12;54263:131;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54329:13;54344:18;:7;:16;:18::i;:::-;54312:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54256:138;54119:281;-1:-1:-1;;54119:281:0:o;54870:659::-;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;1812:1;2543:18;;18686:10;55028:13;;;:47:::1;;-1:-1:-1::0;55055:20:0::1;::::0;::::1;::::0;::::1;;;55054:21;55028:47;:104;;;-1:-1:-1::0;55120:12:0::1;::::0;-1:-1:-1;;;;;55099:17:0;::::1;;::::0;;;:6:::1;:17;::::0;;;;;55088:28:::1;::::0;:8;:28:::1;:::i;:::-;55087:45;55028:104;:150;;;;55169:9;55156;;55145:8;:20;;;;:::i;:::-;55144:34;55028:150;:201;;;-1:-1:-1::0;52534:4:0::1;55207:8:::0;55191:13:::1;39288:12:::0;;;39214:92;55191:13:::1;:24;;;;:::i;:::-;55190:39;55028:201;:393;;;-1:-1:-1::0;55339:44:0::1;::::0;;-1:-1:-1;;;55339:44:0::1;::::0;;::::1;8045:28:1::0;;;;8111:2;8107:15;;;-1:-1:-1;;8103:53:1;8089:12;;;8082:75;55339:44:0;;;;;;;;;8173:12:1;;;55339:44:0;;55329:55;;;;::::1;::::0;7672:66:1;13773:58:0;;;7660:79:1;7755:12;;;;7748:28;;;;13773:58:0;;;;;;;;;;7792:12:1;;;;13773:58:0;;;13763:69;;;;;55242:179:::1;::::0;52332:24:::1;::::0;55264:156:::1;::::0;55406:5:::1;55264:13;:156::i;55242:179::-;55241:180;55028:393;55024:425;;;55436:13;;-1:-1:-1::0;;;55436:13:0::1;;;;;;;;;;;55024:425;-1:-1:-1::0;;;;;55457:17:0;::::1;;::::0;;;:6:::1;:17;::::0;;;;:29;;55478:8;;55457:17;:29:::1;::::0;55478:8;;55457:29:::1;:::i;:::-;::::0;;;-1:-1:-1;55493:30:0::1;::::0;-1:-1:-1;55503:9:0;55514:8;55493:9:::1;:30::i;:::-;-1:-1:-1::0;;1768:1:0;2722:7;:22;-1:-1:-1;54870:659:0:o;29814:149::-;29007:7;29034:12;;;:6;:12;;;;;;;;:22;;26989:16;27000:4;26989:10;:16::i;:::-;29929:26:::1;29941:4;29947:7;29929:11;:26::i;56005:88::-:0;19941:13;:11;:13::i;:::-;56069:12:::1;:18:::0;56005:88::o;53676:93::-;53721:13;53750;53743:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53676:93;:::o;53232:232::-;53354:4;53374:33;52404:26;53398:8;53374:7;:33::i;:::-;:84;;;-1:-1:-1;;;;;;41240:25:0;;;41216:4;41240:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;53419:39;53367:91;53232:232;-1:-1:-1;;;53232:232:0:o;55537:258::-;19941:13;:11;:13::i;:::-;1812:1:::1;2410:7:::0;::::1;:19;;2402:63;;;;-1:-1:-1::0;;;2402:63:0::1;;;;;;;:::i;:::-;1812:1;2543:18:::0;;55657:13;;;:65:::2;;-1:-1:-1::0;52534:4:0::2;55700:8:::0;55684:13:::2;39288:12:::0;;;39214:92;55684:13:::2;:24;;;;:::i;:::-;55683:39;55657:65;55653:97;;;55737:13;;-1:-1:-1::0;;;55737:13:0::2;;;;;;;;;;;55653:97;55759:30;55769:9;55780:8;55759:9;:30::i;20961:201::-:0;19941:13;:11;:13::i;:::-;-1:-1:-1;;;;;21050:22:0;::::1;21042:73;;;::::0;-1:-1:-1;;;21042:73:0;;12244:2:1;21042:73:0::1;::::0;::::1;12226:21:1::0;12283:2;12263:18;;;12256:30;12322:34;12302:18;;;12295:62;-1:-1:-1;;;12373:18:1;;;12366:36;12419:19;;21042:73:0::1;12042:402:1::0;21042:73:0::1;21126:28;21145:8;21126:18;:28::i;:::-;20961:201:::0;:::o;56223:86::-;19941:13;:11;:13::i;:::-;56286:9:::1;:17:::0;56223:86::o;40114:224::-;40221:4;-1:-1:-1;;;;;;40245:40:0;;-1:-1:-1;;;40245:40:0;;:87;;;40296:36;40320:11;40296:23;:36::i;47571:129::-;47636:4;47666:1;47656:7;:11;:38;;;;-1:-1:-1;;47682:12:0;;-1:-1:-1;47671:23:0;;47571:129::o;41610:171::-;41706:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;41706:29:0;-1:-1:-1;;;;;41706:29:0;;;;;;;;;41747:28;;41706:24;;41747:28;;;;;;;41610:171;;;:::o;41850:258::-;41993:42;42012:7;42021;42030:4;41993:18;:42::i;:::-;41988:77;;42052:13;;-1:-1:-1;;;42052:13:0;;;;;;;;;;;41988:77;42074:28;42084:4;42090:2;42094:7;42074:9;:28::i;27844:105::-;27911:30;27922:4;18686:10;27911;:30::i;32115:238::-;32199:22;32207:4;32213:7;32199;:22::i;:::-;32194:152;;32238:12;;;;32270:4;32238:12;;;;;;;;-1:-1:-1;;;;;32238:29:0;;;;;;;;;;:36;;-1:-1:-1;;32238:36:0;;;;;;;32294:40;;18686:10;;32238:12;;32294:40;;32238:12;32294:40;32115:238;;:::o;32533:239::-;32617:22;32625:4;32631:7;32617;:22::i;:::-;32613:152;;;32688:5;32656:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;32656:29:0;;;;;;;;;;:37;;-1:-1:-1;;32656:37:0;;;32713:40;18686:10;;32656:12;;32713:40;;32688:5;32713:40;32533:239;;:::o;20220:132::-;20101:7;20128:6;-1:-1:-1;;;;;20128:6:0;18686:10;20284:23;20276:68;;;;-1:-1:-1;;;20276:68:0;;13457:2:1;20276:68:0;;;13439:21:1;;;13476:18;;;13469:30;13535:34;13515:18;;;13508:62;13587:18;;20276:68:0;13255:356:1;21322:191:0;21396:16;21415:6;;-1:-1:-1;;;;;21432:17:0;;;-1:-1:-1;;;;;;21432:17:0;;;;;;21465:40;;21415:6;;;;;;;21465:40;;21396:16;21465:40;21385:128;21322:191;:::o;45273:102::-;45344:25;45354:2;45358:6;45344:25;;;;;;;;;;;;:9;:25::i;43090:287::-;43223:8;-1:-1:-1;;;;;43214:17:0;:5;-1:-1:-1;;;;;43214:17:0;;43210:55;;;43240:25;;-1:-1:-1;;;43240:25:0;;;;;;;;;;;43210:55;-1:-1:-1;;;;;43272:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;43272:46:0;;;;;;;;;;43330:41;;10107::1;;;43330::0;;10080:18:1;43330:41:0;;;;;;;43090:287;;;:::o;42184:367::-;42326:49;18686:10;42357:4;42363:2;42367:7;42326:16;:49::i;:::-;42442:1;42425:2;-1:-1:-1;;;;;42425:14:0;;:18;:78;;;;;42455:48;42478:4;42484:2;42488:7;42497:5;42455:22;:48::i;:::-;42454:49;42425:78;42421:124;;;42518:27;;-1:-1:-1;;;42518:27:0;;;;;;;;;;;3189:723;3245:13;3466:10;3462:53;;-1:-1:-1;;3493:10:0;;;;;;;;;;;;-1:-1:-1;;;3493:10:0;;;;;3189:723::o;3462:53::-;3540:5;3525:12;3581:78;3588:9;;3581:78;;3614:8;;;;:::i;:::-;;-1:-1:-1;3637:10:0;;-1:-1:-1;3645:2:0;3637:10;;:::i;:::-;;;3581:78;;;3669:19;3701:6;3691:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3691:17:0;;3669:39;;3719:154;3726:10;;3719:154;;3753:11;3763:1;3753:11;;:::i;:::-;;-1:-1:-1;3822:10:0;3830:2;3822:5;:10;:::i;:::-;3809:24;;:2;:24;:::i;:::-;3796:39;;3779:6;3786;3779:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;3779:56:0;;;;;;;;-1:-1:-1;3850:11:0;3859:2;3850:11;;:::i;:::-;;;3719:154;;;3897:6;3189:723;-1:-1:-1;;;;3189:723:0:o;9769:231::-;9847:7;9868:17;9887:18;9909:27;9920:4;9926:9;9909:10;:27::i;:::-;9867:69;;;;9947:18;9959:5;9947:11;:18::i;:::-;-1:-1:-1;9983:9:0;9769:231;-1:-1:-1;;;9769:231:0:o;27097:204::-;27182:4;-1:-1:-1;;;;;;27206:47:0;;-1:-1:-1;;;27206:47:0;;:87;;-1:-1:-1;;;;;;;;;;24465:40:0;;;27257:36;24356:157;42702:258;42831:4;42862:5;-1:-1:-1;;;;;42851:16:0;:7;-1:-1:-1;;;;;42851:16:0;;:59;;;;42903:7;-1:-1:-1;;;;;42879:31:0;:20;42891:7;42879:11;:20::i;:::-;-1:-1:-1;;;;;42879:31:0;;42851:59;:103;;;;42922:32;42939:5;42946:7;42922:16;:32::i;49243:854::-;-1:-1:-1;;;;;49368:16:0;;;;:52;;;49396:24;49412:7;49396:15;:24::i;:::-;-1:-1:-1;;;;;49388:32:0;:4;-1:-1:-1;;;;;49388:32:0;;;49368:52;49364:86;;;49437:13;;-1:-1:-1;;;49437:13:0;;;;;;;;;;;49364:86;49563:35;49580:1;49584:7;49593:4;49563:8;:35::i;:::-;-1:-1:-1;;;;;49685:13:0;;;;;;;:9;:13;;;;;;;;:18;;49702:1;49685:18;;;;;;49712:15;;;;;;;;:20;;-1:-1:-1;;49712:20:0;;;49741:16;;;:7;:16;;;;;:21;;-1:-1:-1;;;;;;49741:21:0;;;;;;49895:12;;49856:11;;;;49880:27;;;;;:65;;-1:-1:-1;49943:1:0;49911:20;;;:7;:20;;;;;;-1:-1:-1;;;;;49911:20:0;:34;49880:65;49876:119;;;49958:20;;;;:7;:20;;;;;:27;;-1:-1:-1;;;;;;49958:27:0;-1:-1:-1;;;;;49958:27:0;;;;;49876:119;49607:395;50083:7;50079:2;-1:-1:-1;;;;;50064:27:0;50073:4;-1:-1:-1;;;;;50064:27:0;;;;;;;;;;;49243:854;;;:::o;28239:505::-;28328:22;28336:4;28342:7;28328;:22::i;:::-;28323:414;;28516:41;28544:7;-1:-1:-1;;;;;28516:41:0;28554:2;28516:19;:41::i;:::-;28630:38;28658:4;28665:2;28630:19;:38::i;:::-;28421:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;28421:270:0;;;;;;;;;;-1:-1:-1;;;28367:358:0;;;;;;;:::i;45600:147::-;45711:30;45717:2;45721:6;45729:5;45736:4;45711:5;:30::i;46711:558::-;46865:86;;-1:-1:-1;;;46865:86:0;;46848:4;;-1:-1:-1;;;;;46865:36:0;;;;;:86;;18686:10;;46924:4;;46930:7;;46939:5;;46865:86;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46865:86:0;;;;;;;;-1:-1:-1;;46865:86:0;;;;;;;;;;;;:::i;:::-;;;46861:403;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47093:13:0;;47089:168;;47131:19;;-1:-1:-1;;;47131:19:0;;;;;;;;;;;47089:168;47229:6;47223:13;47214:6;47210:2;47206:15;47199:38;46861:403;-1:-1:-1;;;;;;46992:51:0;-1:-1:-1;;;46992:51:0;;-1:-1:-1;46711:558:0;;;;;;:::o;7563:1404::-;7644:7;7653:12;7878:9;:16;7898:2;7878:22;7874:1086;;;8222:4;8207:20;;8201:27;8272:4;8257:20;;8251:27;8330:4;8315:20;;8309:27;7917:9;8301:36;8373:25;8384:4;8301:36;8201:27;8251;8373:10;:25::i;:::-;8366:32;;;;;;;;;7874:1086;8420:9;:16;8440:2;8420:22;8416:544;;;8743:4;8728:20;;8722:27;8794:4;8779:20;;8773:27;8836:23;8847:4;8722:27;8773;8836:10;:23::i;:::-;8829:30;;;;;;;;8416:544;-1:-1:-1;8908:1:0;;-1:-1:-1;8912:35:0;8892:56;;5834:643;5912:20;5903:5;:29;;;;;;;;:::i;:::-;;5899:571;;;5834:643;:::o;5899:571::-;6010:29;6001:5;:38;;;;;;;;:::i;:::-;;5997:473;;;6056:34;;-1:-1:-1;;;6056:34:0;;11170:2:1;6056:34:0;;;11152:21:1;11209:2;11189:18;;;11182:30;11248:26;11228:18;;;11221:54;11292:18;;6056:34:0;10968:348:1;5997:473:0;6121:35;6112:5;:44;;;;;;;;:::i;:::-;;6108:362;;;6173:41;;-1:-1:-1;;;6173:41:0;;11884:2:1;6173:41:0;;;11866:21:1;11923:2;11903:18;;;11896:30;11962:33;11942:18;;;11935:61;12013:18;;6173:41:0;11682:355:1;6108:362:0;6245:30;6236:5;:39;;;;;;;;:::i;:::-;;6232:238;;;6292:44;;-1:-1:-1;;;6292:44:0;;12651:2:1;6292:44:0;;;12633:21:1;12690:2;12670:18;;;12663:30;12729:34;12709:18;;;12702:62;-1:-1:-1;;;12780:18:1;;;12773:32;12822:19;;6292:44:0;12449:398:1;6232:238:0;6367:30;6358:5;:39;;;;;;;;:::i;:::-;;6354:116;;;6414:44;;-1:-1:-1;;;6414:44:0;;13054:2:1;6414:44:0;;;13036:21:1;13093:2;13073:18;;;13066:30;13132:34;13112:18;;;13105:62;-1:-1:-1;;;13183:18:1;;;13176:32;13225:19;;6414:44:0;12852:398:1;4490:451:0;4565:13;4591:19;4623:10;4627:6;4623:1;:10;:::i;:::-;:14;;4636:1;4623:14;:::i;:::-;4613:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4613:25:0;;4591:47;;-1:-1:-1;;;4649:6:0;4656:1;4649:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;4649:15:0;;;;;;;;;-1:-1:-1;;;4675:6:0;4682:1;4675:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;4675:15:0;;;;;;;;-1:-1:-1;4706:9:0;4718:10;4722:6;4718:1;:10;:::i;:::-;:14;;4731:1;4718:14;:::i;:::-;4706:26;;4701:135;4738:1;4734;:5;4701:135;;;-1:-1:-1;;;4786:5:0;4794:3;4786:11;4773:25;;;;;;;:::i;:::-;;;;4761:6;4768:1;4761:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;4761:37:0;;;;;;;;-1:-1:-1;4823:1:0;4813:11;;;;;4741:3;;;:::i;:::-;;;4701:135;;;-1:-1:-1;4854:10:0;;4846:55;;;;-1:-1:-1;;;4846:55:0;;11523:2:1;4846:55:0;;;11505:21:1;;;11542:18;;;11535:30;11601:34;11581:18;;;11574:62;11653:18;;4846:55:0;11321:356:1;43741:1194:0;43863:11;;;:31;;-1:-1:-1;;;;;;43878:16:0;;;43863:31;43860:56;;;43903:13;;-1:-1:-1;;;43903:13:0;;;;;;;;;;;43860:56;43923:20;43946:12;;43961:1;43946:16;;;;:::i;:::-;43923:39;;44066:12;:22;;;;;;-1:-1:-1;;;;;44097:13:0;;-1:-1:-1;44097:13:0;;;:9;:13;;;;;;;;:23;;;;;;44129:21;;;:7;:21;;;;;:26;;-1:-1:-1;;;;;;44129:26:0;;;;;;44258:12;44298:21;;;44458:9;:31;;;;;44488:1;44471:2;-1:-1:-1;;;;;44471:14:0;;:18;44458:31;44454:356;;;44551:233;44572:38;;44597:12;;-1:-1:-1;;;;;44572:38:0;;;44589:1;;44572:38;;44589:1;;44572:38;44628:61;44659:1;44663:2;44667:14;;;;;;44683:5;44628:22;:61::i;:::-;44623:115;;44711:27;;-1:-1:-1;;;44711:27:0;;;;;;;;;;;44623:115;44774:8;44758:12;:24;;44551:233;;44794:7;;;;;44454:356;44820:103;44839:40;;44864:14;;;;;-1:-1:-1;;;;;44839:40:0;;;44856:1;;44839:40;;44856:1;;44839:40;44913:8;44897:12;:24;;44820:103;;44047:883;;43853:1082;43741:1194;;;;:::o;11221:1632::-;11352:7;;12286:66;12273:79;;12269:163;;;-1:-1:-1;12385:1:0;;-1:-1:-1;12389:30:0;12369:51;;12269:163;12446:1;:7;;12451:2;12446:7;;:18;;;;;12457:1;:7;;12462:2;12457:7;;12446:18;12442:102;;;-1:-1:-1;12497:1:0;;-1:-1:-1;12501:30:0;12481:51;;12442:102;12658:24;;;12641:14;12658:24;;;;;;;;;10568:25:1;;;10641:4;10629:17;;10609:18;;;10602:45;;;;10663:18;;;10656:34;;;10706:18;;;10699:34;;;12658:24:0;;10540:19:1;;12658:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12658:24:0;;-1:-1:-1;;12658:24:0;;;-1:-1:-1;;;;;;;12697:20:0;;12693:103;;12750:1;12754:29;12734:50;;;;;;;12693:103;12816:6;-1:-1:-1;12824:20:0;;-1:-1:-1;11221:1632:0;;;;;;;;:::o;10263:344::-;10377:7;;-1:-1:-1;;;;;10423:80:0;;10377:7;10530:25;10546:3;10531:18;;;10553:2;10530:25;:::i;:::-;10514:42;;10574:25;10585:4;10591:1;10594;10597;10574:10;:25::i;:::-;10567:32;;;;;;10263:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:160::-;893:20;;949:13;;942:21;932:32;;922:60;;978:1;975;968:12;993:220;1035:5;1088:3;1081:4;1073:6;1069:17;1065:27;1055:55;;1106:1;1103;1096:12;1055:55;1128:79;1203:3;1194:6;1181:20;1174:4;1166:6;1162:17;1128:79;:::i;1218:186::-;1277:6;1330:2;1318:9;1309:7;1305:23;1301:32;1298:52;;;1346:1;1343;1336:12;1298:52;1369:29;1388:9;1369:29;:::i;1409:260::-;1477:6;1485;1538:2;1526:9;1517:7;1513:23;1509:32;1506:52;;;1554:1;1551;1544:12;1506:52;1577:29;1596:9;1577:29;:::i;:::-;1567:39;;1625:38;1659:2;1648:9;1644:18;1625:38;:::i;:::-;1615:48;;1409:260;;;;;:::o;1674:328::-;1751:6;1759;1767;1820:2;1808:9;1799:7;1795:23;1791:32;1788:52;;;1836:1;1833;1826:12;1788:52;1859:29;1878:9;1859:29;:::i;:::-;1849:39;;1907:38;1941:2;1930:9;1926:18;1907:38;:::i;:::-;1897:48;;1992:2;1981:9;1977:18;1964:32;1954:42;;1674:328;;;;;:::o;2007:537::-;2102:6;2110;2118;2126;2179:3;2167:9;2158:7;2154:23;2150:33;2147:53;;;2196:1;2193;2186:12;2147:53;2219:29;2238:9;2219:29;:::i;:::-;2209:39;;2267:38;2301:2;2290:9;2286:18;2267:38;:::i;:::-;2257:48;;2352:2;2341:9;2337:18;2324:32;2314:42;;2407:2;2396:9;2392:18;2379:32;2434:18;2426:6;2423:30;2420:50;;;2466:1;2463;2456:12;2420:50;2489:49;2530:7;2521:6;2510:9;2506:22;2489:49;:::i;:::-;2479:59;;;2007:537;;;;;;;:::o;2549:254::-;2614:6;2622;2675:2;2663:9;2654:7;2650:23;2646:32;2643:52;;;2691:1;2688;2681:12;2643:52;2714:29;2733:9;2714:29;:::i;:::-;2704:39;;2762:35;2793:2;2782:9;2778:18;2762:35;:::i;2808:254::-;2876:6;2884;2937:2;2925:9;2916:7;2912:23;2908:32;2905:52;;;2953:1;2950;2943:12;2905:52;2976:29;2995:9;2976:29;:::i;:::-;2966:39;3052:2;3037:18;;;;3024:32;;-1:-1:-1;;;2808:254:1:o;3067:248::-;3129:6;3137;3190:2;3178:9;3169:7;3165:23;3161:32;3158:52;;;3206:1;3203;3196:12;3158:52;3229:26;3245:9;3229:26;:::i;3320:180::-;3379:6;3432:2;3420:9;3411:7;3407:23;3403:32;3400:52;;;3448:1;3445;3438:12;3400:52;-1:-1:-1;3471:23:1;;3320:180;-1:-1:-1;3320:180:1:o;3505:254::-;3573:6;3581;3634:2;3622:9;3613:7;3609:23;3605:32;3602:52;;;3650:1;3647;3640:12;3602:52;3686:9;3673:23;3663:33;;3715:38;3749:2;3738:9;3734:18;3715:38;:::i;3764:245::-;3822:6;3875:2;3863:9;3854:7;3850:23;3846:32;3843:52;;;3891:1;3888;3881:12;3843:52;3930:9;3917:23;3949:30;3973:5;3949:30;:::i;4014:249::-;4083:6;4136:2;4124:9;4115:7;4111:23;4107:32;4104:52;;;4152:1;4149;4142:12;4104:52;4184:9;4178:16;4203:30;4227:5;4203:30;:::i;4268:450::-;4337:6;4390:2;4378:9;4369:7;4365:23;4361:32;4358:52;;;4406:1;4403;4396:12;4358:52;4446:9;4433:23;4479:18;4471:6;4468:30;4465:50;;;4511:1;4508;4501:12;4465:50;4534:22;;4587:4;4579:13;;4575:27;-1:-1:-1;4565:55:1;;4616:1;4613;4606:12;4565:55;4639:73;4704:7;4699:2;4686:16;4681:2;4677;4673:11;4639:73;:::i;4908:388::-;4985:6;4993;5046:2;5034:9;5025:7;5021:23;5017:32;5014:52;;;5062:1;5059;5052:12;5014:52;5098:9;5085:23;5075:33;;5159:2;5148:9;5144:18;5131:32;5186:18;5178:6;5175:30;5172:50;;;5218:1;5215;5208:12;5172:50;5241:49;5282:7;5273:6;5262:9;5258:22;5241:49;:::i;:::-;5231:59;;;4908:388;;;;;:::o;5301:248::-;5369:6;5377;5430:2;5418:9;5409:7;5405:23;5401:32;5398:52;;;5446:1;5443;5436:12;5398:52;-1:-1:-1;;5469:23:1;;;5539:2;5524:18;;;5511:32;;-1:-1:-1;5301:248:1:o;5554:257::-;5595:3;5633:5;5627:12;5660:6;5655:3;5648:19;5676:63;5732:6;5725:4;5720:3;5716:14;5709:4;5702:5;5698:16;5676:63;:::i;:::-;5793:2;5772:15;-1:-1:-1;;5768:29:1;5759:39;;;;5800:4;5755:50;;5554:257;-1:-1:-1;;5554:257:1:o;5816:185::-;5858:3;5896:5;5890:12;5911:52;5956:6;5951:3;5944:4;5937:5;5933:16;5911:52;:::i;:::-;5979:16;;;;;5816:185;-1:-1:-1;;5816:185:1:o;6124:1301::-;6401:3;6430:1;6463:6;6457:13;6493:3;6515:1;6543:9;6539:2;6535:18;6525:28;;6603:2;6592:9;6588:18;6625;6615:61;;6669:4;6661:6;6657:17;6647:27;;6615:61;6695:2;6743;6735:6;6732:14;6712:18;6709:38;6706:165;;;-1:-1:-1;;;6770:33:1;;6826:4;6823:1;6816:15;6856:4;6777:3;6844:17;6706:165;6887:18;6914:104;;;;7032:1;7027:320;;;;6880:467;;6914:104;-1:-1:-1;;6947:24:1;;6935:37;;6992:16;;;;-1:-1:-1;6914:104:1;;7027:320;14840:1;14833:14;;;14877:4;14864:18;;7122:1;7136:165;7150:6;7147:1;7144:13;7136:165;;;7228:14;;7215:11;;;7208:35;7271:16;;;;7165:10;;7136:165;;;7140:3;;7330:6;7325:3;7321:16;7314:23;;6880:467;;;;;;;7363:56;7388:30;7414:3;7406:6;7388:30;:::i;:::-;-1:-1:-1;;;6066:20:1;;6111:1;6102:11;;6006:113;7363:56;7356:63;6124:1301;-1:-1:-1;;;;;6124:1301:1:o;8196:786::-;8607:25;8602:3;8595:38;8577:3;8662:6;8656:13;8678:62;8733:6;8728:2;8723:3;8719:12;8712:4;8704:6;8700:17;8678:62;:::i;:::-;-1:-1:-1;;;8799:2:1;8759:16;;;8791:11;;;8784:40;8849:13;;8871:63;8849:13;8920:2;8912:11;;8905:4;8893:17;;8871:63;:::i;:::-;8954:17;8973:2;8950:26;;8196:786;-1:-1:-1;;;;8196:786:1:o;9195:488::-;-1:-1:-1;;;;;9464:15:1;;;9446:34;;9516:15;;9511:2;9496:18;;9489:43;9563:2;9548:18;;9541:34;;;9611:3;9606:2;9591:18;;9584:31;;;9389:4;;9632:45;;9657:19;;9649:6;9632:45;:::i;:::-;9624:53;9195:488;-1:-1:-1;;;;;;9195:488:1:o;10744:219::-;10893:2;10882:9;10875:21;10856:4;10913:44;10953:2;10942:9;10938:18;10930:6;10913:44;:::i;13616:355::-;13818:2;13800:21;;;13857:2;13837:18;;;13830:30;13896:33;13891:2;13876:18;;13869:61;13962:2;13947:18;;13616:355::o;14893:128::-;14933:3;14964:1;14960:6;14957:1;14954:13;14951:39;;;14970:18;;:::i;:::-;-1:-1:-1;15006:9:1;;14893:128::o;15026:120::-;15066:1;15092;15082:35;;15097:18;;:::i;:::-;-1:-1:-1;15131:9:1;;15026:120::o;15151:168::-;15191:7;15257:1;15253;15249:6;15245:14;15242:1;15239:21;15234:1;15227:9;15220:17;15216:45;15213:71;;;15264:18;;:::i;:::-;-1:-1:-1;15304:9:1;;15151:168::o;15324:125::-;15364:4;15392:1;15389;15386:8;15383:34;;;15397:18;;:::i;:::-;-1:-1:-1;15434:9:1;;15324:125::o;15454:258::-;15526:1;15536:113;15550:6;15547:1;15544:13;15536:113;;;15626:11;;;15620:18;15607:11;;;15600:39;15572:2;15565:10;15536:113;;;15667:6;15664:1;15661:13;15658:48;;;-1:-1:-1;;15702:1:1;15684:16;;15677:27;15454:258::o;15717:136::-;15756:3;15784:5;15774:39;;15793:18;;:::i;:::-;-1:-1:-1;;;15829:18:1;;15717:136::o;15858:380::-;15937:1;15933:12;;;;15980;;;16001:61;;16055:4;16047:6;16043:17;16033:27;;16001:61;16108:2;16100:6;16097:14;16077:18;16074:38;16071:161;;;16154:10;16149:3;16145:20;16142:1;16135:31;16189:4;16186:1;16179:15;16217:4;16214:1;16207:15;16071:161;;15858:380;;;:::o;16243:135::-;16282:3;-1:-1:-1;;16303:17:1;;16300:43;;;16323:18;;:::i;:::-;-1:-1:-1;16370:1:1;16359:13;;16243:135::o;16383:112::-;16415:1;16441;16431:35;;16446:18;;:::i;:::-;-1:-1:-1;16480:9:1;;16383:112::o;16500:127::-;16561:10;16556:3;16552:20;16549:1;16542:31;16592:4;16589:1;16582:15;16616:4;16613:1;16606:15;16632:127;16693:10;16688:3;16684:20;16681:1;16674:31;16724:4;16721:1;16714:15;16748:4;16745:1;16738:15;16764:127;16825:10;16820:3;16816:20;16813:1;16806:31;16856:4;16853:1;16846:15;16880:4;16877:1;16870:15;16896:127;16957:10;16952:3;16948:20;16945:1;16938:31;16988:4;16985:1;16978:15;17012:4;17009:1;17002:15;17028:127;17089:10;17084:3;17080:20;17077:1;17070:31;17120:4;17117:1;17110:15;17144:4;17141:1;17134:15;17160:131;-1:-1:-1;;;;;;17234:32:1;;17224:43;;17214:71;;17281:1;17278;17271:12
Swarm Source
ipfs://d3f0b10d8b44bb57a84778cc7b9827fd9bd0545f3bde5751e5326dcd4c7299d9
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.