Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Loading...
Loading
Contract Name:
FlowerPower
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-02-02 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/[email protected]/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/[email protected]/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/[email protected]/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/[email protected]/utils/Address.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/[email protected]/utils/Context.sol // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File: @openzeppelin/[email protected]/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // 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. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 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 + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // File: @openzeppelin/[email protected]/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @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/[email protected]/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(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) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/[email protected]/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/[email protected]/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being 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`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } } // File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/[email protected]/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. 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 { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/[email protected]/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: flowerpower.sol pragma solidity ^0.8.0; contract FlowerPower is ERC721Enumerable, Ownable, Pausable { using Strings for uint256; string private baseURI; // Events for Mint and Burn actions event Mint(address indexed to, uint256 tokenId); event Burn(address indexed owner, uint256 tokenId); constructor(string memory baseURI_) ERC721("FlowerPower", "POWER") { baseURI = baseURI_; } /** * @dev Mint a FlowerPower NFT to a specified address. * Can only be called by the contract owner. * Minting is disabled when the contract is paused. */ function mint(address to) external onlyOwner whenNotPaused { uint256 tokenId = totalSupply() + 1; // Token ID starts at 1 _safeMint(to, tokenId); emit Mint(to, tokenId); // Emit mint event } /** * @dev Burn a FlowerPower NFT. Only the token owner can burn it. * Burning is disabled when the contract is paused. */ function burn(uint256 tokenId) external whenNotPaused { require(ownerOf(tokenId) == msg.sender, "You do not own this NFT"); _burn(tokenId); emit Burn(msg.sender, tokenId); // Emit burn event } /** * @dev Set a new base URI for metadata. * Can only be called by the contract owner. */ function setBaseURI(string memory newBaseURI) external onlyOwner { baseURI = newBaseURI; } /** * @dev Internal function to return base URI. */ function _baseURI() internal view override returns (string memory) { return baseURI; } /** * @dev Override tokenURI to return metadata URL. */ function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "Token does not exist"); return string(abi.encodePacked(baseURI, "/", tokenId.toString(), ".json")); } /** * @dev Admin function to pause the contract. * Pausing prevents minting and burning. */ function pause() external onlyOwner { _pause(); } /** * @dev Admin function to unpause the contract. */ function unpause() external onlyOwner { _unpause(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620043d9380380620043d983398181016040528101906200003791906200037e565b6040518060400160405280600b81526020017f466c6f776572506f7765720000000000000000000000000000000000000000008152506040518060400160405280600581526020017f504f5745520000000000000000000000000000000000000000000000000000008152508160009081620000b491906200061a565b508060019081620000c691906200061a565b505050620000e9620000dd6200011d60201b60201c565b6200012560201b60201c565b6000600a60146101000a81548160ff02191690831515021790555080600b90816200011591906200061a565b505062000701565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620002548262000209565b810181811067ffffffffffffffff821117156200027657620002756200021a565b5b80604052505050565b60006200028b620001eb565b905062000299828262000249565b919050565b600067ffffffffffffffff821115620002bc57620002bb6200021a565b5b620002c78262000209565b9050602081019050919050565b60005b83811015620002f4578082015181840152602081019050620002d7565b60008484015250505050565b60006200031762000311846200029e565b6200027f565b90508281526020810184848401111562000336576200033562000204565b5b62000343848285620002d4565b509392505050565b600082601f830112620003635762000362620001ff565b5b81516200037584826020860162000300565b91505092915050565b600060208284031215620003975762000396620001f5565b5b600082015167ffffffffffffffff811115620003b857620003b7620001fa565b5b620003c6848285016200034b565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200042257607f821691505b602082108103620004385762000437620003da565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000463565b620004ae868362000463565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004fb620004f5620004ef84620004c6565b620004d0565b620004c6565b9050919050565b6000819050919050565b6200051783620004da565b6200052f620005268262000502565b84845462000470565b825550505050565b600090565b6200054662000537565b620005538184846200050c565b505050565b5b818110156200057b576200056f6000826200053c565b60018101905062000559565b5050565b601f821115620005ca5762000594816200043e565b6200059f8462000453565b81016020851015620005af578190505b620005c7620005be8562000453565b83018262000558565b50505b505050565b600082821c905092915050565b6000620005ef60001984600802620005cf565b1980831691505092915050565b60006200060a8383620005dc565b9150826002028217905092915050565b6200062582620003cf565b67ffffffffffffffff8111156200064157620006406200021a565b5b6200064d825462000409565b6200065a8282856200057f565b600060209050601f8311600181146200069257600084156200067d578287015190505b620006898582620005fc565b865550620006f9565b601f198416620006a2866200043e565b60005b82811015620006cc57848901518255600182019150602085019450602081019050620006a5565b86831015620006ec5784890151620006e8601f891682620005dc565b8355505b6001600288020188555050505b505050505050565b613cc880620007116000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80635c975abb116100de5780638da5cb5b11610097578063b88d4fde11610071578063b88d4fde14610410578063c87b56dd1461042c578063e985e9c51461045c578063f2fde38b1461048c57610173565b80638da5cb5b146103b857806395d89b41146103d6578063a22cb465146103f457610173565b80635c975abb1461030a5780636352211e146103285780636a6278421461035857806370a0823114610374578063715018a6146103a45780638456cb59146103ae57610173565b80632f745c59116101305780632f745c591461024c5780633f4ba83a1461027c57806342842e0e1461028657806342966c68146102a25780634f6ccce7146102be57806355f804b3146102ee57610173565b806301ffc9a71461017857806306fdde03146101a8578063081812fc146101c6578063095ea7b3146101f657806318160ddd1461021257806323b872dd14610230575b600080fd5b610192600480360381019061018d91906125d2565b6104a8565b60405161019f919061261a565b60405180910390f35b6101b0610522565b6040516101bd91906126c5565b60405180910390f35b6101e060048036038101906101db919061271d565b6105b4565b6040516101ed919061278b565b60405180910390f35b610210600480360381019061020b91906127d2565b6105fa565b005b61021a610711565b6040516102279190612821565b60405180910390f35b61024a6004803603810190610245919061283c565b61071e565b005b610266600480360381019061026191906127d2565b61077e565b6040516102739190612821565b60405180910390f35b610284610823565b005b6102a0600480360381019061029b919061283c565b610835565b005b6102bc60048036038101906102b7919061271d565b610855565b005b6102d860048036038101906102d3919061271d565b61092d565b6040516102e59190612821565b60405180910390f35b610308600480360381019061030391906129c4565b61099e565b005b6103126109b9565b60405161031f919061261a565b60405180910390f35b610342600480360381019061033d919061271d565b6109d0565b60405161034f919061278b565b60405180910390f35b610372600480360381019061036d9190612a0d565b610a56565b005b61038e60048036038101906103899190612a0d565b610ada565b60405161039b9190612821565b60405180910390f35b6103ac610b91565b005b6103b6610ba5565b005b6103c0610bb7565b6040516103cd919061278b565b60405180910390f35b6103de610be1565b6040516103eb91906126c5565b60405180910390f35b61040e60048036038101906104099190612a66565b610c73565b005b61042a60048036038101906104259190612b47565b610c89565b005b6104466004803603810190610441919061271d565b610ceb565b60405161045391906126c5565b60405180910390f35b61047660048036038101906104719190612bca565b610d67565b604051610483919061261a565b60405180910390f35b6104a660048036038101906104a19190612a0d565b610dfb565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061051b575061051a82610e7e565b5b9050919050565b60606000805461053190612c39565b80601f016020809104026020016040519081016040528092919081815260200182805461055d90612c39565b80156105aa5780601f1061057f576101008083540402835291602001916105aa565b820191906000526020600020905b81548152906001019060200180831161058d57829003601f168201915b5050505050905090565b60006105bf82610f60565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610605826109d0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610675576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066c90612cdc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610694610fab565b73ffffffffffffffffffffffffffffffffffffffff1614806106c357506106c2816106bd610fab565b610d67565b5b610702576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f990612d6e565b60405180910390fd5b61070c8383610fb3565b505050565b6000600880549050905090565b61072f610729610fab565b8261106c565b61076e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076590612e00565b60405180910390fd5b610779838383611101565b505050565b600061078983610ada565b82106107ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c190612e92565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61082b6113fa565b610833611478565b565b61085083838360405180602001604052806000815250610c89565b505050565b61085d6114db565b3373ffffffffffffffffffffffffffffffffffffffff1661087d826109d0565b73ffffffffffffffffffffffffffffffffffffffff16146108d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90612efe565b60405180910390fd5b6108dc81611525565b3373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516109229190612821565b60405180910390a250565b6000610937610711565b8210610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096f90612f90565b60405180910390fd5b6008828154811061098c5761098b612fb0565b5b90600052602060002001549050919050565b6109a66113fa565b80600b90816109b5919061318b565b5050565b6000600a60149054906101000a900460ff16905090565b6000806109dc83611673565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a44906132a9565b60405180910390fd5b80915050919050565b610a5e6113fa565b610a666114db565b60006001610a72610711565b610a7c91906132f8565b9050610a8882826116b0565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688582604051610ace9190612821565b60405180910390a25050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b419061339e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b996113fa565b610ba360006116ce565b565b610bad6113fa565b610bb5611794565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610bf090612c39565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1c90612c39565b8015610c695780601f10610c3e57610100808354040283529160200191610c69565b820191906000526020600020905b815481529060010190602001808311610c4c57829003601f168201915b5050505050905090565b610c85610c7e610fab565b83836117f7565b5050565b610c9a610c94610fab565b8361106c565b610cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd090612e00565b60405180910390fd5b610ce584848484611963565b50505050565b6060610cf6826119bf565b610d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2c9061340a565b60405180910390fd5b600b610d4083611a00565b604051602001610d51929190613581565b6040516020818303038152906040529050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610e036113fa565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e699061362d565b60405180910390fd5b610e7b816116ce565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610f4957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610f595750610f5882611ace565b5b9050919050565b610f69816119bf565b610fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9f906132a9565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611026836109d0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611078836109d0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806110ba57506110b98185610d67565b5b806110f857508373ffffffffffffffffffffffffffffffffffffffff166110e0846105b4565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611121826109d0565b73ffffffffffffffffffffffffffffffffffffffff1614611177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116e906136bf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dd90613751565b60405180910390fd5b6111f38383836001611b38565b8273ffffffffffffffffffffffffffffffffffffffff16611213826109d0565b73ffffffffffffffffffffffffffffffffffffffff1614611269576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611260906136bf565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113f58383836001611c96565b505050565b611402610fab565b73ffffffffffffffffffffffffffffffffffffffff16611420610bb7565b73ffffffffffffffffffffffffffffffffffffffff1614611476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146d906137bd565b60405180910390fd5b565b611480611c9c565b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6114c4610fab565b6040516114d1919061278b565b60405180910390a1565b6114e36109b9565b15611523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151a90613829565b60405180910390fd5b565b6000611530826109d0565b9050611540816000846001611b38565b611549826109d0565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461166f816000846001611c96565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6116ca828260405180602001604052806000815250611ce5565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61179c6114db565b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586117e0610fab565b6040516117ed919061278b565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c90613895565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611956919061261a565b60405180910390a3505050565b61196e848484611101565b61197a84848484611d40565b6119b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b090613927565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166119e183611673565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060006001611a0f84611ec7565b01905060008167ffffffffffffffff811115611a2e57611a2d612899565b5b6040519080825280601f01601f191660200182016040528015611a605781602001600182028036833780820191505090505b509050600082602001820190505b600115611ac3578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611ab757611ab6613947565b5b04945060008503611a6e575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611b448484848461201a565b6001811115611b88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7f906139e8565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611bcf57611bca81612020565b611c0e565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614611c0d57611c0c8582612069565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611c5057611c4b816121d6565b611c8f565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611c8e57611c8d84826122a7565b5b5b5050505050565b50505050565b611ca46109b9565b611ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cda90613a54565b60405180910390fd5b565b611cef8383612326565b611cfc6000848484611d40565b611d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3290613927565b60405180910390fd5b505050565b6000611d618473ffffffffffffffffffffffffffffffffffffffff16612543565b15611eba578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d8a610fab565b8786866040518563ffffffff1660e01b8152600401611dac9493929190613ac9565b6020604051808303816000875af1925050508015611de857506040513d601f19601f82011682018060405250810190611de59190613b2a565b60015b611e6a573d8060008114611e18576040519150601f19603f3d011682016040523d82523d6000602084013e611e1d565b606091505b506000815103611e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5990613927565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611ebf565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611f25577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611f1b57611f1a613947565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611f62576d04ee2d6d415b85acef81000000008381611f5857611f57613947565b5b0492506020810190505b662386f26fc100008310611f9157662386f26fc100008381611f8757611f86613947565b5b0492506010810190505b6305f5e1008310611fba576305f5e1008381611fb057611faf613947565b5b0492506008810190505b6127108310611fdf576127108381611fd557611fd4613947565b5b0492506004810190505b606483106120025760648381611ff857611ff7613947565b5b0492506002810190505b600a8310612011576001810190505b80915050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161207684610ada565b6120809190613b57565b9050600060076000848152602001908152602001600020549050818114612165576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506121ea9190613b57565b905060006009600084815260200190815260200160002054905060006008838154811061221a57612219612fb0565b5b90600052602060002001549050806008838154811061223c5761223b612fb0565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061228b5761228a613b8b565b5b6001900381819060005260206000200160009055905550505050565b60006122b283610ada565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238c90613c06565b60405180910390fd5b61239e816119bf565b156123de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d590613c72565b60405180910390fd5b6123ec600083836001611b38565b6123f5816119bf565b15612435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242c90613c72565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461253f600083836001611c96565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6125af8161257a565b81146125ba57600080fd5b50565b6000813590506125cc816125a6565b92915050565b6000602082840312156125e8576125e7612570565b5b60006125f6848285016125bd565b91505092915050565b60008115159050919050565b612614816125ff565b82525050565b600060208201905061262f600083018461260b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561266f578082015181840152602081019050612654565b60008484015250505050565b6000601f19601f8301169050919050565b600061269782612635565b6126a18185612640565b93506126b1818560208601612651565b6126ba8161267b565b840191505092915050565b600060208201905081810360008301526126df818461268c565b905092915050565b6000819050919050565b6126fa816126e7565b811461270557600080fd5b50565b600081359050612717816126f1565b92915050565b60006020828403121561273357612732612570565b5b600061274184828501612708565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127758261274a565b9050919050565b6127858161276a565b82525050565b60006020820190506127a0600083018461277c565b92915050565b6127af8161276a565b81146127ba57600080fd5b50565b6000813590506127cc816127a6565b92915050565b600080604083850312156127e9576127e8612570565b5b60006127f7858286016127bd565b925050602061280885828601612708565b9150509250929050565b61281b816126e7565b82525050565b60006020820190506128366000830184612812565b92915050565b60008060006060848603121561285557612854612570565b5b6000612863868287016127bd565b9350506020612874868287016127bd565b925050604061288586828701612708565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6128d18261267b565b810181811067ffffffffffffffff821117156128f0576128ef612899565b5b80604052505050565b6000612903612566565b905061290f82826128c8565b919050565b600067ffffffffffffffff82111561292f5761292e612899565b5b6129388261267b565b9050602081019050919050565b82818337600083830152505050565b600061296761296284612914565b6128f9565b90508281526020810184848401111561298357612982612894565b5b61298e848285612945565b509392505050565b600082601f8301126129ab576129aa61288f565b5b81356129bb848260208601612954565b91505092915050565b6000602082840312156129da576129d9612570565b5b600082013567ffffffffffffffff8111156129f8576129f7612575565b5b612a0484828501612996565b91505092915050565b600060208284031215612a2357612a22612570565b5b6000612a31848285016127bd565b91505092915050565b612a43816125ff565b8114612a4e57600080fd5b50565b600081359050612a6081612a3a565b92915050565b60008060408385031215612a7d57612a7c612570565b5b6000612a8b858286016127bd565b9250506020612a9c85828601612a51565b9150509250929050565b600067ffffffffffffffff821115612ac157612ac0612899565b5b612aca8261267b565b9050602081019050919050565b6000612aea612ae584612aa6565b6128f9565b905082815260208101848484011115612b0657612b05612894565b5b612b11848285612945565b509392505050565b600082601f830112612b2e57612b2d61288f565b5b8135612b3e848260208601612ad7565b91505092915050565b60008060008060808587031215612b6157612b60612570565b5b6000612b6f878288016127bd565b9450506020612b80878288016127bd565b9350506040612b9187828801612708565b925050606085013567ffffffffffffffff811115612bb257612bb1612575565b5b612bbe87828801612b19565b91505092959194509250565b60008060408385031215612be157612be0612570565b5b6000612bef858286016127bd565b9250506020612c00858286016127bd565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c5157607f821691505b602082108103612c6457612c63612c0a565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612cc6602183612640565b9150612cd182612c6a565b604082019050919050565b60006020820190508181036000830152612cf581612cb9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612d58603d83612640565b9150612d6382612cfc565b604082019050919050565b60006020820190508181036000830152612d8781612d4b565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000612dea602d83612640565b9150612df582612d8e565b604082019050919050565b60006020820190508181036000830152612e1981612ddd565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000612e7c602b83612640565b9150612e8782612e20565b604082019050919050565b60006020820190508181036000830152612eab81612e6f565b9050919050565b7f596f7520646f206e6f74206f776e2074686973204e4654000000000000000000600082015250565b6000612ee8601783612640565b9150612ef382612eb2565b602082019050919050565b60006020820190508181036000830152612f1781612edb565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000612f7a602c83612640565b9150612f8582612f1e565b604082019050919050565b60006020820190508181036000830152612fa981612f6d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026130417fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613004565b61304b8683613004565b95508019841693508086168417925050509392505050565b6000819050919050565b600061308861308361307e846126e7565b613063565b6126e7565b9050919050565b6000819050919050565b6130a28361306d565b6130b66130ae8261308f565b848454613011565b825550505050565b600090565b6130cb6130be565b6130d6818484613099565b505050565b5b818110156130fa576130ef6000826130c3565b6001810190506130dc565b5050565b601f82111561313f5761311081612fdf565b61311984612ff4565b81016020851015613128578190505b61313c61313485612ff4565b8301826130db565b50505b505050565b600082821c905092915050565b600061316260001984600802613144565b1980831691505092915050565b600061317b8383613151565b9150826002028217905092915050565b61319482612635565b67ffffffffffffffff8111156131ad576131ac612899565b5b6131b78254612c39565b6131c28282856130fe565b600060209050601f8311600181146131f557600084156131e3578287015190505b6131ed858261316f565b865550613255565b601f19841661320386612fdf565b60005b8281101561322b57848901518255600182019150602085019450602081019050613206565b868310156132485784890151613244601f891682613151565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613293601883612640565b915061329e8261325d565b602082019050919050565b600060208201905081810360008301526132c281613286565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613303826126e7565b915061330e836126e7565b9250828201905080821115613326576133256132c9565b5b92915050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613388602983612640565b91506133938261332c565b604082019050919050565b600060208201905081810360008301526133b78161337b565b9050919050565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b60006133f4601483612640565b91506133ff826133be565b602082019050919050565b60006020820190508181036000830152613423816133e7565b9050919050565b600081905092915050565b6000815461344281612c39565b61344c818661342a565b94506001821660008114613467576001811461347c576134af565b60ff19831686528115158202860193506134af565b61348585612fdf565b60005b838110156134a757815481890152600182019150602081019050613488565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b60006134ee60018361342a565b91506134f9826134b8565b600182019050919050565b600061350f82612635565b613519818561342a565b9350613529818560208601612651565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061356b60058361342a565b915061357682613535565b600582019050919050565b600061358d8285613435565b9150613598826134e1565b91506135a48284613504565b91506135af8261355e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613617602683612640565b9150613622826135bb565b604082019050919050565b600060208201905081810360008301526136468161360a565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006136a9602583612640565b91506136b48261364d565b604082019050919050565b600060208201905081810360008301526136d88161369c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061373b602483612640565b9150613746826136df565b604082019050919050565b6000602082019050818103600083015261376a8161372e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137a7602083612640565b91506137b282613771565b602082019050919050565b600060208201905081810360008301526137d68161379a565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000613813601083612640565b915061381e826137dd565b602082019050919050565b6000602082019050818103600083015261384281613806565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061387f601983612640565b915061388a82613849565b602082019050919050565b600060208201905081810360008301526138ae81613872565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613911603283612640565b915061391c826138b5565b604082019050919050565b6000602082019050818103600083015261394081613904565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b60006139d2603583612640565b91506139dd82613976565b604082019050919050565b60006020820190508181036000830152613a01816139c5565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613a3e601483612640565b9150613a4982613a08565b602082019050919050565b60006020820190508181036000830152613a6d81613a31565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613a9b82613a74565b613aa58185613a7f565b9350613ab5818560208601612651565b613abe8161267b565b840191505092915050565b6000608082019050613ade600083018761277c565b613aeb602083018661277c565b613af86040830185612812565b8181036060830152613b0a8184613a90565b905095945050505050565b600081519050613b24816125a6565b92915050565b600060208284031215613b4057613b3f612570565b5b6000613b4e84828501613b15565b91505092915050565b6000613b62826126e7565b9150613b6d836126e7565b9250828203905081811115613b8557613b846132c9565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613bf0602083612640565b9150613bfb82613bba565b602082019050919050565b60006020820190508181036000830152613c1f81613be3565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613c5c601c83612640565b9150613c6782613c26565b602082019050919050565b60006020820190508181036000830152613c8b81613c4f565b905091905056fea26469706673582212201c85debc9484070468684e3c8f409ef9ff125182589cd9470e0677bd1e5232ca64736f6c6343000813003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696471786173786778756e6a376b6b6a363569636e74777662787374736e726c726c3436676b757561616e33776f73626433376a692f0000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101735760003560e01c80635c975abb116100de5780638da5cb5b11610097578063b88d4fde11610071578063b88d4fde14610410578063c87b56dd1461042c578063e985e9c51461045c578063f2fde38b1461048c57610173565b80638da5cb5b146103b857806395d89b41146103d6578063a22cb465146103f457610173565b80635c975abb1461030a5780636352211e146103285780636a6278421461035857806370a0823114610374578063715018a6146103a45780638456cb59146103ae57610173565b80632f745c59116101305780632f745c591461024c5780633f4ba83a1461027c57806342842e0e1461028657806342966c68146102a25780634f6ccce7146102be57806355f804b3146102ee57610173565b806301ffc9a71461017857806306fdde03146101a8578063081812fc146101c6578063095ea7b3146101f657806318160ddd1461021257806323b872dd14610230575b600080fd5b610192600480360381019061018d91906125d2565b6104a8565b60405161019f919061261a565b60405180910390f35b6101b0610522565b6040516101bd91906126c5565b60405180910390f35b6101e060048036038101906101db919061271d565b6105b4565b6040516101ed919061278b565b60405180910390f35b610210600480360381019061020b91906127d2565b6105fa565b005b61021a610711565b6040516102279190612821565b60405180910390f35b61024a6004803603810190610245919061283c565b61071e565b005b610266600480360381019061026191906127d2565b61077e565b6040516102739190612821565b60405180910390f35b610284610823565b005b6102a0600480360381019061029b919061283c565b610835565b005b6102bc60048036038101906102b7919061271d565b610855565b005b6102d860048036038101906102d3919061271d565b61092d565b6040516102e59190612821565b60405180910390f35b610308600480360381019061030391906129c4565b61099e565b005b6103126109b9565b60405161031f919061261a565b60405180910390f35b610342600480360381019061033d919061271d565b6109d0565b60405161034f919061278b565b60405180910390f35b610372600480360381019061036d9190612a0d565b610a56565b005b61038e60048036038101906103899190612a0d565b610ada565b60405161039b9190612821565b60405180910390f35b6103ac610b91565b005b6103b6610ba5565b005b6103c0610bb7565b6040516103cd919061278b565b60405180910390f35b6103de610be1565b6040516103eb91906126c5565b60405180910390f35b61040e60048036038101906104099190612a66565b610c73565b005b61042a60048036038101906104259190612b47565b610c89565b005b6104466004803603810190610441919061271d565b610ceb565b60405161045391906126c5565b60405180910390f35b61047660048036038101906104719190612bca565b610d67565b604051610483919061261a565b60405180910390f35b6104a660048036038101906104a19190612a0d565b610dfb565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061051b575061051a82610e7e565b5b9050919050565b60606000805461053190612c39565b80601f016020809104026020016040519081016040528092919081815260200182805461055d90612c39565b80156105aa5780601f1061057f576101008083540402835291602001916105aa565b820191906000526020600020905b81548152906001019060200180831161058d57829003601f168201915b5050505050905090565b60006105bf82610f60565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610605826109d0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610675576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066c90612cdc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610694610fab565b73ffffffffffffffffffffffffffffffffffffffff1614806106c357506106c2816106bd610fab565b610d67565b5b610702576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f990612d6e565b60405180910390fd5b61070c8383610fb3565b505050565b6000600880549050905090565b61072f610729610fab565b8261106c565b61076e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076590612e00565b60405180910390fd5b610779838383611101565b505050565b600061078983610ada565b82106107ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c190612e92565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61082b6113fa565b610833611478565b565b61085083838360405180602001604052806000815250610c89565b505050565b61085d6114db565b3373ffffffffffffffffffffffffffffffffffffffff1661087d826109d0565b73ffffffffffffffffffffffffffffffffffffffff16146108d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90612efe565b60405180910390fd5b6108dc81611525565b3373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516109229190612821565b60405180910390a250565b6000610937610711565b8210610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096f90612f90565b60405180910390fd5b6008828154811061098c5761098b612fb0565b5b90600052602060002001549050919050565b6109a66113fa565b80600b90816109b5919061318b565b5050565b6000600a60149054906101000a900460ff16905090565b6000806109dc83611673565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a44906132a9565b60405180910390fd5b80915050919050565b610a5e6113fa565b610a666114db565b60006001610a72610711565b610a7c91906132f8565b9050610a8882826116b0565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688582604051610ace9190612821565b60405180910390a25050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b419061339e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b996113fa565b610ba360006116ce565b565b610bad6113fa565b610bb5611794565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610bf090612c39565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1c90612c39565b8015610c695780601f10610c3e57610100808354040283529160200191610c69565b820191906000526020600020905b815481529060010190602001808311610c4c57829003601f168201915b5050505050905090565b610c85610c7e610fab565b83836117f7565b5050565b610c9a610c94610fab565b8361106c565b610cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd090612e00565b60405180910390fd5b610ce584848484611963565b50505050565b6060610cf6826119bf565b610d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2c9061340a565b60405180910390fd5b600b610d4083611a00565b604051602001610d51929190613581565b6040516020818303038152906040529050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610e036113fa565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e699061362d565b60405180910390fd5b610e7b816116ce565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610f4957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610f595750610f5882611ace565b5b9050919050565b610f69816119bf565b610fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9f906132a9565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611026836109d0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611078836109d0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806110ba57506110b98185610d67565b5b806110f857508373ffffffffffffffffffffffffffffffffffffffff166110e0846105b4565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611121826109d0565b73ffffffffffffffffffffffffffffffffffffffff1614611177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116e906136bf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dd90613751565b60405180910390fd5b6111f38383836001611b38565b8273ffffffffffffffffffffffffffffffffffffffff16611213826109d0565b73ffffffffffffffffffffffffffffffffffffffff1614611269576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611260906136bf565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113f58383836001611c96565b505050565b611402610fab565b73ffffffffffffffffffffffffffffffffffffffff16611420610bb7565b73ffffffffffffffffffffffffffffffffffffffff1614611476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146d906137bd565b60405180910390fd5b565b611480611c9c565b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6114c4610fab565b6040516114d1919061278b565b60405180910390a1565b6114e36109b9565b15611523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151a90613829565b60405180910390fd5b565b6000611530826109d0565b9050611540816000846001611b38565b611549826109d0565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461166f816000846001611c96565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6116ca828260405180602001604052806000815250611ce5565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61179c6114db565b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586117e0610fab565b6040516117ed919061278b565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c90613895565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611956919061261a565b60405180910390a3505050565b61196e848484611101565b61197a84848484611d40565b6119b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b090613927565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166119e183611673565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060006001611a0f84611ec7565b01905060008167ffffffffffffffff811115611a2e57611a2d612899565b5b6040519080825280601f01601f191660200182016040528015611a605781602001600182028036833780820191505090505b509050600082602001820190505b600115611ac3578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611ab757611ab6613947565b5b04945060008503611a6e575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611b448484848461201a565b6001811115611b88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7f906139e8565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611bcf57611bca81612020565b611c0e565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614611c0d57611c0c8582612069565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611c5057611c4b816121d6565b611c8f565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611c8e57611c8d84826122a7565b5b5b5050505050565b50505050565b611ca46109b9565b611ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cda90613a54565b60405180910390fd5b565b611cef8383612326565b611cfc6000848484611d40565b611d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3290613927565b60405180910390fd5b505050565b6000611d618473ffffffffffffffffffffffffffffffffffffffff16612543565b15611eba578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d8a610fab565b8786866040518563ffffffff1660e01b8152600401611dac9493929190613ac9565b6020604051808303816000875af1925050508015611de857506040513d601f19601f82011682018060405250810190611de59190613b2a565b60015b611e6a573d8060008114611e18576040519150601f19603f3d011682016040523d82523d6000602084013e611e1d565b606091505b506000815103611e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5990613927565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611ebf565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611f25577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611f1b57611f1a613947565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611f62576d04ee2d6d415b85acef81000000008381611f5857611f57613947565b5b0492506020810190505b662386f26fc100008310611f9157662386f26fc100008381611f8757611f86613947565b5b0492506010810190505b6305f5e1008310611fba576305f5e1008381611fb057611faf613947565b5b0492506008810190505b6127108310611fdf576127108381611fd557611fd4613947565b5b0492506004810190505b606483106120025760648381611ff857611ff7613947565b5b0492506002810190505b600a8310612011576001810190505b80915050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161207684610ada565b6120809190613b57565b9050600060076000848152602001908152602001600020549050818114612165576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506121ea9190613b57565b905060006009600084815260200190815260200160002054905060006008838154811061221a57612219612fb0565b5b90600052602060002001549050806008838154811061223c5761223b612fb0565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061228b5761228a613b8b565b5b6001900381819060005260206000200160009055905550505050565b60006122b283610ada565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238c90613c06565b60405180910390fd5b61239e816119bf565b156123de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d590613c72565b60405180910390fd5b6123ec600083836001611b38565b6123f5816119bf565b15612435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242c90613c72565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461253f600083836001611c96565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6125af8161257a565b81146125ba57600080fd5b50565b6000813590506125cc816125a6565b92915050565b6000602082840312156125e8576125e7612570565b5b60006125f6848285016125bd565b91505092915050565b60008115159050919050565b612614816125ff565b82525050565b600060208201905061262f600083018461260b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561266f578082015181840152602081019050612654565b60008484015250505050565b6000601f19601f8301169050919050565b600061269782612635565b6126a18185612640565b93506126b1818560208601612651565b6126ba8161267b565b840191505092915050565b600060208201905081810360008301526126df818461268c565b905092915050565b6000819050919050565b6126fa816126e7565b811461270557600080fd5b50565b600081359050612717816126f1565b92915050565b60006020828403121561273357612732612570565b5b600061274184828501612708565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127758261274a565b9050919050565b6127858161276a565b82525050565b60006020820190506127a0600083018461277c565b92915050565b6127af8161276a565b81146127ba57600080fd5b50565b6000813590506127cc816127a6565b92915050565b600080604083850312156127e9576127e8612570565b5b60006127f7858286016127bd565b925050602061280885828601612708565b9150509250929050565b61281b816126e7565b82525050565b60006020820190506128366000830184612812565b92915050565b60008060006060848603121561285557612854612570565b5b6000612863868287016127bd565b9350506020612874868287016127bd565b925050604061288586828701612708565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6128d18261267b565b810181811067ffffffffffffffff821117156128f0576128ef612899565b5b80604052505050565b6000612903612566565b905061290f82826128c8565b919050565b600067ffffffffffffffff82111561292f5761292e612899565b5b6129388261267b565b9050602081019050919050565b82818337600083830152505050565b600061296761296284612914565b6128f9565b90508281526020810184848401111561298357612982612894565b5b61298e848285612945565b509392505050565b600082601f8301126129ab576129aa61288f565b5b81356129bb848260208601612954565b91505092915050565b6000602082840312156129da576129d9612570565b5b600082013567ffffffffffffffff8111156129f8576129f7612575565b5b612a0484828501612996565b91505092915050565b600060208284031215612a2357612a22612570565b5b6000612a31848285016127bd565b91505092915050565b612a43816125ff565b8114612a4e57600080fd5b50565b600081359050612a6081612a3a565b92915050565b60008060408385031215612a7d57612a7c612570565b5b6000612a8b858286016127bd565b9250506020612a9c85828601612a51565b9150509250929050565b600067ffffffffffffffff821115612ac157612ac0612899565b5b612aca8261267b565b9050602081019050919050565b6000612aea612ae584612aa6565b6128f9565b905082815260208101848484011115612b0657612b05612894565b5b612b11848285612945565b509392505050565b600082601f830112612b2e57612b2d61288f565b5b8135612b3e848260208601612ad7565b91505092915050565b60008060008060808587031215612b6157612b60612570565b5b6000612b6f878288016127bd565b9450506020612b80878288016127bd565b9350506040612b9187828801612708565b925050606085013567ffffffffffffffff811115612bb257612bb1612575565b5b612bbe87828801612b19565b91505092959194509250565b60008060408385031215612be157612be0612570565b5b6000612bef858286016127bd565b9250506020612c00858286016127bd565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c5157607f821691505b602082108103612c6457612c63612c0a565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612cc6602183612640565b9150612cd182612c6a565b604082019050919050565b60006020820190508181036000830152612cf581612cb9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612d58603d83612640565b9150612d6382612cfc565b604082019050919050565b60006020820190508181036000830152612d8781612d4b565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000612dea602d83612640565b9150612df582612d8e565b604082019050919050565b60006020820190508181036000830152612e1981612ddd565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000612e7c602b83612640565b9150612e8782612e20565b604082019050919050565b60006020820190508181036000830152612eab81612e6f565b9050919050565b7f596f7520646f206e6f74206f776e2074686973204e4654000000000000000000600082015250565b6000612ee8601783612640565b9150612ef382612eb2565b602082019050919050565b60006020820190508181036000830152612f1781612edb565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000612f7a602c83612640565b9150612f8582612f1e565b604082019050919050565b60006020820190508181036000830152612fa981612f6d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026130417fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613004565b61304b8683613004565b95508019841693508086168417925050509392505050565b6000819050919050565b600061308861308361307e846126e7565b613063565b6126e7565b9050919050565b6000819050919050565b6130a28361306d565b6130b66130ae8261308f565b848454613011565b825550505050565b600090565b6130cb6130be565b6130d6818484613099565b505050565b5b818110156130fa576130ef6000826130c3565b6001810190506130dc565b5050565b601f82111561313f5761311081612fdf565b61311984612ff4565b81016020851015613128578190505b61313c61313485612ff4565b8301826130db565b50505b505050565b600082821c905092915050565b600061316260001984600802613144565b1980831691505092915050565b600061317b8383613151565b9150826002028217905092915050565b61319482612635565b67ffffffffffffffff8111156131ad576131ac612899565b5b6131b78254612c39565b6131c28282856130fe565b600060209050601f8311600181146131f557600084156131e3578287015190505b6131ed858261316f565b865550613255565b601f19841661320386612fdf565b60005b8281101561322b57848901518255600182019150602085019450602081019050613206565b868310156132485784890151613244601f891682613151565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613293601883612640565b915061329e8261325d565b602082019050919050565b600060208201905081810360008301526132c281613286565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613303826126e7565b915061330e836126e7565b9250828201905080821115613326576133256132c9565b5b92915050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613388602983612640565b91506133938261332c565b604082019050919050565b600060208201905081810360008301526133b78161337b565b9050919050565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b60006133f4601483612640565b91506133ff826133be565b602082019050919050565b60006020820190508181036000830152613423816133e7565b9050919050565b600081905092915050565b6000815461344281612c39565b61344c818661342a565b94506001821660008114613467576001811461347c576134af565b60ff19831686528115158202860193506134af565b61348585612fdf565b60005b838110156134a757815481890152600182019150602081019050613488565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b60006134ee60018361342a565b91506134f9826134b8565b600182019050919050565b600061350f82612635565b613519818561342a565b9350613529818560208601612651565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061356b60058361342a565b915061357682613535565b600582019050919050565b600061358d8285613435565b9150613598826134e1565b91506135a48284613504565b91506135af8261355e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613617602683612640565b9150613622826135bb565b604082019050919050565b600060208201905081810360008301526136468161360a565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006136a9602583612640565b91506136b48261364d565b604082019050919050565b600060208201905081810360008301526136d88161369c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061373b602483612640565b9150613746826136df565b604082019050919050565b6000602082019050818103600083015261376a8161372e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137a7602083612640565b91506137b282613771565b602082019050919050565b600060208201905081810360008301526137d68161379a565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000613813601083612640565b915061381e826137dd565b602082019050919050565b6000602082019050818103600083015261384281613806565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061387f601983612640565b915061388a82613849565b602082019050919050565b600060208201905081810360008301526138ae81613872565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613911603283612640565b915061391c826138b5565b604082019050919050565b6000602082019050818103600083015261394081613904565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b60006139d2603583612640565b91506139dd82613976565b604082019050919050565b60006020820190508181036000830152613a01816139c5565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613a3e601483612640565b9150613a4982613a08565b602082019050919050565b60006020820190508181036000830152613a6d81613a31565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613a9b82613a74565b613aa58185613a7f565b9350613ab5818560208601612651565b613abe8161267b565b840191505092915050565b6000608082019050613ade600083018761277c565b613aeb602083018661277c565b613af86040830185612812565b8181036060830152613b0a8184613a90565b905095945050505050565b600081519050613b24816125a6565b92915050565b600060208284031215613b4057613b3f612570565b5b6000613b4e84828501613b15565b91505092915050565b6000613b62826126e7565b9150613b6d836126e7565b9250828203905081811115613b8557613b846132c9565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613bf0602083612640565b9150613bfb82613bba565b602082019050919050565b60006020820190508181036000830152613c1f81613be3565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613c5c601c83612640565b9150613c6782613c26565b602082019050919050565b60006020820190508181036000830152613c8b81613c4f565b905091905056fea26469706673582212201c85debc9484070468684e3c8f409ef9ff125182589cd9470e0677bd1e5232ca64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696471786173786778756e6a376b6b6a363569636e74777662787374736e726c726c3436676b757561616e33776f73626433376a692f0000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : baseURI_ (string): ipfs://bafybeidqxasxgxunj7kkj65icntwvbxstsnrlrl46gkuuaan3wosbd37ji/
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [2] : 697066733a2f2f626166796265696471786173786778756e6a376b6b6a363569
Arg [3] : 636e74777662787374736e726c726c3436676b757561616e33776f7362643337
Arg [4] : 6a692f0000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
67612:2235:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56254:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39211:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40723:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40241:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56894:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41423:301;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56562:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69777:67;;;:::i;:::-;;41795:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68571:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57084:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68917:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66567:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38921:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68195:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38652:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64071:103;;;:::i;:::-;;69635:63;;;:::i;:::-;;63430:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39380:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40966:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42017:279;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69279:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41192:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64329:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56254:224;56356:4;56395:35;56380:50;;;:11;:50;;;;:90;;;;56434:36;56458:11;56434:23;:36::i;:::-;56380:90;56373:97;;56254:224;;;:::o;39211:100::-;39265:13;39298:5;39291:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39211:100;:::o;40723:171::-;40799:7;40819:23;40834:7;40819:14;:23::i;:::-;40862:15;:24;40878:7;40862:24;;;;;;;;;;;;;;;;;;;;;40855:31;;40723:171;;;:::o;40241:416::-;40322:13;40338:23;40353:7;40338:14;:23::i;:::-;40322:39;;40386:5;40380:11;;:2;:11;;;40372:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;40480:5;40464:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;40489:37;40506:5;40513:12;:10;:12::i;:::-;40489:16;:37::i;:::-;40464:62;40442:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;40628:21;40637:2;40641:7;40628:8;:21::i;:::-;40311:346;40241:416;;:::o;56894:113::-;56955:7;56982:10;:17;;;;56975:24;;56894:113;:::o;41423:301::-;41584:41;41603:12;:10;:12::i;:::-;41617:7;41584:18;:41::i;:::-;41576:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;41688:28;41698:4;41704:2;41708:7;41688:9;:28::i;:::-;41423:301;;;:::o;56562:256::-;56659:7;56695:23;56712:5;56695:16;:23::i;:::-;56687:5;:31;56679:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;56784:12;:19;56797:5;56784:19;;;;;;;;;;;;;;;:26;56804:5;56784:26;;;;;;;;;;;;56777:33;;56562:256;;;;:::o;69777:67::-;63316:13;:11;:13::i;:::-;69826:10:::1;:8;:10::i;:::-;69777:67::o:0;41795:151::-;41899:39;41916:4;41922:2;41926:7;41899:39;;;;;;;;;;;;:16;:39::i;:::-;41795:151;;;:::o;68571:224::-;66172:19;:17;:19::i;:::-;68664:10:::1;68644:30;;:16;68652:7;68644;:16::i;:::-;:30;;;68636:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;68713:14;68719:7;68713:5;:14::i;:::-;68748:10;68743:25;;;68760:7;68743:25;;;;;;:::i;:::-;;;;;;;;68571:224:::0;:::o;57084:233::-;57159:7;57195:30;:28;:30::i;:::-;57187:5;:38;57179:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;57292:10;57303:5;57292:17;;;;;;;;:::i;:::-;;;;;;;;;;57285:24;;57084:233;;;:::o;68917:104::-;63316:13;:11;:13::i;:::-;69003:10:::1;68993:7;:20;;;;;;:::i;:::-;;68917:104:::0;:::o;66567:86::-;66614:4;66638:7;;;;;;;;;;;66631:14;;66567:86;:::o;38921:223::-;38993:7;39013:13;39029:17;39038:7;39029:8;:17::i;:::-;39013:33;;39082:1;39065:19;;:5;:19;;;39057:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;39131:5;39124:12;;;38921:223;;;:::o;68195:222::-;63316:13;:11;:13::i;:::-;66172:19:::1;:17;:19::i;:::-;68265:15:::2;68299:1;68283:13;:11;:13::i;:::-;:17;;;;:::i;:::-;68265:35;;68335:22;68345:2;68349:7;68335:9;:22::i;:::-;68378:2;68373:17;;;68382:7;68373:17;;;;;;:::i;:::-;;;;;;;;68254:163;68195:222:::0;:::o;38652:207::-;38724:7;38769:1;38752:19;;:5;:19;;;38744:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38835:9;:16;38845:5;38835:16;;;;;;;;;;;;;;;;38828:23;;38652:207;;;:::o;64071:103::-;63316:13;:11;:13::i;:::-;64136:30:::1;64163:1;64136:18;:30::i;:::-;64071:103::o:0;69635:63::-;63316:13;:11;:13::i;:::-;69682:8:::1;:6;:8::i;:::-;69635:63::o:0;63430:87::-;63476:7;63503:6;;;;;;;;;;;63496:13;;63430:87;:::o;39380:104::-;39436:13;39469:7;39462:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39380:104;:::o;40966:155::-;41061:52;41080:12;:10;:12::i;:::-;41094:8;41104;41061:18;:52::i;:::-;40966:155;;:::o;42017:279::-;42148:41;42167:12;:10;:12::i;:::-;42181:7;42148:18;:41::i;:::-;42140:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;42250:38;42264:4;42270:2;42274:7;42283:4;42250:13;:38::i;:::-;42017:279;;;;:::o;69279:233::-;69344:13;69378:16;69386:7;69378;:16::i;:::-;69370:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;69461:7;69475:18;:7;:16;:18::i;:::-;69444:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69430:74;;69279:233;;;:::o;41192:164::-;41289:4;41313:18;:25;41332:5;41313:25;;;;;;;;;;;;;;;:35;41339:8;41313:35;;;;;;;;;;;;;;;;;;;;;;;;;41306:42;;41192:164;;;;:::o;64329:201::-;63316:13;:11;:13::i;:::-;64438:1:::1;64418:22;;:8;:22;;::::0;64410:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;64494:28;64513:8;64494:18;:28::i;:::-;64329:201:::0;:::o;38283:305::-;38385:4;38437:25;38422:40;;;:11;:40;;;;:105;;;;38494:33;38479:48;;;:11;:48;;;;38422:105;:158;;;;38544:36;38568:11;38544:23;:36::i;:::-;38422:158;38402:178;;38283:305;;;:::o;50286:135::-;50368:16;50376:7;50368;:16::i;:::-;50360:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;50286:135;:::o;18174:98::-;18227:7;18254:10;18247:17;;18174:98;:::o;49599:174::-;49701:2;49674:15;:24;49690:7;49674:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;49757:7;49753:2;49719:46;;49728:23;49743:7;49728:14;:23::i;:::-;49719:46;;;;;;;;;;;;49599:174;;:::o;44286:264::-;44379:4;44396:13;44412:23;44427:7;44412:14;:23::i;:::-;44396:39;;44465:5;44454:16;;:7;:16;;;:52;;;;44474:32;44491:5;44498:7;44474:16;:32::i;:::-;44454:52;:87;;;;44534:7;44510:31;;:20;44522:7;44510:11;:20::i;:::-;:31;;;44454:87;44446:96;;;44286:264;;;;:::o;48251:1229::-;48376:4;48349:31;;:23;48364:7;48349:14;:23::i;:::-;:31;;;48341:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48455:1;48441:16;;:2;:16;;;48433:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;48511:42;48532:4;48538:2;48542:7;48551:1;48511:20;:42::i;:::-;48683:4;48656:31;;:23;48671:7;48656:14;:23::i;:::-;:31;;;48648:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48801:15;:24;48817:7;48801:24;;;;;;;;;;;;48794:31;;;;;;;;;;;49296:1;49277:9;:15;49287:4;49277:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;49329:1;49312:9;:13;49322:2;49312:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;49371:2;49352:7;:16;49360:7;49352:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;49410:7;49406:2;49391:27;;49400:4;49391:27;;;;;;;;;;;;49431:41;49451:4;49457:2;49461:7;49470:1;49431:19;:41::i;:::-;48251:1229;;;:::o;63595:132::-;63670:12;:10;:12::i;:::-;63659:23;;:7;:5;:7::i;:::-;:23;;;63651:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63595:132::o;67422:120::-;66431:16;:14;:16::i;:::-;67491:5:::1;67481:7;;:15;;;;;;;;;;;;;;;;;;67512:22;67521:12;:10;:12::i;:::-;67512:22;;;;;;:::i;:::-;;;;;;;;67422:120::o:0;66726:108::-;66797:8;:6;:8::i;:::-;66796:9;66788:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;66726:108::o;47131:783::-;47191:13;47207:23;47222:7;47207:14;:23::i;:::-;47191:39;;47243:51;47264:5;47279:1;47283:7;47292:1;47243:20;:51::i;:::-;47407:23;47422:7;47407:14;:23::i;:::-;47399:31;;47478:15;:24;47494:7;47478:24;;;;;;;;;;;;47471:31;;;;;;;;;;;47743:1;47723:9;:16;47733:5;47723:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;47773:7;:16;47781:7;47773:16;;;;;;;;;;;;47766:23;;;;;;;;;;;47835:7;47831:1;47807:36;;47816:5;47807:36;;;;;;;;;;;;47856:50;47876:5;47891:1;47895:7;47904:1;47856:19;:50::i;:::-;47180:734;47131:783;:::o;43561:117::-;43627:7;43654;:16;43662:7;43654:16;;;;;;;;;;;;;;;;;;;;;43647:23;;43561:117;;;:::o;44892:110::-;44968:26;44978:2;44982:7;44968:26;;;;;;;;;;;;:9;:26::i;:::-;44892:110;;:::o;64690:191::-;64764:16;64783:6;;;;;;;;;;;64764:25;;64809:8;64800:6;;:17;;;;;;;;;;;;;;;;;;64864:8;64833:40;;64854:8;64833:40;;;;;;;;;;;;64753:128;64690:191;:::o;67163:118::-;66172:19;:17;:19::i;:::-;67233:4:::1;67223:7;;:14;;;;;;;;;;;;;;;;;;67253:20;67260:12;:10;:12::i;:::-;67253:20;;;;;;:::i;:::-;;;;;;;;67163:118::o:0;49916:281::-;50037:8;50028:17;;:5;:17;;;50020:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;50124:8;50086:18;:25;50105:5;50086:25;;;;;;;;;;;;;;;:35;50112:8;50086:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;50170:8;50148:41;;50163:5;50148:41;;;50180:8;50148:41;;;;;;:::i;:::-;;;;;;;;49916:281;;;:::o;43177:270::-;43290:28;43300:4;43306:2;43310:7;43290:9;:28::i;:::-;43337:47;43360:4;43366:2;43370:7;43379:4;43337:22;:47::i;:::-;43329:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;43177:270;;;;:::o;43991:128::-;44056:4;44109:1;44080:31;;:17;44089:7;44080:8;:17::i;:::-;:31;;;;44073:38;;43991:128;;;:::o;33433:716::-;33489:13;33540:14;33577:1;33557:17;33568:5;33557:10;:17::i;:::-;:21;33540:38;;33593:20;33627:6;33616:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33593:41;;33649:11;33778:6;33774:2;33770:15;33762:6;33758:28;33751:35;;33815:288;33822:4;33815:288;;;33847:5;;;;;;;;33989:8;33984:2;33977:5;33973:14;33968:30;33963:3;33955:44;34045:2;34036:11;;;;;;:::i;:::-;;;;;34079:1;34070:5;:10;33815:288;34066:21;33815:288;34124:6;34117:13;;;;;33433:716;;;:::o;36706:157::-;36791:4;36830:25;36815:40;;;:11;:40;;;;36808:47;;36706:157;;;:::o;57391:915::-;57568:61;57595:4;57601:2;57605:12;57619:9;57568:26;:61::i;:::-;57658:1;57646:9;:13;57642:222;;;57789:63;;;;;;;;;;:::i;:::-;;;;;;;;57642:222;57876:15;57894:12;57876:30;;57939:1;57923:18;;:4;:18;;;57919:187;;57958:40;57990:7;57958:31;:40::i;:::-;57919:187;;;58028:2;58020:10;;:4;:10;;;58016:90;;58047:47;58080:4;58086:7;58047:32;:47::i;:::-;58016:90;57919:187;58134:1;58120:16;;:2;:16;;;58116:183;;58153:45;58190:7;58153:36;:45::i;:::-;58116:183;;;58226:4;58220:10;;:2;:10;;;58216:83;;58247:40;58275:2;58279:7;58247:27;:40::i;:::-;58216:83;58116:183;57557:749;57391:915;;;;:::o;53408:115::-;;;;;:::o;66911:108::-;66978:8;:6;:8::i;:::-;66970:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;66911:108::o;45229:285::-;45324:18;45330:2;45334:7;45324:5;:18::i;:::-;45375:53;45406:1;45410:2;45414:7;45423:4;45375:22;:53::i;:::-;45353:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;45229:285;;;:::o;50985:853::-;51139:4;51160:15;:2;:13;;;:15::i;:::-;51156:675;;;51212:2;51196:36;;;51233:12;:10;:12::i;:::-;51247:4;51253:7;51262:4;51196:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51192:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51454:1;51437:6;:13;:18;51433:328;;51480:60;;;;;;;;;;:::i;:::-;;;;;;;;51433:328;51711:6;51705:13;51696:6;51692:2;51688:15;51681:38;51192:584;51328:41;;;51318:51;;;:6;:51;;;;51311:58;;;;;51156:675;51815:4;51808:11;;50985:853;;;;;;;:::o;28916:948::-;28969:7;28989:14;29006:1;28989:18;;29056:8;29047:5;:17;29043:106;;29094:8;29085:17;;;;;;:::i;:::-;;;;;29131:2;29121:12;;;;29043:106;29176:8;29167:5;:17;29163:106;;29214:8;29205:17;;;;;;:::i;:::-;;;;;29251:2;29241:12;;;;29163:106;29296:8;29287:5;:17;29283:106;;29334:8;29325:17;;;;;;:::i;:::-;;;;;29371:2;29361:12;;;;29283:106;29416:7;29407:5;:16;29403:103;;29453:7;29444:16;;;;;;:::i;:::-;;;;;29489:1;29479:11;;;;29403:103;29533:7;29524:5;:16;29520:103;;29570:7;29561:16;;;;;;:::i;:::-;;;;;29606:1;29596:11;;;;29520:103;29650:7;29641:5;:16;29637:103;;29687:7;29678:16;;;;;;:::i;:::-;;;;;29723:1;29713:11;;;;29637:103;29767:7;29758:5;:16;29754:68;;29805:1;29795:11;;;;29754:68;29850:6;29843:13;;;28916:948;;;:::o;52570:116::-;;;;;:::o;59029:164::-;59133:10;:17;;;;59106:15;:24;59122:7;59106:24;;;;;;;;;;;:44;;;;59161:10;59177:7;59161:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59029:164;:::o;59820:988::-;60086:22;60136:1;60111:22;60128:4;60111:16;:22::i;:::-;:26;;;;:::i;:::-;60086:51;;60148:18;60169:17;:26;60187:7;60169:26;;;;;;;;;;;;60148:47;;60316:14;60302:10;:28;60298:328;;60347:19;60369:12;:18;60382:4;60369:18;;;;;;;;;;;;;;;:34;60388:14;60369:34;;;;;;;;;;;;60347:56;;60453:11;60420:12;:18;60433:4;60420:18;;;;;;;;;;;;;;;:30;60439:10;60420:30;;;;;;;;;;;:44;;;;60570:10;60537:17;:30;60555:11;60537:30;;;;;;;;;;;:43;;;;60332:294;60298:328;60722:17;:26;60740:7;60722:26;;;;;;;;;;;60715:33;;;60766:12;:18;60779:4;60766:18;;;;;;;;;;;;;;;:34;60785:14;60766:34;;;;;;;;;;;60759:41;;;59901:907;;59820:988;;:::o;61103:1079::-;61356:22;61401:1;61381:10;:17;;;;:21;;;;:::i;:::-;61356:46;;61413:18;61434:15;:24;61450:7;61434:24;;;;;;;;;;;;61413:45;;61785:19;61807:10;61818:14;61807:26;;;;;;;;:::i;:::-;;;;;;;;;;61785:48;;61871:11;61846:10;61857;61846:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;61982:10;61951:15;:28;61967:11;61951:28;;;;;;;;;;;:41;;;;62123:15;:24;62139:7;62123:24;;;;;;;;;;;62116:31;;;62158:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;61174:1008;;;61103:1079;:::o;58607:221::-;58692:14;58709:20;58726:2;58709:16;:20::i;:::-;58692:37;;58767:7;58740:12;:16;58753:2;58740:16;;;;;;;;;;;;;;;:24;58757:6;58740:24;;;;;;;;;;;:34;;;;58814:6;58785:17;:26;58803:7;58785:26;;;;;;;;;;;:35;;;;58681:147;58607:221;;:::o;45850:942::-;45944:1;45930:16;;:2;:16;;;45922:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;46003:16;46011:7;46003;:16::i;:::-;46002:17;45994:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;46065:48;46094:1;46098:2;46102:7;46111:1;46065:20;:48::i;:::-;46212:16;46220:7;46212;:16::i;:::-;46211:17;46203:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;46627:1;46610:9;:13;46620:2;46610:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;46671:2;46652:7;:16;46660:7;46652:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;46716:7;46712:2;46691:33;;46708:1;46691:33;;;;;;;;;;;;46737:47;46765:1;46769:2;46773:7;46782:1;46737:19;:47::i;:::-;45850:942;;:::o;9315:326::-;9375:4;9632:1;9610:7;:19;;;:23;9603:30;;9315:326;;;:::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:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:117::-;5976:1;5973;5966:12;5990:117;6099:1;6096;6089:12;6113:180;6161:77;6158:1;6151:88;6258:4;6255:1;6248:15;6282:4;6279:1;6272:15;6299:281;6382:27;6404:4;6382:27;:::i;:::-;6374:6;6370:40;6512:6;6500:10;6497:22;6476:18;6464:10;6461:34;6458:62;6455:88;;;6523:18;;:::i;:::-;6455:88;6563:10;6559:2;6552:22;6342:238;6299:281;;:::o;6586:129::-;6620:6;6647:20;;:::i;:::-;6637:30;;6676:33;6704:4;6696:6;6676:33;:::i;:::-;6586:129;;;:::o;6721:308::-;6783:4;6873:18;6865:6;6862:30;6859:56;;;6895:18;;:::i;:::-;6859:56;6933:29;6955:6;6933:29;:::i;:::-;6925:37;;7017:4;7011;7007:15;6999:23;;6721:308;;;:::o;7035:146::-;7132:6;7127:3;7122;7109:30;7173:1;7164:6;7159:3;7155:16;7148:27;7035:146;;;:::o;7187:425::-;7265:5;7290:66;7306:49;7348:6;7306:49;:::i;:::-;7290:66;:::i;:::-;7281:75;;7379:6;7372:5;7365:21;7417:4;7410:5;7406:16;7455:3;7446:6;7441:3;7437:16;7434:25;7431:112;;;7462:79;;:::i;:::-;7431:112;7552:54;7599:6;7594:3;7589;7552:54;:::i;:::-;7271:341;7187:425;;;;;:::o;7632:340::-;7688:5;7737:3;7730:4;7722:6;7718:17;7714:27;7704:122;;7745:79;;:::i;:::-;7704:122;7862:6;7849:20;7887:79;7962:3;7954:6;7947:4;7939:6;7935:17;7887:79;:::i;:::-;7878:88;;7694:278;7632:340;;;;:::o;7978:509::-;8047:6;8096:2;8084:9;8075:7;8071:23;8067:32;8064:119;;;8102:79;;:::i;:::-;8064:119;8250:1;8239:9;8235:17;8222:31;8280:18;8272:6;8269:30;8266:117;;;8302:79;;:::i;:::-;8266:117;8407:63;8462:7;8453:6;8442:9;8438:22;8407:63;:::i;:::-;8397:73;;8193:287;7978:509;;;;:::o;8493:329::-;8552:6;8601:2;8589:9;8580:7;8576:23;8572:32;8569:119;;;8607:79;;:::i;:::-;8569:119;8727:1;8752:53;8797:7;8788:6;8777:9;8773:22;8752:53;:::i;:::-;8742:63;;8698:117;8493:329;;;;:::o;8828:116::-;8898:21;8913:5;8898:21;:::i;:::-;8891:5;8888:32;8878:60;;8934:1;8931;8924:12;8878:60;8828:116;:::o;8950:133::-;8993:5;9031:6;9018:20;9009:29;;9047:30;9071:5;9047:30;:::i;:::-;8950:133;;;;:::o;9089:468::-;9154:6;9162;9211:2;9199:9;9190:7;9186:23;9182:32;9179:119;;;9217:79;;:::i;:::-;9179:119;9337:1;9362:53;9407:7;9398:6;9387:9;9383:22;9362:53;:::i;:::-;9352:63;;9308:117;9464:2;9490:50;9532:7;9523:6;9512:9;9508:22;9490:50;:::i;:::-;9480:60;;9435:115;9089:468;;;;;:::o;9563:307::-;9624:4;9714:18;9706:6;9703:30;9700:56;;;9736:18;;:::i;:::-;9700:56;9774:29;9796:6;9774:29;:::i;:::-;9766:37;;9858:4;9852;9848:15;9840:23;;9563:307;;;:::o;9876:423::-;9953:5;9978:65;9994:48;10035:6;9994:48;:::i;:::-;9978:65;:::i;:::-;9969:74;;10066:6;10059:5;10052:21;10104:4;10097:5;10093:16;10142:3;10133:6;10128:3;10124:16;10121:25;10118:112;;;10149:79;;:::i;:::-;10118:112;10239:54;10286:6;10281:3;10276;10239:54;:::i;:::-;9959:340;9876:423;;;;;:::o;10318:338::-;10373:5;10422:3;10415:4;10407:6;10403:17;10399:27;10389:122;;10430:79;;:::i;:::-;10389:122;10547:6;10534:20;10572:78;10646:3;10638:6;10631:4;10623:6;10619:17;10572:78;:::i;:::-;10563:87;;10379:277;10318:338;;;;:::o;10662:943::-;10757:6;10765;10773;10781;10830:3;10818:9;10809:7;10805:23;10801:33;10798:120;;;10837:79;;:::i;:::-;10798:120;10957:1;10982:53;11027:7;11018:6;11007:9;11003:22;10982:53;:::i;:::-;10972:63;;10928:117;11084:2;11110:53;11155:7;11146:6;11135:9;11131:22;11110:53;:::i;:::-;11100:63;;11055:118;11212:2;11238:53;11283:7;11274:6;11263:9;11259:22;11238:53;:::i;:::-;11228:63;;11183:118;11368:2;11357:9;11353:18;11340:32;11399:18;11391:6;11388:30;11385:117;;;11421:79;;:::i;:::-;11385:117;11526:62;11580:7;11571:6;11560:9;11556:22;11526:62;:::i;:::-;11516:72;;11311:287;10662:943;;;;;;;:::o;11611:474::-;11679:6;11687;11736:2;11724:9;11715:7;11711:23;11707:32;11704:119;;;11742:79;;:::i;:::-;11704:119;11862:1;11887:53;11932:7;11923:6;11912:9;11908:22;11887:53;:::i;:::-;11877:63;;11833:117;11989:2;12015:53;12060:7;12051:6;12040:9;12036:22;12015:53;:::i;:::-;12005:63;;11960:118;11611:474;;;;;:::o;12091:180::-;12139:77;12136:1;12129:88;12236:4;12233:1;12226:15;12260:4;12257:1;12250:15;12277:320;12321:6;12358:1;12352:4;12348:12;12338:22;;12405:1;12399:4;12395:12;12426:18;12416:81;;12482:4;12474:6;12470:17;12460:27;;12416:81;12544:2;12536:6;12533:14;12513:18;12510:38;12507:84;;12563:18;;:::i;:::-;12507:84;12328:269;12277:320;;;:::o;12603:220::-;12743:34;12739:1;12731:6;12727:14;12720:58;12812:3;12807:2;12799:6;12795:15;12788:28;12603:220;:::o;12829:366::-;12971:3;12992:67;13056:2;13051:3;12992:67;:::i;:::-;12985:74;;13068:93;13157:3;13068:93;:::i;:::-;13186:2;13181:3;13177:12;13170:19;;12829:366;;;:::o;13201:419::-;13367:4;13405:2;13394:9;13390:18;13382:26;;13454:9;13448:4;13444:20;13440:1;13429:9;13425:17;13418:47;13482:131;13608:4;13482:131;:::i;:::-;13474:139;;13201:419;;;:::o;13626:248::-;13766:34;13762:1;13754:6;13750:14;13743:58;13835:31;13830:2;13822:6;13818:15;13811:56;13626:248;:::o;13880:366::-;14022:3;14043:67;14107:2;14102:3;14043:67;:::i;:::-;14036:74;;14119:93;14208:3;14119:93;:::i;:::-;14237:2;14232:3;14228:12;14221:19;;13880:366;;;:::o;14252:419::-;14418:4;14456:2;14445:9;14441:18;14433:26;;14505:9;14499:4;14495:20;14491:1;14480:9;14476:17;14469:47;14533:131;14659:4;14533:131;:::i;:::-;14525:139;;14252:419;;;:::o;14677:232::-;14817:34;14813:1;14805:6;14801:14;14794:58;14886:15;14881:2;14873:6;14869:15;14862:40;14677:232;:::o;14915:366::-;15057:3;15078:67;15142:2;15137:3;15078:67;:::i;:::-;15071:74;;15154:93;15243:3;15154:93;:::i;:::-;15272:2;15267:3;15263:12;15256:19;;14915:366;;;:::o;15287:419::-;15453:4;15491:2;15480:9;15476:18;15468:26;;15540:9;15534:4;15530:20;15526:1;15515:9;15511:17;15504:47;15568:131;15694:4;15568:131;:::i;:::-;15560:139;;15287:419;;;:::o;15712:230::-;15852:34;15848:1;15840:6;15836:14;15829:58;15921:13;15916:2;15908:6;15904:15;15897:38;15712:230;:::o;15948:366::-;16090:3;16111:67;16175:2;16170:3;16111:67;:::i;:::-;16104:74;;16187:93;16276:3;16187:93;:::i;:::-;16305:2;16300:3;16296:12;16289:19;;15948:366;;;:::o;16320:419::-;16486:4;16524:2;16513:9;16509:18;16501:26;;16573:9;16567:4;16563:20;16559:1;16548:9;16544:17;16537:47;16601:131;16727:4;16601:131;:::i;:::-;16593:139;;16320:419;;;:::o;16745:173::-;16885:25;16881:1;16873:6;16869:14;16862:49;16745:173;:::o;16924:366::-;17066:3;17087:67;17151:2;17146:3;17087:67;:::i;:::-;17080:74;;17163:93;17252:3;17163:93;:::i;:::-;17281:2;17276:3;17272:12;17265:19;;16924:366;;;:::o;17296:419::-;17462:4;17500:2;17489:9;17485:18;17477:26;;17549:9;17543:4;17539:20;17535:1;17524:9;17520:17;17513:47;17577:131;17703:4;17577:131;:::i;:::-;17569:139;;17296:419;;;:::o;17721:231::-;17861:34;17857:1;17849:6;17845:14;17838:58;17930:14;17925:2;17917:6;17913:15;17906:39;17721:231;:::o;17958:366::-;18100:3;18121:67;18185:2;18180:3;18121:67;:::i;:::-;18114:74;;18197:93;18286:3;18197:93;:::i;:::-;18315:2;18310:3;18306:12;18299:19;;17958:366;;;:::o;18330:419::-;18496:4;18534:2;18523:9;18519:18;18511:26;;18583:9;18577:4;18573:20;18569:1;18558:9;18554:17;18547:47;18611:131;18737:4;18611:131;:::i;:::-;18603:139;;18330:419;;;:::o;18755:180::-;18803:77;18800:1;18793:88;18900:4;18897:1;18890:15;18924:4;18921:1;18914:15;18941:141;18990:4;19013:3;19005:11;;19036:3;19033:1;19026:14;19070:4;19067:1;19057:18;19049:26;;18941:141;;;:::o;19088:93::-;19125:6;19172:2;19167;19160:5;19156:14;19152:23;19142:33;;19088:93;;;:::o;19187:107::-;19231:8;19281:5;19275:4;19271:16;19250:37;;19187:107;;;;:::o;19300:393::-;19369:6;19419:1;19407:10;19403:18;19442:97;19472:66;19461:9;19442:97;:::i;:::-;19560:39;19590:8;19579:9;19560:39;:::i;:::-;19548:51;;19632:4;19628:9;19621:5;19617:21;19608:30;;19681:4;19671:8;19667:19;19660:5;19657:30;19647:40;;19376:317;;19300:393;;;;;:::o;19699:60::-;19727:3;19748:5;19741:12;;19699:60;;;:::o;19765:142::-;19815:9;19848:53;19866:34;19875:24;19893:5;19875:24;:::i;:::-;19866:34;:::i;:::-;19848:53;:::i;:::-;19835:66;;19765:142;;;:::o;19913:75::-;19956:3;19977:5;19970:12;;19913:75;;;:::o;19994:269::-;20104:39;20135:7;20104:39;:::i;:::-;20165:91;20214:41;20238:16;20214:41;:::i;:::-;20206:6;20199:4;20193:11;20165:91;:::i;:::-;20159:4;20152:105;20070:193;19994:269;;;:::o;20269:73::-;20314:3;20269:73;:::o;20348:189::-;20425:32;;:::i;:::-;20466:65;20524:6;20516;20510:4;20466:65;:::i;:::-;20401:136;20348:189;;:::o;20543:186::-;20603:120;20620:3;20613:5;20610:14;20603:120;;;20674:39;20711:1;20704:5;20674:39;:::i;:::-;20647:1;20640:5;20636:13;20627:22;;20603:120;;;20543:186;;:::o;20735:543::-;20836:2;20831:3;20828:11;20825:446;;;20870:38;20902:5;20870:38;:::i;:::-;20954:29;20972:10;20954:29;:::i;:::-;20944:8;20940:44;21137:2;21125:10;21122:18;21119:49;;;21158:8;21143:23;;21119:49;21181:80;21237:22;21255:3;21237:22;:::i;:::-;21227:8;21223:37;21210:11;21181:80;:::i;:::-;20840:431;;20825:446;20735:543;;;:::o;21284:117::-;21338:8;21388:5;21382:4;21378:16;21357:37;;21284:117;;;;:::o;21407:169::-;21451:6;21484:51;21532:1;21528:6;21520:5;21517:1;21513:13;21484:51;:::i;:::-;21480:56;21565:4;21559;21555:15;21545:25;;21458:118;21407:169;;;;:::o;21581:295::-;21657:4;21803:29;21828:3;21822:4;21803:29;:::i;:::-;21795:37;;21865:3;21862:1;21858:11;21852:4;21849:21;21841:29;;21581:295;;;;:::o;21881:1395::-;21998:37;22031:3;21998:37;:::i;:::-;22100:18;22092:6;22089:30;22086:56;;;22122:18;;:::i;:::-;22086:56;22166:38;22198:4;22192:11;22166:38;:::i;:::-;22251:67;22311:6;22303;22297:4;22251:67;:::i;:::-;22345:1;22369:4;22356:17;;22401:2;22393:6;22390:14;22418:1;22413:618;;;;23075:1;23092:6;23089:77;;;23141:9;23136:3;23132:19;23126:26;23117:35;;23089:77;23192:67;23252:6;23245:5;23192:67;:::i;:::-;23186:4;23179:81;23048:222;22383:887;;22413:618;22465:4;22461:9;22453:6;22449:22;22499:37;22531:4;22499:37;:::i;:::-;22558:1;22572:208;22586:7;22583:1;22580:14;22572:208;;;22665:9;22660:3;22656:19;22650:26;22642:6;22635:42;22716:1;22708:6;22704:14;22694:24;;22763:2;22752:9;22748:18;22735:31;;22609:4;22606:1;22602:12;22597:17;;22572:208;;;22808:6;22799:7;22796:19;22793:179;;;22866:9;22861:3;22857:19;22851:26;22909:48;22951:4;22943:6;22939:17;22928:9;22909:48;:::i;:::-;22901:6;22894:64;22816:156;22793:179;23018:1;23014;23006:6;23002:14;22998:22;22992:4;22985:36;22420:611;;;22383:887;;21973:1303;;;21881:1395;;:::o;23282:174::-;23422:26;23418:1;23410:6;23406:14;23399:50;23282:174;:::o;23462:366::-;23604:3;23625:67;23689:2;23684:3;23625:67;:::i;:::-;23618:74;;23701:93;23790:3;23701:93;:::i;:::-;23819:2;23814:3;23810:12;23803:19;;23462:366;;;:::o;23834:419::-;24000:4;24038:2;24027:9;24023:18;24015:26;;24087:9;24081:4;24077:20;24073:1;24062:9;24058:17;24051:47;24115:131;24241:4;24115:131;:::i;:::-;24107:139;;23834:419;;;:::o;24259:180::-;24307:77;24304:1;24297:88;24404:4;24401:1;24394:15;24428:4;24425:1;24418:15;24445:191;24485:3;24504:20;24522:1;24504:20;:::i;:::-;24499:25;;24538:20;24556:1;24538:20;:::i;:::-;24533:25;;24581:1;24578;24574:9;24567:16;;24602:3;24599:1;24596:10;24593:36;;;24609:18;;:::i;:::-;24593:36;24445:191;;;;:::o;24642:228::-;24782:34;24778:1;24770:6;24766:14;24759:58;24851:11;24846:2;24838:6;24834:15;24827:36;24642:228;:::o;24876:366::-;25018:3;25039:67;25103:2;25098:3;25039:67;:::i;:::-;25032:74;;25115:93;25204:3;25115:93;:::i;:::-;25233:2;25228:3;25224:12;25217:19;;24876:366;;;:::o;25248:419::-;25414:4;25452:2;25441:9;25437:18;25429:26;;25501:9;25495:4;25491:20;25487:1;25476:9;25472:17;25465:47;25529:131;25655:4;25529:131;:::i;:::-;25521:139;;25248:419;;;:::o;25673:170::-;25813:22;25809:1;25801:6;25797:14;25790:46;25673:170;:::o;25849:366::-;25991:3;26012:67;26076:2;26071:3;26012:67;:::i;:::-;26005:74;;26088:93;26177:3;26088:93;:::i;:::-;26206:2;26201:3;26197:12;26190:19;;25849:366;;;:::o;26221:419::-;26387:4;26425:2;26414:9;26410:18;26402:26;;26474:9;26468:4;26464:20;26460:1;26449:9;26445:17;26438:47;26502:131;26628:4;26502:131;:::i;:::-;26494:139;;26221:419;;;:::o;26646:148::-;26748:11;26785:3;26770:18;;26646:148;;;;:::o;26824:874::-;26927:3;26964:5;26958:12;26993:36;27019:9;26993:36;:::i;:::-;27045:89;27127:6;27122:3;27045:89;:::i;:::-;27038:96;;27165:1;27154:9;27150:17;27181:1;27176:166;;;;27356:1;27351:341;;;;27143:549;;27176:166;27260:4;27256:9;27245;27241:25;27236:3;27229:38;27322:6;27315:14;27308:22;27300:6;27296:35;27291:3;27287:45;27280:52;;27176:166;;27351:341;27418:38;27450:5;27418:38;:::i;:::-;27478:1;27492:154;27506:6;27503:1;27500:13;27492:154;;;27580:7;27574:14;27570:1;27565:3;27561:11;27554:35;27630:1;27621:7;27617:15;27606:26;;27528:4;27525:1;27521:12;27516:17;;27492:154;;;27675:6;27670:3;27666:16;27659:23;;27358:334;;27143:549;;26931:767;;26824:874;;;;:::o;27704:151::-;27844:3;27840:1;27832:6;27828:14;27821:27;27704:151;:::o;27861:400::-;28021:3;28042:84;28124:1;28119:3;28042:84;:::i;:::-;28035:91;;28135:93;28224:3;28135:93;:::i;:::-;28253:1;28248:3;28244:11;28237:18;;27861:400;;;:::o;28267:390::-;28373:3;28401:39;28434:5;28401:39;:::i;:::-;28456:89;28538:6;28533:3;28456:89;:::i;:::-;28449:96;;28554:65;28612:6;28607:3;28600:4;28593:5;28589:16;28554:65;:::i;:::-;28644:6;28639:3;28635:16;28628:23;;28377:280;28267:390;;;;:::o;28663:155::-;28803:7;28799:1;28791:6;28787:14;28780:31;28663:155;:::o;28824:400::-;28984:3;29005:84;29087:1;29082:3;29005:84;:::i;:::-;28998:91;;29098:93;29187:3;29098:93;:::i;:::-;29216:1;29211:3;29207:11;29200:18;;28824:400;;;:::o;29230:961::-;29609:3;29631:92;29719:3;29710:6;29631:92;:::i;:::-;29624:99;;29740:148;29884:3;29740:148;:::i;:::-;29733:155;;29905:95;29996:3;29987:6;29905:95;:::i;:::-;29898:102;;30017:148;30161:3;30017:148;:::i;:::-;30010:155;;30182:3;30175:10;;29230:961;;;;;:::o;30197:225::-;30337:34;30333:1;30325:6;30321:14;30314:58;30406:8;30401:2;30393:6;30389:15;30382:33;30197:225;:::o;30428:366::-;30570:3;30591:67;30655:2;30650:3;30591:67;:::i;:::-;30584:74;;30667:93;30756:3;30667:93;:::i;:::-;30785:2;30780:3;30776:12;30769:19;;30428:366;;;:::o;30800:419::-;30966:4;31004:2;30993:9;30989:18;30981:26;;31053:9;31047:4;31043:20;31039:1;31028:9;31024:17;31017:47;31081:131;31207:4;31081:131;:::i;:::-;31073:139;;30800:419;;;:::o;31225:224::-;31365:34;31361:1;31353:6;31349:14;31342:58;31434:7;31429:2;31421:6;31417:15;31410:32;31225:224;:::o;31455:366::-;31597:3;31618:67;31682:2;31677:3;31618:67;:::i;:::-;31611:74;;31694:93;31783:3;31694:93;:::i;:::-;31812:2;31807:3;31803:12;31796:19;;31455:366;;;:::o;31827:419::-;31993:4;32031:2;32020:9;32016:18;32008:26;;32080:9;32074:4;32070:20;32066:1;32055:9;32051:17;32044:47;32108:131;32234:4;32108:131;:::i;:::-;32100:139;;31827:419;;;:::o;32252:223::-;32392:34;32388:1;32380:6;32376:14;32369:58;32461:6;32456:2;32448:6;32444:15;32437:31;32252:223;:::o;32481:366::-;32623:3;32644:67;32708:2;32703:3;32644:67;:::i;:::-;32637:74;;32720:93;32809:3;32720:93;:::i;:::-;32838:2;32833:3;32829:12;32822:19;;32481:366;;;:::o;32853:419::-;33019:4;33057:2;33046:9;33042:18;33034:26;;33106:9;33100:4;33096:20;33092:1;33081:9;33077:17;33070:47;33134:131;33260:4;33134:131;:::i;:::-;33126:139;;32853:419;;;:::o;33278:182::-;33418:34;33414:1;33406:6;33402:14;33395:58;33278:182;:::o;33466:366::-;33608:3;33629:67;33693:2;33688:3;33629:67;:::i;:::-;33622:74;;33705:93;33794:3;33705:93;:::i;:::-;33823:2;33818:3;33814:12;33807:19;;33466:366;;;:::o;33838:419::-;34004:4;34042:2;34031:9;34027:18;34019:26;;34091:9;34085:4;34081:20;34077:1;34066:9;34062:17;34055:47;34119:131;34245:4;34119:131;:::i;:::-;34111:139;;33838:419;;;:::o;34263:166::-;34403:18;34399:1;34391:6;34387:14;34380:42;34263:166;:::o;34435:366::-;34577:3;34598:67;34662:2;34657:3;34598:67;:::i;:::-;34591:74;;34674:93;34763:3;34674:93;:::i;:::-;34792:2;34787:3;34783:12;34776:19;;34435:366;;;:::o;34807:419::-;34973:4;35011:2;35000:9;34996:18;34988:26;;35060:9;35054:4;35050:20;35046:1;35035:9;35031:17;35024:47;35088:131;35214:4;35088:131;:::i;:::-;35080:139;;34807:419;;;:::o;35232:175::-;35372:27;35368:1;35360:6;35356:14;35349:51;35232:175;:::o;35413:366::-;35555:3;35576:67;35640:2;35635:3;35576:67;:::i;:::-;35569:74;;35652:93;35741:3;35652:93;:::i;:::-;35770:2;35765:3;35761:12;35754:19;;35413:366;;;:::o;35785:419::-;35951:4;35989:2;35978:9;35974:18;35966:26;;36038:9;36032:4;36028:20;36024:1;36013:9;36009:17;36002:47;36066:131;36192:4;36066:131;:::i;:::-;36058:139;;35785:419;;;:::o;36210:237::-;36350:34;36346:1;36338:6;36334:14;36327:58;36419:20;36414:2;36406:6;36402:15;36395:45;36210:237;:::o;36453:366::-;36595:3;36616:67;36680:2;36675:3;36616:67;:::i;:::-;36609:74;;36692:93;36781:3;36692:93;:::i;:::-;36810:2;36805:3;36801:12;36794:19;;36453:366;;;:::o;36825:419::-;36991:4;37029:2;37018:9;37014:18;37006:26;;37078:9;37072:4;37068:20;37064:1;37053:9;37049:17;37042:47;37106:131;37232:4;37106:131;:::i;:::-;37098:139;;36825:419;;;:::o;37250:180::-;37298:77;37295:1;37288:88;37395:4;37392:1;37385:15;37419:4;37416:1;37409:15;37436:240;37576:34;37572:1;37564:6;37560:14;37553:58;37645:23;37640:2;37632:6;37628:15;37621:48;37436:240;:::o;37682:366::-;37824:3;37845:67;37909:2;37904:3;37845:67;:::i;:::-;37838:74;;37921:93;38010:3;37921:93;:::i;:::-;38039:2;38034:3;38030:12;38023:19;;37682:366;;;:::o;38054:419::-;38220:4;38258:2;38247:9;38243:18;38235:26;;38307:9;38301:4;38297:20;38293:1;38282:9;38278:17;38271:47;38335:131;38461:4;38335:131;:::i;:::-;38327:139;;38054:419;;;:::o;38479:170::-;38619:22;38615:1;38607:6;38603:14;38596:46;38479:170;:::o;38655:366::-;38797:3;38818:67;38882:2;38877:3;38818:67;:::i;:::-;38811:74;;38894:93;38983:3;38894:93;:::i;:::-;39012:2;39007:3;39003:12;38996:19;;38655:366;;;:::o;39027:419::-;39193:4;39231:2;39220:9;39216:18;39208:26;;39280:9;39274:4;39270:20;39266:1;39255:9;39251:17;39244:47;39308:131;39434:4;39308:131;:::i;:::-;39300:139;;39027:419;;;:::o;39452:98::-;39503:6;39537:5;39531:12;39521:22;;39452:98;;;:::o;39556:168::-;39639:11;39673:6;39668:3;39661:19;39713:4;39708:3;39704:14;39689:29;;39556:168;;;;:::o;39730:373::-;39816:3;39844:38;39876:5;39844:38;:::i;:::-;39898:70;39961:6;39956:3;39898:70;:::i;:::-;39891:77;;39977:65;40035:6;40030:3;40023:4;40016:5;40012:16;39977:65;:::i;:::-;40067:29;40089:6;40067:29;:::i;:::-;40062:3;40058:39;40051:46;;39820:283;39730:373;;;;:::o;40109:640::-;40304:4;40342:3;40331:9;40327:19;40319:27;;40356:71;40424:1;40413:9;40409:17;40400:6;40356:71;:::i;:::-;40437:72;40505:2;40494:9;40490:18;40481:6;40437:72;:::i;:::-;40519;40587:2;40576:9;40572:18;40563:6;40519:72;:::i;:::-;40638:9;40632:4;40628:20;40623:2;40612:9;40608:18;40601:48;40666:76;40737:4;40728:6;40666:76;:::i;:::-;40658:84;;40109:640;;;;;;;:::o;40755:141::-;40811:5;40842:6;40836:13;40827:22;;40858:32;40884:5;40858:32;:::i;:::-;40755:141;;;;:::o;40902:349::-;40971:6;41020:2;41008:9;40999:7;40995:23;40991:32;40988:119;;;41026:79;;:::i;:::-;40988:119;41146:1;41171:63;41226:7;41217:6;41206:9;41202:22;41171:63;:::i;:::-;41161:73;;41117:127;40902:349;;;;:::o;41257:194::-;41297:4;41317:20;41335:1;41317:20;:::i;:::-;41312:25;;41351:20;41369:1;41351:20;:::i;:::-;41346:25;;41395:1;41392;41388:9;41380:17;;41419:1;41413:4;41410:11;41407:37;;;41424:18;;:::i;:::-;41407:37;41257:194;;;;:::o;41457:180::-;41505:77;41502:1;41495:88;41602:4;41599:1;41592:15;41626:4;41623:1;41616:15;41643:182;41783:34;41779:1;41771:6;41767:14;41760:58;41643:182;:::o;41831:366::-;41973:3;41994:67;42058:2;42053:3;41994:67;:::i;:::-;41987:74;;42070:93;42159:3;42070:93;:::i;:::-;42188:2;42183:3;42179:12;42172:19;;41831:366;;;:::o;42203:419::-;42369:4;42407:2;42396:9;42392:18;42384:26;;42456:9;42450:4;42446:20;42442:1;42431:9;42427:17;42420:47;42484:131;42610:4;42484:131;:::i;:::-;42476:139;;42203:419;;;:::o;42628:178::-;42768:30;42764:1;42756:6;42752:14;42745:54;42628:178;:::o;42812:366::-;42954:3;42975:67;43039:2;43034:3;42975:67;:::i;:::-;42968:74;;43051:93;43140:3;43051:93;:::i;:::-;43169:2;43164:3;43160:12;43153:19;;42812:366;;;:::o;43184:419::-;43350:4;43388:2;43377:9;43373:18;43365:26;;43437:9;43431:4;43427:20;43423:1;43412:9;43408:17;43401:47;43465:131;43591:4;43465:131;:::i;:::-;43457:139;;43184:419;;;:::o
Swarm Source
ipfs://1c85debc9484070468684e3c8f409ef9ff125182589cd9470e0677bd1e5232ca
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.