Polygon Sponsored slots available. Book your slot here!
Contract Overview
[ Download CSV Export ]
Contract Name:
AFRNFT
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-11-03 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/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/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/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // 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/metatx/ERC2771Context.sol // OpenZeppelin Contracts (last updated v4.7.0) (metatx/ERC2771Context.sol) pragma solidity ^0.8.9; /** * @dev Context variant with ERC2771 support. */ abstract contract ERC2771Context is Context { /// @custom:oz-upgrades-unsafe-allow state-variable-immutable address private immutable _trustedForwarder; /// @custom:oz-upgrades-unsafe-allow constructor constructor(address trustedForwarder) { _trustedForwarder = trustedForwarder; } function isTrustedForwarder(address forwarder) public view virtual returns (bool) { return forwarder == _trustedForwarder; } function _msgSender() internal view virtual override returns (address sender) { if (isTrustedForwarder(msg.sender)) { // The assembly code is more direct than the Solidity version using `abi.decode`. /// @solidity memory-safe-assembly assembly { sender := shr(96, calldataload(sub(calldatasize(), 20))) } } else { return super._msgSender(); } } function _msgData() internal view virtual override returns (bytes calldata) { if (isTrustedForwarder(msg.sender)) { return msg.data[:msg.data.length - 20]; } else { return super._msgData(); } } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { 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/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.6.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. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/AFRNFT.sol pragma solidity 0.8.11; contract AFRNFT is ERC2771Context, ERC721Enumerable, AccessControl, Ownable, ReentrancyGuard { using Strings for uint256; // Prefix for tokens metadata URIs string public baseURI; // Suffix for tokens metadata URIs string public baseExtension = ".json"; // Operator that sets the tradeability of this token bool public tradingPaused = true; // Claim start date uint256 public claimStartDate = 0; // Array of payout percentages uint8[10] public payoutPercentages = [10,10,10,10,10,10,10,10,10,10]; // Array of days until next payout uint256[10] public payoutDays = [0,30,60,90,120,150,180,210,240,270]; // Mapping of token ids to player statistics mapping(uint256 => uint256[12]) public TokenIdToStats; // Mapping of token ids to rewards mapping(uint256 => uint256) public TokenIdToRewards; // Mapping of token ids to claimed rewards mapping(uint256 => uint256) public TokenIdToClaimedRewards; // Mapping of token ids to index claimed mapping(uint256 => uint8) public TokenIdToIndexClaimed; // Role for off-chain player statistics verification bytes32 public constant WHITELISTER_ROLE = keccak256("WHITELISTER_ROLE"); // Role for off-chain withdrawing verification bytes32 public constant WITHDRAWER_ROLE = keccak256("WITHDRAWER_ROLE"); // Role for off-chain claim checks bytes32 public constant CLAIM_CHECK_ROLE = keccak256("CLAIM_CHECK_ROLE"); // Rewards token interface IERC20 public rewardsToken; ////////////// /// Events /// ////////////// /** * An event that is emitted when update metadata function is called */ event UpdateMetadata(address indexed _caller, uint256 indexed _tokenId, uint256[12] _playerStats); /** * An event that is emitted when a player claims their rewards */ event RewardsClaimed(address indexed _caller, uint256 indexed _tokenId, uint256 indexed _transferAmount); /** * An event that is emitted when a the payout percentages change */ event PayoutsChanged(uint8[10] _payoutPercentages, uint8[10] _newPayoutPercentages); /** * An event that is emitted when the days between payouts change */ event PayoutDaysChanged(uint256[10] _payoutDays, uint256[10] _newPayoutDays); /** * An event that is emitted when the tokens tradeability is paused or unpaused */ event TradingPaused(bool _state); /** * An event that is emitted when the contracts native chain token is withdrawn */ event Withdraw(uint256 _amount); /** * An event that is emitted when the owner withdraws all the rewards token from the contract */ event WithdrawRewardsToken(uint256 _amount); /////////////////// /// CONSTRUCTOR /// /////////////////// constructor( string memory _name, string memory _symbol, string memory _initBaseURI, address _forwarder, address _rewardsToken ) ERC721(_name, _symbol) ERC2771Context(_forwarder) { setBaseURI(_initBaseURI); rewardsToken = IERC20(_rewardsToken); _setupRole(WHITELISTER_ROLE, _msgSender()); _setupRole(WITHDRAWER_ROLE, _msgSender()); _setupRole(CLAIM_CHECK_ROLE, _msgSender()); _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); } ///////////////// /// FUNCTIONS /// ///////////////// /** * Mints NFTs for multiple addresses. * * @param _addresses the addresses to mint for. */ function mintBatch(address[] calldata _addresses) public onlyOwner { // Get Supply uint256 supply = totalSupply(); uint256 count = supply + 1; // Loop through array of addresses for (uint i = 0; i < _addresses.length; i++) { // Check if owner has nft if(balanceOf(_addresses[i]) == 0) { // Mint for address _safeMint(_addresses[i], count); count++; } } } /** * Updates a players on-chain progress to match with their in game statistics. * * @param _playerStatistics the callers in game statistics. * @param _signature signed message of the stats by an address with WHITELISTER_ROLE */ function updateMetadata( uint[12] calldata _playerStatistics, bytes memory _signature ) public { // Verify stats address player = _msgSender(); require(balanceOf(player) > 0, "You need to have a token to update its metadata."); require( verifyStats(player, _playerStatistics, _signature) == true, "These statistics do not match our signature." ); // Get token id uint256 tokenId = tokenOfOwnerByIndex(player, 0); // Update player stats TokenIdToStats[tokenId] = _playerStatistics; // Emit update metadata event emit UpdateMetadata( player, tokenId, TokenIdToStats[tokenId] ); } /////////////// /// REWARDS /// /////////////// /** * A setter function to set the rewards for each token id * * @param _tokenIds array of token ids associated with the reward * @param _amounts array of the reward amount for the token ids */ function setRewards(uint256[] calldata _tokenIds, uint256[] calldata _amounts) public onlyOwner { require(_tokenIds.length == _amounts.length, "Both arrays need to be the same size."); for (uint256 i = 0; i < _tokenIds.length; i++) { // Set new reward amount TokenIdToRewards[_tokenIds[i]] = _amounts[i]; } } /** * A setter function to increase the rewards for each token id * * @param _tokenIds array of token ids associated with the reward * @param _amounts array of the reward amount to add for the token ids */ function addRewards(uint256[] calldata _tokenIds, uint256[] calldata _amounts) public onlyOwner { require(_tokenIds.length == _amounts.length, "Both arrays need to be the same size."); for (uint256 i = 0; i < _tokenIds.length; i++) { // Add rewards to existing reward amount TokenIdToRewards[_tokenIds[i]] += _amounts[i]; } } /** * Set the start date for players to start claiming rewards */ function startClaimingPeriod() public onlyOwner { require(claimStartDate == 0, "Claiming has already started."); claimStartDate = block.timestamp; } /** * Allows players to retrieve rewards allocated to their token id * * @param _tokenId the id of the token to claim rewards for * @param _signature verification that the caller is able to claim rewards tokens */ function getRewards(uint256 _tokenId, bytes memory _signature) public nonReentrant { require(claimStartDate > 0, "Claiming has not started yet."); // Get player address address player = _msgSender(); require( verifyClaim(player, _signature) == true, "Claim signature check invalid." ); require( ownerOf(_tokenId) == player, "You must own this token to claim the rewards." ); require( TokenIdToRewards[_tokenId] > 0 && TokenIdToClaimedRewards[_tokenId] < TokenIdToRewards[_tokenId], "There is no reward for this token id at this time." ); // Get transfer amount uint256 transferAmount; uint8 indexClaimed; (transferAmount, indexClaimed) = getTransferAmount(_tokenId); // Require the contract to have enough tokens require( rewardsToken.balanceOf(address(this)) >= transferAmount, "Not enough tokens to claim yet. Please try again later." ); // Update claimed amounts and index claimed for the account TokenIdToClaimedRewards[_tokenId] += transferAmount; TokenIdToIndexClaimed[_tokenId] = indexClaimed; // Transfer tokens rewardsToken.transfer(player, transferAmount); // Emit rewards claimed event emit RewardsClaimed(player, _tokenId, transferAmount); } /** * @dev Returns the amount of rewards token claimable for a token id * * @param _tokenId the id of the token to find the claimable rewards for */ function getTransferAmount(uint256 _tokenId) internal view returns (uint256, uint8) { // Require this months rewards to be unclaimed for this token id uint256 daysPassed = ((block.timestamp - claimStartDate) / 1 days) + 1; require( daysPassed > payoutDays[TokenIdToIndexClaimed[_tokenId]], "This token's rewards have already been claimed for this period." ); // Find what days the player is able to claim to uint8 endIndex; for (uint8 i = uint8(payoutDays.length); i > 0; i--) { if (daysPassed > payoutDays[i - 1]) { endIndex = i; break; } } // Caclulate the payout percentage for this token id uint256 percentagePayout; for (uint8 i = TokenIdToIndexClaimed[_tokenId]; i < endIndex; i++) { percentagePayout += payoutPercentages[i]; } // Calculate the transfer amount uint256 transferAmount = (TokenIdToRewards[_tokenId] * percentagePayout) / 100; return (transferAmount, endIndex); } /** * Allows players to retrieve rewards allocated for all their held tokens * * @param _signature verification that the caller is able to claim rewards tokens */ function getRewardsBatch(bytes memory _signature) public { // Get player address address player = _msgSender(); uint256 balance = balanceOf(player); // Check if owner has a token require(balance > 0, "You must have a token to claim rewards."); for (uint256 i = 0; i < balance; i++) { uint256 tokenId = tokenOfOwnerByIndex(player, i); getRewards(tokenId, _signature); } } /** * Setter function to set the payout percentages for the rewards token * * @param _newPayoutPercentages an array of the new payout percentages */ function setPayoutPercentages(uint8[10] calldata _newPayoutPercentages) public onlyOwner { // Find current index of payout days uint256 daysPassed; if (claimStartDate > 0) daysPassed = (block.timestamp - claimStartDate) / 1 days + 1; // Find the current index uint8 index; for (uint8 i = 1; i < 10; i++) { if (payoutDays[i] > daysPassed) { index = i - 1; break; } } // Calculate the new array sum uint8 newSum; for (uint8 i = 0; i < 10; i++) { // Require past and current payouts to be the same if (i <= index) { require( _newPayoutPercentages[i] == payoutPercentages[i], "Past and current payouts must be the same." ); } newSum += _newPayoutPercentages[i]; } // Require the sum of new payouts to equal 100 require(newSum == 100, "Payouts must equal 100%."); // Change payout and emit event emit PayoutsChanged(payoutPercentages, _newPayoutPercentages); payoutPercentages = _newPayoutPercentages; } /** * Setter function to set the days between payouts for the rewards token * * @param _newPayoutDays an array of the new days that payouts are to be given in */ function setPayoutDays(uint256[10] calldata _newPayoutDays) public onlyOwner { // Get days passed uint256 daysPassed; if (claimStartDate > 0) daysPassed = (block.timestamp - claimStartDate) / 1 days + 1; // Require the new array to be incrementing each index uint8 index; bool indexFound = false; for (uint8 i = 1; i < 10; i++) { require(_newPayoutDays[i - 1] < _newPayoutDays[i], "Each item in payout days array must be greater than the previous."); if (payoutDays[i] > daysPassed && !indexFound) { index = i - 1; indexFound = true; } } // Require this periods payout days to be the same require(_newPayoutDays[index] == payoutDays[index], "The current index of both arrays must be the same."); // Change payout and emit event emit PayoutDaysChanged(payoutDays, _newPayoutDays); payoutDays = _newPayoutDays; } /** * Setter function to set the address of the rewards token * * @param _tokenAddress of the new rewards token */ function setRewardsToken(address _tokenAddress) public onlyOwner { rewardsToken = IERC20(_tokenAddress); } /////////////// /// HELPERS /// /////////////// /** * @dev Returns true if the senders statistics are signed by an account with a WHITELISTER_ROLE. * * @param _to address that is part of the verified hash * @param _stats player statistics that are part of the verified hash * @param _signature of the signer that has WHITELISTER_ROLE */ function verifyStats( address _to, uint[12] calldata _stats, bytes memory _signature ) internal view returns (bool) { bytes32 messageHash = keccak256(abi.encode(_to, _stats)); bytes32 ethSignedMessageHash = keccak256( abi.encodePacked("\x19Ethereum Signed Message:\n32", messageHash) ); bytes32 r; bytes32 s; uint8 v; assembly { r := mload(add(_signature, 32)) s := mload(add(_signature, 64)) v := byte(0, mload(add(_signature, 96))) } address _signer = ecrecover(ethSignedMessageHash, v, r, s); return hasRole(WHITELISTER_ROLE, _signer); } /** * @dev Returns true if the senders statistics are signed by an account with a CLAIM_CHECK_ROLE. * * @param _to address that is part of the verified hash * @param _signature of the signer that has CLAIM_CHECK_ROLE */ function verifyClaim( address _to, bytes memory _signature ) internal view returns (bool) { bytes32 messageHash = keccak256(abi.encode(_to)); bytes32 ethSignedMessageHash = keccak256( abi.encodePacked("\x19Ethereum Signed Message:\n32", messageHash) ); bytes32 r; bytes32 s; uint8 v; assembly { r := mload(add(_signature, 32)) s := mload(add(_signature, 64)) v := byte(0, mload(add(_signature, 96))) } address _signer = ecrecover(ethSignedMessageHash, v, r, s); return hasRole(CLAIM_CHECK_ROLE, _signer); } /** * @dev Internal baseURI getter. */ function _baseURI() internal view virtual override returns (string memory) { return baseURI; } /** * @dev Returns the Uniform Resource Identifier (URI) for requested token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "AFR721: URI query for nonexistent token." ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, tokenId.toString(), baseExtension ) ) : ""; } /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. * * This function call must use less than 30 000 gas. * * @param _interfaceId to be checked for support */ function supportsInterface(bytes4 _interfaceId) public view virtual override(ERC721Enumerable, AccessControl) returns (bool) { return super.supportsInterface(_interfaceId); } /** * Changes the base URI for token metadata. * * @param _newBaseURI new value */ function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } /** * Changes the base extension for token metadata. * * @param _newBaseExtension new value */ function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } /** * Set trading state of NFT's * * @param _state operator set the contract on pause */ function setTradingPaused(bool _state) public onlyOwner { tradingPaused = _state; emit TradingPaused(_state); } /** * Transfers the total native coin balance to contract's owner account. * The balance must be > 0 so a zero transfer is avoided. * */ function withdraw() public nonReentrant onlyRole(WITHDRAWER_ROLE) { uint256 balance = address(this).balance; require(balance != 0, "AFR721: contract balance is zero."); (bool sent, ) = payable(owner()).call{value: balance}(""); require(sent, "AFR721: failed to send amount."); emit Withdraw(balance); } /** * Transfers the total rewards coin balance to contract's owner account. * The balance must be > 0 so a zero transfer is avoided. * */ function withdrawRewardsToken() public nonReentrant onlyRole(WITHDRAWER_ROLE) { uint256 balance = rewardsToken.balanceOf(address(this)); require(balance != 0, "AFR721: contract balance is zero."); rewardsToken.transfer(payable(owner()), balance); emit WithdrawRewardsToken(balance); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * This does not allow any transferring of tokens while trading is paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (tradingPaused) require(from == address(0), "The trading of this token is paused at the moment"); } /** * @dev function to return the msg.sender from ERC2771Context */ function _msgSender() internal view virtual override(Context, ERC2771Context) returns (address ret) { return ERC2771Context._msgSender(); } /** * @dev function to return the msg.data from ERC2771Context */ function _msgData() internal view virtual override(Context, ERC2771Context) returns (bytes memory ret) { return ERC2771Context._msgData(); } receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"address","name":"_forwarder","type":"address"},{"internalType":"address","name":"_rewardsToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[10]","name":"_payoutDays","type":"uint256[10]"},{"indexed":false,"internalType":"uint256[10]","name":"_newPayoutDays","type":"uint256[10]"}],"name":"PayoutDaysChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8[10]","name":"_payoutPercentages","type":"uint8[10]"},{"indexed":false,"internalType":"uint8[10]","name":"_newPayoutPercentages","type":"uint8[10]"}],"name":"PayoutsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_caller","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_transferAmount","type":"uint256"}],"name":"RewardsClaimed","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":false,"internalType":"bool","name":"_state","type":"bool"}],"name":"TradingPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_caller","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256[12]","name":"_playerStats","type":"uint256[12]"}],"name":"UpdateMetadata","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"WithdrawRewardsToken","type":"event"},{"inputs":[],"name":"CLAIM_CHECK_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"TokenIdToClaimedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"TokenIdToIndexClaimed","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"TokenIdToRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"TokenIdToStats","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELISTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAWER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"addRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimStartDate","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":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"getRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"getRewardsBatch","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"payoutDays","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"payoutPercentages","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":[],"name":"rewardsToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[10]","name":"_newPayoutDays","type":"uint256[10]"}],"name":"setPayoutDays","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8[10]","name":"_newPayoutPercentages","type":"uint8[10]"}],"name":"setPayoutPercentages","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"setRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"setRewardsToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setTradingPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startClaimingPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256[12]","name":"_playerStatistics","type":"uint256[12]"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"updateMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawRewardsToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e0604052600560a081905264173539b7b760d91b60c09081526200002891600e919062000458565b50600f805460ff1916600117905560006010556040805161014081018252600a80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526200009a9160119190620004e7565b50604080516101408101825260008152601e6020820152603c91810191909152605a606082015260786080820152609660a082015260b460c082015260d260e082015260f061010082015261010e610120820152620000fe90601290600a6200057c565b503480156200010c57600080fd5b5060405162004f3238038062004f328339810160408190526200012f91620006b4565b6001600160a01b0382166080528451859085906200015590600090602085019062000458565b5080516200016b90600190602084019062000458565b50505062000188620001826200026160201b60201c565b6200027d565b6001600c556200019883620002cf565b602080546001600160a01b0319166001600160a01b038316179055620001e87f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a620001e262000261565b62000369565b620002177f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4620001e262000261565b620002467f3581a363a9b2878a7f506ab23823a67229b8324b20ebc81f176e920a89c33c44620001e262000261565b620002566000620001e262000261565b5050505050620007a8565b6000620002786200037560201b6200269e1760201c565b905090565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620002d962000261565b6001600160a01b0316620002f5600b546001600160a01b031690565b6001600160a01b031614620003505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b80516200036590600d90602084019062000458565b5050565b620003658282620003ae565b6080516000906001600160a01b031633141562000399575060131936013560601c90565b620002786200045460201b620026e81760201c565b6000828152600a602090815260408083206001600160a01b038516845290915290205460ff1662000365576000828152600a602090815260408083206001600160a01b03851684529091529020805460ff191660011790556200041062000261565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b3390565b82805462000466906200076b565b90600052602060002090601f0160209004810192826200048a5760008555620004d5565b82601f10620004a557805160ff1916838001178555620004d5565b82800160010185558215620004d5579182015b82811115620004d5578251825591602001919060010190620004b8565b50620004e3929150620005b3565b5090565b600183019183908215620004d55791602002820160005b838211156200053e57835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302620004fe565b80156200056d5782816101000a81549060ff02191690556001016020816000010492830192600103026200053e565b5050620004e3929150620005b3565b82600a8101928215620004d5579160200282015b82811115620004d5578251829061ffff1690559160200191906001019062000590565b5b80821115620004e35760008155600101620005b4565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620005f257600080fd5b81516001600160401b03808211156200060f576200060f620005ca565b604051601f8301601f19908116603f011681019082821181831017156200063a576200063a620005ca565b816040528381526020925086838588010111156200065757600080fd5b600091505b838210156200067b57858201830151818301840152908201906200065c565b838211156200068d5760008385830101525b9695505050505050565b80516001600160a01b0381168114620006af57600080fd5b919050565b600080600080600060a08688031215620006cd57600080fd5b85516001600160401b0380821115620006e557600080fd5b620006f389838a01620005e0565b965060208801519150808211156200070a57600080fd5b6200071889838a01620005e0565b955060408801519150808211156200072f57600080fd5b506200073e88828901620005e0565b9350506200074f6060870162000697565b91506200075f6080870162000697565b90509295509295909350565b600181811c908216806200078057607f821691505b60208210811415620007a257634e487b7160e01b600052602260045260246000fd5b50919050565b608051614767620007cb600039600081816106db01526126a201526147676000f3fe6080604052600436106103535760003560e01c80636c0360eb116101c6578063a22cb465116100f7578063d547741f11610095578063de320cc11161006f578063de320cc114610a3e578063e985e9c514610a5e578063f25e995c14610aa7578063f2fde38b14610ac757600080fd5b8063d547741f146109d1578063d866178d146109f1578063da3ef23f14610a1e57600080fd5b8063b88d4fde116100d1578063b88d4fde1461095c578063c66828621461097c578063c87b56dd14610991578063d1af0c7d146109b157600080fd5b8063a22cb46514610907578063ae28dc5014610927578063ae69b95b1461093c57600080fd5b80638d6bb7ee11610164578063927f59ba1161013e578063927f59ba1461089d57806395d89b41146108bd578063979db1c4146108d2578063a217fddf146108f257600080fd5b80638d6bb7ee1461083f5780638da5cb5b1461085f57806391d148541461087d57600080fd5b8063718f9dbd116101a0578063718f9dbd146107ab5780637588854c146107cb57806385f438c1146107eb5780638a4445c51461081f57600080fd5b80636c0360eb1461076157806370a0823114610776578063715018a61461079657600080fd5b80632f745c59116102a057806353e23e2e1161023e578063572b6c0511610218578063572b6c05146106be5780635f03b6b21461070b5780636352211e1461072157806368e4278c1461074157600080fd5b806353e23e2e1461065057806355f804b31461066a578063570618e11461068a57600080fd5b806342842e0e1161027a57806342842e0e146105ae57806349a046c1146105ce5780634a56d8ce146106005780634f6ccce71461063057600080fd5b80632f745c591461055957806336568abe146105795780633ccfd60b1461059957600080fd5b8063179e49841161030d578063248a9ca3116102e7578063248a9ca3146104bc5780632758c56c146104ec5780632df4df8e146105195780632f2ff15d1461053957600080fd5b8063179e49841461044557806318160ddd1461048757806323b872dd1461049c57600080fd5b8062e0be331461035f57806301ffc9a71461038157806306fdde03146103b6578063081812fc146103d8578063095ea7b31461041057806312215a671461043057600080fd5b3661035a57005b600080fd5b34801561036b57600080fd5b5061037f61037a366004613b43565b610ae7565b005b34801561038d57600080fd5b506103a161039c366004613bc5565b610bd5565b60405190151581526020015b60405180910390f35b3480156103c257600080fd5b506103cb610be6565b6040516103ad9190613c3a565b3480156103e457600080fd5b506103f86103f3366004613c4d565b610c78565b6040516001600160a01b0390911681526020016103ad565b34801561041c57600080fd5b5061037f61042b366004613c82565b610c9f565b34801561043c57600080fd5b5061037f610dc7565b34801561045157600080fd5b506104797f3581a363a9b2878a7f506ab23823a67229b8324b20ebc81f176e920a89c33c4481565b6040519081526020016103ad565b34801561049357600080fd5b50600854610479565b3480156104a857600080fd5b5061037f6104b7366004613cac565b610e66565b3480156104c857600080fd5b506104796104d7366004613c4d565b6000908152600a602052604090206001015490565b3480156104f857600080fd5b50610479610507366004613c4d565b601e6020526000908152604090205481565b34801561052557600080fd5b5061037f610534366004613cfa565b610e9e565b34801561054557600080fd5b5061037f610554366004613d17565b611118565b34801561056557600080fd5b50610479610574366004613c82565b61113d565b34801561058557600080fd5b5061037f610594366004613d17565b6111d3565b3480156105a557600080fd5b5061037f611261565b3480156105ba57600080fd5b5061037f6105c9366004613cac565b6113c2565b3480156105da57600080fd5b506105ee6105e9366004613c4d565b6113dd565b60405160ff90911681526020016103ad565b34801561060c57600080fd5b506105ee61061b366004613c4d565b601f6020526000908152604090205460ff1681565b34801561063c57600080fd5b5061047961064b366004613c4d565b611407565b34801561065c57600080fd5b50600f546103a19060ff1681565b34801561067657600080fd5b5061037f610685366004613dcf565b61149a565b34801561069657600080fd5b506104797f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b3480156106ca57600080fd5b506103a16106d9366004613e18565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b34801561071757600080fd5b5061047960105481565b34801561072d57600080fd5b506103f861073c366004613c4d565b6114f6565b34801561074d57600080fd5b5061047961075c366004613c4d565b611556565b34801561076d57600080fd5b506103cb61156d565b34801561078257600080fd5b50610479610791366004613e18565b6115fb565b3480156107a257600080fd5b5061037f611681565b3480156107b757600080fd5b5061037f6107c6366004613e53565b6116d6565b3480156107d757600080fd5b506104796107e6366004613e9a565b611abe565b3480156107f757600080fd5b506104797f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b34801561082b57600080fd5b5061037f61083a366004613cfa565b611ae3565b34801561084b57600080fd5b5061037f61085a366004613ebc565b611d6c565b34801561086b57600080fd5b50600b546001600160a01b03166103f8565b34801561088957600080fd5b506103a1610898366004613d17565b611edf565b3480156108a957600080fd5b5061037f6108b8366004613efb565b611f0a565b3480156108c957600080fd5b506103cb611ff8565b3480156108de57600080fd5b5061037f6108ed366004613b43565b612007565b3480156108fe57600080fd5b50610479600081565b34801561091357600080fd5b5061037f610922366004613f4b565b6120d5565b34801561093357600080fd5b5061037f6120e7565b34801561094857600080fd5b5061037f610957366004613f82565b612296565b34801561096857600080fd5b5061037f610977366004613f9f565b612326565b34801561098857600080fd5b506103cb612365565b34801561099d57600080fd5b506103cb6109ac366004613c4d565b612372565b3480156109bd57600080fd5b506020546103f8906001600160a01b031681565b3480156109dd57600080fd5b5061037f6109ec366004613d17565b612449565b3480156109fd57600080fd5b50610479610a0c366004613c4d565b601d6020526000908152604090205481565b348015610a2a57600080fd5b5061037f610a39366004613dcf565b61246e565b348015610a4a57600080fd5b5061037f610a59366004613e18565b6124ca565b348015610a6a57600080fd5b506103a1610a79366004614007565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610ab357600080fd5b5061037f610ac2366004614031565b612535565b348015610ad357600080fd5b5061037f610ae2366004613e18565b6125e4565b610aef6126ec565b6001600160a01b0316610b0a600b546001600160a01b031690565b6001600160a01b031614610b395760405162461bcd60e51b8152600401610b3090614066565b60405180910390fd5b828114610b585760405162461bcd60e51b8152600401610b309061409b565b60005b83811015610bce57828282818110610b7557610b756140e0565b90506020020135601d6000878785818110610b9257610b926140e0565b9050602002013581526020019081526020016000206000828254610bb6919061410c565b90915550819050610bc681614124565b915050610b5b565b5050505050565b6000610be0826126f6565b92915050565b606060008054610bf59061413f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c219061413f565b8015610c6e5780601f10610c4357610100808354040283529160200191610c6e565b820191906000526020600020905b815481529060010190602001808311610c5157829003601f168201915b5050505050905090565b6000610c838261271b565b506000908152600460205260409020546001600160a01b031690565b6000610caa826114f6565b9050806001600160a01b0316836001600160a01b03161415610d185760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b30565b806001600160a01b0316610d2a6126ec565b6001600160a01b03161480610d465750610d4681610a796126ec565b610db85760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610b30565b610dc2838361277a565b505050565b610dcf6126ec565b6001600160a01b0316610dea600b546001600160a01b031690565b6001600160a01b031614610e105760405162461bcd60e51b8152600401610b3090614066565b60105415610e605760405162461bcd60e51b815260206004820152601d60248201527f436c61696d696e672068617320616c726561647920737461727465642e0000006044820152606401610b30565b42601055565b610e77610e716126ec565b826127e8565b610e935760405162461bcd60e51b8152600401610b309061417a565b610dc2838383612867565b610ea66126ec565b6001600160a01b0316610ec1600b546001600160a01b031690565b6001600160a01b031614610ee75760405162461bcd60e51b8152600401610b3090614066565b60105460009015610f1c576201518060105442610f0491906141c8565b610f0e91906141f5565b610f1990600161410c565b90505b60008060015b600a8160ff16101561103657848160ff16600a8110610f4357610f436140e0565b602002013585610f54600184614209565b60ff16600a8110610f6757610f676140e0565b602002013510610fe95760405162461bcd60e51b815260206004820152604160248201527f45616368206974656d20696e207061796f75742064617973206172726179206d60448201527f7573742062652067726561746572207468616e207468652070726576696f75736064820152601760f91b608482015260a401610b30565b8360128260ff16600a8110611000576110006140e0565b015411801561100d575081155b156110245761101d600182614209565b9250600191505b8061102e8161422c565b915050610f22565b5060128260ff16600a811061104d5761104d6140e0565b0154848360ff16600a8110611064576110646140e0565b6020020135146110d15760405162461bcd60e51b815260206004820152603260248201527f5468652063757272656e7420696e646578206f6620626f7468206172726179736044820152711036bab9ba103132903a34329039b0b6b29760711b6064820152608401610b30565b7ff09b292b241121206fca3aa132c542314689e3294c67f366ce576c4de600580660128560405161110392919061424c565b60405180910390a1610bce601285600a613972565b6000828152600a602052604090206001015461113381612a0e565b610dc28383612a1f565b6000611148836115fb565b82106111aa5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b30565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6111db6126ec565b6001600160a01b0316816001600160a01b0316146112535760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610b30565b61125d8282612aa6565b5050565b6002600c5414156112845760405162461bcd60e51b8152600401610b309061428d565b6002600c557f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e46112b381612a0e565b47806112d15760405162461bcd60e51b8152600401610b30906142c4565b60006112e5600b546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d806000811461132f576040519150601f19603f3d011682016040523d82523d6000602084013e611334565b606091505b50509050806113855760405162461bcd60e51b815260206004820152601e60248201527f4146523732313a206661696c656420746f2073656e6420616d6f756e742e00006044820152606401610b30565b6040518281527f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d9060200160405180910390a150506001600c5550565b610dc283838360405180602001604052806000815250612326565b601181600a81106113ed57600080fd5b60209182820401919006915054906101000a900460ff1681565b600061141260085490565b82106114755760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b30565b60088281548110611488576114886140e0565b90600052602060002001549050919050565b6114a26126ec565b6001600160a01b03166114bd600b546001600160a01b031690565b6001600160a01b0316146114e35760405162461bcd60e51b8152600401610b3090614066565b805161125d90600d9060208401906139b0565b6000818152600260205260408120546001600160a01b031680610be05760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610b30565b601281600a811061156657600080fd5b0154905081565b600d805461157a9061413f565b80601f01602080910402602001604051908101604052809291908181526020018280546115a69061413f565b80156115f35780601f106115c8576101008083540402835291602001916115f3565b820191906000526020600020905b8154815290600101906020018083116115d657829003601f168201915b505050505081565b60006001600160a01b0382166116655760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610b30565b506001600160a01b031660009081526003602052604090205490565b6116896126ec565b6001600160a01b03166116a4600b546001600160a01b031690565b6001600160a01b0316146116ca5760405162461bcd60e51b8152600401610b3090614066565b6116d46000612b2b565b565b6002600c5414156116f95760405162461bcd60e51b8152600401610b309061428d565b6002600c5560105461174d5760405162461bcd60e51b815260206004820152601d60248201527f436c61696d696e6720686173206e6f742073746172746564207965742e0000006044820152606401610b30565b60006117576126ec565b90506117638183612b7d565b15156001146117b45760405162461bcd60e51b815260206004820152601e60248201527f436c61696d207369676e617475726520636865636b20696e76616c69642e00006044820152606401610b30565b806001600160a01b03166117c7846114f6565b6001600160a01b0316146118335760405162461bcd60e51b815260206004820152602d60248201527f596f75206d757374206f776e207468697320746f6b656e20746f20636c61696d60448201526c103a3432903932bbb0b932399760991b6064820152608401610b30565b6000838152601d60205260409020541580159061186857506000838152601d6020908152604080832054601e90925290912054105b6118cf5760405162461bcd60e51b815260206004820152603260248201527f5468657265206973206e6f2072657761726420666f72207468697320746f6b65604482015271371034b21030ba103a3434b9903a34b6b29760711b6064820152608401610b30565b6000806118db85612c9b565b6020546040516370a0823160e01b815230600482015292945090925083916001600160a01b03909116906370a0823190602401602060405180830381865afa15801561192b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194f9190614305565b10156119c35760405162461bcd60e51b815260206004820152603760248201527f4e6f7420656e6f75676820746f6b656e7320746f20636c61696d207965742e2060448201527f506c656173652074727920616761696e206c617465722e0000000000000000006064820152608401610b30565b6000858152601e6020526040812080548492906119e190849061410c565b90915550506000858152601f6020908152604091829020805460ff191660ff851617905554905163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb906044016020604051808303816000875af1158015611a55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a79919061431e565b508185846001600160a01b03167fdacbdde355ba930696a362ea6738feb9f8bd52dfb3d81947558fd3217e23e32560405160405180910390a450506001600c55505050565b601c60205281600052604060002081600c8110611ada57600080fd5b01549150829050565b611aeb6126ec565b6001600160a01b0316611b06600b546001600160a01b031690565b6001600160a01b031614611b2c5760405162461bcd60e51b8152600401610b3090614066565b60105460009015611b61576201518060105442611b4991906141c8565b611b5391906141f5565b611b5e90600161410c565b90505b600060015b600a8160ff161015611bb5578260128260ff16600a8110611b8957611b896140e0565b01541115611ba357611b9c600182614209565b9150611bb5565b80611bad8161422c565b915050611b66565b506000805b600a8160ff161015611cd1578260ff168160ff1611611c8b5760118160ff16600a8110611be957611be96140e0565b602081049091015460ff601f9092166101000a900481169086908316600a8110611c1557611c156140e0565b602002016020810190611c28919061434c565b60ff1614611c8b5760405162461bcd60e51b815260206004820152602a60248201527f5061737420616e642063757272656e74207061796f757473206d757374206265604482015269103a34329039b0b6b29760b11b6064820152608401610b30565b848160ff16600a8110611ca057611ca06140e0565b602002016020810190611cb3919061434c565b611cbd9083614367565b915080611cc98161422c565b915050611bba565b508060ff16606414611d255760405162461bcd60e51b815260206004820152601860248201527f5061796f757473206d75737420657175616c20313030252e00000000000000006044820152606401610b30565b7f17202a799495b21e9633b96cb161994c8a8694f1053d708b24cb06a887130f6b601185604051611d579291906143ba565b60405180910390a1610bce601185600a613a24565b6000611d766126ec565b90506000611d83826115fb565b11611de95760405162461bcd60e51b815260206004820152603060248201527f596f75206e65656420746f2068617665206120746f6b656e20746f207570646160448201526f3a329034ba399036b2ba30b230ba309760811b6064820152608401610b30565b611df4818484612e56565b1515600114611e5a5760405162461bcd60e51b815260206004820152602c60248201527f5468657365207374617469737469637320646f206e6f74206d61746368206f7560448201526b391039b4b3b730ba3ab9329760a11b6064820152608401610b30565b6000611e6782600061113d565b6000818152601c60205260409020909150611e849085600c613ab5565b5080826001600160a01b03167f07fe1750b52755ec3fb09a34f85eb25fdd77c6f6d68197e268681786d3549012601c6000858152602001908152602001600020604051611ed19190614478565b60405180910390a350505050565b6000918252600a602090815260408084206001600160a01b0393909316845291905290205460ff1690565b611f126126ec565b6001600160a01b0316611f2d600b546001600160a01b031690565b6001600160a01b031614611f535760405162461bcd60e51b8152600401610b3090614066565b6000611f5e60085490565b90506000611f6d82600161410c565b905060005b83811015610bce57611fa4858583818110611f8f57611f8f6140e0565b90506020020160208101906107919190613e18565b611fe657611fd8858583818110611fbd57611fbd6140e0565b9050602002016020810190611fd29190613e18565b83612f7f565b81611fe281614124565b9250505b80611ff081614124565b915050611f72565b606060018054610bf59061413f565b61200f6126ec565b6001600160a01b031661202a600b546001600160a01b031690565b6001600160a01b0316146120505760405162461bcd60e51b8152600401610b3090614066565b82811461206f5760405162461bcd60e51b8152600401610b309061409b565b60005b83811015610bce5782828281811061208c5761208c6140e0565b90506020020135601d60008787858181106120a9576120a96140e0565b9050602002013581526020019081526020016000208190555080806120cd90614124565b915050612072565b61125d6120e06126ec565b8383612f99565b6002600c54141561210a5760405162461bcd60e51b8152600401610b309061428d565b6002600c557f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461213981612a0e565b6020546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612182573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a69190614305565b9050806121c55760405162461bcd60e51b8152600401610b30906142c4565b6020546001600160a01b031663a9059cbb6121e8600b546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015612235573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612259919061431e565b506040518181527f6a18e453382124b26f3128783718f9fa1bab6621a7201e336999023c05d35f2d9060200160405180910390a150506001600c55565b61229e6126ec565b6001600160a01b03166122b9600b546001600160a01b031690565b6001600160a01b0316146122df5760405162461bcd60e51b8152600401610b3090614066565b600f805460ff19168215159081179091556040519081527f64891834b8201e4fdeda37096a5f1c16360f209047b1e9a93839cc5bbbb763bd9060200160405180910390a150565b6123376123316126ec565b836127e8565b6123535760405162461bcd60e51b8152600401610b309061417a565b61235f84848484613068565b50505050565b600e805461157a9061413f565b6000818152600260205260409020546060906001600160a01b03166123ea5760405162461bcd60e51b815260206004820152602860248201527f4146523732313a2055524920717565727920666f72206e6f6e6578697374656e6044820152673a103a37b5b2b71760c11b6064820152608401610b30565b60006123f461309b565b905060008151116124145760405180602001604052806000815250612442565b8061241e846130aa565b600e604051602001612432939291906144aa565b6040516020818303038152906040525b9392505050565b6000828152600a602052604090206001015461246481612a0e565b610dc28383612aa6565b6124766126ec565b6001600160a01b0316612491600b546001600160a01b031690565b6001600160a01b0316146124b75760405162461bcd60e51b8152600401610b3090614066565b805161125d90600e9060208401906139b0565b6124d26126ec565b6001600160a01b03166124ed600b546001600160a01b031690565b6001600160a01b0316146125135760405162461bcd60e51b8152600401610b3090614066565b602080546001600160a01b0319166001600160a01b0392909216919091179055565b600061253f6126ec565b9050600061254c826115fb565b9050600081116125ae5760405162461bcd60e51b815260206004820152602760248201527f596f75206d7573742068617665206120746f6b656e20746f20636c61696d207260448201526632bbb0b932399760c91b6064820152608401610b30565b60005b8181101561235f5760006125c5848361113d565b90506125d181866116d6565b50806125dc81614124565b9150506125b1565b6125ec6126ec565b6001600160a01b0316612607600b546001600160a01b031690565b6001600160a01b03161461262d5760405162461bcd60e51b8152600401610b3090614066565b6001600160a01b0381166126925760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b30565b61269b81612b2b565b50565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163314156126de575060131936013560601c90565b503390565b905090565b3390565b60006126e361269e565b60006001600160e01b03198216637965db0b60e01b1480610be05750610be0826131a8565b6000818152600260205260409020546001600160a01b031661269b5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610b30565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906127af826114f6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806127f4836114f6565b9050806001600160a01b0316846001600160a01b0316148061283b57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b8061285f5750836001600160a01b031661285484610c78565b6001600160a01b0316145b949350505050565b826001600160a01b031661287a826114f6565b6001600160a01b0316146128de5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610b30565b6001600160a01b0382166129405760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b30565b61294b8383836131cd565b61295660008261277a565b6001600160a01b038316600090815260036020526040812080546001929061297f9084906141c8565b90915550506001600160a01b03821660009081526003602052604081208054600192906129ad90849061410c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61269b81612a1a6126ec565b613254565b612a298282611edf565b61125d576000828152600a602090815260408083206001600160a01b03851684529091529020805460ff19166001179055612a626126ec565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b612ab08282611edf565b1561125d576000828152600a602090815260408083206001600160a01b03851684529091529020805460ff19169055612ae76126ec565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516001600160a01b03841660208083019190915282518083038201815282840190935282519201919091207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006060830152607c82018190526000918290609c0160408051601f19818403018152828252805160209182012087820151888401516060808b01516000808952958801808852859052851a958701869052860182905260808601819052919550939092919060019060a0016020604051602081039080840390855afa158015612c58573d6000803e3d6000fd5b505050602060405103519050612c8e7f3581a363a9b2878a7f506ab23823a67229b8324b20ebc81f176e920a89c33c4482611edf565b9998505050505050505050565b60008060006201518060105442612cb291906141c8565b612cbc91906141f5565b612cc790600161410c565b6000858152601f602052604090205490915060129060ff16600a8110612cef57612cef6140e0565b01548111612d655760405162461bcd60e51b815260206004820152603f60248201527f5468697320746f6b656e27732072657761726473206861766520616c7265616460448201527f79206265656e20636c61696d656420666f72207468697320706572696f642e006064820152608401610b30565b6000600a5b60ff811615612db6576012612d80600183614209565b60ff16600a8110612d9357612d936140e0565b0154831115612da457809150612db6565b80612dae8161456e565b915050612d6a565b506000858152601f602052604081205460ff165b8260ff168160ff161015612e215760118160ff16600a8110612dee57612dee6140e0565b602081049190910154612e0d91601f166101000a900460ff168361410c565b915080612e198161422c565b915050612dca565b506000868152601d6020526040812054606490612e3f90849061458b565b612e4991906141f5565b9792965091945050505050565b6000808484604051602001612e6c9291906145aa565b604051602081830303815290604052805190602001209050600081604051602001612ec391907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f19818403018152828252805160209182012087820151888401516060808b01516000808952958801808852859052851a958701869052860182905260808601819052919550939092919060019060a0016020604051602081039080840390855afa158015612f3b573d6000803e3d6000fd5b505050602060405103519050612f717f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a82611edf565b9a9950505050505050505050565b61125d8282604051806020016040528060008152506132b8565b816001600160a01b0316836001600160a01b03161415612ffb5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b30565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613073848484612867565b61307f848484846132eb565b61235f5760405162461bcd60e51b8152600401610b30906145cf565b6060600d8054610bf59061413f565b6060816130ce5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156130f857806130e281614124565b91506130f19050600a836141f5565b91506130d2565b60008167ffffffffffffffff81111561311357613113613d43565b6040519080825280601f01601f19166020018201604052801561313d576020820181803683370190505b5090505b841561285f576131526001836141c8565b915061315f600a86614621565b61316a90603061410c565b60f81b81838151811061317f5761317f6140e0565b60200101906001600160f81b031916908160001a9053506131a1600a866141f5565b9450613141565b60006001600160e01b0319821663780e9d6360e01b1480610be05750610be0826133f0565b6131d8838383613440565b600f5460ff1615610dc2576001600160a01b03831615610dc25760405162461bcd60e51b815260206004820152603160248201527f5468652074726164696e67206f66207468697320746f6b656e206973207061756044820152701cd95908185d081d1a19481b5bdb595b9d607a1b6064820152608401610b30565b61325e8282611edf565b61125d57613276816001600160a01b031660146134f8565b6132818360206134f8565b604051602001613292929190614635565b60408051601f198184030181529082905262461bcd60e51b8252610b3091600401613c3a565b6132c28383613694565b6132cf60008484846132eb565b610dc25760405162461bcd60e51b8152600401610b30906145cf565b60006001600160a01b0384163b156133e557836001600160a01b031663150b7a026133146126ec565b8786866040518563ffffffff1660e01b815260040161333694939291906146aa565b6020604051808303816000875af1925050508015613371575060408051601f3d908101601f1916820190925261336e918101906146e7565b60015b6133cb573d80801561339f576040519150601f19603f3d011682016040523d82523d6000602084013e6133a4565b606091505b5080516133c35760405162461bcd60e51b8152600401610b30906145cf565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061285f565b506001949350505050565b60006001600160e01b031982166380ac58cd60e01b148061342157506001600160e01b03198216635b5e139f60e01b145b80610be057506301ffc9a760e01b6001600160e01b0319831614610be0565b6001600160a01b03831661349b5761349681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6134be565b816001600160a01b0316836001600160a01b0316146134be576134be83826137e2565b6001600160a01b0382166134d557610dc28161387f565b826001600160a01b0316826001600160a01b031614610dc257610dc2828261392e565b6060600061350783600261458b565b61351290600261410c565b67ffffffffffffffff81111561352a5761352a613d43565b6040519080825280601f01601f191660200182016040528015613554576020820181803683370190505b509050600360fc1b8160008151811061356f5761356f6140e0565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061359e5761359e6140e0565b60200101906001600160f81b031916908160001a90535060006135c284600261458b565b6135cd90600161410c565b90505b6001811115613645576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110613601576136016140e0565b1a60f81b828281518110613617576136176140e0565b60200101906001600160f81b031916908160001a90535060049490941c9361363e81614704565b90506135d0565b5083156124425760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610b30565b6001600160a01b0382166136ea5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b30565b6000818152600260205260409020546001600160a01b03161561374f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b30565b61375b600083836131cd565b6001600160a01b038216600090815260036020526040812080546001929061378490849061410c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060016137ef846115fb565b6137f991906141c8565b60008381526007602052604090205490915080821461384c576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090613891906001906141c8565b600083815260096020526040812054600880549394509092849081106138b9576138b96140e0565b9060005260206000200154905080600883815481106138da576138da6140e0565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806139125761391261471b565b6001900381819060005260206000200160009055905550505050565b6000613939836115fb565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82600a81019282156139a0579160200282015b828111156139a0578235825591602001919060010190613985565b506139ac929150613ae2565b5090565b8280546139bc9061413f565b90600052602060002090601f0160209004810192826139de57600085556139a0565b82601f106139f757805160ff19168380011785556139a0565b828001600101855582156139a0579182015b828111156139a0578251825591602001919060010190613a09565b6001830191839082156139a05791602002820160005b83821115613a7b57833560ff1683826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302613a3a565b8015613aa85782816101000a81549060ff0219169055600101602081600001049283019260010302613a7b565b50506139ac929150613ae2565b82600c81019282156139a057916020028201828111156139a0578235825591602001919060010190613985565b5b808211156139ac5760008155600101613ae3565b60008083601f840112613b0957600080fd5b50813567ffffffffffffffff811115613b2157600080fd5b6020830191508360208260051b8501011115613b3c57600080fd5b9250929050565b60008060008060408587031215613b5957600080fd5b843567ffffffffffffffff80821115613b7157600080fd5b613b7d88838901613af7565b90965094506020870135915080821115613b9657600080fd5b50613ba387828801613af7565b95989497509550505050565b6001600160e01b03198116811461269b57600080fd5b600060208284031215613bd757600080fd5b813561244281613baf565b60005b83811015613bfd578181015183820152602001613be5565b8381111561235f5750506000910152565b60008151808452613c26816020860160208601613be2565b601f01601f19169290920160200192915050565b6020815260006124426020830184613c0e565b600060208284031215613c5f57600080fd5b5035919050565b80356001600160a01b0381168114613c7d57600080fd5b919050565b60008060408385031215613c9557600080fd5b613c9e83613c66565b946020939093013593505050565b600080600060608486031215613cc157600080fd5b613cca84613c66565b9250613cd860208501613c66565b9150604084013590509250925092565b806101408101831015610be057600080fd5b60006101408284031215613d0d57600080fd5b6124428383613ce8565b60008060408385031215613d2a57600080fd5b82359150613d3a60208401613c66565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115613d7457613d74613d43565b604051601f8501601f19908116603f01168101908282118183101715613d9c57613d9c613d43565b81604052809350858152868686011115613db557600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215613de157600080fd5b813567ffffffffffffffff811115613df857600080fd5b8201601f81018413613e0957600080fd5b61285f84823560208401613d59565b600060208284031215613e2a57600080fd5b61244282613c66565b600082601f830112613e4457600080fd5b61244283833560208501613d59565b60008060408385031215613e6657600080fd5b82359150602083013567ffffffffffffffff811115613e8457600080fd5b613e9085828601613e33565b9150509250929050565b60008060408385031215613ead57600080fd5b50508035926020909101359150565b6000806101a08385031215613ed057600080fd5b610180830184811115613ee257600080fd5b8392503567ffffffffffffffff811115613e8457600080fd5b60008060208385031215613f0e57600080fd5b823567ffffffffffffffff811115613f2557600080fd5b613f3185828601613af7565b90969095509350505050565b801515811461269b57600080fd5b60008060408385031215613f5e57600080fd5b613f6783613c66565b91506020830135613f7781613f3d565b809150509250929050565b600060208284031215613f9457600080fd5b813561244281613f3d565b60008060008060808587031215613fb557600080fd5b613fbe85613c66565b9350613fcc60208601613c66565b925060408501359150606085013567ffffffffffffffff811115613fef57600080fd5b613ffb87828801613e33565b91505092959194509250565b6000806040838503121561401a57600080fd5b61402383613c66565b9150613d3a60208401613c66565b60006020828403121561404357600080fd5b813567ffffffffffffffff81111561405a57600080fd5b61285f84828501613e33565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f426f746820617272617973206e65656420746f206265207468652073616d652060408201526439b4bd329760d91b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000821982111561411f5761411f6140f6565b500190565b6000600019821415614138576141386140f6565b5060010190565b600181811c9082168061415357607f821691505b6020821081141561417457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b6000828210156141da576141da6140f6565b500390565b634e487b7160e01b600052601260045260246000fd5b600082614204576142046141df565b500490565b600060ff821660ff841680821015614223576142236140f6565b90039392505050565b600060ff821660ff811415614243576142436140f6565b60010192915050565b6102808101818460005b600a811015614275578154835260209092019160019182019101614256565b50505061014080848285013750600081529392505050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526021908201527f4146523732313a20636f6e74726163742062616c616e6365206973207a65726f6040820152601760f91b606082015260800190565b60006020828403121561431757600080fd5b5051919050565b60006020828403121561433057600080fd5b815161244281613f3d565b803560ff81168114613c7d57600080fd5b60006020828403121561435e57600080fd5b6124428261433b565b600060ff821660ff84168060ff03821115614384576143846140f6565b019392505050565b8060005b600a81101561235f5760ff6143a48361433b565b1684526020938401939190910190600101614390565b825460ff8082168352600882901c81166020840152601082901c81166040840152601882901c811660608401526102808301919061440260808501828460201c1660ff169052565b61441660a08501828460281c1660ff169052565b61442a60c08501828460301c1660ff169052565b61443e60e08501828460381c1660ff169052565b6144536101008501828460401c1660ff169052565b6144686101208501828460481c1660ff169052565b505061244261014083018461438c565b6101808101818360005b600c8110156144a1578154835260209092019160019182019101614482565b50505092915050565b6000845160206144bd8285838a01613be2565b8551918401916144d08184848a01613be2565b8554920191600090600181811c90808316806144ed57607f831692505b85831081141561450b57634e487b7160e01b85526022600452602485fd5b80801561451f57600181146145305761455d565b60ff1985168852838801955061455d565b60008b81526020902060005b858110156145555781548a82015290840190880161453c565b505083880195505b50939b9a5050505050505050505050565b600060ff821680614581576145816140f6565b6000190192915050565b60008160001904831182151516156145a5576145a56140f6565b500290565b6001600160a01b03831681526101a08101610180836020840137600081529392505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082614630576146306141df565b500690565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161466d816017850160208801613be2565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161469e816028840160208801613be2565b01602801949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906146dd90830184613c0e565b9695505050505050565b6000602082840312156146f957600080fd5b815161244281613baf565b600081614713576147136140f6565b506000190190565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220f81b709b02b295a179c2c571256ce349f3109eeb6c106191fad34ccd6a20323864736f6c634300080b003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000f0511f123164602042ab2bcf02111fa5d3fe97cd000000000000000000000000dfce1e99a31c4597a3f8a8945cbfa9037655e33500000000000000000000000000000000000000000000000000000000000000305068616e746f6d2047616c61786965732041737472616669746520527573682050726f677265737320547261636b65720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055047414652000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d68747470733a2f2f6166722e6e66742e7068616e746f6d67616c61786965732e636f6d2f6d657461646174612f00000000000000000000000000000000000000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000f0511f123164602042ab2bcf02111fa5d3fe97cd000000000000000000000000dfce1e99a31c4597a3f8a8945cbfa9037655e33500000000000000000000000000000000000000000000000000000000000000305068616e746f6d2047616c61786965732041737472616669746520527573682050726f677265737320547261636b65720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055047414652000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d68747470733a2f2f6166722e6e66742e7068616e746f6d67616c61786965732e636f6d2f6d657461646174612f00000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): Phantom Galaxies Astrafite Rush Progress Tracker
Arg [1] : _symbol (string): PGAFR
Arg [2] : _initBaseURI (string): https://afr.nft.phantomgalaxies.com/metadata/
Arg [3] : _forwarder (address): 0xf0511f123164602042ab2bcf02111fa5d3fe97cd
Arg [4] : _rewardsToken (address): 0xdfce1e99a31c4597a3f8a8945cbfa9037655e335
-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [3] : 000000000000000000000000f0511f123164602042ab2bcf02111fa5d3fe97cd
Arg [4] : 000000000000000000000000dfce1e99a31c4597a3f8a8945cbfa9037655e335
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000030
Arg [6] : 5068616e746f6d2047616c617869657320417374726166697465205275736820
Arg [7] : 50726f677265737320547261636b657200000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [9] : 5047414652000000000000000000000000000000000000000000000000000000
Arg [10] : 000000000000000000000000000000000000000000000000000000000000002d
Arg [11] : 68747470733a2f2f6166722e6e66742e7068616e746f6d67616c61786965732e
Arg [12] : 636f6d2f6d657461646174612f00000000000000000000000000000000000000
Deployed ByteCode Sourcemap
63713:20042:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69905:397;;;;;;;;;;-1:-1:-1;69905:397:0;;;;;:::i;:::-;;:::i;:::-;;80533:238;;;;;;;;;;-1:-1:-1;80533:238:0;;;;;:::i;:::-;;:::i;:::-;;;1715:14:1;;1708:22;1690:41;;1678:2;1663:18;80533:238:0;;;;;;;;44225:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;45738:171::-;;;;;;;;;;-1:-1:-1;45738:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2842:32:1;;;2824:51;;2812:2;2797:18;45738:171:0;2678:203:1;45255:417:0;;;;;;;;;;-1:-1:-1;45255:417:0;;;;;:::i;:::-;;:::i;70393:171::-;;;;;;;;;;;;;:::i;65171:72::-;;;;;;;;;;;;65214:29;65171:72;;;;;3469:25:1;;;3457:2;3442:18;65171:72:0;3323:177:1;58131:113:0;;;;;;;;;;-1:-1:-1;58219:10:0;:17;58131:113;;46438:336;;;;;;;;;;-1:-1:-1;46438:336:0;;;;;:::i;:::-;;:::i;31566:131::-;;;;;;;;;;-1:-1:-1;31566:131:0;;;;;:::i;:::-;31640:7;31667:12;;;:6;:12;;;;;:22;;;;31566:131;64685:58;;;;;;;;;;-1:-1:-1;64685:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;75969:1024;;;;;;;;;;-1:-1:-1;75969:1024:0;;;;;:::i;:::-;;:::i;31959:147::-;;;;;;;;;;-1:-1:-1;31959:147:0;;;;;:::i;:::-;;:::i;57799:256::-;;;;;;;;;;-1:-1:-1;57799:256:0;;;;;:::i;:::-;;:::i;33007:218::-;;;;;;;;;;-1:-1:-1;33007:218:0;;;;;:::i;:::-;;:::i;81740:356::-;;;;;;;;;;;;;:::i;46845:185::-;;;;;;;;;;-1:-1:-1;46845:185:0;;;;;:::i;:::-;;:::i;64231:68::-;;;;;;;;;;-1:-1:-1;64231:68:0;;;;;:::i;:::-;;:::i;:::-;;;5123:4:1;5111:17;;;5093:36;;5081:2;5066:18;64231:68:0;4951:184:1;64798:54:0;;;;;;;;;;-1:-1:-1;64798:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;58321:233;;;;;;;;;;-1:-1:-1;58321:233:0;;;;;:::i;:::-;;:::i;64087:32::-;;;;;;;;;;-1:-1:-1;64087:32:0;;;;;;;;80891:130;;;;;;;;;;-1:-1:-1;80891:130:0;;;;;:::i;:::-;;:::i;64919:72::-;;;;;;;;;;;;64962:29;64919:72;;12250:138;;;;;;;;;;-1:-1:-1;12250:138:0;;;;;:::i;:::-;12363:17;-1:-1:-1;;;;;12350:30:0;;;;;;;12250:138;64153:33;;;;;;;;;;;;;;;;43936:222;;;;;;;;;;-1:-1:-1;43936:222:0;;;;;:::i;:::-;;:::i;64348:68::-;;;;;;;;;;-1:-1:-1;64348:68:0;;;;;:::i;:::-;;:::i;63913:21::-;;;;;;;;;;;;;:::i;43667:207::-;;;;;;;;;;-1:-1:-1;43667:207:0;;;;;:::i;:::-;;:::i;14833:103::-;;;;;;;;;;;;;:::i;70826:1501::-;;;;;;;;;;-1:-1:-1;70826:1501:0;;;;;:::i;:::-;;:::i;64475:53::-;;;;;;;;;;-1:-1:-1;64475:53:0;;;;;:::i;:::-;;:::i;65052:70::-;;;;;;;;;;;;65094:28;65052:70;;74505:1262;;;;;;;;;;-1:-1:-1;74505:1262:0;;;;;:::i;:::-;;:::i;68198:788::-;;;;;;;;;;-1:-1:-1;68198:788:0;;;;;:::i;:::-;;:::i;14182:87::-;;;;;;;;;;-1:-1:-1;14255:6:0;;-1:-1:-1;;;;;14255:6:0;14182:87;;30026:147;;;;;;;;;;-1:-1:-1;30026:147:0;;;;;:::i;:::-;;:::i;67401:519::-;;;;;;;;;;-1:-1:-1;67401:519:0;;;;;:::i;:::-;;:::i;44394:104::-;;;;;;;;;;;;;:::i;69288:368::-;;;;;;;;;;-1:-1:-1;69288:368:0;;;;;:::i;:::-;;:::i;29131:49::-;;;;;;;;;;-1:-1:-1;29131:49:0;29176:4;29131:49;;45981:155;;;;;;;;;;-1:-1:-1;45981:155:0;;;;;:::i;:::-;;:::i;82271:327::-;;;;;;;;;;;;;:::i;81432:134::-;;;;;;;;;;-1:-1:-1;81432:134:0;;;;;:::i;:::-;;:::i;47101:323::-;;;;;;;;;;-1:-1:-1;47101:323:0;;;;;:::i;:::-;;:::i;63983:37::-;;;;;;;;;;;;;:::i;79639:637::-;;;;;;;;;;-1:-1:-1;79639:637:0;;;;;:::i;:::-;;:::i;65284:26::-;;;;;;;;;;-1:-1:-1;65284:26:0;;;;-1:-1:-1;;;;;65284:26:0;;;32351:149;;;;;;;;;;-1:-1:-1;32351:149:0;;;;;:::i;:::-;;:::i;64577:51::-;;;;;;;;;;-1:-1:-1;64577:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;81153:151;;;;;;;;;;-1:-1:-1;81153:151:0;;;;;:::i;:::-;;:::i;77146:120::-;;;;;;;;;;-1:-1:-1;77146:120:0;;;;;:::i;:::-;;:::i;46207:164::-;;;;;;;;;;-1:-1:-1;46207:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;46328:25:0;;;46304:4;46328:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;46207:164;73848:470;;;;;;;;;;-1:-1:-1;73848:470:0;;;;;:::i;:::-;;:::i;15091:201::-;;;;;;;;;;-1:-1:-1;15091:201:0;;;;;:::i;:::-;;:::i;69905:397::-;14413:12;:10;:12::i;:::-;-1:-1:-1;;;;;14402:23:0;:7;14255:6;;-1:-1:-1;;;;;14255:6:0;;14182:87;14402:7;-1:-1:-1;;;;;14402:23:0;;14394:68;;;;-1:-1:-1;;;14394:68:0;;;;;;;:::i;:::-;;;;;;;;;70020:35;;::::1;70012:85;;;;-1:-1:-1::0;;;70012:85:0::1;;;;;;;:::i;:::-;70113:9;70108:187;70128:20:::0;;::::1;70108:187;;;70272:8;;70281:1;70272:11;;;;;;;:::i;:::-;;;;;;;70238:16;:30;70255:9;;70265:1;70255:12;;;;;;;:::i;:::-;;;;;;;70238:30;;;;;;;;;;;;:45;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;70150:3:0;;-1:-1:-1;70150:3:0::1;::::0;::::1;:::i;:::-;;;;70108:187;;;;69905:397:::0;;;;:::o;80533:238::-;80697:4;80726:37;80750:12;80726:23;:37::i;:::-;80719:44;80533:238;-1:-1:-1;;80533:238:0:o;44225:100::-;44279:13;44312:5;44305:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44225:100;:::o;45738:171::-;45814:7;45834:23;45849:7;45834:14;:23::i;:::-;-1:-1:-1;45877:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;45877:24:0;;45738:171::o;45255:417::-;45336:13;45352:23;45367:7;45352:14;:23::i;:::-;45336:39;;45400:5;-1:-1:-1;;;;;45394:11:0;:2;-1:-1:-1;;;;;45394:11:0;;;45386:57;;;;-1:-1:-1;;;45386:57:0;;12515:2:1;45386:57:0;;;12497:21:1;12554:2;12534:18;;;12527:30;12593:34;12573:18;;;12566:62;-1:-1:-1;;;12644:18:1;;;12637:31;12685:19;;45386:57:0;12313:397:1;45386:57:0;45494:5;-1:-1:-1;;;;;45478:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;45478:21:0;;:62;;;;45503:37;45520:5;45527:12;:10;:12::i;45503:37::-;45456:174;;;;-1:-1:-1;;;45456:174:0;;12917:2:1;45456:174:0;;;12899:21:1;12956:2;12936:18;;;12929:30;12995:34;12975:18;;;12968:62;13066:32;13046:18;;;13039:60;13116:19;;45456:174:0;12715:426:1;45456:174:0;45643:21;45652:2;45656:7;45643:8;:21::i;:::-;45325:347;45255:417;;:::o;70393:171::-;14413:12;:10;:12::i;:::-;-1:-1:-1;;;;;14402:23:0;:7;14255:6;;-1:-1:-1;;;;;14255:6:0;;14182:87;14402:7;-1:-1:-1;;;;;14402:23:0;;14394:68;;;;-1:-1:-1;;;14394:68:0;;;;;;;:::i;:::-;70460:14:::1;::::0;:19;70452:61:::1;;;::::0;-1:-1:-1;;;70452:61:0;;13348:2:1;70452:61:0::1;::::0;::::1;13330:21:1::0;13387:2;13367:18;;;13360:30;13426:31;13406:18;;;13399:59;13475:18;;70452:61:0::1;13146:353:1::0;70452:61:0::1;70541:15;70524:14;:32:::0;70393:171::o;46438:336::-;46633:41;46652:12;:10;:12::i;:::-;46666:7;46633:18;:41::i;:::-;46625:100;;;;-1:-1:-1;;;46625:100:0;;;;;;;:::i;:::-;46738:28;46748:4;46754:2;46758:7;46738:9;:28::i;75969:1024::-;14413:12;:10;:12::i;:::-;-1:-1:-1;;;;;14402:23:0;:7;14255:6;;-1:-1:-1;;;;;14255:6:0;;14182:87;14402:7;-1:-1:-1;;;;;14402:23:0;;14394:68;;;;-1:-1:-1;;;14394:68:0;;;;;;;:::i;:::-;76123:14:::1;::::0;76090:18:::1;::::0;76123;76119:84:::1;;76193:6;76175:14;;76157:15;:32;;;;:::i;:::-;76156:43;;;;:::i;:::-;:47;::::0;76202:1:::1;76156:47;:::i;:::-;76143:60;;76119:84;76280:11;::::0;76351:1:::1;76336:322;76358:2;76354:1;:6;;;76336:322;;;76414:14;76429:1;76414:17;;;;;;;;;:::i;:::-;;;;;76390:14:::0;76405:5:::1;76409:1;76405::::0;:5:::1;:::i;:::-;76390:21;;;;;;;;;:::i;:::-;;;;;:41;76382:119;;;::::0;-1:-1:-1;;;76382:119:0;;14708:2:1;76382:119:0::1;::::0;::::1;14690:21:1::0;14747:2;14727:18;;;14720:30;14786:34;14766:18;;;14759:62;14857:34;14837:18;;;14830:62;-1:-1:-1;;;14908:19:1;;;14901:32;14950:19;;76382:119:0::1;14506:469:1::0;76382:119:0::1;76536:10;76520;76531:1;76520:13;;;;;;;;;:::i;:::-;;;:26;:41;;;;;76551:10;76550:11;76520:41;76516:131;;;76590:5;76594:1;76590::::0;:5:::1;:::i;:::-;76582:13;;76627:4;76614:17;;76516:131;76362:3:::0;::::1;::::0;::::1;:::i;:::-;;;;76336:322;;;;76771:10;76782:5;76771:17;;;;;;;;;:::i;:::-;;;76746:14;76761:5;76746:21;;;;;;;;;:::i;:::-;;;;;:42;76738:105;;;::::0;-1:-1:-1;;;76738:105:0;;15362:2:1;76738:105:0::1;::::0;::::1;15344:21:1::0;15401:2;15381:18;;;15374:30;15440:34;15420:18;;;15413:62;-1:-1:-1;;;15491:18:1;;;15484:48;15549:19;;76738:105:0::1;15160:414:1::0;76738:105:0::1;76902:45;76920:10;76932:14;76902:45;;;;;;;:::i;:::-;;;;;;;;76958:27;:10;76971:14:::0;76958:27:::1;;:::i;31959:147::-:0;31640:7;31667:12;;;:6;:12;;;;;:22;;;29622:16;29633:4;29622:10;:16::i;:::-;32073:25:::1;32084:4;32090:7;32073:10;:25::i;57799:256::-:0;57896:7;57932:23;57949:5;57932:16;:23::i;:::-;57924:5;:31;57916:87;;;;-1:-1:-1;;;57916:87:0;;16431:2:1;57916:87:0;;;16413:21:1;16470:2;16450:18;;;16443:30;16509:34;16489:18;;;16482:62;-1:-1:-1;;;16560:18:1;;;16553:41;16611:19;;57916:87:0;16229:407:1;57916:87:0;-1:-1:-1;;;;;;58021:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;57799:256::o;33007:218::-;33114:12;:10;:12::i;:::-;-1:-1:-1;;;;;33103:23:0;:7;-1:-1:-1;;;;;33103:23:0;;33095:83;;;;-1:-1:-1;;;33095:83:0;;16843:2:1;33095:83:0;;;16825:21:1;16882:2;16862:18;;;16855:30;16921:34;16901:18;;;16894:62;-1:-1:-1;;;16972:18:1;;;16965:45;17027:19;;33095:83:0;16641:411:1;33095:83:0;33191:26;33203:4;33209:7;33191:11;:26::i;:::-;33007:218;;:::o;81740:356::-;4691:1;5289:7;;:19;;5281:63;;;;-1:-1:-1;;;5281:63:0;;;;;;;:::i;:::-;4691:1;5422:7;:18;65094:28:::1;29622:16;65094:28:::0;29622:10:::1;:16::i;:::-;81835:21:::2;81875:12:::0;81867:58:::2;;;;-1:-1:-1::0;;;81867:58:0::2;;;;;;;:::i;:::-;81939:9;81962:7;14255:6:::0;;-1:-1:-1;;;;;14255:6:0;;14182:87;81962:7:::2;-1:-1:-1::0;;;;;81954:21:0::2;81983:7;81954:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81938:57;;;82014:4;82006:47;;;::::0;-1:-1:-1;;;82006:47:0;;18231:2:1;82006:47:0::2;::::0;::::2;18213:21:1::0;18270:2;18250:18;;;18243:30;18309:32;18289:18;;;18282:60;18359:18;;82006:47:0::2;18029:354:1::0;82006:47:0::2;82071:17;::::0;3469:25:1;;;82071:17:0::2;::::0;3457:2:1;3442:18;82071:17:0::2;;;;;;;-1:-1:-1::0;;4647:1:0;5601:7;:22;-1:-1:-1;81740:356:0:o;46845:185::-;46983:39;47000:4;47006:2;47010:7;46983:39;;;;;;;;;;;;:16;:39::i;64231:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58321:233::-;58396:7;58432:30;58219:10;:17;;58131:113;58432:30;58424:5;:38;58416:95;;;;-1:-1:-1;;;58416:95:0;;18590:2:1;58416:95:0;;;18572:21:1;18629:2;18609:18;;;18602:30;18668:34;18648:18;;;18641:62;-1:-1:-1;;;18719:18:1;;;18712:42;18771:19;;58416:95:0;18388:408:1;58416:95:0;58529:10;58540:5;58529:17;;;;;;;;:::i;:::-;;;;;;;;;58522:24;;58321:233;;;:::o;80891:130::-;14413:12;:10;:12::i;:::-;-1:-1:-1;;;;;14402:23:0;:7;14255:6;;-1:-1:-1;;;;;14255:6:0;;14182:87;14402:7;-1:-1:-1;;;;;14402:23:0;;14394:68;;;;-1:-1:-1;;;14394:68:0;;;;;;;:::i;:::-;80992:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;43936:222::-:0;44008:7;44044:16;;;:7;:16;;;;;;-1:-1:-1;;;;;44044:16:0;44079:19;44071:56;;;;-1:-1:-1;;;44071:56:0;;19003:2:1;44071:56:0;;;18985:21:1;19042:2;19022:18;;;19015:30;-1:-1:-1;;;19061:18:1;;;19054:54;19125:18;;44071:56:0;18801:348:1;64348:68:0;;;;;;;;;;;;;;;-1:-1:-1;64348:68:0;:::o;63913:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43667:207::-;43739:7;-1:-1:-1;;;;;43767:19:0;;43759:73;;;;-1:-1:-1;;;43759:73:0;;19356:2:1;43759:73:0;;;19338:21:1;19395:2;19375:18;;;19368:30;19434:34;19414:18;;;19407:62;-1:-1:-1;;;19485:18:1;;;19478:39;19534:19;;43759:73:0;19154:405:1;43759:73:0;-1:-1:-1;;;;;;43850:16:0;;;;;:9;:16;;;;;;;43667:207::o;14833:103::-;14413:12;:10;:12::i;:::-;-1:-1:-1;;;;;14402:23:0;:7;14255:6;;-1:-1:-1;;;;;14255:6:0;;14182:87;14402:7;-1:-1:-1;;;;;14402:23:0;;14394:68;;;;-1:-1:-1;;;14394:68:0;;;;;;;:::i;:::-;14898:30:::1;14925:1;14898:18;:30::i;:::-;14833:103::o:0;70826:1501::-;4691:1;5289:7;;:19;;5281:63;;;;-1:-1:-1;;;5281:63:0;;;;;;;:::i;:::-;4691:1;5422:7;:18;70928:14:::1;::::0;70920:60:::1;;;::::0;-1:-1:-1;;;70920:60:0;;19766:2:1;70920:60:0::1;::::0;::::1;19748:21:1::0;19805:2;19785:18;;;19778:30;19844:31;19824:18;;;19817:59;19893:18;;70920:60:0::1;19564:353:1::0;70920:60:0::1;71024:14;71041:12;:10;:12::i;:::-;71024:29;;71088:31;71100:6;71108:10;71088:11;:31::i;:::-;:39;;71123:4;71088:39;71066:119;;;::::0;-1:-1:-1;;;71066:119:0;;20124:2:1;71066:119:0::1;::::0;::::1;20106:21:1::0;20163:2;20143:18;;;20136:30;20202:32;20182:18;;;20175:60;20252:18;;71066:119:0::1;19922:354:1::0;71066:119:0::1;71241:6;-1:-1:-1::0;;;;;71220:27:0::1;:17;71228:8;71220:7;:17::i;:::-;-1:-1:-1::0;;;;;71220:27:0::1;;71198:123;;;::::0;-1:-1:-1;;;71198:123:0;;20483:2:1;71198:123:0::1;::::0;::::1;20465:21:1::0;20522:2;20502:18;;;20495:30;20561:34;20541:18;;;20534:62;-1:-1:-1;;;20612:18:1;;;20605:43;20665:19;;71198:123:0::1;20281:409:1::0;71198:123:0::1;71385:1;71356:26:::0;;;:16:::1;:26;::::0;;;;;:30;;;;:110:::1;;-1:-1:-1::0;71440:26:0::1;::::0;;;:16:::1;:26;::::0;;;;;;;;71404:23:::1;:33:::0;;;;;;;:62:::1;71356:110;71334:210;;;::::0;-1:-1:-1;;;71334:210:0;;20897:2:1;71334:210:0::1;::::0;::::1;20879:21:1::0;20936:2;20916:18;;;20909:30;20975:34;20955:18;;;20948:62;-1:-1:-1;;;21026:18:1;;;21019:48;21084:19;;71334:210:0::1;20695:414:1::0;71334:210:0::1;71589:22;71622:18:::0;71684:27:::1;71702:8;71684:17;:27::i;:::-;71801:12;::::0;:37:::1;::::0;-1:-1:-1;;;71801:37:0;;71832:4:::1;71801:37;::::0;::::1;2824:51:1::0;71651:60:0;;-1:-1:-1;71651:60:0;;-1:-1:-1;71651:60:0;;-1:-1:-1;;;;;71801:12:0;;::::1;::::0;:22:::1;::::0;2797:18:1;;71801:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;71779:161;;;::::0;-1:-1:-1;;;71779:161:0;;21505:2:1;71779:161:0::1;::::0;::::1;21487:21:1::0;21544:2;21524:18;;;21517:30;21583:34;21563:18;;;21556:62;21654:25;21634:18;;;21627:53;21697:19;;71779:161:0::1;21303:419:1::0;71779:161:0::1;72022:33;::::0;;;:23:::1;:33;::::0;;;;:51;;72059:14;;72022:33;:51:::1;::::0;72059:14;;72022:51:::1;:::i;:::-;::::0;;;-1:-1:-1;;72084:31:0::1;::::0;;;:21:::1;:31;::::0;;;;;;;;:46;;-1:-1:-1;;72084:46:0::1;;::::0;::::1;;::::0;;72169:12;:45;;-1:-1:-1;;;72169:45:0;;-1:-1:-1;;;;;21919:32:1;;;72169:45:0::1;::::0;::::1;21901:51:1::0;21968:18;;;21961:34;;;72169:12:0;;::::1;::::0;:21:::1;::::0;21874:18:1;;72169:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;72304:14;72294:8;72286:6;-1:-1:-1::0;;;;;72271:48:0::1;;;;;;;;;;;-1:-1:-1::0;;4647:1:0;5601:7;:22;-1:-1:-1;;;70826:1501:0:o;64475:53::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64475:53:0;;-1:-1:-1;64475:53:0:o;74505:1262::-;14413:12;:10;:12::i;:::-;-1:-1:-1;;;;;14402:23:0;:7;14255:6;;-1:-1:-1;;;;;14255:6:0;;14182:87;14402:7;-1:-1:-1;;;;;14402:23:0;;14394:68;;;;-1:-1:-1;;;14394:68:0;;;;;;;:::i;:::-;74686:14:::1;::::0;74653:18:::1;::::0;74686;74682:84:::1;;74756:6;74738:14;;74720:15;:32;;;;:::i;:::-;74719:43;;;;:::i;:::-;:47;::::0;74765:1:::1;74719:47;:::i;:::-;74706:60;;74682:84;74814:11;74851:1;74836:161;74858:2;74854:1;:6;;;74836:161;;;74902:10;74886;74897:1;74886:13;;;;;;;;;:::i;:::-;;;:26;74882:104;;;74941:5;74945:1;74941::::0;:5:::1;:::i;:::-;74933:13;;74965:5;;74882:104;74862:3:::0;::::1;::::0;::::1;:::i;:::-;;;;74836:161;;;-1:-1:-1::0;75049:12:0::1;::::0;75072:386:::1;75094:2;75090:1;:6;;;75072:386;;;75191:5;75186:10;;:1;:10;;;75182:216;;75275:17;75293:1;75275:20;;;;;;;;;:::i;:::-;;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;::::1;;::::0;::::1;::::0;::::1;::::0;75247:21;;:24;::::1;;::::0;::::1;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:48;;;75217:165;;;::::0;-1:-1:-1;;;75217:165:0;;22806:2:1;75217:165:0::1;::::0;::::1;22788:21:1::0;22845:2;22825:18;;;22818:30;22884:34;22864:18;;;22857:62;-1:-1:-1;;;22935:18:1;;;22928:40;22985:19;;75217:165:0::1;22604:406:1::0;75217:165:0::1;75422:21;75444:1;75422:24;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;75412:34;::::0;;::::1;:::i;:::-;::::0;-1:-1:-1;75098:3:0;::::1;::::0;::::1;:::i;:::-;;;;75072:386;;;;75550:6;:13;;75560:3;75550:13;75542:50;;;::::0;-1:-1:-1;;;75542:50:0;;23426:2:1;75542:50:0::1;::::0;::::1;23408:21:1::0;23465:2;23445:18;;;23438:30;23504:26;23484:18;;;23477:54;23548:18;;75542:50:0::1;23224:348:1::0;75542:50:0::1;75651:56;75666:17;75685:21;75651:56;;;;;;;:::i;:::-;;;;;;;;75718:41;:17;75738:21:::0;75718:41:::1;;:::i;68198:788::-:0;68354:14;68371:12;:10;:12::i;:::-;68354:29;;68424:1;68404:17;68414:6;68404:9;:17::i;:::-;:21;68396:82;;;;-1:-1:-1;;;68396:82:0;;25210:2:1;68396:82:0;;;25192:21:1;25249:2;25229:18;;;25222:30;25288:34;25268:18;;;25261:62;-1:-1:-1;;;25339:18:1;;;25332:46;25395:19;;68396:82:0;25008:412:1;68396:82:0;68511:50;68523:6;68531:17;68550:10;68511:11;:50::i;:::-;:58;;68565:4;68511:58;68489:152;;;;-1:-1:-1;;;68489:152:0;;25627:2:1;68489:152:0;;;25609:21:1;25666:2;25646:18;;;25639:30;25705:34;25685:18;;;25678:62;-1:-1:-1;;;25756:18:1;;;25749:42;25808:19;;68489:152:0;25425:408:1;68489:152:0;68679:15;68697:30;68717:6;68725:1;68697:19;:30::i;:::-;68772:23;;;;:14;:23;;;;;68679:48;;-1:-1:-1;68772:43:0;;68798:17;68772:43;;:::i;:::-;;68922:7;68901:6;-1:-1:-1;;;;;68872:106:0;;68944:14;:23;68959:7;68944:23;;;;;;;;;;;68872:106;;;;;;:::i;:::-;;;;;;;;68316:670;;68198:788;;:::o;30026:147::-;30112:4;30136:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;30136:29:0;;;;;;;;;;;;;;;30026:147::o;67401:519::-;14413:12;:10;:12::i;:::-;-1:-1:-1;;;;;14402:23:0;:7;14255:6;;-1:-1:-1;;;;;14255:6:0;;14182:87;14402:7;-1:-1:-1;;;;;14402:23:0;;14394:68;;;;-1:-1:-1;;;14394:68:0;;;;;;;:::i;:::-;67511:14:::1;67528:13;58219:10:::0;:17;;58131:113;67528:13:::1;67511:30:::0;-1:-1:-1;67552:13:0::1;67568:10;67511:30:::0;67577:1:::1;67568:10;:::i;:::-;67552:26;;67640:6;67635:278;67652:21:::0;;::::1;67635:278;;;67739:24;67749:10;;67760:1;67749:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;67739:24::-;67736:165;;67828:31;67838:10;;67849:1;67838:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;67853:5;67828:9;:31::i;:::-;67878:7:::0;::::1;::::0;::::1;:::i;:::-;;;;67736:165;67675:3:::0;::::1;::::0;::::1;:::i;:::-;;;;67635:278;;44394:104:::0;44450:13;44483:7;44476:14;;;;;:::i;69288:368::-;14413:12;:10;:12::i;:::-;-1:-1:-1;;;;;14402:23:0;:7;14255:6;;-1:-1:-1;;;;;14255:6:0;;14182:87;14402:7;-1:-1:-1;;;;;14402:23:0;;14394:68;;;;-1:-1:-1;;;14394:68:0;;;;;;;:::i;:::-;69403:35;;::::1;69395:85;;;;-1:-1:-1::0;;;69395:85:0::1;;;;;;;:::i;:::-;69496:9;69491:158;69511:20:::0;;::::1;69491:158;;;69626:8;;69635:1;69626:11;;;;;;;:::i;:::-;;;;;;;69593:16;:30;69610:9;;69620:1;69610:12;;;;;;;:::i;:::-;;;;;;;69593:30;;;;;;;;;;;:44;;;;69533:3;;;;;:::i;:::-;;;;69491:158;;45981:155:::0;46076:52;46095:12;:10;:12::i;:::-;46109:8;46119;46076:18;:52::i;82271:327::-;4691:1;5289:7;;:19;;5281:63;;;;-1:-1:-1;;;5281:63:0;;;;;;;:::i;:::-;4691:1;5422:7;:18;65094:28:::1;29622:16;65094:28:::0;29622:10:::1;:16::i;:::-;82378:12:::2;::::0;:37:::2;::::0;-1:-1:-1;;;82378:37:0;;82409:4:::2;82378:37;::::0;::::2;2824:51:1::0;82360:15:0::2;::::0;-1:-1:-1;;;;;82378:12:0::2;::::0;:22:::2;::::0;2797:18:1;;82378:37:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;82360:55:::0;-1:-1:-1;82434:12:0;82426:58:::2;;;;-1:-1:-1::0;;;82426:58:0::2;;;;;;;:::i;:::-;82495:12;::::0;-1:-1:-1;;;;;82495:12:0::2;:21;82525:7;14255:6:::0;;-1:-1:-1;;;;;14255:6:0;;14182:87;82525:7:::2;82495:48;::::0;-1:-1:-1;;;;;;82495:48:0::2;::::0;;;;;;-1:-1:-1;;;;;21919:32:1;;;82495:48:0::2;::::0;::::2;21901:51:1::0;21968:18;;;21961:34;;;21874:18;;82495:48:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;82561:29:0::2;::::0;3469:25:1;;;82561:29:0::2;::::0;3457:2:1;3442:18;82561:29:0::2;;;;;;;-1:-1:-1::0;;4647:1:0;5601:7;:22;82271:327::o;81432:134::-;14413:12;:10;:12::i;:::-;-1:-1:-1;;;;;14402:23:0;:7;14255:6;;-1:-1:-1;;;;;14255:6:0;;14182:87;14402:7;-1:-1:-1;;;;;14402:23:0;;14394:68;;;;-1:-1:-1;;;14394:68:0;;;;;;;:::i;:::-;81499:13:::1;:22:::0;;-1:-1:-1;;81499:22:0::1;::::0;::::1;;::::0;;::::1;::::0;;;81537:21:::1;::::0;1690:41:1;;;81537:21:0::1;::::0;1678:2:1;1663:18;81537:21:0::1;;;;;;;81432:134:::0;:::o;47101:323::-;47275:41;47294:12;:10;:12::i;:::-;47308:7;47275:18;:41::i;:::-;47267:100;;;;-1:-1:-1;;;47267:100:0;;;;;;;:::i;:::-;47378:38;47392:4;47398:2;47402:7;47411:4;47378:13;:38::i;:::-;47101:323;;;;:::o;63983:37::-;;;;;;;:::i;79639:637::-;48996:4;49020:16;;;:7;:16;;;;;;79757:13;;-1:-1:-1;;;;;49020:16:0;79788:106;;;;-1:-1:-1;;;79788:106:0;;26800:2:1;79788:106:0;;;26782:21:1;26839:2;26819:18;;;26812:30;26878:34;26858:18;;;26851:62;-1:-1:-1;;;26929:18:1;;;26922:38;26977:19;;79788:106:0;26598:404:1;79788:106:0;79907:28;79938:10;:8;:10::i;:::-;79907:41;;80012:1;79987:14;79981:28;:32;:287;;;;;;;;;;;;;;;;;80105:14;80146:18;:7;:16;:18::i;:::-;80191:13;80062:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;79981:287;79961:307;79639:637;-1:-1:-1;;;79639:637:0:o;32351:149::-;31640:7;31667:12;;;:6;:12;;;;;:22;;;29622:16;29633:4;29622:10;:16::i;:::-;32466:26:::1;32478:4;32484:7;32466:11;:26::i;81153:151::-:0;14413:12;:10;:12::i;:::-;-1:-1:-1;;;;;14402:23:0;:7;14255:6;;-1:-1:-1;;;;;14255:6:0;;14182:87;14402:7;-1:-1:-1;;;;;14402:23:0;;14394:68;;;;-1:-1:-1;;;14394:68:0;;;;;;;:::i;:::-;81263:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;77146:120::-:0;14413:12;:10;:12::i;:::-;-1:-1:-1;;;;;14402:23:0;:7;14255:6;;-1:-1:-1;;;;;14255:6:0;;14182:87;14402:7;-1:-1:-1;;;;;14402:23:0;;14394:68;;;;-1:-1:-1;;;14394:68:0;;;;;;;:::i;:::-;77222:12:::1;:36:::0;;-1:-1:-1;;;;;;77222:36:0::1;-1:-1:-1::0;;;;;77222:36:0;;;::::1;::::0;;;::::1;::::0;;77146:120::o;73848:470::-;73949:14;73966:12;:10;:12::i;:::-;73949:29;;73989:15;74007:17;74017:6;74007:9;:17::i;:::-;73989:35;;74094:1;74084:7;:11;74076:63;;;;-1:-1:-1;;;74076:63:0;;28867:2:1;74076:63:0;;;28849:21:1;28906:2;28886:18;;;28879:30;28945:34;28925:18;;;28918:62;-1:-1:-1;;;28996:18:1;;;28989:37;29043:19;;74076:63:0;28665:403:1;74076:63:0;74157:9;74152:159;74176:7;74172:1;:11;74152:159;;;74205:15;74223:30;74243:6;74251:1;74223:19;:30::i;:::-;74205:48;;74268:31;74279:7;74288:10;74268;:31::i;:::-;-1:-1:-1;74185:3:0;;;;:::i;:::-;;;;74152:159;;15091:201;14413:12;:10;:12::i;:::-;-1:-1:-1;;;;;14402:23:0;:7;14255:6;;-1:-1:-1;;;;;14255:6:0;;14182:87;14402:7;-1:-1:-1;;;;;14402:23:0;;14394:68;;;;-1:-1:-1;;;14394:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15180:22:0;::::1;15172:73;;;::::0;-1:-1:-1;;;15172:73:0;;29275:2:1;15172:73:0::1;::::0;::::1;29257:21:1::0;29314:2;29294:18;;;29287:30;29353:34;29333:18;;;29326:62;-1:-1:-1;;;29404:18:1;;;29397:36;29450:19;;15172:73:0::1;29073:402:1::0;15172:73:0::1;15256:28;15275:8;15256:18;:28::i;:::-;15091:201:::0;:::o;12396:458::-;12458:14;12363:17;-1:-1:-1;;;;;12350:30:0;12508:10;12350:30;12485:362;;;-1:-1:-1;;;12742:14:0;12738:23;12725:37;12721:2;12717:46;12396:458;:::o;12485:362::-;-1:-1:-1;11562:10:0;;12396:458::o;12817:18::-;12810:25;;12396:458;:::o;11482:98::-;11562:10;;11482:98::o;83217:203::-;83349:11;83385:27;:25;:27::i;29730:204::-;29815:4;-1:-1:-1;;;;;;29839:47:0;;-1:-1:-1;;;29839:47:0;;:87;;;29890:36;29914:11;29890:23;:36::i;53713:135::-;48996:4;49020:16;;;:7;:16;;;;;;-1:-1:-1;;;;;49020:16:0;53787:53;;;;-1:-1:-1;;;53787:53:0;;19003:2:1;53787:53:0;;;18985:21:1;19042:2;19022:18;;;19015:30;-1:-1:-1;;;19061:18:1;;;19054:54;19125:18;;53787:53:0;18801:348:1;52992:174:0;53067:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;53067:29:0;-1:-1:-1;;;;;53067:29:0;;;;;;;;:24;;53121:23;53067:24;53121:14;:23::i;:::-;-1:-1:-1;;;;;53112:46:0;;;;;;;;;;;52992:174;;:::o;49225:264::-;49318:4;49335:13;49351:23;49366:7;49351:14;:23::i;:::-;49335:39;;49404:5;-1:-1:-1;;;;;49393:16:0;:7;-1:-1:-1;;;;;49393:16:0;;:52;;;-1:-1:-1;;;;;;46328:25:0;;;46304:4;46328:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;49413:32;49393:87;;;;49473:7;-1:-1:-1;;;;;49449:31:0;:20;49461:7;49449:11;:20::i;:::-;-1:-1:-1;;;;;49449:31:0;;49393:87;49385:96;49225:264;-1:-1:-1;;;;49225:264:0:o;52248:625::-;52407:4;-1:-1:-1;;;;;52380:31:0;:23;52395:7;52380:14;:23::i;:::-;-1:-1:-1;;;;;52380:31:0;;52372:81;;;;-1:-1:-1;;;52372:81:0;;29682:2:1;52372:81:0;;;29664:21:1;29721:2;29701:18;;;29694:30;29760:34;29740:18;;;29733:62;-1:-1:-1;;;29811:18:1;;;29804:35;29856:19;;52372:81:0;29480:401:1;52372:81:0;-1:-1:-1;;;;;52472:16:0;;52464:65;;;;-1:-1:-1;;;52464:65:0;;30088:2:1;52464:65:0;;;30070:21:1;30127:2;30107:18;;;30100:30;30166:34;30146:18;;;30139:62;-1:-1:-1;;;30217:18:1;;;30210:34;30261:19;;52464:65:0;29886:400:1;52464:65:0;52542:39;52563:4;52569:2;52573:7;52542:20;:39::i;:::-;52646:29;52663:1;52667:7;52646:8;:29::i;:::-;-1:-1:-1;;;;;52688:15:0;;;;;;:9;:15;;;;;:20;;52707:1;;52688:15;:20;;52707:1;;52688:20;:::i;:::-;;;;-1:-1:-1;;;;;;;52719:13:0;;;;;;:9;:13;;;;;:18;;52736:1;;52719:13;:18;;52736:1;;52719:18;:::i;:::-;;;;-1:-1:-1;;52748:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;52748:21:0;-1:-1:-1;;;;;52748:21:0;;;;;;;;;52787:27;;52748:16;;52787:27;;;;;;;45325:347;45255:417;;:::o;30477:105::-;30544:30;30555:4;30561:12;:10;:12::i;:::-;30544:10;:30::i;34508:238::-;34592:22;34600:4;34606:7;34592;:22::i;:::-;34587:152;;34631:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;34631:29:0;;;;;;;;;:36;;-1:-1:-1;;34631:36:0;34663:4;34631:36;;;34714:12;:10;:12::i;:::-;-1:-1:-1;;;;;34687:40:0;34705:7;-1:-1:-1;;;;;34687:40:0;34699:4;34687:40;;;;;;;;;;34508:238;;:::o;34878:239::-;34962:22;34970:4;34976:7;34962;:22::i;:::-;34958:152;;;35033:5;35001:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;35001:29:0;;;;;;;;;:37;;-1:-1:-1;;35001:37:0;;;35085:12;:10;:12::i;:::-;-1:-1:-1;;;;;35058:40:0;35076:7;-1:-1:-1;;;;;35058:40:0;35070:4;35058:40;;;;;;;;;;34878:239;;:::o;15452:191::-;15545:6;;;-1:-1:-1;;;;;15562:17:0;;;-1:-1:-1;;;;;;15562:17:0;;;;;;;15595:40;;15545:6;;;15562:17;15545:6;;15595:40;;15526:16;;15595:40;15515:128;15452:191;:::o;78669:692::-;78825:15;;;-1:-1:-1;;;;;2842:32:1;;78825:15:0;;;;2824:51:1;;;;78825:15:0;;;;;;;;;2797:18:1;;;78825:15:0;;;78815:26;;;;;;;;30533:66:1;78911:65:0;;;30521:79:1;30616:12;;;30609:28;;;78776:4:0;;;;30653:12:1;;78911:65:0;;;-1:-1:-1;;78911:65:0;;;;;;;;;78883:108;;78911:65;78883:108;;;;79099:19;;;79093:26;79144:19;;;79138:26;79213:2;79197:19;;;79191:26;79004:9;79259:40;;;;;;;;;30903:25:1;;;79183:35:0;;30944:18:1;;;30937:45;;;30998:18;;30991:34;;;31041:18;;;31034:34;;;78883:108:0;;-1:-1:-1;79093:26:0;79138;;79183:35;79004:9;79259:40;;30875:19:1;;79259:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79241:58;;79319:34;65214:29;79345:7;79319;:34::i;:::-;79312:41;78669:692;-1:-1:-1;;;;;;;;;78669:692:0:o;72515:1132::-;72583:7;72592:5;72686:18;72745:6;72727:14;;72709:15;:32;;;;:::i;:::-;72708:43;;;;:::i;:::-;72707:49;;72755:1;72707:49;:::i;:::-;72813:31;;;;:21;:31;;;;;;72686:70;;-1:-1:-1;72802:10:0;;72813:31;;72802:43;;;;;;;:::i;:::-;;;72789:10;:56;72767:169;;;;-1:-1:-1;;;72767:169:0;;31281:2:1;72767:169:0;;;31263:21:1;31320:2;31300:18;;;31293:30;31359:34;31339:18;;;31332:62;31430:33;31410:18;;;31403:61;31481:19;;72767:169:0;31079:427:1;72767:169:0;73007:14;73053:17;73032:186;73073:5;;;;73032:186;;73117:10;73128:5;73132:1;73128;:5;:::i;:::-;73117:17;;;;;;;;;:::i;:::-;;;73104:10;:30;73100:107;;;73166:1;73155:12;;73186:5;;73100:107;73080:3;;;;:::i;:::-;;;;73032:186;;;-1:-1:-1;73292:24:0;73342:31;;;:21;:31;;;;;;;;73327:134;73379:8;73375:12;;:1;:12;;;73327:134;;;73429:17;73447:1;73429:20;;;;;;;;;:::i;:::-;;;;;;;;;73409:40;;73429:20;;;;;;;;73409:40;;:::i;:::-;;-1:-1:-1;73389:3:0;;;;:::i;:::-;;;;73327:134;;;-1:-1:-1;73515:22:0;73541:26;;;:16;:26;;;;;;73590:3;;73541:45;;73570:16;;73541:45;:::i;:::-;73540:53;;;;:::i;:::-;73515:78;73630:8;;-1:-1:-1;72515:1132:0;;-1:-1:-1;;;;;72515:1132:0:o;77670:735::-;77812:4;77829:19;77872:3;77877:6;77861:23;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77851:34;;;;;;77829:56;;77896:28;78008:11;77955:65;;;;;;;30533:66:1;30521:79;;30625:2;30616:12;;30609:28;;;;30662:2;30653:12;;30291:380;77955:65:0;;;;-1:-1:-1;;77955:65:0;;;;;;;;;77927:108;;77955:65;77927:108;;;;78143:19;;;78137:26;78188:19;;;78182:26;78257:2;78241:19;;;78235:26;78048:9;78303:40;;;;;;;;;30903:25:1;;;78227:35:0;;30944:18:1;;;30937:45;;;30998:18;;30991:34;;;31041:18;;;31034:34;;;77927:108:0;;-1:-1:-1;78137:26:0;78182;;78227:35;78048:9;78303:40;;30875:19:1;;78303:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78285:58;;78363:34;64962:29;78389:7;78363;:34::i;:::-;78356:41;77670:735;-1:-1:-1;;;;;;;;;;77670:735:0:o;49831:110::-;49907:26;49917:2;49921:7;49907:26;;;;;;;;;;;;:9;:26::i;53309:315::-;53464:8;-1:-1:-1;;;;;53455:17:0;:5;-1:-1:-1;;;;;53455:17:0;;;53447:55;;;;-1:-1:-1;;;53447:55:0;;32437:2:1;53447:55:0;;;32419:21:1;32476:2;32456:18;;;32449:30;32515:27;32495:18;;;32488:55;32560:18;;53447:55:0;32235:349:1;53447:55:0;-1:-1:-1;;;;;53513:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;53513:46:0;;;;;;;;;;53575:41;;1690::1;;;53575::0;;1663:18:1;53575:41:0;;;;;;;53309:315;;;:::o;48305:313::-;48461:28;48471:4;48477:2;48481:7;48461:9;:28::i;:::-;48508:47;48531:4;48537:2;48541:7;48550:4;48508:22;:47::i;:::-;48500:110;;;;-1:-1:-1;;;48500:110:0;;;;;;;:::i;79425:108::-;79485:13;79518:7;79511:14;;;;;:::i;9044:723::-;9100:13;9321:10;9317:53;;-1:-1:-1;;9348:10:0;;;;;;;;;;;;-1:-1:-1;;;9348:10:0;;;;;9044:723::o;9317:53::-;9395:5;9380:12;9436:78;9443:9;;9436:78;;9469:8;;;;:::i;:::-;;-1:-1:-1;9492:10:0;;-1:-1:-1;9500:2:0;9492:10;;:::i;:::-;;;9436:78;;;9524:19;9556:6;9546:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9546:17:0;;9524:39;;9574:154;9581:10;;9574:154;;9608:11;9618:1;9608:11;;:::i;:::-;;-1:-1:-1;9677:10:0;9685:2;9677:5;:10;:::i;:::-;9664:24;;:2;:24;:::i;:::-;9651:39;;9634:6;9641;9634:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;9634:56:0;;;;;;;;-1:-1:-1;9705:11:0;9714:2;9705:11;;:::i;:::-;;;9574:154;;57491:224;57593:4;-1:-1:-1;;;;;;57617:50:0;;-1:-1:-1;;;57617:50:0;;:90;;;57671:36;57695:11;57671:23;:36::i;82815:309::-;82959:45;82986:4;82992:2;82996:7;82959:26;:45::i;:::-;83021:13;;;;83017:99;;;-1:-1:-1;;;;;83044:18:0;;;83036:80;;;;-1:-1:-1;;;83036:80:0;;33327:2:1;83036:80:0;;;33309:21:1;33366:2;33346:18;;;33339:30;33405:34;33385:18;;;33378:62;-1:-1:-1;;;33456:18:1;;;33449:47;33513:19;;83036:80:0;33125:413:1;30872:505:0;30961:22;30969:4;30975:7;30961;:22::i;:::-;30956:414;;31149:41;31177:7;-1:-1:-1;;;;;31149:41:0;31187:2;31149:19;:41::i;:::-;31263:38;31291:4;31298:2;31263:19;:38::i;:::-;31054:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;31054:270:0;;;;;;;;;;-1:-1:-1;;;31000:358:0;;;;;;;:::i;50168:319::-;50297:18;50303:2;50307:7;50297:5;:18::i;:::-;50348:53;50379:1;50383:2;50387:7;50396:4;50348:22;:53::i;:::-;50326:153;;;;-1:-1:-1;;;50326:153:0;;;;;;;:::i;54412:853::-;54566:4;-1:-1:-1;;;;;54587:13:0;;17178:19;:23;54583:675;;54639:2;-1:-1:-1;;;;;54623:36:0;;54660:12;:10;:12::i;:::-;54674:4;54680:7;54689:4;54623:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54623:71:0;;;;;;;;-1:-1:-1;;54623:71:0;;;;;;;;;;;;:::i;:::-;;;54619:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54864:13:0;;54860:328;;54907:60;;-1:-1:-1;;;54907:60:0;;;;;;;:::i;54860:328::-;55138:6;55132:13;55123:6;55119:2;55115:15;55108:38;54619:584;-1:-1:-1;;;;;;54745:51:0;-1:-1:-1;;;54745:51:0;;-1:-1:-1;54738:58:0;;54583:675;-1:-1:-1;55242:4:0;54412:853;;;;;;:::o;43298:305::-;43400:4;-1:-1:-1;;;;;;43437:40:0;;-1:-1:-1;;;43437:40:0;;:105;;-1:-1:-1;;;;;;;43494:48:0;;-1:-1:-1;;;43494:48:0;43437:105;:158;;;-1:-1:-1;;;;;;;;;;27098:40:0;;;43559:36;26989:157;59167:589;-1:-1:-1;;;;;59373:18:0;;59369:187;;59408:40;59440:7;60583:10;:17;;60556:24;;;;:15;:24;;;;;:44;;;60611:24;;;;;;;;;;;;60479:164;59408:40;59369:187;;;59478:2;-1:-1:-1;;;;;59470:10:0;:4;-1:-1:-1;;;;;59470:10:0;;59466:90;;59497:47;59530:4;59536:7;59497:32;:47::i;:::-;-1:-1:-1;;;;;59570:16:0;;59566:183;;59603:45;59640:7;59603:36;:45::i;59566:183::-;59676:4;-1:-1:-1;;;;;59670:10:0;:2;-1:-1:-1;;;;;59670:10:0;;59666:83;;59697:40;59725:2;59729:7;59697:27;:40::i;10345:451::-;10420:13;10446:19;10478:10;10482:6;10478:1;:10;:::i;:::-;:14;;10491:1;10478:14;:::i;:::-;10468:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10468:25:0;;10446:47;;-1:-1:-1;;;10504:6:0;10511:1;10504:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;10504:15:0;;;;;;;;;-1:-1:-1;;;10530:6:0;10537:1;10530:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;10530:15:0;;;;;;;;-1:-1:-1;10561:9:0;10573:10;10577:6;10573:1;:10;:::i;:::-;:14;;10586:1;10573:14;:::i;:::-;10561:26;;10556:135;10593:1;10589;:5;10556:135;;;-1:-1:-1;;;10641:5:0;10649:3;10641:11;10628:25;;;;;;;:::i;:::-;;;;10616:6;10623:1;10616:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;10616:37:0;;;;;;;;-1:-1:-1;10678:1:0;10668:11;;;;;10596:3;;;:::i;:::-;;;10556:135;;;-1:-1:-1;10709:10:0;;10701:55;;;;-1:-1:-1;;;10701:55:0;;35425:2:1;10701:55:0;;;35407:21:1;;;35444:18;;;35437:30;35503:34;35483:18;;;35476:62;35555:18;;10701:55:0;35223:356:1;50823:439:0;-1:-1:-1;;;;;50903:16:0;;50895:61;;;;-1:-1:-1;;;50895:61:0;;35786:2:1;50895:61:0;;;35768:21:1;;;35805:18;;;35798:30;35864:34;35844:18;;;35837:62;35916:18;;50895:61:0;35584:356:1;50895:61:0;48996:4;49020:16;;;:7;:16;;;;;;-1:-1:-1;;;;;49020:16:0;:30;50967:58;;;;-1:-1:-1;;;50967:58:0;;36147:2:1;50967:58:0;;;36129:21:1;36186:2;36166:18;;;36159:30;36225;36205:18;;;36198:58;36273:18;;50967:58:0;35945:352:1;50967:58:0;51038:45;51067:1;51071:2;51075:7;51038:20;:45::i;:::-;-1:-1:-1;;;;;51096:13:0;;;;;;:9;:13;;;;;:18;;51113:1;;51096:13;:18;;51113:1;;51096:18;:::i;:::-;;;;-1:-1:-1;;51125:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;51125:21:0;-1:-1:-1;;;;;51125:21:0;;;;;;;;51164:33;;51125:16;;;51164:33;;51125:16;;51164:33;33007:218;;:::o;61270:988::-;61536:22;61586:1;61561:22;61578:4;61561:16;:22::i;:::-;:26;;;;:::i;:::-;61598:18;61619:26;;;:17;:26;;;;;;61536:51;;-1:-1:-1;61752:28:0;;;61748:328;;-1:-1:-1;;;;;61819:18:0;;61797:19;61819:18;;;:12;:18;;;;;;;;:34;;;;;;;;;61870:30;;;;;;:44;;;61987:30;;:17;:30;;;;;:43;;;61748:328;-1:-1:-1;62172:26:0;;;;:17;:26;;;;;;;;62165:33;;;-1:-1:-1;;;;;62216:18:0;;;;;:12;:18;;;;;:34;;;;;;;62209:41;61270:988::o;62553:1079::-;62831:10;:17;62806:22;;62831:21;;62851:1;;62831:21;:::i;:::-;62863:18;62884:24;;;:15;:24;;;;;;63257:10;:26;;62806:46;;-1:-1:-1;62884:24:0;;62806:46;;63257:26;;;;;;:::i;:::-;;;;;;;;;63235:48;;63321:11;63296:10;63307;63296:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;63401:28;;;:15;:28;;;;;;;:41;;;63573:24;;;;;63566:31;63608:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;62624:1008;;;62553:1079;:::o;60057:221::-;60142:14;60159:20;60176:2;60159:16;:20::i;:::-;-1:-1:-1;;;;;60190:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;60235:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;60057:221:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:367:1;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:55;;159:1;156;149:12;108:55;-1:-1:-1;182:20:1;;225:18;214:30;;211:50;;;257:1;254;247:12;211:50;294:4;286:6;282:17;270:29;;354:3;347:4;337:6;334:1;330:14;322:6;318:27;314:38;311:47;308:67;;;371:1;368;361:12;308:67;14:367;;;;;:::o;386:773::-;508:6;516;524;532;585:2;573:9;564:7;560:23;556:32;553:52;;;601:1;598;591:12;553:52;641:9;628:23;670:18;711:2;703:6;700:14;697:34;;;727:1;724;717:12;697:34;766:70;828:7;819:6;808:9;804:22;766:70;:::i;:::-;855:8;;-1:-1:-1;740:96:1;-1:-1:-1;943:2:1;928:18;;915:32;;-1:-1:-1;959:16:1;;;956:36;;;988:1;985;978:12;956:36;;1027:72;1091:7;1080:8;1069:9;1065:24;1027:72;:::i;:::-;386:773;;;;-1:-1:-1;1118:8:1;-1:-1:-1;;;;386:773:1:o;1164:131::-;-1:-1:-1;;;;;;1238:32:1;;1228:43;;1218:71;;1285:1;1282;1275:12;1300:245;1358:6;1411:2;1399:9;1390:7;1386:23;1382:32;1379:52;;;1427:1;1424;1417:12;1379:52;1466:9;1453:23;1485:30;1509:5;1485:30;:::i;1742:258::-;1814:1;1824:113;1838:6;1835:1;1832:13;1824:113;;;1914:11;;;1908:18;1895:11;;;1888:39;1860:2;1853:10;1824:113;;;1955:6;1952:1;1949:13;1946:48;;;-1:-1:-1;;1990:1:1;1972:16;;1965:27;1742:258::o;2005:::-;2047:3;2085:5;2079:12;2112:6;2107:3;2100:19;2128:63;2184:6;2177:4;2172:3;2168:14;2161:4;2154:5;2150:16;2128:63;:::i;:::-;2245:2;2224:15;-1:-1:-1;;2220:29:1;2211:39;;;;2252:4;2207:50;;2005:258;-1:-1:-1;;2005:258:1:o;2268:220::-;2417:2;2406:9;2399:21;2380:4;2437:45;2478:2;2467:9;2463:18;2455:6;2437:45;:::i;2493:180::-;2552:6;2605:2;2593:9;2584:7;2580:23;2576:32;2573:52;;;2621:1;2618;2611:12;2573:52;-1:-1:-1;2644:23:1;;2493:180;-1:-1:-1;2493:180:1:o;2886:173::-;2954:20;;-1:-1:-1;;;;;3003:31:1;;2993:42;;2983:70;;3049:1;3046;3039:12;2983:70;2886:173;;;:::o;3064:254::-;3132:6;3140;3193:2;3181:9;3172:7;3168:23;3164:32;3161:52;;;3209:1;3206;3199:12;3161:52;3232:29;3251:9;3232:29;:::i;:::-;3222:39;3308:2;3293:18;;;;3280:32;;-1:-1:-1;;;3064:254:1:o;3687:328::-;3764:6;3772;3780;3833:2;3821:9;3812:7;3808:23;3804:32;3801:52;;;3849:1;3846;3839:12;3801:52;3872:29;3891:9;3872:29;:::i;:::-;3862:39;;3920:38;3954:2;3943:9;3939:18;3920:38;:::i;:::-;3910:48;;4005:2;3994:9;3990:18;3977:32;3967:42;;3687:328;;;;;:::o;4205:160::-;4299:6;4332:3;4320:16;;4317:25;-1:-1:-1;4314:45:1;;;4355:1;4352;4345:12;4370:237;4455:6;4508:3;4496:9;4487:7;4483:23;4479:33;4476:53;;;4525:1;4522;4515:12;4476:53;4548;4593:7;4582:9;4548:53;:::i;4612:254::-;4680:6;4688;4741:2;4729:9;4720:7;4716:23;4712:32;4709:52;;;4757:1;4754;4747:12;4709:52;4793:9;4780:23;4770:33;;4822:38;4856:2;4845:9;4841:18;4822:38;:::i;:::-;4812:48;;4612:254;;;;;:::o;5140:127::-;5201:10;5196:3;5192:20;5189:1;5182:31;5232:4;5229:1;5222:15;5256:4;5253:1;5246:15;5272:632;5337:5;5367:18;5408:2;5400:6;5397:14;5394:40;;;5414:18;;:::i;:::-;5489:2;5483:9;5457:2;5543:15;;-1:-1:-1;;5539:24:1;;;5565:2;5535:33;5531:42;5519:55;;;5589:18;;;5609:22;;;5586:46;5583:72;;;5635:18;;:::i;:::-;5675:10;5671:2;5664:22;5704:6;5695:15;;5734:6;5726;5719:22;5774:3;5765:6;5760:3;5756:16;5753:25;5750:45;;;5791:1;5788;5781:12;5750:45;5841:6;5836:3;5829:4;5821:6;5817:17;5804:44;5896:1;5889:4;5880:6;5872;5868:19;5864:30;5857:41;;;;5272:632;;;;;:::o;5909:451::-;5978:6;6031:2;6019:9;6010:7;6006:23;6002:32;5999:52;;;6047:1;6044;6037:12;5999:52;6087:9;6074:23;6120:18;6112:6;6109:30;6106:50;;;6152:1;6149;6142:12;6106:50;6175:22;;6228:4;6220:13;;6216:27;-1:-1:-1;6206:55:1;;6257:1;6254;6247:12;6206:55;6280:74;6346:7;6341:2;6328:16;6323:2;6319;6315:11;6280:74;:::i;6365:186::-;6424:6;6477:2;6465:9;6456:7;6452:23;6448:32;6445:52;;;6493:1;6490;6483:12;6445:52;6516:29;6535:9;6516:29;:::i;6556:221::-;6598:5;6651:3;6644:4;6636:6;6632:17;6628:27;6618:55;;6669:1;6666;6659:12;6618:55;6691:80;6767:3;6758:6;6745:20;6738:4;6730:6;6726:17;6691:80;:::i;6782:388::-;6859:6;6867;6920:2;6908:9;6899:7;6895:23;6891:32;6888:52;;;6936:1;6933;6926:12;6888:52;6972:9;6959:23;6949:33;;7033:2;7022:9;7018:18;7005:32;7060:18;7052:6;7049:30;7046:50;;;7092:1;7089;7082:12;7046:50;7115:49;7156:7;7147:6;7136:9;7132:22;7115:49;:::i;:::-;7105:59;;;6782:388;;;;;:::o;7175:248::-;7243:6;7251;7304:2;7292:9;7283:7;7279:23;7275:32;7272:52;;;7320:1;7317;7310:12;7272:52;-1:-1:-1;;7343:23:1;;;7413:2;7398:18;;;7385:32;;-1:-1:-1;7175:248:1:o;7668:467::-;7771:6;7779;7832:3;7820:9;7811:7;7807:23;7803:33;7800:53;;;7849:1;7846;7839:12;7800:53;7887:3;7876:9;7872:19;7910:7;7906:2;7903:15;7900:35;;;7931:1;7928;7921:12;7900:35;7954:9;;-1:-1:-1;7986:16:1;8025:18;8014:30;;8011:50;;;8057:1;8054;8047:12;8140:437;8226:6;8234;8287:2;8275:9;8266:7;8262:23;8258:32;8255:52;;;8303:1;8300;8293:12;8255:52;8343:9;8330:23;8376:18;8368:6;8365:30;8362:50;;;8408:1;8405;8398:12;8362:50;8447:70;8509:7;8500:6;8489:9;8485:22;8447:70;:::i;:::-;8536:8;;8421:96;;-1:-1:-1;8140:437:1;-1:-1:-1;;;;8140:437:1:o;8582:118::-;8668:5;8661:13;8654:21;8647:5;8644:32;8634:60;;8690:1;8687;8680:12;8705:315;8770:6;8778;8831:2;8819:9;8810:7;8806:23;8802:32;8799:52;;;8847:1;8844;8837:12;8799:52;8870:29;8889:9;8870:29;:::i;:::-;8860:39;;8949:2;8938:9;8934:18;8921:32;8962:28;8984:5;8962:28;:::i;:::-;9009:5;8999:15;;;8705:315;;;;;:::o;9025:241::-;9081:6;9134:2;9122:9;9113:7;9109:23;9105:32;9102:52;;;9150:1;9147;9140:12;9102:52;9189:9;9176:23;9208:28;9230:5;9208:28;:::i;9271:537::-;9366:6;9374;9382;9390;9443:3;9431:9;9422:7;9418:23;9414:33;9411:53;;;9460:1;9457;9450:12;9411:53;9483:29;9502:9;9483:29;:::i;:::-;9473:39;;9531:38;9565:2;9554:9;9550:18;9531:38;:::i;:::-;9521:48;;9616:2;9605:9;9601:18;9588:32;9578:42;;9671:2;9660:9;9656:18;9643:32;9698:18;9690:6;9687:30;9684:50;;;9730:1;9727;9720:12;9684:50;9753:49;9794:7;9785:6;9774:9;9770:22;9753:49;:::i;:::-;9743:59;;;9271:537;;;;;;;:::o;10034:260::-;10102:6;10110;10163:2;10151:9;10142:7;10138:23;10134:32;10131:52;;;10179:1;10176;10169:12;10131:52;10202:29;10221:9;10202:29;:::i;:::-;10192:39;;10250:38;10284:2;10273:9;10269:18;10250:38;:::i;10299:320::-;10367:6;10420:2;10408:9;10399:7;10395:23;10391:32;10388:52;;;10436:1;10433;10426:12;10388:52;10476:9;10463:23;10509:18;10501:6;10498:30;10495:50;;;10541:1;10538;10531:12;10495:50;10564:49;10605:7;10596:6;10585:9;10581:22;10564:49;:::i;10624:356::-;10826:2;10808:21;;;10845:18;;;10838:30;10904:34;10899:2;10884:18;;10877:62;10971:2;10956:18;;10624:356::o;10985:401::-;11187:2;11169:21;;;11226:2;11206:18;;;11199:30;11265:34;11260:2;11245:18;;11238:62;-1:-1:-1;;;11331:2:1;11316:18;;11309:35;11376:3;11361:19;;10985:401::o;11391:127::-;11452:10;11447:3;11443:20;11440:1;11433:31;11483:4;11480:1;11473:15;11507:4;11504:1;11497:15;11523:127;11584:10;11579:3;11575:20;11572:1;11565:31;11615:4;11612:1;11605:15;11639:4;11636:1;11629:15;11655:128;11695:3;11726:1;11722:6;11719:1;11716:13;11713:39;;;11732:18;;:::i;:::-;-1:-1:-1;11768:9:1;;11655:128::o;11788:135::-;11827:3;-1:-1:-1;;11848:17:1;;11845:43;;;11868:18;;:::i;:::-;-1:-1:-1;11915:1:1;11904:13;;11788:135::o;11928:380::-;12007:1;12003:12;;;;12050;;;12071:61;;12125:4;12117:6;12113:17;12103:27;;12071:61;12178:2;12170:6;12167:14;12147:18;12144:38;12141:161;;;12224:10;12219:3;12215:20;12212:1;12205:31;12259:4;12256:1;12249:15;12287:4;12284:1;12277:15;12141:161;;11928:380;;;:::o;13504:410::-;13706:2;13688:21;;;13745:2;13725:18;;;13718:30;13784:34;13779:2;13764:18;;13757:62;-1:-1:-1;;;13850:2:1;13835:18;;13828:44;13904:3;13889:19;;13504:410::o;13919:125::-;13959:4;13987:1;13984;13981:8;13978:34;;;13992:18;;:::i;:::-;-1:-1:-1;14029:9:1;;13919:125::o;14049:127::-;14110:10;14105:3;14101:20;14098:1;14091:31;14141:4;14138:1;14131:15;14165:4;14162:1;14155:15;14181:120;14221:1;14247;14237:35;;14252:18;;:::i;:::-;-1:-1:-1;14286:9:1;;14181:120::o;14306:195::-;14344:4;14381;14378:1;14374:12;14413:4;14410:1;14406:12;14438:3;14433;14430:12;14427:38;;;14445:18;;:::i;:::-;14482:13;;;14306:195;-1:-1:-1;;;14306:195:1:o;14980:175::-;15017:3;15061:4;15054:5;15050:16;15090:4;15081:7;15078:17;15075:43;;;15098:18;;:::i;:::-;15147:1;15134:15;;14980:175;-1:-1:-1;;14980:175:1:o;15579:645::-;15836:3;15821:19;;15825:9;15917:6;15794:4;15951:168;15965:4;15962:1;15959:11;15951:168;;;16024:13;;16012:26;;16067:4;16058:14;;;;16107:1;16095:14;;;;15978:9;15951:168;;;15955:3;;;16138;16191:2;16183:6;16178:2;16167:9;16163:18;16150:44;;16216:1;16210:4;16203:15;15579:645;;;;;:::o;17057:355::-;17259:2;17241:21;;;17298:2;17278:18;;;17271:30;17337:33;17332:2;17317:18;;17310:61;17403:2;17388:18;;17057:355::o;17417:397::-;17619:2;17601:21;;;17658:2;17638:18;;;17631:30;17697:34;17692:2;17677:18;;17670:62;-1:-1:-1;;;17763:2:1;17748:18;;17741:31;17804:3;17789:19;;17417:397::o;21114:184::-;21184:6;21237:2;21225:9;21216:7;21212:23;21208:32;21205:52;;;21253:1;21250;21243:12;21205:52;-1:-1:-1;21276:16:1;;21114:184;-1:-1:-1;21114:184:1:o;22006:245::-;22073:6;22126:2;22114:9;22105:7;22101:23;22097:32;22094:52;;;22142:1;22139;22132:12;22094:52;22174:9;22168:16;22193:28;22215:5;22193:28;:::i;22256:156::-;22322:20;;22382:4;22371:16;;22361:27;;22351:55;;22402:1;22399;22392:12;22417:182;22474:6;22527:2;22515:9;22506:7;22502:23;22498:32;22495:52;;;22543:1;22540;22533:12;22495:52;22566:27;22583:9;22566:27;:::i;23015:204::-;23053:3;23089:4;23086:1;23082:12;23121:4;23118:1;23114:12;23156:3;23150:4;23146:14;23141:3;23138:23;23135:49;;;23164:18;;:::i;:::-;23200:13;;23015:204;-1:-1:-1;;;23015:204:1:o;23577:355::-;23677:5;23700:1;23710:216;23724:4;23721:1;23718:11;23710:216;;;23813:4;23787:24;23804:6;23787:24;:::i;:::-;23783:35;23771:48;;23842:4;23866:12;;;;23901:15;;;;;23744:1;23737:9;23710:216;;23937:1066;24211:13;;24243:4;24273:13;;;4915:29;;24332:1;24328:12;;;24324:21;;24362:4;24347:20;;4915:29;24402:2;24398:13;;;24394:22;;24433:2;24418:18;;4915:29;24471:2;24467:13;;;24463:22;;24502:2;24487:18;;4915:29;24186:3;24171:19;;;24211:13;24515:63;24573:3;24562:9;24558:19;24553:2;24546:4;24540;24536:15;24532:24;4938:4;4927:16;4915:29;;4871:75;24515:63;24587:61;24643:3;24632:9;24628:19;24623:2;24616:4;24612:2;24608:13;24604:22;4938:4;4927:16;4915:29;;4871:75;24587:61;24657;24713:3;24702:9;24698:19;24693:2;24686:4;24682:2;24678:13;24674:22;4938:4;4927:16;4915:29;;4871:75;24657:61;24727;24783:3;24772:9;24768:19;24763:2;24756:4;24752:2;24748:13;24744:22;4938:4;4927:16;4915:29;;4871:75;24727:61;24797;24853:3;24842:9;24838:19;24833:2;24826:4;24822:2;24818:13;24814:22;4938:4;4927:16;4915:29;;4871:75;24797:61;24867;24923:3;24912:9;24908:19;24903:2;24896:4;24892:2;24888:13;24884:22;4938:4;4927:16;4915:29;;4871:75;24867:61;;;24937:60;24992:3;24981:9;24977:19;24969:6;24937:60;:::i;25838:468::-;26017:3;26002:19;;26006:9;26098:6;25975:4;26132:168;26146:4;26143:1;26140:11;26132:168;;;26205:13;;26193:26;;26248:4;26239:14;;;;26288:1;26276:14;;;;26159:9;26132:168;;;26136:3;;;25838:468;;;;:::o;27133:1527::-;27357:3;27395:6;27389:13;27421:4;27434:51;27478:6;27473:3;27468:2;27460:6;27456:15;27434:51;:::i;:::-;27548:13;;27507:16;;;;27570:55;27548:13;27507:16;27592:15;;;27570:55;:::i;:::-;27714:13;;27647:20;;;27687:1;;27774;27796:18;;;;27849;;;;27876:93;;27954:4;27944:8;27940:19;27928:31;;27876:93;28017:2;28007:8;28004:16;27984:18;27981:40;27978:167;;;-1:-1:-1;;;28044:33:1;;28100:4;28097:1;28090:15;28130:4;28051:3;28118:17;27978:167;28161:18;28188:110;;;;28312:1;28307:328;;;;28154:481;;28188:110;-1:-1:-1;;28223:24:1;;28209:39;;28268:20;;;;-1:-1:-1;28188:110:1;;28307:328;27080:1;27073:14;;;27117:4;27104:18;;28402:1;28416:169;28430:8;28427:1;28424:15;28416:169;;;28512:14;;28497:13;;;28490:37;28555:16;;;;28447:10;;28416:169;;;28420:3;;28616:8;28609:5;28605:20;28598:27;;28154:481;-1:-1:-1;28651:3:1;;27133:1527;-1:-1:-1;;;;;;;;;;;27133:1527:1:o;31511:178::-;31548:3;31592:4;31585:5;31581:16;31616:7;31606:41;;31627:18;;:::i;:::-;-1:-1:-1;;31663:20:1;;31511:178;-1:-1:-1;;31511:178:1:o;31694:168::-;31734:7;31800:1;31796;31792:6;31788:14;31785:1;31782:21;31777:1;31770:9;31763:17;31759:45;31756:71;;;31807:18;;:::i;:::-;-1:-1:-1;31847:9:1;;31694:168::o;31867:363::-;-1:-1:-1;;;;;32110:32:1;;32092:51;;32079:3;32064:19;;32193:6;32185;32180:2;32165:18;;32152:48;32222:1;32216:4;32209:15;31867:363;;;;;:::o;32589:414::-;32791:2;32773:21;;;32830:2;32810:18;;;32803:30;32869:34;32864:2;32849:18;;32842:62;-1:-1:-1;;;32935:2:1;32920:18;;32913:48;32993:3;32978:19;;32589:414::o;33008:112::-;33040:1;33066;33056:35;;33071:18;;:::i;:::-;-1:-1:-1;33105:9:1;;33008:112::o;33543:786::-;33954:25;33949:3;33942:38;33924:3;34009:6;34003:13;34025:62;34080:6;34075:2;34070:3;34066:12;34059:4;34051:6;34047:17;34025:62;:::i;:::-;-1:-1:-1;;;34146:2:1;34106:16;;;34138:11;;;34131:40;34196:13;;34218:63;34196:13;34267:2;34259:11;;34252:4;34240:17;;34218:63;:::i;:::-;34301:17;34320:2;34297:26;;33543:786;-1:-1:-1;;;;33543:786:1:o;34334:489::-;-1:-1:-1;;;;;34603:15:1;;;34585:34;;34655:15;;34650:2;34635:18;;34628:43;34702:2;34687:18;;34680:34;;;34750:3;34745:2;34730:18;;34723:31;;;34528:4;;34771:46;;34797:19;;34789:6;34771:46;:::i;:::-;34763:54;34334:489;-1:-1:-1;;;;;;34334:489:1:o;34828:249::-;34897:6;34950:2;34938:9;34929:7;34925:23;34921:32;34918:52;;;34966:1;34963;34956:12;34918:52;34998:9;34992:16;35017:30;35041:5;35017:30;:::i;35082:136::-;35121:3;35149:5;35139:39;;35158:18;;:::i;:::-;-1:-1:-1;;;35194:18:1;;35082:136::o;36302:127::-;36363:10;36358:3;36354:20;36351:1;36344:31;36394:4;36391:1;36384:15;36418:4;36415:1;36408:15
Swarm Source
ipfs://f81b709b02b295a179c2c571256ce349f3109eeb6c106191fad34ccd6a203238
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.