Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
0 Boy Soldier
Holders
93
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 Boy SoldierLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Boy_Soldier
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-11-02 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol) pragma solidity ^0.8.18; /** * @dev Standard ERC20 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens. */ interface IERC20Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC20InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC20InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. * @param spender Address that may be allowed to operate on tokens without being their owner. * @param allowance Amount of tokens a `spender` is allowed to operate with. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC20InvalidApprover(address approver); /** * @dev Indicates a failure with the `spender` to be approved. Used in approvals. * @param spender Address that may be allowed to operate on tokens without being their owner. */ error ERC20InvalidSpender(address spender); } /** * @dev Standard ERC721 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens. */ interface IERC721Errors { /** * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. * Used in balance queries. * @param owner Address of the current owner of a token. */ error ERC721InvalidOwner(address owner); /** * @dev Indicates a `tokenId` whose `owner` is the zero address. * @param tokenId Identifier number of a token. */ error ERC721NonexistentToken(uint256 tokenId); /** * @dev Indicates an error related to the ownership over a particular token. Used in transfers. * @param sender Address whose tokens are being transferred. * @param tokenId Identifier number of a token. * @param owner Address of the current owner of a token. */ error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC721InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC721InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param tokenId Identifier number of a token. */ error ERC721InsufficientApproval(address operator, uint256 tokenId); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC721InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC721InvalidOperator(address operator); } /** * @dev Standard ERC1155 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens. */ interface IERC1155Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. * @param tokenId Identifier number of a token. */ error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC1155InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC1155InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param owner Address of the current owner of a token. */ error ERC1155MissingApprovalForAll(address operator, address owner); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC1155InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC1155InvalidOperator(address operator); /** * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. * Used in batch transfers. * @param idsLength Length of the array of token identifiers * @param valuesLength Length of the array of token amounts */ error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength); } // File: @openzeppelin/contracts/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.18; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol) pragma solidity ^0.8.18; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Muldiv operation overflow. */ error MathOverflowedMulDiv(); enum Rounding { Floor, // Toward negative infinity Ceil, // Toward positive infinity Trunc, // Toward zero Expand // Away from zero } /** * @dev Returns the addition of two unsigned integers, with an overflow flag. */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds towards infinity instead * of rounding towards zero. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { if (b == 0) { // Guarantee the same behavior as in a regular Solidity division. return a / b; } // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or * denominator == 0. * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by * Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0 = x * y; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. if (denominator <= prod1) { revert MathOverflowedMulDiv(); } /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. // Always >= 1. See https://cs.stackexchange.com/q/138556/92363. uint256 twos = denominator & (0 - denominator); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also // works in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded * towards zero. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256 of a positive value rounded towards zero. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); } } /** * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. */ function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { return uint8(rounding) % 2 == 1; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol) pragma solidity ^0.8.18; /** * @dev String operations. */ library Strings { bytes16 private constant HEX_DIGITS = "0123456789abcdef"; uint8 private constant ADDRESS_LENGTH = 20; /** * @dev The `value` string doesn't fit in the specified `length`. */ error StringsInsufficientHexLength(uint256 value, uint256 length); /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), HEX_DIGITS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toStringSigned(int256 value) internal pure returns (string memory) { return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { uint256 localValue = value; 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_DIGITS[localValue & 0xf]; localValue >>= 4; } if (localValue != 0) { revert StringsInsufficientHexLength(value, length); } return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal * representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol) pragma solidity ^0.8.18; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.18; /** * @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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.18; /** * @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 (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.18; /** * @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/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.18; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/interfaces/IERC165.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol) pragma solidity ^0.8.18; // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.18; /** * @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); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/common/ERC2981.sol) pragma solidity ^0.8.18; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 tokenId => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev The default royalty set is invalid (eg. (numerator / denominator) >= 1). */ error ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator); /** * @dev The default royalty receiver is invalid. */ error ERC2981InvalidDefaultRoyaltyReceiver(address receiver); /** * @dev The royalty set for an specific `tokenId` is invalid (eg. (numerator / denominator) >= 1). */ error ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator); /** * @dev The royalty receiver for `tokenId` is invalid. */ error ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver); /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { uint256 denominator = _feeDenominator(); if (feeNumerator > denominator) { // Royalty fee will exceed the sale price revert ERC2981InvalidDefaultRoyalty(feeNumerator, denominator); } if (receiver == address(0)) { revert ERC2981InvalidDefaultRoyaltyReceiver(address(0)); } _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual { uint256 denominator = _feeDenominator(); if (feeNumerator > denominator) { // Royalty fee will exceed the sale price revert ERC2981InvalidTokenRoyalty(tokenId, feeNumerator, denominator); } if (receiver == address(0)) { revert ERC2981InvalidTokenRoyaltyReceiver(tokenId, address(0)); } _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.18; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon * a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or * {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon * a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the address zero. * * 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/interfaces/IERC721.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC721.sol) pragma solidity ^0.8.18; // File: @openzeppelin/contracts/interfaces/IERC4906.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC4906.sol) pragma solidity ^0.8.18; /// @title EIP-721 Metadata Update Extension interface IERC4906 is IERC165, IERC721 { /// @dev This event emits when the metadata of a token is changed. /// So that the third-party platforms such as NFT market could /// timely update the images and related attributes of the NFT. event MetadataUpdate(uint256 _tokenId); /// @dev This event emits when the metadata of a range of tokens is changed. /// So that the third-party platforms such as NFT market could /// timely update the images and related attributes of the NFTs. event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.18; /** * @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 v5.0.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.18; /** * @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}. */ abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors { using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; mapping(uint256 tokenId => address) private _owners; mapping(address owner => uint256) private _balances; mapping(uint256 tokenId => address) private _tokenApprovals; mapping(address owner => mapping(address operator => 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 returns (uint256) { if (owner == address(0)) { revert ERC721InvalidOwner(address(0)); } return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual returns (address) { return _requireOwned(tokenId); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual returns (string memory) { _requireOwned(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string.concat(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 { _approve(to, tokenId, _msgSender()); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual returns (address) { _requireOwned(tokenId); return _getApproved(tokenId); } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } // Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here. address previousOwner = _update(to, tokenId, _msgSender()); if (previousOwner != from) { revert ERC721IncorrectOwner(from, tokenId, previousOwner); } } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual { transferFrom(from, to, tokenId); _checkOnERC721Received(from, to, tokenId, data); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist * * IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the * core ERC721 logic MUST be matched with the use of {_increaseBalance} to keep balances * consistent with ownership. The invariant to preserve is that for any address `a` the value returned by * `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`. */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted. */ function _getApproved(uint256 tokenId) internal view virtual returns (address) { return _tokenApprovals[tokenId]; } /** * @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in * particular (ignoring whether it is owned by `owner`). * * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this * assumption. */ function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) { return spender != address(0) && (owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender); } /** * @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner. * Reverts if `spender` does not have approval from the provided `owner` for the given token or for all its assets * the `spender` for the specific `tokenId`. * * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this * assumption. */ function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual { if (!_isAuthorized(owner, spender, tokenId)) { if (owner == address(0)) { revert ERC721NonexistentToken(tokenId); } else { revert ERC721InsufficientApproval(spender, tokenId); } } } /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that * a uint256 would ever overflow from increments when these increments are bounded to uint128 values. * * WARNING: Increasing an account's balance using this function tends to be paired with an override of the * {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership * remain consistent with one another. */ function _increaseBalance(address account, uint128 value) internal virtual { unchecked { _balances[account] += value; } } /** * @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner * (or `to`) is the zero address. Returns the owner of the `tokenId` before the update. * * The `auth` argument is optional. If the value passed is non 0, then this function will check that * `auth` is either the owner of the token, or approved to operate on the token (by the owner). * * Emits a {Transfer} event. * * NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}. */ function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) { address from = _ownerOf(tokenId); // Perform (optional) operator check if (auth != address(0)) { _checkAuthorized(from, auth, tokenId); } // Execute the update if (from != address(0)) { // Clear approval. No need to re-authorize or emit the Approval event _approve(address(0), tokenId, address(0), false); unchecked { _balances[from] -= 1; } } if (to != address(0)) { unchecked { _balances[to] += 1; } } _owners[tokenId] = to; emit Transfer(from, to, tokenId); return from; } /** * @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 { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } address previousOwner = _update(to, tokenId, address(0)); if (previousOwner != address(0)) { revert ERC721InvalidSender(address(0)); } } /** * @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance. * * 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 { _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); _checkOnERC721Received(address(0), to, tokenId, data); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal { address previousOwner = _update(address(0), tokenId, address(0)); if (previousOwner == address(0)) { revert ERC721NonexistentToken(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 { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } address previousOwner = _update(to, tokenId, address(0)); if (previousOwner == address(0)) { revert ERC721NonexistentToken(tokenId); } else if (previousOwner != from) { revert ERC721IncorrectOwner(from, tokenId, previousOwner); } } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients * are aware of the ERC721 standard 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 like {safeTransferFrom} in the sense that it invokes * {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `tokenId` token must exist and be owned by `from`. * - `to` cannot be the zero address. * - `from` cannot be the zero address. * - 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) internal { _safeTransfer(from, to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual { _transfer(from, to, tokenId); _checkOnERC721Received(from, to, tokenId, data); } /** * @dev Approve `to` to operate on `tokenId` * * The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is * either the owner of the token, or approved to operate on all tokens held by this owner. * * Emits an {Approval} event. * * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. */ function _approve(address to, uint256 tokenId, address auth) internal { _approve(to, tokenId, auth, true); } /** * @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not * emitted in the context of transfers. */ function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual { // Avoid reading the owner unless necessary if (emitEvent || auth != address(0)) { address owner = _requireOwned(tokenId); // We do not use _isAuthorized because single-token approvals should not be able to call approve if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) { revert ERC721InvalidApprover(auth); } if (emitEvent) { emit Approval(owner, to, tokenId); } } _tokenApprovals[tokenId] = to; } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Requirements: * - operator can't be the address zero. * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { if (operator == address(0)) { revert ERC721InvalidOperator(operator); } _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned). * Returns the owner. * * Overrides to ownership logic should be done to {_ownerOf}. */ function _requireOwned(uint256 tokenId) internal view returns (address) { address owner = _ownerOf(tokenId); if (owner == address(0)) { revert ERC721NonexistentToken(tokenId); } return owner; } /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the * recipient doesn't accept the token transfer. 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 */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private { if (to.code.length > 0) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { if (retval != IERC721Receiver.onERC721Received.selector) { revert ERC721InvalidReceiver(to); } } catch (bytes memory reason) { if (reason.length == 0) { revert ERC721InvalidReceiver(to); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.18; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is IERC4906, ERC721 { using Strings for uint256; // Interface ID as defined in ERC-4906. This does not correspond to a traditional interface ID as ERC-4906 only // defines events and does not include any external function. bytes4 private constant ERC4906_INTERFACE_ID = bytes4(0x49064906); // Optional mapping for token URIs mapping(uint256 tokenId => string) private _tokenURIs; /** * @dev See {IERC165-supportsInterface} */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, IERC165) returns (bool) { return interfaceId == ERC4906_INTERFACE_ID || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireOwned(tokenId); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via string.concat). if (bytes(_tokenURI).length > 0) { return string.concat(base, _tokenURI); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Emits {MetadataUpdate}. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { _tokenURIs[tokenId] = _tokenURI; emit MetadataUpdate(tokenId); } } // File: mainnet/0x52a043Ec29fbB9A1B142b8913A76c0bC592D0849/contracts/redeem.sol pragma solidity ^0.8.18; abstract contract OperatorFilterer { /// @dev The default OpenSea operator blocklist subscription. address internal constant _DEFAULT_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6; /// @dev The OpenSea operator filter registry. address internal constant _OPERATOR_FILTER_REGISTRY = 0x000000000000AAeB6D7670E522A718067333cd4E; /// @dev Registers the current contract to OpenSea's operator filter, /// and subscribe to the default OpenSea operator blocklist. /// Note: Will not revert nor update existing settings for repeated registration. function _registerForOperatorFiltering() internal virtual { _registerForOperatorFiltering(_DEFAULT_SUBSCRIPTION, true); } /// @dev Registers the current contract to OpenSea's operator filter. /// Note: Will not revert nor update existing settings for repeated registration. function _registerForOperatorFiltering( address subscriptionOrRegistrantToCopy, bool subscribe ) internal virtual { /// @solidity memory-safe-assembly assembly { let functionSelector := 0x7d3e3dbe // `registerAndSubscribe(address,address)`. // Clean the upper 96 bits of `subscriptionOrRegistrantToCopy` in case they are dirty. subscriptionOrRegistrantToCopy := shr( 96, shl(96, subscriptionOrRegistrantToCopy) ) // prettier-ignore for {} iszero(subscribe) {} { if iszero(subscriptionOrRegistrantToCopy) { functionSelector := 0x4420e486 // `register(address)`. break } functionSelector := 0xa0af2903 // `registerAndCopyEntries(address,address)`. break } // Store the function selector. mstore(0x00, shl(224, functionSelector)) // Store the `address(this)`. mstore(0x04, address()) // Store the `subscriptionOrRegistrantToCopy`. mstore(0x24, subscriptionOrRegistrantToCopy) // Register into the registry. pop( call( gas(), _OPERATOR_FILTER_REGISTRY, 0, 0x00, 0x44, 0x00, 0x00 ) ) // Restore the part of the free memory pointer that was overwritten, // which is guaranteed to be zero, because of Solidity's memory size limits. mstore(0x24, 0) } } /// @dev Modifier to guard a function and revert if `from` is a blocked operator. /// Can be turned on / off via `enabled`. /// For gas efficiency, you can use tight variable packing to efficiently read / write /// the boolean value for `enabled`. modifier onlyAllowedOperator(address from, bool enabled) virtual { /// @solidity memory-safe-assembly assembly { // This code prioritizes runtime gas costs on a chain with the registry. // As such, we will not use `extcodesize`, but rather abuse the behavior // of `staticcall` returning 1 when called on an empty / missing contract, // to avoid reverting when a chain does not have the registry. if enabled { // Check if `from` is not equal to `msg.sender`, // discarding the upper 96 bits of `from` in case they are dirty. if iszero(eq(shr(96, shl(96, from)), caller())) { // Store the function selector of `isOperatorAllowed(address,address)`, // shifted left by 6 bytes, which is enough for 8tb of memory. // We waste 6-3 = 3 bytes to save on 6 runtime gas (PUSH1 0x224 SHL). mstore(0x00, 0xc6171134001122334455) // Store the `address(this)`. mstore(0x1a, address()) // Store the `msg.sender`. mstore(0x3a, caller()) // `isOperatorAllowed` always returns true if it does not revert. if iszero( staticcall( gas(), _OPERATOR_FILTER_REGISTRY, 0x16, 0x44, 0x00, 0x00 ) ) { // Bubble up the revert if the staticcall reverts. returndatacopy(0x00, 0x00, returndatasize()) revert(0x00, returndatasize()) } // We'll skip checking if `from` is inside the blacklist. // Even though that can block transferring out of wrapper contracts, // we don't want tokens to be stuck. // Restore the part of the free memory pointer that was overwritten, // which is guaranteed to be zero, if less than 8tb of memory is used. mstore(0x3a, 0) } } } _; } /// @dev Modifier to guard a function from approving a blocked operator. /// Can be turned on / off via `enabled`. /// For efficiency, you can use tight variable packing to efficiently read / write /// the boolean value for `enabled`. modifier onlyAllowedOperatorApproval(address operator, bool enabled) virtual { /// @solidity memory-safe-assembly assembly { // For more information on the optimization techniques used, // see the comments in `onlyAllowedOperator`. if enabled { // Store the function selector of `isOperatorAllowed(address,address)`, mstore(0x00, 0xc6171134001122334455) // Store the `address(this)`. mstore(0x1a, address()) // Store the `operator`, discarding the upper 96 bits in case they are dirty. mstore(0x3a, shr(96, shl(96, operator))) // `isOperatorAllowed` always returns true if it does not revert. if iszero( staticcall( gas(), _OPERATOR_FILTER_REGISTRY, 0x16, 0x44, 0x00, 0x00 ) ) { // Bubble up the revert if the staticcall reverts. returndatacopy(0x00, 0x00, returndatasize()) revert(0x00, returndatasize()) } // Restore the part of the free memory pointer that was overwritten. mstore(0x3a, 0) } } _; } } error WithdrawFailed(); contract Boy_Soldier is ERC721, ERC721URIStorage, ERC2981, OperatorFilterer, Ownable { bool public operatorFilteringEnabled; bool public enableRedeem = false; address private craftingContract; uint256 public redeemFee = 0.034 ether; string baseURI; mapping(uint256 => bool) public redeemedTokens; mapping(address => uint256) public userRedeemed; constructor(address initialOwner, address royalityReciever, uint96 royality) ERC721("Boy Soldier", "Boy Soldier") Ownable(initialOwner) { _registerForOperatorFiltering(); operatorFilteringEnabled = true; _setDefaultRoyalty(royalityReciever, royality); } function publicMint( address to, uint256 tokenId, string memory uri ) public { require(msg.sender == craftingContract, "You are not authorized"); _safeMint(to, tokenId); _setTokenURI(tokenId, uri); } function redeem(uint256 tokenId) public payable { require(enableRedeem == true, "You can't redeem at this time"); require(!redeemedTokens[tokenId], "Token already redeemed"); address tokenOwner = ownerOf(tokenId); require(msg.sender == tokenOwner, "You are not the owner"); require(msg.value >= redeemFee, "Value is not sufficient"); uint256 extraAmount = msg.value - redeemFee; if (extraAmount > 0) { payable(msg.sender).transfer(extraAmount); } // Mark the token as redeemed redeemedTokens[tokenId] = true; userRedeemed[msg.sender] ++; _setTokenURI(tokenId, baseURI); } function remainItems(address user) public view returns (uint256){ uint256 i = balanceOf(user) - userRedeemed[user]; return i; } function setCraftingContract(address _contract) external onlyOwner { craftingContract = _contract; } function setBaseUri(string memory _uri) external onlyOwner { baseURI = _uri; } function setTokenUri(uint256 id, string memory _URI) external onlyOwner{ _setTokenURI(id, _URI); } function setRedeemFee(uint256 _fee) external onlyOwner{ redeemFee = _fee; } function setRedeemStatus(bool _setStatus) external onlyOwner{ enableRedeem = _setStatus; } /** * @notice Withdraw all ETH sent to the contract */ function withdraw() external onlyOwner { (bool success, ) = payable(msg.sender).call{ value: address(this).balance }(""); if (!success) revert WithdrawFailed(); } // The following functions are overrides required by Solidity. function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721URIStorage, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } /** * @notice Set the state of the OpenSea operator filter * @param value Flag indicating if the operator filter should be applied to transfers and approvals */ function setOperatorFilteringEnabled(bool value) external onlyOwner { operatorFilteringEnabled = value; } /** * @notice Set new royalties settings for the collection * @param receiver Address to receive royalties * @param royaltyFraction Royalty fee respective to fee denominator (10_000) */ function setRoyalties(address receiver, uint96 royaltyFraction) external onlyOwner { _setDefaultRoyalty(receiver, royaltyFraction); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"address","name":"royalityReciever","type":"address"},{"internalType":"uint96","name":"royality","type":"uint96"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidDefaultRoyalty","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidDefaultRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidTokenRoyalty","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidTokenRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721IncorrectOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721InsufficientApproval","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC721InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC721InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721InvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC721InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC721InvalidSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonexistentToken","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"WithdrawFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableRedeem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilteringEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"publicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"redeemFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redeemedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"remainItems","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setCraftingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setOperatorFilteringEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setRedeemFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_setStatus","type":"bool"}],"name":"setRedeemStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"royaltyFraction","type":"uint96"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"_URI","type":"string"}],"name":"setTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userRedeemed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600960156101000a81548160ff0219169083151502179055506678cad1e25d0000600b553480156200003757600080fd5b50604051620043d2380380620043d283398181016040528101906200005d91906200057b565b826040518060400160405280600b81526020017f426f7920536f6c646965720000000000000000000000000000000000000000008152506040518060400160405280600b81526020017f426f7920536f6c646965720000000000000000000000000000000000000000008152508160009081620000db919062000851565b508060019081620000ed919062000851565b505050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620001655760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016200015c919062000949565b60405180910390fd5b6200017681620001bd60201b60201c565b50620001876200028360201b60201c565b6001600960146101000a81548160ff021916908315150217905550620001b48282620002ac60201b60201c565b505050620009dd565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002aa733cc6cdda760b79bafa08df41ecfa224f810dceb660016200045c60201b60201c565b565b6000620002be620004be60201b60201c565b6bffffffffffffffffffffffff16905080826bffffffffffffffffffffffff161115620003265781816040517f6f483d090000000000000000000000000000000000000000000000000000000081526004016200031d929190620009b0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036200039b5760006040517fb6d9900a00000000000000000000000000000000000000000000000000000000815260040162000392919062000949565b60405180910390fd5b60405180604001604052808473ffffffffffffffffffffffffffffffffffffffff168152602001836bffffffffffffffffffffffff16815250600760008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b637d3e3dbe8260601b60601c9250816200048b57826200048357634420e48690506200048b565b63a0af290390505b8060e01b600052306004528260245260008060446000806daaeb6d7670e522a718067333cd4e5af1506000602452505050565b6000612710905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620004fa82620004cd565b9050919050565b6200050c81620004ed565b81146200051857600080fd5b50565b6000815190506200052c8162000501565b92915050565b60006bffffffffffffffffffffffff82169050919050565b620005558162000532565b81146200056157600080fd5b50565b60008151905062000575816200054a565b92915050565b600080600060608486031215620005975762000596620004c8565b5b6000620005a7868287016200051b565b9350506020620005ba868287016200051b565b9250506040620005cd8682870162000564565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200065957607f821691505b6020821081036200066f576200066e62000611565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200069a565b620006e586836200069a565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620007326200072c6200072684620006fd565b62000707565b620006fd565b9050919050565b6000819050919050565b6200074e8362000711565b620007666200075d8262000739565b848454620006a7565b825550505050565b600090565b6200077d6200076e565b6200078a81848462000743565b505050565b5b81811015620007b257620007a660008262000773565b60018101905062000790565b5050565b601f8211156200080157620007cb8162000675565b620007d6846200068a565b81016020851015620007e6578190505b620007fe620007f5856200068a565b8301826200078f565b50505b505050565b600082821c905092915050565b6000620008266000198460080262000806565b1980831691505092915050565b600062000841838362000813565b9150826002028217905092915050565b6200085c82620005d7565b67ffffffffffffffff811115620008785762000877620005e2565b5b62000884825462000640565b62000891828285620007b6565b600060209050601f831160018114620008c95760008415620008b4578287015190505b620008c0858262000833565b86555062000930565b601f198416620008d98662000675565b60005b828110156200090357848901518255600182019150602085019450602081019050620008dc565b868310156200092357848901516200091f601f89168262000813565b8355505b6001600288020188555050505b505050505050565b6200094381620004ed565b82525050565b600060208201905062000960600083018462000938565b92915050565b600062000987620009816200097b8462000532565b62000707565b620006fd565b9050919050565b620009998162000966565b82525050565b620009aa81620006fd565b82525050565b6000604082019050620009c760008301856200098e565b620009d660208301846200099f565b9392505050565b6139e580620009ed6000396000f3fe6080604052600436106101ee5760003560e01c80638da5cb5b1161010d578063b884f3f2116100a0578063db006a751161006f578063db006a751461070a578063deffe7f814610726578063e985e9c51461074f578063f2fde38b1461078c578063fb796e6c146107b5576101ee565b8063b884f3f21461063e578063b88d4fde1461067b578063c21b471b146106a4578063c87b56dd146106cd576101ee565b8063a0bcfc7f116100dc578063a0bcfc7f1461059a578063a22cb465146105c3578063a53cd3b1146105ec578063b7c0b8e814610615576101ee565b80638da5cb5b146104dc57806395d89b4114610507578063965fa21e146105325780639f477d741461055d576101ee565b806342842e0e116101855780636352211e116101545780636352211e1461042257806370a082311461045f578063715018a61461049c57806384ff3382146104b3576101ee565b806342842e0e1461036a5780634f4602da1461039357806357f7789e146103d05780635d841af5146103f9576101ee565b8063095ea7b3116101c1578063095ea7b3146102c357806323b872dd146102ec5780632a55205a146103155780633ccfd60b14610353576101ee565b806301ffc9a7146101f3578063061873e81461023057806306fdde031461025b578063081812fc14610286575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612931565b6107e0565b6040516102279190612979565b60405180910390f35b34801561023c57600080fd5b506102456107f2565b6040516102529190612979565b60405180910390f35b34801561026757600080fd5b50610270610805565b60405161027d9190612a24565b60405180910390f35b34801561029257600080fd5b506102ad60048036038101906102a89190612a7c565b610897565b6040516102ba9190612aea565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e59190612b31565b6108b3565b005b3480156102f857600080fd5b50610313600480360381019061030e9190612b71565b6108c9565b005b34801561032157600080fd5b5061033c60048036038101906103379190612bc4565b6109cb565b60405161034a929190612c13565b60405180910390f35b34801561035f57600080fd5b50610368610bb5565b005b34801561037657600080fd5b50610391600480360381019061038c9190612b71565b610c63565b005b34801561039f57600080fd5b506103ba60048036038101906103b59190612a7c565b610c83565b6040516103c79190612979565b60405180910390f35b3480156103dc57600080fd5b506103f760048036038101906103f29190612d71565b610ca3565b005b34801561040557600080fd5b50610420600480360381019061041b9190612a7c565b610cb9565b005b34801561042e57600080fd5b5061044960048036038101906104449190612a7c565b610ccb565b6040516104569190612aea565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190612dcd565b610cdd565b6040516104939190612dfa565b60405180910390f35b3480156104a857600080fd5b506104b1610d97565b005b3480156104bf57600080fd5b506104da60048036038101906104d59190612dcd565b610dab565b005b3480156104e857600080fd5b506104f1610df7565b6040516104fe9190612aea565b60405180910390f35b34801561051357600080fd5b5061051c610e21565b6040516105299190612a24565b60405180910390f35b34801561053e57600080fd5b50610547610eb3565b6040516105549190612dfa565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f9190612dcd565b610eb9565b6040516105919190612dfa565b60405180910390f35b3480156105a657600080fd5b506105c160048036038101906105bc9190612e15565b610ed1565b005b3480156105cf57600080fd5b506105ea60048036038101906105e59190612e8a565b610eec565b005b3480156105f857600080fd5b50610613600480360381019061060e9190612eca565b610f02565b005b34801561062157600080fd5b5061063c60048036038101906106379190612f39565b610fab565b005b34801561064a57600080fd5b5061066560048036038101906106609190612dcd565b610fd0565b6040516106729190612dfa565b60405180910390f35b34801561068757600080fd5b506106a2600480360381019061069d9190613007565b611031565b005b3480156106b057600080fd5b506106cb60048036038101906106c691906130ce565b61104e565b005b3480156106d957600080fd5b506106f460048036038101906106ef9190612a7c565b611064565b6040516107019190612a24565b60405180910390f35b610724600480360381019061071f9190612a7c565b611076565b005b34801561073257600080fd5b5061074d60048036038101906107489190612f39565b61136a565b005b34801561075b57600080fd5b506107766004803603810190610771919061310e565b61138f565b6040516107839190612979565b60405180910390f35b34801561079857600080fd5b506107b360048036038101906107ae9190612dcd565b611423565b005b3480156107c157600080fd5b506107ca6114a9565b6040516107d79190612979565b60405180910390f35b60006107eb826114bc565b9050919050565b600960159054906101000a900460ff1681565b6060600080546108149061317d565b80601f01602080910402602001604051908101604052809291908181526020018280546108409061317d565b801561088d5780601f106108625761010080835404028352916020019161088d565b820191906000526020600020905b81548152906001019060200180831161087057829003601f168201915b5050505050905090565b60006108a282611536565b506108ac826115be565b9050919050565b6108c582826108c06115fb565b611603565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361093b5760006040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016109329190612aea565b60405180910390fd5b600061094f838361094a6115fb565b611615565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109c5578382826040517f64283d7b0000000000000000000000000000000000000000000000000000000081526004016109bc939291906131ae565b60405180910390fd5b50505050565b6000806000600860008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610b605760076040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610b6a61182f565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610b969190613214565b610ba09190613285565b90508160000151819350935050509250929050565b610bbd611839565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610be3906132e7565b60006040518083038185875af1925050503d8060008114610c20576040519150601f19603f3d011682016040523d82523d6000602084013e610c25565b606091505b5050905080610c60576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b610c7e83838360405180602001604052806000815250611031565b505050565b600d6020528060005260406000206000915054906101000a900460ff1681565b610cab611839565b610cb582826118c0565b5050565b610cc1611839565b80600b8190555050565b6000610cd682611536565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d505760006040517f89c62b64000000000000000000000000000000000000000000000000000000008152600401610d479190612aea565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d9f611839565b610da9600061191c565b565b610db3611839565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e309061317d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5c9061317d565b8015610ea95780601f10610e7e57610100808354040283529160200191610ea9565b820191906000526020600020905b815481529060010190602001808311610e8c57829003601f168201915b5050505050905090565b600b5481565b600e6020528060005260406000206000915090505481565b610ed9611839565b80600c9081610ee891906134a8565b5050565b610efe610ef76115fb565b83836119e2565b5050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f89906135c6565b60405180910390fd5b610f9c8383611b51565b610fa682826118c0565b505050565b610fb3611839565b80600960146101000a81548160ff02191690831515021790555050565b600080600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461101c84610cdd565b61102691906135e6565b905080915050919050565b61103c8484846108c9565b61104884848484611b6f565b50505050565b611056611839565b6110608282611d26565b5050565b606061106f82611ec8565b9050919050565b60011515600960159054906101000a900460ff161515146110cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c390613666565b60405180910390fd5b600d600082815260200190815260200160002060009054906101000a900460ff161561112d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611124906136d2565b60405180910390fd5b600061113882610ccb565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119f9061373e565b60405180910390fd5b600b543410156111ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e4906137aa565b60405180910390fd5b6000600b54346111fd91906135e6565b90506000811115611250573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561124e573d6000803e3d6000fd5b505b6001600d600085815260200190815260200160002060006101000a81548160ff021916908315150217905550600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906112cc906137ca565b919050555061136583600c80546112e29061317d565b80601f016020809104026020016040519081016040528092919081815260200182805461130e9061317d565b801561135b5780601f106113305761010080835404028352916020019161135b565b820191906000526020600020905b81548152906001019060200180831161133e57829003601f168201915b50505050506118c0565b505050565b611372611839565b80600960156101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61142b611839565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361149d5760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016114949190612aea565b60405180910390fd5b6114a68161191c565b50565b600960149054906101000a900460ff1681565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061152f575061152e82611fdb565b5b9050919050565b6000806115428361203c565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115b557826040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016115ac9190612dfa565b60405180910390fd5b80915050919050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905090565b6116108383836001612079565b505050565b6000806116218461203c565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146116635761166281848661223e565b5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116f4576116a5600085600080612079565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614611777576001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b846002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b6000612710905090565b6118416115fb565b73ffffffffffffffffffffffffffffffffffffffff1661185f610df7565b73ffffffffffffffffffffffffffffffffffffffff16146118be576118826115fb565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016118b59190612aea565b60405180910390fd5b565b806006600084815260200190815260200160002090816118e091906134a8565b507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7826040516119109190612dfa565b60405180910390a15050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a5357816040517f5b08ba18000000000000000000000000000000000000000000000000000000008152600401611a4a9190612aea565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b449190612979565b60405180910390a3505050565b611b6b828260405180602001604052806000815250612302565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff163b1115611d20578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02611bb36115fb565b8685856040518563ffffffff1660e01b8152600401611bd59493929190613867565b6020604051808303816000875af1925050508015611c1157506040513d601f19601f82011682018060405250810190611c0e91906138c8565b60015b611c95573d8060008114611c41576040519150601f19603f3d011682016040523d82523d6000602084013e611c46565b606091505b506000815103611c8d57836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611c849190612aea565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611d1e57836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611d159190612aea565b60405180910390fd5b505b50505050565b6000611d3061182f565b6bffffffffffffffffffffffff16905080826bffffffffffffffffffffffff161115611d955781816040517f6f483d09000000000000000000000000000000000000000000000000000000008152600401611d8c929190613926565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e075760006040517fb6d9900a000000000000000000000000000000000000000000000000000000008152600401611dfe9190612aea565b60405180910390fd5b60405180604001604052808473ffffffffffffffffffffffffffffffffffffffff168152602001836bffffffffffffffffffffffff16815250600760008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b6060611ed382611536565b506000600660008481526020019081526020016000208054611ef49061317d565b80601f0160208091040260200160405190810160405280929190818152602001828054611f209061317d565b8015611f6d5780601f10611f4257610100808354040283529160200191611f6d565b820191906000526020600020905b815481529060010190602001808311611f5057829003601f168201915b505050505090506000611f7e61231e565b90506000815103611f93578192505050611fd6565b600082511115611fc8578082604051602001611fb092919061398b565b60405160208183030381529060405292505050611fd6565b611fd184612335565b925050505b919050565b6000634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061203557506120348261239e565b5b9050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b80806120b25750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156121e65760006120c284611536565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561212d57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015612140575061213e818461138f565b155b1561218257826040517fa9fbf51f0000000000000000000000000000000000000000000000000000000081526004016121799190612aea565b60405180910390fd5b81156121e457838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b836004600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b612249838383612480565b6122fd57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036122be57806040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016122b59190612dfa565b60405180910390fd5b81816040517f177e802f0000000000000000000000000000000000000000000000000000000081526004016122f4929190612c13565b60405180910390fd5b505050565b61230c8383612541565b6123196000848484611b6f565b505050565b606060405180602001604052806000815250905090565b606061234082611536565b50600061234b61231e565b9050600081511161236b5760405180602001604052806000815250612396565b806123758461263a565b60405160200161238692919061398b565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061246957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612479575061247882612708565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561253857508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806124f957506124f8848461138f565b5b8061253757508273ffffffffffffffffffffffffffffffffffffffff1661251f836115be565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125b35760006040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016125aa9190612aea565b60405180910390fd5b60006125c183836000611615565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146126355760006040517f73c6ac6e00000000000000000000000000000000000000000000000000000000815260040161262c9190612aea565b60405180910390fd5b505050565b60606000600161264984612772565b01905060008167ffffffffffffffff81111561266857612667612c46565b5b6040519080825280601f01601f19166020018201604052801561269a5781602001600182028036833780820191505090505b509050600082602001820190505b6001156126fd578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816126f1576126f0613256565b5b049450600085036126a8575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106127d0577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816127c6576127c5613256565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061280d576d04ee2d6d415b85acef8100000000838161280357612802613256565b5b0492506020810190505b662386f26fc10000831061283c57662386f26fc10000838161283257612831613256565b5b0492506010810190505b6305f5e1008310612865576305f5e100838161285b5761285a613256565b5b0492506008810190505b612710831061288a5761271083816128805761287f613256565b5b0492506004810190505b606483106128ad57606483816128a3576128a2613256565b5b0492506002810190505b600a83106128bc576001810190505b80915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61290e816128d9565b811461291957600080fd5b50565b60008135905061292b81612905565b92915050565b600060208284031215612947576129466128cf565b5b60006129558482850161291c565b91505092915050565b60008115159050919050565b6129738161295e565b82525050565b600060208201905061298e600083018461296a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129ce5780820151818401526020810190506129b3565b60008484015250505050565b6000601f19601f8301169050919050565b60006129f682612994565b612a00818561299f565b9350612a108185602086016129b0565b612a19816129da565b840191505092915050565b60006020820190508181036000830152612a3e81846129eb565b905092915050565b6000819050919050565b612a5981612a46565b8114612a6457600080fd5b50565b600081359050612a7681612a50565b92915050565b600060208284031215612a9257612a916128cf565b5b6000612aa084828501612a67565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ad482612aa9565b9050919050565b612ae481612ac9565b82525050565b6000602082019050612aff6000830184612adb565b92915050565b612b0e81612ac9565b8114612b1957600080fd5b50565b600081359050612b2b81612b05565b92915050565b60008060408385031215612b4857612b476128cf565b5b6000612b5685828601612b1c565b9250506020612b6785828601612a67565b9150509250929050565b600080600060608486031215612b8a57612b896128cf565b5b6000612b9886828701612b1c565b9350506020612ba986828701612b1c565b9250506040612bba86828701612a67565b9150509250925092565b60008060408385031215612bdb57612bda6128cf565b5b6000612be985828601612a67565b9250506020612bfa85828601612a67565b9150509250929050565b612c0d81612a46565b82525050565b6000604082019050612c286000830185612adb565b612c356020830184612c04565b9392505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c7e826129da565b810181811067ffffffffffffffff82111715612c9d57612c9c612c46565b5b80604052505050565b6000612cb06128c5565b9050612cbc8282612c75565b919050565b600067ffffffffffffffff821115612cdc57612cdb612c46565b5b612ce5826129da565b9050602081019050919050565b82818337600083830152505050565b6000612d14612d0f84612cc1565b612ca6565b905082815260208101848484011115612d3057612d2f612c41565b5b612d3b848285612cf2565b509392505050565b600082601f830112612d5857612d57612c3c565b5b8135612d68848260208601612d01565b91505092915050565b60008060408385031215612d8857612d876128cf565b5b6000612d9685828601612a67565b925050602083013567ffffffffffffffff811115612db757612db66128d4565b5b612dc385828601612d43565b9150509250929050565b600060208284031215612de357612de26128cf565b5b6000612df184828501612b1c565b91505092915050565b6000602082019050612e0f6000830184612c04565b92915050565b600060208284031215612e2b57612e2a6128cf565b5b600082013567ffffffffffffffff811115612e4957612e486128d4565b5b612e5584828501612d43565b91505092915050565b612e678161295e565b8114612e7257600080fd5b50565b600081359050612e8481612e5e565b92915050565b60008060408385031215612ea157612ea06128cf565b5b6000612eaf85828601612b1c565b9250506020612ec085828601612e75565b9150509250929050565b600080600060608486031215612ee357612ee26128cf565b5b6000612ef186828701612b1c565b9350506020612f0286828701612a67565b925050604084013567ffffffffffffffff811115612f2357612f226128d4565b5b612f2f86828701612d43565b9150509250925092565b600060208284031215612f4f57612f4e6128cf565b5b6000612f5d84828501612e75565b91505092915050565b600067ffffffffffffffff821115612f8157612f80612c46565b5b612f8a826129da565b9050602081019050919050565b6000612faa612fa584612f66565b612ca6565b905082815260208101848484011115612fc657612fc5612c41565b5b612fd1848285612cf2565b509392505050565b600082601f830112612fee57612fed612c3c565b5b8135612ffe848260208601612f97565b91505092915050565b60008060008060808587031215613021576130206128cf565b5b600061302f87828801612b1c565b945050602061304087828801612b1c565b935050604061305187828801612a67565b925050606085013567ffffffffffffffff811115613072576130716128d4565b5b61307e87828801612fd9565b91505092959194509250565b60006bffffffffffffffffffffffff82169050919050565b6130ab8161308a565b81146130b657600080fd5b50565b6000813590506130c8816130a2565b92915050565b600080604083850312156130e5576130e46128cf565b5b60006130f385828601612b1c565b9250506020613104858286016130b9565b9150509250929050565b60008060408385031215613125576131246128cf565b5b600061313385828601612b1c565b925050602061314485828601612b1c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061319557607f821691505b6020821081036131a8576131a761314e565b5b50919050565b60006060820190506131c36000830186612adb565b6131d06020830185612c04565b6131dd6040830184612adb565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061321f82612a46565b915061322a83612a46565b925082820261323881612a46565b9150828204841483151761324f5761324e6131e5565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061329082612a46565b915061329b83612a46565b9250826132ab576132aa613256565b5b828204905092915050565b600081905092915050565b50565b60006132d16000836132b6565b91506132dc826132c1565b600082019050919050565b60006132f2826132c4565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261335e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613321565b6133688683613321565b95508019841693508086168417925050509392505050565b6000819050919050565b60006133a56133a061339b84612a46565b613380565b612a46565b9050919050565b6000819050919050565b6133bf8361338a565b6133d36133cb826133ac565b84845461332e565b825550505050565b600090565b6133e86133db565b6133f38184846133b6565b505050565b5b818110156134175761340c6000826133e0565b6001810190506133f9565b5050565b601f82111561345c5761342d816132fc565b61343684613311565b81016020851015613445578190505b61345961345185613311565b8301826133f8565b50505b505050565b600082821c905092915050565b600061347f60001984600802613461565b1980831691505092915050565b6000613498838361346e565b9150826002028217905092915050565b6134b182612994565b67ffffffffffffffff8111156134ca576134c9612c46565b5b6134d4825461317d565b6134df82828561341b565b600060209050601f8311600181146135125760008415613500578287015190505b61350a858261348c565b865550613572565b601f198416613520866132fc565b60005b8281101561354857848901518255600182019150602085019450602081019050613523565b868310156135655784890151613561601f89168261346e565b8355505b6001600288020188555050505b505050505050565b7f596f7520617265206e6f7420617574686f72697a656400000000000000000000600082015250565b60006135b060168361299f565b91506135bb8261357a565b602082019050919050565b600060208201905081810360008301526135df816135a3565b9050919050565b60006135f182612a46565b91506135fc83612a46565b9250828203905081811115613614576136136131e5565b5b92915050565b7f596f752063616e27742072656465656d20617420746869732074696d65000000600082015250565b6000613650601d8361299f565b915061365b8261361a565b602082019050919050565b6000602082019050818103600083015261367f81613643565b9050919050565b7f546f6b656e20616c72656164792072656465656d656400000000000000000000600082015250565b60006136bc60168361299f565b91506136c782613686565b602082019050919050565b600060208201905081810360008301526136eb816136af565b9050919050565b7f596f7520617265206e6f7420746865206f776e65720000000000000000000000600082015250565b600061372860158361299f565b9150613733826136f2565b602082019050919050565b600060208201905081810360008301526137578161371b565b9050919050565b7f56616c7565206973206e6f742073756666696369656e74000000000000000000600082015250565b600061379460178361299f565b915061379f8261375e565b602082019050919050565b600060208201905081810360008301526137c381613787565b9050919050565b60006137d582612a46565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613807576138066131e5565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b600061383982613812565b613843818561381d565b93506138538185602086016129b0565b61385c816129da565b840191505092915050565b600060808201905061387c6000830187612adb565b6138896020830186612adb565b6138966040830185612c04565b81810360608301526138a8818461382e565b905095945050505050565b6000815190506138c281612905565b92915050565b6000602082840312156138de576138dd6128cf565b5b60006138ec848285016138b3565b91505092915050565b600061391061390b6139068461308a565b613380565b612a46565b9050919050565b613920816138f5565b82525050565b600060408201905061393b6000830185613917565b6139486020830184612c04565b9392505050565b600081905092915050565b600061396582612994565b61396f818561394f565b935061397f8185602086016129b0565b80840191505092915050565b6000613997828561395a565b91506139a3828461395a565b9150819050939250505056fea264697066735822122053bed7642abcf7b065bcaae8ea87e2cf991960d995160f376120d91c487d1fed64736f6c6343000812003300000000000000000000000059de7273191e6bf1907d614e94ecfbe8e5fb73180000000000000000000000000116991b4edf3d88a9db4850b2c9fc5a326b14b500000000000000000000000000000000000000000000000000000000000003e8
Deployed Bytecode
0x6080604052600436106101ee5760003560e01c80638da5cb5b1161010d578063b884f3f2116100a0578063db006a751161006f578063db006a751461070a578063deffe7f814610726578063e985e9c51461074f578063f2fde38b1461078c578063fb796e6c146107b5576101ee565b8063b884f3f21461063e578063b88d4fde1461067b578063c21b471b146106a4578063c87b56dd146106cd576101ee565b8063a0bcfc7f116100dc578063a0bcfc7f1461059a578063a22cb465146105c3578063a53cd3b1146105ec578063b7c0b8e814610615576101ee565b80638da5cb5b146104dc57806395d89b4114610507578063965fa21e146105325780639f477d741461055d576101ee565b806342842e0e116101855780636352211e116101545780636352211e1461042257806370a082311461045f578063715018a61461049c57806384ff3382146104b3576101ee565b806342842e0e1461036a5780634f4602da1461039357806357f7789e146103d05780635d841af5146103f9576101ee565b8063095ea7b3116101c1578063095ea7b3146102c357806323b872dd146102ec5780632a55205a146103155780633ccfd60b14610353576101ee565b806301ffc9a7146101f3578063061873e81461023057806306fdde031461025b578063081812fc14610286575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612931565b6107e0565b6040516102279190612979565b60405180910390f35b34801561023c57600080fd5b506102456107f2565b6040516102529190612979565b60405180910390f35b34801561026757600080fd5b50610270610805565b60405161027d9190612a24565b60405180910390f35b34801561029257600080fd5b506102ad60048036038101906102a89190612a7c565b610897565b6040516102ba9190612aea565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e59190612b31565b6108b3565b005b3480156102f857600080fd5b50610313600480360381019061030e9190612b71565b6108c9565b005b34801561032157600080fd5b5061033c60048036038101906103379190612bc4565b6109cb565b60405161034a929190612c13565b60405180910390f35b34801561035f57600080fd5b50610368610bb5565b005b34801561037657600080fd5b50610391600480360381019061038c9190612b71565b610c63565b005b34801561039f57600080fd5b506103ba60048036038101906103b59190612a7c565b610c83565b6040516103c79190612979565b60405180910390f35b3480156103dc57600080fd5b506103f760048036038101906103f29190612d71565b610ca3565b005b34801561040557600080fd5b50610420600480360381019061041b9190612a7c565b610cb9565b005b34801561042e57600080fd5b5061044960048036038101906104449190612a7c565b610ccb565b6040516104569190612aea565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190612dcd565b610cdd565b6040516104939190612dfa565b60405180910390f35b3480156104a857600080fd5b506104b1610d97565b005b3480156104bf57600080fd5b506104da60048036038101906104d59190612dcd565b610dab565b005b3480156104e857600080fd5b506104f1610df7565b6040516104fe9190612aea565b60405180910390f35b34801561051357600080fd5b5061051c610e21565b6040516105299190612a24565b60405180910390f35b34801561053e57600080fd5b50610547610eb3565b6040516105549190612dfa565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f9190612dcd565b610eb9565b6040516105919190612dfa565b60405180910390f35b3480156105a657600080fd5b506105c160048036038101906105bc9190612e15565b610ed1565b005b3480156105cf57600080fd5b506105ea60048036038101906105e59190612e8a565b610eec565b005b3480156105f857600080fd5b50610613600480360381019061060e9190612eca565b610f02565b005b34801561062157600080fd5b5061063c60048036038101906106379190612f39565b610fab565b005b34801561064a57600080fd5b5061066560048036038101906106609190612dcd565b610fd0565b6040516106729190612dfa565b60405180910390f35b34801561068757600080fd5b506106a2600480360381019061069d9190613007565b611031565b005b3480156106b057600080fd5b506106cb60048036038101906106c691906130ce565b61104e565b005b3480156106d957600080fd5b506106f460048036038101906106ef9190612a7c565b611064565b6040516107019190612a24565b60405180910390f35b610724600480360381019061071f9190612a7c565b611076565b005b34801561073257600080fd5b5061074d60048036038101906107489190612f39565b61136a565b005b34801561075b57600080fd5b506107766004803603810190610771919061310e565b61138f565b6040516107839190612979565b60405180910390f35b34801561079857600080fd5b506107b360048036038101906107ae9190612dcd565b611423565b005b3480156107c157600080fd5b506107ca6114a9565b6040516107d79190612979565b60405180910390f35b60006107eb826114bc565b9050919050565b600960159054906101000a900460ff1681565b6060600080546108149061317d565b80601f01602080910402602001604051908101604052809291908181526020018280546108409061317d565b801561088d5780601f106108625761010080835404028352916020019161088d565b820191906000526020600020905b81548152906001019060200180831161087057829003601f168201915b5050505050905090565b60006108a282611536565b506108ac826115be565b9050919050565b6108c582826108c06115fb565b611603565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361093b5760006040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016109329190612aea565b60405180910390fd5b600061094f838361094a6115fb565b611615565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109c5578382826040517f64283d7b0000000000000000000000000000000000000000000000000000000081526004016109bc939291906131ae565b60405180910390fd5b50505050565b6000806000600860008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610b605760076040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610b6a61182f565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610b969190613214565b610ba09190613285565b90508160000151819350935050509250929050565b610bbd611839565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610be3906132e7565b60006040518083038185875af1925050503d8060008114610c20576040519150601f19603f3d011682016040523d82523d6000602084013e610c25565b606091505b5050905080610c60576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b610c7e83838360405180602001604052806000815250611031565b505050565b600d6020528060005260406000206000915054906101000a900460ff1681565b610cab611839565b610cb582826118c0565b5050565b610cc1611839565b80600b8190555050565b6000610cd682611536565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d505760006040517f89c62b64000000000000000000000000000000000000000000000000000000008152600401610d479190612aea565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d9f611839565b610da9600061191c565b565b610db3611839565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e309061317d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5c9061317d565b8015610ea95780601f10610e7e57610100808354040283529160200191610ea9565b820191906000526020600020905b815481529060010190602001808311610e8c57829003601f168201915b5050505050905090565b600b5481565b600e6020528060005260406000206000915090505481565b610ed9611839565b80600c9081610ee891906134a8565b5050565b610efe610ef76115fb565b83836119e2565b5050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f89906135c6565b60405180910390fd5b610f9c8383611b51565b610fa682826118c0565b505050565b610fb3611839565b80600960146101000a81548160ff02191690831515021790555050565b600080600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461101c84610cdd565b61102691906135e6565b905080915050919050565b61103c8484846108c9565b61104884848484611b6f565b50505050565b611056611839565b6110608282611d26565b5050565b606061106f82611ec8565b9050919050565b60011515600960159054906101000a900460ff161515146110cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c390613666565b60405180910390fd5b600d600082815260200190815260200160002060009054906101000a900460ff161561112d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611124906136d2565b60405180910390fd5b600061113882610ccb565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119f9061373e565b60405180910390fd5b600b543410156111ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e4906137aa565b60405180910390fd5b6000600b54346111fd91906135e6565b90506000811115611250573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561124e573d6000803e3d6000fd5b505b6001600d600085815260200190815260200160002060006101000a81548160ff021916908315150217905550600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906112cc906137ca565b919050555061136583600c80546112e29061317d565b80601f016020809104026020016040519081016040528092919081815260200182805461130e9061317d565b801561135b5780601f106113305761010080835404028352916020019161135b565b820191906000526020600020905b81548152906001019060200180831161133e57829003601f168201915b50505050506118c0565b505050565b611372611839565b80600960156101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61142b611839565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361149d5760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016114949190612aea565b60405180910390fd5b6114a68161191c565b50565b600960149054906101000a900460ff1681565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061152f575061152e82611fdb565b5b9050919050565b6000806115428361203c565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115b557826040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016115ac9190612dfa565b60405180910390fd5b80915050919050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905090565b6116108383836001612079565b505050565b6000806116218461203c565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146116635761166281848661223e565b5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116f4576116a5600085600080612079565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614611777576001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b846002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b6000612710905090565b6118416115fb565b73ffffffffffffffffffffffffffffffffffffffff1661185f610df7565b73ffffffffffffffffffffffffffffffffffffffff16146118be576118826115fb565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016118b59190612aea565b60405180910390fd5b565b806006600084815260200190815260200160002090816118e091906134a8565b507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7826040516119109190612dfa565b60405180910390a15050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a5357816040517f5b08ba18000000000000000000000000000000000000000000000000000000008152600401611a4a9190612aea565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b449190612979565b60405180910390a3505050565b611b6b828260405180602001604052806000815250612302565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff163b1115611d20578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02611bb36115fb565b8685856040518563ffffffff1660e01b8152600401611bd59493929190613867565b6020604051808303816000875af1925050508015611c1157506040513d601f19601f82011682018060405250810190611c0e91906138c8565b60015b611c95573d8060008114611c41576040519150601f19603f3d011682016040523d82523d6000602084013e611c46565b606091505b506000815103611c8d57836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611c849190612aea565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611d1e57836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611d159190612aea565b60405180910390fd5b505b50505050565b6000611d3061182f565b6bffffffffffffffffffffffff16905080826bffffffffffffffffffffffff161115611d955781816040517f6f483d09000000000000000000000000000000000000000000000000000000008152600401611d8c929190613926565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e075760006040517fb6d9900a000000000000000000000000000000000000000000000000000000008152600401611dfe9190612aea565b60405180910390fd5b60405180604001604052808473ffffffffffffffffffffffffffffffffffffffff168152602001836bffffffffffffffffffffffff16815250600760008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b6060611ed382611536565b506000600660008481526020019081526020016000208054611ef49061317d565b80601f0160208091040260200160405190810160405280929190818152602001828054611f209061317d565b8015611f6d5780601f10611f4257610100808354040283529160200191611f6d565b820191906000526020600020905b815481529060010190602001808311611f5057829003601f168201915b505050505090506000611f7e61231e565b90506000815103611f93578192505050611fd6565b600082511115611fc8578082604051602001611fb092919061398b565b60405160208183030381529060405292505050611fd6565b611fd184612335565b925050505b919050565b6000634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061203557506120348261239e565b5b9050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b80806120b25750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156121e65760006120c284611536565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561212d57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015612140575061213e818461138f565b155b1561218257826040517fa9fbf51f0000000000000000000000000000000000000000000000000000000081526004016121799190612aea565b60405180910390fd5b81156121e457838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b836004600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b612249838383612480565b6122fd57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036122be57806040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016122b59190612dfa565b60405180910390fd5b81816040517f177e802f0000000000000000000000000000000000000000000000000000000081526004016122f4929190612c13565b60405180910390fd5b505050565b61230c8383612541565b6123196000848484611b6f565b505050565b606060405180602001604052806000815250905090565b606061234082611536565b50600061234b61231e565b9050600081511161236b5760405180602001604052806000815250612396565b806123758461263a565b60405160200161238692919061398b565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061246957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612479575061247882612708565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561253857508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806124f957506124f8848461138f565b5b8061253757508273ffffffffffffffffffffffffffffffffffffffff1661251f836115be565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125b35760006040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016125aa9190612aea565b60405180910390fd5b60006125c183836000611615565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146126355760006040517f73c6ac6e00000000000000000000000000000000000000000000000000000000815260040161262c9190612aea565b60405180910390fd5b505050565b60606000600161264984612772565b01905060008167ffffffffffffffff81111561266857612667612c46565b5b6040519080825280601f01601f19166020018201604052801561269a5781602001600182028036833780820191505090505b509050600082602001820190505b6001156126fd578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816126f1576126f0613256565b5b049450600085036126a8575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106127d0577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816127c6576127c5613256565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061280d576d04ee2d6d415b85acef8100000000838161280357612802613256565b5b0492506020810190505b662386f26fc10000831061283c57662386f26fc10000838161283257612831613256565b5b0492506010810190505b6305f5e1008310612865576305f5e100838161285b5761285a613256565b5b0492506008810190505b612710831061288a5761271083816128805761287f613256565b5b0492506004810190505b606483106128ad57606483816128a3576128a2613256565b5b0492506002810190505b600a83106128bc576001810190505b80915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61290e816128d9565b811461291957600080fd5b50565b60008135905061292b81612905565b92915050565b600060208284031215612947576129466128cf565b5b60006129558482850161291c565b91505092915050565b60008115159050919050565b6129738161295e565b82525050565b600060208201905061298e600083018461296a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129ce5780820151818401526020810190506129b3565b60008484015250505050565b6000601f19601f8301169050919050565b60006129f682612994565b612a00818561299f565b9350612a108185602086016129b0565b612a19816129da565b840191505092915050565b60006020820190508181036000830152612a3e81846129eb565b905092915050565b6000819050919050565b612a5981612a46565b8114612a6457600080fd5b50565b600081359050612a7681612a50565b92915050565b600060208284031215612a9257612a916128cf565b5b6000612aa084828501612a67565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ad482612aa9565b9050919050565b612ae481612ac9565b82525050565b6000602082019050612aff6000830184612adb565b92915050565b612b0e81612ac9565b8114612b1957600080fd5b50565b600081359050612b2b81612b05565b92915050565b60008060408385031215612b4857612b476128cf565b5b6000612b5685828601612b1c565b9250506020612b6785828601612a67565b9150509250929050565b600080600060608486031215612b8a57612b896128cf565b5b6000612b9886828701612b1c565b9350506020612ba986828701612b1c565b9250506040612bba86828701612a67565b9150509250925092565b60008060408385031215612bdb57612bda6128cf565b5b6000612be985828601612a67565b9250506020612bfa85828601612a67565b9150509250929050565b612c0d81612a46565b82525050565b6000604082019050612c286000830185612adb565b612c356020830184612c04565b9392505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c7e826129da565b810181811067ffffffffffffffff82111715612c9d57612c9c612c46565b5b80604052505050565b6000612cb06128c5565b9050612cbc8282612c75565b919050565b600067ffffffffffffffff821115612cdc57612cdb612c46565b5b612ce5826129da565b9050602081019050919050565b82818337600083830152505050565b6000612d14612d0f84612cc1565b612ca6565b905082815260208101848484011115612d3057612d2f612c41565b5b612d3b848285612cf2565b509392505050565b600082601f830112612d5857612d57612c3c565b5b8135612d68848260208601612d01565b91505092915050565b60008060408385031215612d8857612d876128cf565b5b6000612d9685828601612a67565b925050602083013567ffffffffffffffff811115612db757612db66128d4565b5b612dc385828601612d43565b9150509250929050565b600060208284031215612de357612de26128cf565b5b6000612df184828501612b1c565b91505092915050565b6000602082019050612e0f6000830184612c04565b92915050565b600060208284031215612e2b57612e2a6128cf565b5b600082013567ffffffffffffffff811115612e4957612e486128d4565b5b612e5584828501612d43565b91505092915050565b612e678161295e565b8114612e7257600080fd5b50565b600081359050612e8481612e5e565b92915050565b60008060408385031215612ea157612ea06128cf565b5b6000612eaf85828601612b1c565b9250506020612ec085828601612e75565b9150509250929050565b600080600060608486031215612ee357612ee26128cf565b5b6000612ef186828701612b1c565b9350506020612f0286828701612a67565b925050604084013567ffffffffffffffff811115612f2357612f226128d4565b5b612f2f86828701612d43565b9150509250925092565b600060208284031215612f4f57612f4e6128cf565b5b6000612f5d84828501612e75565b91505092915050565b600067ffffffffffffffff821115612f8157612f80612c46565b5b612f8a826129da565b9050602081019050919050565b6000612faa612fa584612f66565b612ca6565b905082815260208101848484011115612fc657612fc5612c41565b5b612fd1848285612cf2565b509392505050565b600082601f830112612fee57612fed612c3c565b5b8135612ffe848260208601612f97565b91505092915050565b60008060008060808587031215613021576130206128cf565b5b600061302f87828801612b1c565b945050602061304087828801612b1c565b935050604061305187828801612a67565b925050606085013567ffffffffffffffff811115613072576130716128d4565b5b61307e87828801612fd9565b91505092959194509250565b60006bffffffffffffffffffffffff82169050919050565b6130ab8161308a565b81146130b657600080fd5b50565b6000813590506130c8816130a2565b92915050565b600080604083850312156130e5576130e46128cf565b5b60006130f385828601612b1c565b9250506020613104858286016130b9565b9150509250929050565b60008060408385031215613125576131246128cf565b5b600061313385828601612b1c565b925050602061314485828601612b1c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061319557607f821691505b6020821081036131a8576131a761314e565b5b50919050565b60006060820190506131c36000830186612adb565b6131d06020830185612c04565b6131dd6040830184612adb565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061321f82612a46565b915061322a83612a46565b925082820261323881612a46565b9150828204841483151761324f5761324e6131e5565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061329082612a46565b915061329b83612a46565b9250826132ab576132aa613256565b5b828204905092915050565b600081905092915050565b50565b60006132d16000836132b6565b91506132dc826132c1565b600082019050919050565b60006132f2826132c4565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261335e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613321565b6133688683613321565b95508019841693508086168417925050509392505050565b6000819050919050565b60006133a56133a061339b84612a46565b613380565b612a46565b9050919050565b6000819050919050565b6133bf8361338a565b6133d36133cb826133ac565b84845461332e565b825550505050565b600090565b6133e86133db565b6133f38184846133b6565b505050565b5b818110156134175761340c6000826133e0565b6001810190506133f9565b5050565b601f82111561345c5761342d816132fc565b61343684613311565b81016020851015613445578190505b61345961345185613311565b8301826133f8565b50505b505050565b600082821c905092915050565b600061347f60001984600802613461565b1980831691505092915050565b6000613498838361346e565b9150826002028217905092915050565b6134b182612994565b67ffffffffffffffff8111156134ca576134c9612c46565b5b6134d4825461317d565b6134df82828561341b565b600060209050601f8311600181146135125760008415613500578287015190505b61350a858261348c565b865550613572565b601f198416613520866132fc565b60005b8281101561354857848901518255600182019150602085019450602081019050613523565b868310156135655784890151613561601f89168261346e565b8355505b6001600288020188555050505b505050505050565b7f596f7520617265206e6f7420617574686f72697a656400000000000000000000600082015250565b60006135b060168361299f565b91506135bb8261357a565b602082019050919050565b600060208201905081810360008301526135df816135a3565b9050919050565b60006135f182612a46565b91506135fc83612a46565b9250828203905081811115613614576136136131e5565b5b92915050565b7f596f752063616e27742072656465656d20617420746869732074696d65000000600082015250565b6000613650601d8361299f565b915061365b8261361a565b602082019050919050565b6000602082019050818103600083015261367f81613643565b9050919050565b7f546f6b656e20616c72656164792072656465656d656400000000000000000000600082015250565b60006136bc60168361299f565b91506136c782613686565b602082019050919050565b600060208201905081810360008301526136eb816136af565b9050919050565b7f596f7520617265206e6f7420746865206f776e65720000000000000000000000600082015250565b600061372860158361299f565b9150613733826136f2565b602082019050919050565b600060208201905081810360008301526137578161371b565b9050919050565b7f56616c7565206973206e6f742073756666696369656e74000000000000000000600082015250565b600061379460178361299f565b915061379f8261375e565b602082019050919050565b600060208201905081810360008301526137c381613787565b9050919050565b60006137d582612a46565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613807576138066131e5565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b600061383982613812565b613843818561381d565b93506138538185602086016129b0565b61385c816129da565b840191505092915050565b600060808201905061387c6000830187612adb565b6138896020830186612adb565b6138966040830185612c04565b81810360608301526138a8818461382e565b905095945050505050565b6000815190506138c281612905565b92915050565b6000602082840312156138de576138dd6128cf565b5b60006138ec848285016138b3565b91505092915050565b600061391061390b6139068461308a565b613380565b612a46565b9050919050565b613920816138f5565b82525050565b600060408201905061393b6000830185613917565b6139486020830184612c04565b9392505050565b600081905092915050565b600061396582612994565b61396f818561394f565b935061397f8185602086016129b0565b80840191505092915050565b6000613997828561395a565b91506139a3828461395a565b9150819050939250505056fea264697066735822122053bed7642abcf7b065bcaae8ea87e2cf991960d995160f376120d91c487d1fed64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000059de7273191e6bf1907d614e94ecfbe8e5fb73180000000000000000000000000116991b4edf3d88a9db4850b2c9fc5a326b14b500000000000000000000000000000000000000000000000000000000000003e8
-----Decoded View---------------
Arg [0] : initialOwner (address): 0x59dE7273191E6bf1907d614e94eCFbe8e5FB7318
Arg [1] : royalityReciever (address): 0x0116991B4eDF3D88a9Db4850b2C9FC5a326b14b5
Arg [2] : royality (uint96): 1000
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000059de7273191e6bf1907d614e94ecfbe8e5fb7318
Arg [1] : 0000000000000000000000000116991b4edf3d88a9db4850b2c9fc5a326b14b5
Arg [2] : 00000000000000000000000000000000000000000000000000000000000003e8
Deployed Bytecode Sourcemap
73949:3910:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76931:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74110:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48940:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50112:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49931:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50781:588;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37190:429;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;76442:207;;;;;;;;;;;;;:::i;:::-;;51440:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74254:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76041:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76161:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48753:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48478:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30047:103;;;;;;;;;;;;;:::i;:::-;;75819:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29372:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49100:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74188:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74307:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75941:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50342:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74679:263;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77344:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75661:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51645:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77686:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76727:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74950:703;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76258:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50559:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30305:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74067:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76931:221;77079:4;77108:36;77132:11;77108:23;:36::i;:::-;77101:43;;76931:221;;;:::o;74110:32::-;;;;;;;;;;;;;:::o;48940:91::-;48985:13;49018:5;49011:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48940:91;:::o;50112:158::-;50179:7;50199:22;50213:7;50199:13;:22::i;:::-;;50241:21;50254:7;50241:12;:21::i;:::-;50234:28;;50112:158;;;:::o;49931:115::-;50003:35;50012:2;50016:7;50025:12;:10;:12::i;:::-;50003:8;:35::i;:::-;49931:115;;:::o;50781:588::-;50890:1;50876:16;;:2;:16;;;50872:89;;50946:1;50916:33;;;;;;;;;;;:::i;:::-;;;;;;;;50872:89;51182:21;51206:34;51214:2;51218:7;51227:12;:10;:12::i;:::-;51206:7;:34::i;:::-;51182:58;;51272:4;51255:21;;:13;:21;;;51251:111;;51321:4;51327:7;51336:13;51300:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;51251:111;50861:508;50781:588;;;:::o;37190:429::-;37276:7;37285;37305:26;37334:17;:26;37352:7;37334:26;;;;;;;;;;;37305:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37405:1;37377:30;;:7;:16;;;:30;;;37373:92;;37434:19;37424:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37373:92;37477:21;37541:17;:15;:17::i;:::-;37501:57;;37514:7;:23;;;37502:35;;:9;:35;;;;:::i;:::-;37501:57;;;;:::i;:::-;37477:81;;37579:7;:16;;;37597:13;37571:40;;;;;;37190:429;;;;;:::o;76442:207::-;29258:13;:11;:13::i;:::-;76493:12:::1;76519:10;76511:24;;76557:21;76511:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76492:101;;;76609:7;76604:37;;76625:16;;;;;;;;;;;;;;76604:37;76481:168;76442:207::o:0;51440:134::-;51527:39;51544:4;51550:2;51554:7;51527:39;;;;;;;;;;;;:16;:39::i;:::-;51440:134;;;:::o;74254:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;76041:112::-;29258:13;:11;:13::i;:::-;76123:22:::1;76136:2;76140:4;76123:12;:22::i;:::-;76041:112:::0;;:::o;76161:89::-;29258:13;:11;:13::i;:::-;76238:4:::1;76226:9;:16;;;;76161:89:::0;:::o;48753:120::-;48816:7;48843:22;48857:7;48843:13;:22::i;:::-;48836:29;;48753:120;;;:::o;48478:213::-;48541:7;48582:1;48565:19;;:5;:19;;;48561:89;;48635:1;48608:30;;;;;;;;;;;:::i;:::-;;;;;;;;48561:89;48667:9;:16;48677:5;48667:16;;;;;;;;;;;;;;;;48660:23;;48478:213;;;:::o;30047:103::-;29258:13;:11;:13::i;:::-;30112:30:::1;30139:1;30112:18;:30::i;:::-;30047:103::o:0;75819:114::-;29258:13;:11;:13::i;:::-;75916:9:::1;75897:16;;:28;;;;;;;;;;;;;;;;;;75819:114:::0;:::o;29372:87::-;29418:7;29445:6;;;;;;;;;;;29438:13;;29372:87;:::o;49100:95::-;49147:13;49180:7;49173:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49100:95;:::o;74188:38::-;;;;:::o;74307:47::-;;;;;;;;;;;;;;;;;:::o;75941:92::-;29258:13;:11;:13::i;:::-;76021:4:::1;76011:7;:14;;;;;;:::i;:::-;;75941:92:::0;:::o;50342:146::-;50428:52;50447:12;:10;:12::i;:::-;50461:8;50471;50428:18;:52::i;:::-;50342:146;;:::o;74679:263::-;74821:16;;;;;;;;;;;74807:30;;:10;:30;;;74799:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;74875:22;74885:2;74889:7;74875:9;:22::i;:::-;74908:26;74921:7;74930:3;74908:12;:26::i;:::-;74679:263;;;:::o;77344:119::-;29258:13;:11;:13::i;:::-;77450:5:::1;77423:24;;:32;;;;;;;;;;;;;;;;;;77344:119:::0;:::o;75661:150::-;75717:7;75736:9;75766:12;:18;75779:4;75766:18;;;;;;;;;;;;;;;;75748:15;75758:4;75748:9;:15::i;:::-;:36;;;;:::i;:::-;75736:48;;75802:1;75795:8;;;75661:150;;;:::o;51645:211::-;51759:31;51772:4;51778:2;51782:7;51759:12;:31::i;:::-;51801:47;51824:4;51830:2;51834:7;51843:4;51801:22;:47::i;:::-;51645:211;;;;:::o;77686:170::-;29258:13;:11;:13::i;:::-;77803:45:::1;77822:8;77832:15;77803:18;:45::i;:::-;77686:170:::0;;:::o;76727:196::-;76854:13;76892:23;76907:7;76892:14;:23::i;:::-;76885:30;;76727:196;;;:::o;74950:703::-;75033:4;75017:20;;:12;;;;;;;;;;;:20;;;75009:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;75091:14;:23;75106:7;75091:23;;;;;;;;;;;;;;;;;;;;;75090:24;75082:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;75152:18;75173:16;75181:7;75173;:16::i;:::-;75152:37;;75222:10;75208:24;;:10;:24;;;75200:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;75292:9;;75279;:22;;75271:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;75342:19;75376:9;;75364;:21;;;;:::i;:::-;75342:43;;75414:1;75400:11;:15;75396:89;;;75440:10;75432:28;;:41;75461:11;75432:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75396:89;75562:4;75536:14;:23;75551:7;75536:23;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;75577:12;:24;75590:10;75577:24;;;;;;;;;;;;;;;;:27;;;;;;;;;:::i;:::-;;;;;;75615:30;75628:7;75637;75615:30;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:30::i;:::-;74998:655;;74950:703;:::o;76258:104::-;29258:13;:11;:13::i;:::-;76344:10:::1;76329:12;;:25;;;;;;;;;;;;;;;;;;76258:104:::0;:::o;50559:155::-;50647:4;50671:18;:25;50690:5;50671:25;;;;;;;;;;;;;;;:35;50697:8;50671:35;;;;;;;;;;;;;;;;;;;;;;;;;50664:42;;50559:155;;;;:::o;30305:220::-;29258:13;:11;:13::i;:::-;30410:1:::1;30390:22;;:8;:22;;::::0;30386:93:::1;;30464:1;30436:31;;;;;;;;;;;:::i;:::-;;;;;;;;30386:93;30489:28;30508:8;30489:18;:28::i;:::-;30305:220:::0;:::o;74067:36::-;;;;;;;;;;;;;:::o;36920:215::-;37022:4;37061:26;37046:41;;;:11;:41;;;;:81;;;;37091:36;37115:11;37091:23;:36::i;:::-;37046:81;37039:88;;36920:215;;;:::o;63087:247::-;63150:7;63170:13;63186:17;63195:7;63186:8;:17::i;:::-;63170:33;;63235:1;63218:19;;:5;:19;;;63214:90;;63284:7;63261:31;;;;;;;;;;;:::i;:::-;;;;;;;;63214:90;63321:5;63314:12;;;63087:247;;;:::o;52618:129::-;52688:7;52715:15;:24;52731:7;52715:24;;;;;;;;;;;;;;;;;;;;;52708:31;;52618:129;;;:::o;27488:98::-;27541:7;27568:10;27561:17;;27488:98;:::o;61319:122::-;61400:33;61409:2;61413:7;61422:4;61428;61400:8;:33::i;:::-;61319:122;;;:::o;55580:824::-;55666:7;55686:12;55701:17;55710:7;55701:8;:17::i;:::-;55686:32;;55797:1;55781:18;;:4;:18;;;55777:88;;55816:37;55833:4;55839;55845:7;55816:16;:37::i;:::-;55777:88;55928:1;55912:18;;:4;:18;;;55908:263;;56030:48;56047:1;56051:7;56068:1;56072:5;56030:8;:48::i;:::-;56143:1;56124:9;:15;56134:4;56124:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;55908:263;56201:1;56187:16;;:2;:16;;;56183:111;;56266:1;56249:9;:13;56259:2;56249:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;56183:111;56325:2;56306:7;:16;56314:7;56306:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;56364:7;56360:2;56345:27;;56354:4;56345:27;;;;;;;;;;;;56392:4;56385:11;;;55580:824;;;;;:::o;37901:97::-;37959:6;37985:5;37978:12;;37901:97;:::o;29537:166::-;29608:12;:10;:12::i;:::-;29597:23;;:7;:5;:7::i;:::-;:23;;;29593:103;;29671:12;:10;:12::i;:::-;29644:40;;;;;;;;;;;:::i;:::-;;;;;;;;29593:103;29537:166::o;66514:170::-;66628:9;66606:10;:19;66617:7;66606:19;;;;;;;;;;;:31;;;;;;:::i;:::-;;66653:23;66668:7;66653:23;;;;;;:::i;:::-;;;;;;;;66514:170;;:::o;30685:191::-;30759:16;30778:6;;;;;;;;;;;30759:25;;30804:8;30795:6;;:17;;;;;;;;;;;;;;;;;;30859:8;30828:40;;30849:8;30828:40;;;;;;;;;;;;30748:128;30685:191;:::o;62526:318::-;62654:1;62634:22;;:8;:22;;;62630:93;;62702:8;62680:31;;;;;;;;;;;:::i;:::-;;;;;;;;62630:93;62771:8;62733:18;:25;62752:5;62733:25;;;;;;;;;;;;;;;:35;62759:8;62733:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;62817:8;62795:41;;62810:5;62795:41;;;62827:8;62795:41;;;;;;:::i;:::-;;;;;;;;62526:318;;;:::o;57438:102::-;57506:26;57516:2;57520:7;57506:26;;;;;;;;;;;;:9;:26::i;:::-;57438:102;;:::o;63884:799::-;64018:1;64001:2;:14;;;:18;63997:679;;;64056:2;64040:36;;;64077:12;:10;:12::i;:::-;64091:4;64097:7;64106:4;64040:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;64036:629;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64371:1;64354:6;:13;:18;64350:300;;64426:2;64404:25;;;;;;;;;;;:::i;:::-;;;;;;;;64350:300;64600:6;64594:13;64585:6;64581:2;64577:15;64570:38;64036:629;64169:41;;;64159:51;;;:6;:51;;;;64155:132;;64264:2;64242:25;;;;;;;;;;;:::i;:::-;;;;;;;;64155:132;64112:190;63997:679;63884:799;;;;:::o;38269:518::-;38364:19;38386:17;:15;:17::i;:::-;38364:39;;;;38433:11;38418:12;:26;;;38414:176;;;38552:12;38566:11;38523:55;;;;;;;;;;;;:::i;:::-;;;;;;;;38414:176;38624:1;38604:22;;:8;:22;;;38600:110;;38695:1;38650:48;;;;;;;;;;;:::i;:::-;;;;;;;;38600:110;38744:35;;;;;;;;38756:8;38744:35;;;;;;38766:12;38744:35;;;;;38722:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38353:434;38269:518;;:::o;65779:609::-;65852:13;65878:22;65892:7;65878:13;:22::i;:::-;;65913:23;65939:10;:19;65950:7;65939:19;;;;;;;;;;;65913:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65969:18;65990:10;:8;:10::i;:::-;65969:31;;66098:1;66082:4;66076:18;:23;66072:72;;66123:9;66116:16;;;;;;66072:72;66271:1;66251:9;66245:23;:27;66241:97;;;66310:4;66316:9;66296:30;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66289:37;;;;;;66241:97;66357:23;66372:7;66357:14;:23::i;:::-;66350:30;;;;65779:609;;;;:::o;65499:209::-;65601:4;65314:10;65307:18;;65625:35;;;:11;:35;;;;:75;;;;65664:36;65688:11;65664:23;:36::i;:::-;65625:75;65618:82;;65499:209;;;:::o;52380:117::-;52446:7;52473;:16;52481:7;52473:16;;;;;;;;;;;;;;;;;;;;;52466:23;;52380:117;;;:::o;61629:678::-;61791:9;:31;;;;61820:1;61804:18;;:4;:18;;;;61791:31;61787:471;;;61839:13;61855:22;61869:7;61855:13;:22::i;:::-;61839:38;;62024:1;62008:18;;:4;:18;;;;:35;;;;;62039:4;62030:13;;:5;:13;;;;62008:35;:69;;;;;62048:29;62065:5;62072:4;62048:16;:29::i;:::-;62047:30;62008:69;62004:144;;;62127:4;62105:27;;;;;;;;;;;:::i;:::-;;;;;;;;62004:144;62168:9;62164:83;;;62223:7;62219:2;62203:28;;62212:5;62203:28;;;;;;;;;;;;62164:83;61824:434;61787:471;62297:2;62270:15;:24;62286:7;62270:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;61629:678;;;;:::o;53787:376::-;53900:38;53914:5;53921:7;53930;53900:13;:38::i;:::-;53895:261;;53976:1;53959:19;;:5;:19;;;53955:190;;54029:7;54006:31;;;;;;;;;;;:::i;:::-;;;;;;;;53955:190;54112:7;54121;54085:44;;;;;;;;;;;;:::i;:::-;;;;;;;;53895:261;53787:376;;;:::o;57767:185::-;57862:18;57868:2;57872:7;57862:5;:18::i;:::-;57891:53;57922:1;57926:2;57930:7;57939:4;57891:22;:53::i;:::-;57767:185;;;:::o;49775:94::-;49826:13;49852:9;;;;;;;;;;;;;;49775:94;:::o;49266:260::-;49330:13;49356:22;49370:7;49356:13;:22::i;:::-;;49391:21;49415:10;:8;:10::i;:::-;49391:34;;49467:1;49449:7;49443:21;:25;:75;;;;;;;;;;;;;;;;;49485:7;49494:18;:7;:16;:18::i;:::-;49471:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49443:75;49436:82;;;49266:260;;;:::o;48109:305::-;48211:4;48263:25;48248:40;;;:11;:40;;;;:105;;;;48320:33;48305:48;;;:11;:48;;;;48248:105;:158;;;;48370:36;48394:11;48370:23;:36::i;:::-;48248:158;48228:178;;48109:305;;;:::o;53067:276::-;53170:4;53226:1;53207:21;;:7;:21;;;;:128;;;;;53255:7;53246:16;;:5;:16;;;:52;;;;53266:32;53283:5;53290:7;53266:16;:32::i;:::-;53246:52;:88;;;;53327:7;53302:32;;:21;53315:7;53302:12;:21::i;:::-;:32;;;53246:88;53207:128;53187:148;;53067:276;;;;;:::o;56740:335::-;56822:1;56808:16;;:2;:16;;;56804:89;;56878:1;56848:33;;;;;;;;;;;:::i;:::-;;;;;;;;56804:89;56903:21;56927:32;56935:2;56939:7;56956:1;56927:7;:32::i;:::-;56903:56;;56999:1;56974:27;;:13;:27;;;56970:98;;57053:1;57025:31;;;;;;;;;;;:::i;:::-;;;;;;;;56970:98;56793:282;56740:335;;:::o;24258:718::-;24314:13;24365:14;24402:1;24382:17;24393:5;24382:10;:17::i;:::-;:21;24365:38;;24418:20;24452:6;24441:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24418:41;;24474:11;24603:6;24599:2;24595:15;24587:6;24583:28;24576:35;;24640:290;24647:4;24640:290;;;24672:5;;;;;;;;24814:10;24809:2;24802:5;24798:14;24793:32;24788:3;24780:46;24872:2;24863:11;;;;;;:::i;:::-;;;;;24906:1;24897:5;:10;24640:290;24893:21;24640:290;24951:6;24944:13;;;;;24258:718;;;:::o;34692:148::-;34768:4;34807:25;34792:40;;;:11;:40;;;;34785:47;;34692:148;;;:::o;20662:948::-;20715:7;20735:14;20752:1;20735:18;;20802:8;20793:5;:17;20789:106;;20840:8;20831:17;;;;;;:::i;:::-;;;;;20877:2;20867:12;;;;20789:106;20922:8;20913:5;:17;20909:106;;20960:8;20951:17;;;;;;:::i;:::-;;;;;20997:2;20987:12;;;;20909:106;21042:8;21033:5;:17;21029:106;;21080:8;21071:17;;;;;;:::i;:::-;;;;;21117:2;21107:12;;;;21029:106;21162:7;21153:5;:16;21149:103;;21199:7;21190:16;;;;;;:::i;:::-;;;;;21235:1;21225:11;;;;21149:103;21279:7;21270:5;:16;21266:103;;21316:7;21307:16;;;;;;:::i;:::-;;;;;21352:1;21342:11;;;;21266:103;21396:7;21387:5;:16;21383:103;;21433:7;21424:16;;;;;;:::i;:::-;;;;;21469:1;21459:11;;;;21383:103;21513:7;21504:5;:16;21500:68;;21551:1;21541:11;;;;21500:68;21596:6;21589:13;;;20662:948;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:619::-;4967:6;4975;4983;5032:2;5020:9;5011:7;5007:23;5003:32;5000:119;;;5038:79;;:::i;:::-;5000:119;5158:1;5183:53;5228:7;5219:6;5208:9;5204:22;5183:53;:::i;:::-;5173:63;;5129:117;5285:2;5311:53;5356:7;5347:6;5336:9;5332:22;5311:53;:::i;:::-;5301:63;;5256:118;5413:2;5439:53;5484:7;5475:6;5464:9;5460:22;5439:53;:::i;:::-;5429:63;;5384:118;4890:619;;;;;:::o;5515:474::-;5583:6;5591;5640:2;5628:9;5619:7;5615:23;5611:32;5608:119;;;5646:79;;:::i;:::-;5608:119;5766:1;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5737:117;5893:2;5919:53;5964:7;5955:6;5944:9;5940:22;5919:53;:::i;:::-;5909:63;;5864:118;5515:474;;;;;:::o;5995:118::-;6082:24;6100:5;6082:24;:::i;:::-;6077:3;6070:37;5995:118;;:::o;6119:332::-;6240:4;6278:2;6267:9;6263:18;6255:26;;6291:71;6359:1;6348:9;6344:17;6335:6;6291:71;:::i;:::-;6372:72;6440:2;6429:9;6425:18;6416:6;6372:72;:::i;:::-;6119:332;;;;;:::o;6457:117::-;6566:1;6563;6556:12;6580:117;6689:1;6686;6679:12;6703:180;6751:77;6748:1;6741:88;6848:4;6845:1;6838:15;6872:4;6869:1;6862:15;6889:281;6972:27;6994:4;6972:27;:::i;:::-;6964:6;6960:40;7102:6;7090:10;7087:22;7066:18;7054:10;7051:34;7048:62;7045:88;;;7113:18;;:::i;:::-;7045:88;7153:10;7149:2;7142:22;6932:238;6889:281;;:::o;7176:129::-;7210:6;7237:20;;:::i;:::-;7227:30;;7266:33;7294:4;7286:6;7266:33;:::i;:::-;7176:129;;;:::o;7311:308::-;7373:4;7463:18;7455:6;7452:30;7449:56;;;7485:18;;:::i;:::-;7449:56;7523:29;7545:6;7523:29;:::i;:::-;7515:37;;7607:4;7601;7597:15;7589:23;;7311:308;;;:::o;7625:146::-;7722:6;7717:3;7712;7699:30;7763:1;7754:6;7749:3;7745:16;7738:27;7625:146;;;:::o;7777:425::-;7855:5;7880:66;7896:49;7938:6;7896:49;:::i;:::-;7880:66;:::i;:::-;7871:75;;7969:6;7962:5;7955:21;8007:4;8000:5;7996:16;8045:3;8036:6;8031:3;8027:16;8024:25;8021:112;;;8052:79;;:::i;:::-;8021:112;8142:54;8189:6;8184:3;8179;8142:54;:::i;:::-;7861:341;7777:425;;;;;:::o;8222:340::-;8278:5;8327:3;8320:4;8312:6;8308:17;8304:27;8294:122;;8335:79;;:::i;:::-;8294:122;8452:6;8439:20;8477:79;8552:3;8544:6;8537:4;8529:6;8525:17;8477:79;:::i;:::-;8468:88;;8284:278;8222:340;;;;:::o;8568:654::-;8646:6;8654;8703:2;8691:9;8682:7;8678:23;8674:32;8671:119;;;8709:79;;:::i;:::-;8671:119;8829:1;8854:53;8899:7;8890:6;8879:9;8875:22;8854:53;:::i;:::-;8844:63;;8800:117;8984:2;8973:9;8969:18;8956:32;9015:18;9007:6;9004:30;9001:117;;;9037:79;;:::i;:::-;9001:117;9142:63;9197:7;9188:6;9177:9;9173:22;9142:63;:::i;:::-;9132:73;;8927:288;8568:654;;;;;:::o;9228:329::-;9287:6;9336:2;9324:9;9315:7;9311:23;9307:32;9304:119;;;9342:79;;:::i;:::-;9304:119;9462:1;9487:53;9532:7;9523:6;9512:9;9508:22;9487:53;:::i;:::-;9477:63;;9433:117;9228:329;;;;:::o;9563:222::-;9656:4;9694:2;9683:9;9679:18;9671:26;;9707:71;9775:1;9764:9;9760:17;9751:6;9707:71;:::i;:::-;9563:222;;;;:::o;9791:509::-;9860:6;9909:2;9897:9;9888:7;9884:23;9880:32;9877:119;;;9915:79;;:::i;:::-;9877:119;10063:1;10052:9;10048:17;10035:31;10093:18;10085:6;10082:30;10079:117;;;10115:79;;:::i;:::-;10079:117;10220:63;10275:7;10266:6;10255:9;10251:22;10220:63;:::i;:::-;10210:73;;10006:287;9791:509;;;;:::o;10306:116::-;10376:21;10391:5;10376:21;:::i;:::-;10369:5;10366:32;10356:60;;10412:1;10409;10402:12;10356:60;10306:116;:::o;10428:133::-;10471:5;10509:6;10496:20;10487:29;;10525:30;10549:5;10525:30;:::i;:::-;10428:133;;;;:::o;10567:468::-;10632:6;10640;10689:2;10677:9;10668:7;10664:23;10660:32;10657:119;;;10695:79;;:::i;:::-;10657:119;10815:1;10840:53;10885:7;10876:6;10865:9;10861:22;10840:53;:::i;:::-;10830:63;;10786:117;10942:2;10968:50;11010:7;11001:6;10990:9;10986:22;10968:50;:::i;:::-;10958:60;;10913:115;10567:468;;;;;:::o;11041:799::-;11128:6;11136;11144;11193:2;11181:9;11172:7;11168:23;11164:32;11161:119;;;11199:79;;:::i;:::-;11161:119;11319:1;11344:53;11389:7;11380:6;11369:9;11365:22;11344:53;:::i;:::-;11334:63;;11290:117;11446:2;11472:53;11517:7;11508:6;11497:9;11493:22;11472:53;:::i;:::-;11462:63;;11417:118;11602:2;11591:9;11587:18;11574:32;11633:18;11625:6;11622:30;11619:117;;;11655:79;;:::i;:::-;11619:117;11760:63;11815:7;11806:6;11795:9;11791:22;11760:63;:::i;:::-;11750:73;;11545:288;11041:799;;;;;:::o;11846:323::-;11902:6;11951:2;11939:9;11930:7;11926:23;11922:32;11919:119;;;11957:79;;:::i;:::-;11919:119;12077:1;12102:50;12144:7;12135:6;12124:9;12120:22;12102:50;:::i;:::-;12092:60;;12048:114;11846:323;;;;:::o;12175:307::-;12236:4;12326:18;12318:6;12315:30;12312:56;;;12348:18;;:::i;:::-;12312:56;12386:29;12408:6;12386:29;:::i;:::-;12378:37;;12470:4;12464;12460:15;12452:23;;12175:307;;;:::o;12488:423::-;12565:5;12590:65;12606:48;12647:6;12606:48;:::i;:::-;12590:65;:::i;:::-;12581:74;;12678:6;12671:5;12664:21;12716:4;12709:5;12705:16;12754:3;12745:6;12740:3;12736:16;12733:25;12730:112;;;12761:79;;:::i;:::-;12730:112;12851:54;12898:6;12893:3;12888;12851:54;:::i;:::-;12571:340;12488:423;;;;;:::o;12930:338::-;12985:5;13034:3;13027:4;13019:6;13015:17;13011:27;13001:122;;13042:79;;:::i;:::-;13001:122;13159:6;13146:20;13184:78;13258:3;13250:6;13243:4;13235:6;13231:17;13184:78;:::i;:::-;13175:87;;12991:277;12930:338;;;;:::o;13274:943::-;13369:6;13377;13385;13393;13442:3;13430:9;13421:7;13417:23;13413:33;13410:120;;;13449:79;;:::i;:::-;13410:120;13569:1;13594:53;13639:7;13630:6;13619:9;13615:22;13594:53;:::i;:::-;13584:63;;13540:117;13696:2;13722:53;13767:7;13758:6;13747:9;13743:22;13722:53;:::i;:::-;13712:63;;13667:118;13824:2;13850:53;13895:7;13886:6;13875:9;13871:22;13850:53;:::i;:::-;13840:63;;13795:118;13980:2;13969:9;13965:18;13952:32;14011:18;14003:6;14000:30;13997:117;;;14033:79;;:::i;:::-;13997:117;14138:62;14192:7;14183:6;14172:9;14168:22;14138:62;:::i;:::-;14128:72;;13923:287;13274:943;;;;;;;:::o;14223:109::-;14259:7;14299:26;14292:5;14288:38;14277:49;;14223:109;;;:::o;14338:120::-;14410:23;14427:5;14410:23;:::i;:::-;14403:5;14400:34;14390:62;;14448:1;14445;14438:12;14390:62;14338:120;:::o;14464:137::-;14509:5;14547:6;14534:20;14525:29;;14563:32;14589:5;14563:32;:::i;:::-;14464:137;;;;:::o;14607:472::-;14674:6;14682;14731:2;14719:9;14710:7;14706:23;14702:32;14699:119;;;14737:79;;:::i;:::-;14699:119;14857:1;14882:53;14927:7;14918:6;14907:9;14903:22;14882:53;:::i;:::-;14872:63;;14828:117;14984:2;15010:52;15054:7;15045:6;15034:9;15030:22;15010:52;:::i;:::-;15000:62;;14955:117;14607:472;;;;;:::o;15085:474::-;15153:6;15161;15210:2;15198:9;15189:7;15185:23;15181:32;15178:119;;;15216:79;;:::i;:::-;15178:119;15336:1;15361:53;15406:7;15397:6;15386:9;15382:22;15361:53;:::i;:::-;15351:63;;15307:117;15463:2;15489:53;15534:7;15525:6;15514:9;15510:22;15489:53;:::i;:::-;15479:63;;15434:118;15085:474;;;;;:::o;15565:180::-;15613:77;15610:1;15603:88;15710:4;15707:1;15700:15;15734:4;15731:1;15724:15;15751:320;15795:6;15832:1;15826:4;15822:12;15812:22;;15879:1;15873:4;15869:12;15900:18;15890:81;;15956:4;15948:6;15944:17;15934:27;;15890:81;16018:2;16010:6;16007:14;15987:18;15984:38;15981:84;;16037:18;;:::i;:::-;15981:84;15802:269;15751:320;;;:::o;16077:442::-;16226:4;16264:2;16253:9;16249:18;16241:26;;16277:71;16345:1;16334:9;16330:17;16321:6;16277:71;:::i;:::-;16358:72;16426:2;16415:9;16411:18;16402:6;16358:72;:::i;:::-;16440;16508:2;16497:9;16493:18;16484:6;16440:72;:::i;:::-;16077:442;;;;;;:::o;16525:180::-;16573:77;16570:1;16563:88;16670:4;16667:1;16660:15;16694:4;16691:1;16684:15;16711:410;16751:7;16774:20;16792:1;16774:20;:::i;:::-;16769:25;;16808:20;16826:1;16808:20;:::i;:::-;16803:25;;16863:1;16860;16856:9;16885:30;16903:11;16885:30;:::i;:::-;16874:41;;17064:1;17055:7;17051:15;17048:1;17045:22;17025:1;17018:9;16998:83;16975:139;;17094:18;;:::i;:::-;16975:139;16759:362;16711:410;;;;:::o;17127:180::-;17175:77;17172:1;17165:88;17272:4;17269:1;17262:15;17296:4;17293:1;17286:15;17313:185;17353:1;17370:20;17388:1;17370:20;:::i;:::-;17365:25;;17404:20;17422:1;17404:20;:::i;:::-;17399:25;;17443:1;17433:35;;17448:18;;:::i;:::-;17433:35;17490:1;17487;17483:9;17478:14;;17313:185;;;;:::o;17504:147::-;17605:11;17642:3;17627:18;;17504:147;;;;:::o;17657:114::-;;:::o;17777:398::-;17936:3;17957:83;18038:1;18033:3;17957:83;:::i;:::-;17950:90;;18049:93;18138:3;18049:93;:::i;:::-;18167:1;18162:3;18158:11;18151:18;;17777:398;;;:::o;18181:379::-;18365:3;18387:147;18530:3;18387:147;:::i;:::-;18380:154;;18551:3;18544:10;;18181:379;;;:::o;18566:141::-;18615:4;18638:3;18630:11;;18661:3;18658:1;18651:14;18695:4;18692:1;18682:18;18674:26;;18566:141;;;:::o;18713:93::-;18750:6;18797:2;18792;18785:5;18781:14;18777:23;18767:33;;18713:93;;;:::o;18812:107::-;18856:8;18906:5;18900:4;18896:16;18875:37;;18812:107;;;;:::o;18925:393::-;18994:6;19044:1;19032:10;19028:18;19067:97;19097:66;19086:9;19067:97;:::i;:::-;19185:39;19215:8;19204:9;19185:39;:::i;:::-;19173:51;;19257:4;19253:9;19246:5;19242:21;19233:30;;19306:4;19296:8;19292:19;19285:5;19282:30;19272:40;;19001:317;;18925:393;;;;;:::o;19324:60::-;19352:3;19373:5;19366:12;;19324:60;;;:::o;19390:142::-;19440:9;19473:53;19491:34;19500:24;19518:5;19500:24;:::i;:::-;19491:34;:::i;:::-;19473:53;:::i;:::-;19460:66;;19390:142;;;:::o;19538:75::-;19581:3;19602:5;19595:12;;19538:75;;;:::o;19619:269::-;19729:39;19760:7;19729:39;:::i;:::-;19790:91;19839:41;19863:16;19839:41;:::i;:::-;19831:6;19824:4;19818:11;19790:91;:::i;:::-;19784:4;19777:105;19695:193;19619:269;;;:::o;19894:73::-;19939:3;19894:73;:::o;19973:189::-;20050:32;;:::i;:::-;20091:65;20149:6;20141;20135:4;20091:65;:::i;:::-;20026:136;19973:189;;:::o;20168:186::-;20228:120;20245:3;20238:5;20235:14;20228:120;;;20299:39;20336:1;20329:5;20299:39;:::i;:::-;20272:1;20265:5;20261:13;20252:22;;20228:120;;;20168:186;;:::o;20360:543::-;20461:2;20456:3;20453:11;20450:446;;;20495:38;20527:5;20495:38;:::i;:::-;20579:29;20597:10;20579:29;:::i;:::-;20569:8;20565:44;20762:2;20750:10;20747:18;20744:49;;;20783:8;20768:23;;20744:49;20806:80;20862:22;20880:3;20862:22;:::i;:::-;20852:8;20848:37;20835:11;20806:80;:::i;:::-;20465:431;;20450:446;20360:543;;;:::o;20909:117::-;20963:8;21013:5;21007:4;21003:16;20982:37;;20909:117;;;;:::o;21032:169::-;21076:6;21109:51;21157:1;21153:6;21145:5;21142:1;21138:13;21109:51;:::i;:::-;21105:56;21190:4;21184;21180:15;21170:25;;21083:118;21032:169;;;;:::o;21206:295::-;21282:4;21428:29;21453:3;21447:4;21428:29;:::i;:::-;21420:37;;21490:3;21487:1;21483:11;21477:4;21474:21;21466:29;;21206:295;;;;:::o;21506:1395::-;21623:37;21656:3;21623:37;:::i;:::-;21725:18;21717:6;21714:30;21711:56;;;21747:18;;:::i;:::-;21711:56;21791:38;21823:4;21817:11;21791:38;:::i;:::-;21876:67;21936:6;21928;21922:4;21876:67;:::i;:::-;21970:1;21994:4;21981:17;;22026:2;22018:6;22015:14;22043:1;22038:618;;;;22700:1;22717:6;22714:77;;;22766:9;22761:3;22757:19;22751:26;22742:35;;22714:77;22817:67;22877:6;22870:5;22817:67;:::i;:::-;22811:4;22804:81;22673:222;22008:887;;22038:618;22090:4;22086:9;22078:6;22074:22;22124:37;22156:4;22124:37;:::i;:::-;22183:1;22197:208;22211:7;22208:1;22205:14;22197:208;;;22290:9;22285:3;22281:19;22275:26;22267:6;22260:42;22341:1;22333:6;22329:14;22319:24;;22388:2;22377:9;22373:18;22360:31;;22234:4;22231:1;22227:12;22222:17;;22197:208;;;22433:6;22424:7;22421:19;22418:179;;;22491:9;22486:3;22482:19;22476:26;22534:48;22576:4;22568:6;22564:17;22553:9;22534:48;:::i;:::-;22526:6;22519:64;22441:156;22418:179;22643:1;22639;22631:6;22627:14;22623:22;22617:4;22610:36;22045:611;;;22008:887;;21598:1303;;;21506:1395;;:::o;22907:172::-;23047:24;23043:1;23035:6;23031:14;23024:48;22907:172;:::o;23085:366::-;23227:3;23248:67;23312:2;23307:3;23248:67;:::i;:::-;23241:74;;23324:93;23413:3;23324:93;:::i;:::-;23442:2;23437:3;23433:12;23426:19;;23085:366;;;:::o;23457:419::-;23623:4;23661:2;23650:9;23646:18;23638:26;;23710:9;23704:4;23700:20;23696:1;23685:9;23681:17;23674:47;23738:131;23864:4;23738:131;:::i;:::-;23730:139;;23457:419;;;:::o;23882:194::-;23922:4;23942:20;23960:1;23942:20;:::i;:::-;23937:25;;23976:20;23994:1;23976:20;:::i;:::-;23971:25;;24020:1;24017;24013:9;24005:17;;24044:1;24038:4;24035:11;24032:37;;;24049:18;;:::i;:::-;24032:37;23882:194;;;;:::o;24082:179::-;24222:31;24218:1;24210:6;24206:14;24199:55;24082:179;:::o;24267:366::-;24409:3;24430:67;24494:2;24489:3;24430:67;:::i;:::-;24423:74;;24506:93;24595:3;24506:93;:::i;:::-;24624:2;24619:3;24615:12;24608:19;;24267:366;;;:::o;24639:419::-;24805:4;24843:2;24832:9;24828:18;24820:26;;24892:9;24886:4;24882:20;24878:1;24867:9;24863:17;24856:47;24920:131;25046:4;24920:131;:::i;:::-;24912:139;;24639:419;;;:::o;25064:172::-;25204:24;25200:1;25192:6;25188:14;25181:48;25064:172;:::o;25242:366::-;25384:3;25405:67;25469:2;25464:3;25405:67;:::i;:::-;25398:74;;25481:93;25570:3;25481:93;:::i;:::-;25599:2;25594:3;25590:12;25583:19;;25242:366;;;:::o;25614:419::-;25780:4;25818:2;25807:9;25803:18;25795:26;;25867:9;25861:4;25857:20;25853:1;25842:9;25838:17;25831:47;25895:131;26021:4;25895:131;:::i;:::-;25887:139;;25614:419;;;:::o;26039:171::-;26179:23;26175:1;26167:6;26163:14;26156:47;26039:171;:::o;26216:366::-;26358:3;26379:67;26443:2;26438:3;26379:67;:::i;:::-;26372:74;;26455:93;26544:3;26455:93;:::i;:::-;26573:2;26568:3;26564:12;26557:19;;26216:366;;;:::o;26588:419::-;26754:4;26792:2;26781:9;26777:18;26769:26;;26841:9;26835:4;26831:20;26827:1;26816:9;26812:17;26805:47;26869:131;26995:4;26869:131;:::i;:::-;26861:139;;26588:419;;;:::o;27013:173::-;27153:25;27149:1;27141:6;27137:14;27130:49;27013:173;:::o;27192:366::-;27334:3;27355:67;27419:2;27414:3;27355:67;:::i;:::-;27348:74;;27431:93;27520:3;27431:93;:::i;:::-;27549:2;27544:3;27540:12;27533:19;;27192:366;;;:::o;27564:419::-;27730:4;27768:2;27757:9;27753:18;27745:26;;27817:9;27811:4;27807:20;27803:1;27792:9;27788:17;27781:47;27845:131;27971:4;27845:131;:::i;:::-;27837:139;;27564:419;;;:::o;27989:233::-;28028:3;28051:24;28069:5;28051:24;:::i;:::-;28042:33;;28097:66;28090:5;28087:77;28084:103;;28167:18;;:::i;:::-;28084:103;28214:1;28207:5;28203:13;28196:20;;27989:233;;;:::o;28228:98::-;28279:6;28313:5;28307:12;28297:22;;28228:98;;;:::o;28332:168::-;28415:11;28449:6;28444:3;28437:19;28489:4;28484:3;28480:14;28465:29;;28332:168;;;;:::o;28506:373::-;28592:3;28620:38;28652:5;28620:38;:::i;:::-;28674:70;28737:6;28732:3;28674:70;:::i;:::-;28667:77;;28753:65;28811:6;28806:3;28799:4;28792:5;28788:16;28753:65;:::i;:::-;28843:29;28865:6;28843:29;:::i;:::-;28838:3;28834:39;28827:46;;28596:283;28506:373;;;;:::o;28885:640::-;29080:4;29118:3;29107:9;29103:19;29095:27;;29132:71;29200:1;29189:9;29185:17;29176:6;29132:71;:::i;:::-;29213:72;29281:2;29270:9;29266:18;29257:6;29213:72;:::i;:::-;29295;29363:2;29352:9;29348:18;29339:6;29295:72;:::i;:::-;29414:9;29408:4;29404:20;29399:2;29388:9;29384:18;29377:48;29442:76;29513:4;29504:6;29442:76;:::i;:::-;29434:84;;28885:640;;;;;;;:::o;29531:141::-;29587:5;29618:6;29612:13;29603:22;;29634:32;29660:5;29634:32;:::i;:::-;29531:141;;;;:::o;29678:349::-;29747:6;29796:2;29784:9;29775:7;29771:23;29767:32;29764:119;;;29802:79;;:::i;:::-;29764:119;29922:1;29947:63;30002:7;29993:6;29982:9;29978:22;29947:63;:::i;:::-;29937:73;;29893:127;29678:349;;;;:::o;30033:140::-;30082:9;30115:52;30133:33;30142:23;30159:5;30142:23;:::i;:::-;30133:33;:::i;:::-;30115:52;:::i;:::-;30102:65;;30033:140;;;:::o;30179:129::-;30265:36;30295:5;30265:36;:::i;:::-;30260:3;30253:49;30179:129;;:::o;30314:330::-;30434:4;30472:2;30461:9;30457:18;30449:26;;30485:70;30552:1;30541:9;30537:17;30528:6;30485:70;:::i;:::-;30565:72;30633:2;30622:9;30618:18;30609:6;30565:72;:::i;:::-;30314:330;;;;;:::o;30650:148::-;30752:11;30789:3;30774:18;;30650:148;;;;:::o;30804:390::-;30910:3;30938:39;30971:5;30938:39;:::i;:::-;30993:89;31075:6;31070:3;30993:89;:::i;:::-;30986:96;;31091:65;31149:6;31144:3;31137:4;31130:5;31126:16;31091:65;:::i;:::-;31181:6;31176:3;31172:16;31165:23;;30914:280;30804:390;;;;:::o;31200:435::-;31380:3;31402:95;31493:3;31484:6;31402:95;:::i;:::-;31395:102;;31514:95;31605:3;31596:6;31514:95;:::i;:::-;31507:102;;31626:3;31619:10;;31200:435;;;;;:::o
Swarm Source
ipfs://53bed7642abcf7b065bcaae8ea87e2cf991960d995160f376120d91c487d1fed
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.