Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 20 from a total of 20 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Mint | 20255330 | 103 days ago | IN | 0.00878168 ETH | 0.0018996 | ||||
Mint | 20255103 | 103 days ago | IN | 0.00846404 ETH | 0.00183142 | ||||
Mint | 20255103 | 103 days ago | IN | 0.00846404 ETH | 0.003018 | ||||
Mint | 20137632 | 119 days ago | IN | 0.01921235 ETH | 0.00313533 | ||||
Set Max Callback... | 20007053 | 137 days ago | IN | 0 ETH | 0.00020543 | ||||
Mint | 19986351 | 140 days ago | IN | 0.01875641 ETH | 0.00838516 | ||||
Mint | 19955279 | 145 days ago | IN | 0.01385951 ETH | 0.00570659 | ||||
Mint | 19955190 | 145 days ago | IN | 0.0090281 ETH | 0.00394074 | ||||
Mint | 19946889 | 146 days ago | IN | 0.01039282 ETH | 0.00229907 | ||||
Set Approval For... | 19945607 | 146 days ago | IN | 0 ETH | 0.00018666 | ||||
Set Approval For... | 19937765 | 147 days ago | IN | 0 ETH | 0.00031125 | ||||
Mint | 19937754 | 147 days ago | IN | 0.01306266 ETH | 0.00346379 | ||||
Mint | 19934446 | 147 days ago | IN | 0.01849234 ETH | 0.00658732 | ||||
Mint | 19934420 | 147 days ago | IN | 0.02249745 ETH | 0.01033804 | ||||
Set Max Callback... | 19933026 | 148 days ago | IN | 0 ETH | 0.00077572 | ||||
Mint | 19932997 | 148 days ago | IN | 0.02616394 ETH | 0.01910923 | ||||
Mint | 19932930 | 148 days ago | IN | 0.02433037 ETH | 0.00856457 | ||||
Mint | 19931342 | 148 days ago | IN | 0.05769773 ETH | 0.00867544 | ||||
Start Or Stop Mi... | 19931090 | 148 days ago | IN | 0 ETH | 0.00017834 | ||||
0x60e06040 | 19931068 | 148 days ago | IN | 0 ETH | 0.02068212 |
Latest 14 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
20255330 | 103 days ago | 0.00878168 ETH | ||||
20255103 | 103 days ago | 0.00846404 ETH | ||||
20255103 | 103 days ago | 0.00846404 ETH | ||||
20137632 | 119 days ago | 0.01921235 ETH | ||||
19986351 | 140 days ago | 0.01875641 ETH | ||||
19955279 | 145 days ago | 0.01385951 ETH | ||||
19955190 | 145 days ago | 0.0090281 ETH | ||||
19946889 | 146 days ago | 0.01039282 ETH | ||||
19937754 | 147 days ago | 0.01306266 ETH | ||||
19934446 | 147 days ago | 0.01849234 ETH | ||||
19934420 | 147 days ago | 0.02249745 ETH | ||||
19932997 | 148 days ago | 0.02616394 ETH | ||||
19932930 | 148 days ago | 0.02433037 ETH | ||||
19931342 | 148 days ago | 0.05769773 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
AIGC_NFT_LLM
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-05-23 */ // Sources flattened with hardhat v2.19.2 https://hardhat.org // SPDX-License-Identifier: MIT AND UNLICENSED // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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/contracts/access/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.20; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); } // File @openzeppelin/contracts/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol) pragma solidity ^0.8.20; /** * @dev Standard ERC20 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens. */ interface IERC20Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC20InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC20InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. * @param spender Address that may be allowed to operate on tokens without being their owner. * @param allowance Amount of tokens a `spender` is allowed to operate with. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC20InvalidApprover(address approver); /** * @dev Indicates a failure with the `spender` to be approved. Used in approvals. * @param spender Address that may be allowed to operate on tokens without being their owner. */ error ERC20InvalidSpender(address spender); } /** * @dev Standard ERC721 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens. */ interface IERC721Errors { /** * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. * Used in balance queries. * @param owner Address of the current owner of a token. */ error ERC721InvalidOwner(address owner); /** * @dev Indicates a `tokenId` whose `owner` is the zero address. * @param tokenId Identifier number of a token. */ error ERC721NonexistentToken(uint256 tokenId); /** * @dev Indicates an error related to the ownership over a particular token. Used in transfers. * @param sender Address whose tokens are being transferred. * @param tokenId Identifier number of a token. * @param owner Address of the current owner of a token. */ error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC721InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC721InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param tokenId Identifier number of a token. */ error ERC721InsufficientApproval(address operator, uint256 tokenId); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC721InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC721InvalidOperator(address operator); } /** * @dev Standard ERC1155 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens. */ interface IERC1155Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. * @param tokenId Identifier number of a token. */ error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC1155InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC1155InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param owner Address of the current owner of a token. */ error ERC1155MissingApprovalForAll(address operator, address owner); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC1155InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC1155InvalidOperator(address operator); /** * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. * Used in batch transfers. * @param idsLength Length of the array of token identifiers * @param valuesLength Length of the array of token amounts */ error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength); } // File @openzeppelin/contracts/token/ERC721/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.20; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon * a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or * {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon * a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the address zero. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.20; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/token/ERC721/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.20; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be * reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/utils/introspection/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/utils/math/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol) pragma solidity ^0.8.20; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Muldiv operation overflow. */ error MathOverflowedMulDiv(); enum Rounding { Floor, // Toward negative infinity Ceil, // Toward positive infinity Trunc, // Toward zero Expand // Away from zero } /** * @dev Returns the addition of two unsigned integers, with an overflow flag. */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds towards infinity instead * of rounding towards zero. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { if (b == 0) { // Guarantee the same behavior as in a regular Solidity division. return a / b; } // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or * denominator == 0. * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by * Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0 = x * y; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. if (denominator <= prod1) { revert MathOverflowedMulDiv(); } /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. // Always >= 1. See https://cs.stackexchange.com/q/138556/92363. uint256 twos = denominator & (0 - denominator); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also // works in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded * towards zero. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256 of a positive value rounded towards zero. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); } } /** * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. */ function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { return uint8(rounding) % 2 == 1; } } // File @openzeppelin/contracts/utils/math/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.20; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol) pragma solidity ^0.8.20; /** * @dev String operations. */ library Strings { bytes16 private constant HEX_DIGITS = "0123456789abcdef"; uint8 private constant ADDRESS_LENGTH = 20; /** * @dev The `value` string doesn't fit in the specified `length`. */ error StringsInsufficientHexLength(uint256 value, uint256 length); /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), HEX_DIGITS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toStringSigned(int256 value) internal pure returns (string memory) { return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { uint256 localValue = value; bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = HEX_DIGITS[localValue & 0xf]; localValue >>= 4; } if (localValue != 0) { revert StringsInsufficientHexLength(value, length); } return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal * representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b)); } } // File @openzeppelin/contracts/token/ERC721/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.20; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors { using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; mapping(uint256 tokenId => address) private _owners; mapping(address owner => uint256) private _balances; mapping(uint256 tokenId => address) private _tokenApprovals; mapping(address owner => mapping(address operator => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual returns (uint256) { if (owner == address(0)) { revert ERC721InvalidOwner(address(0)); } return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual returns (address) { return _requireOwned(tokenId); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual returns (string memory) { _requireOwned(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string.concat(baseURI, tokenId.toString()) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual { _approve(to, tokenId, _msgSender()); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual returns (address) { _requireOwned(tokenId); return _getApproved(tokenId); } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } // Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here. address previousOwner = _update(to, tokenId, _msgSender()); if (previousOwner != from) { revert ERC721IncorrectOwner(from, tokenId, previousOwner); } } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual { transferFrom(from, to, tokenId); _checkOnERC721Received(from, to, tokenId, data); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist * * IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the * core ERC721 logic MUST be matched with the use of {_increaseBalance} to keep balances * consistent with ownership. The invariant to preserve is that for any address `a` the value returned by * `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`. */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted. */ function _getApproved(uint256 tokenId) internal view virtual returns (address) { return _tokenApprovals[tokenId]; } /** * @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in * particular (ignoring whether it is owned by `owner`). * * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this * assumption. */ function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) { return spender != address(0) && (owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender); } /** * @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner. * Reverts if `spender` does not have approval from the provided `owner` for the given token or for all its assets * the `spender` for the specific `tokenId`. * * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this * assumption. */ function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual { if (!_isAuthorized(owner, spender, tokenId)) { if (owner == address(0)) { revert ERC721NonexistentToken(tokenId); } else { revert ERC721InsufficientApproval(spender, tokenId); } } } /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that * a uint256 would ever overflow from increments when these increments are bounded to uint128 values. * * WARNING: Increasing an account's balance using this function tends to be paired with an override of the * {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership * remain consistent with one another. */ function _increaseBalance(address account, uint128 value) internal virtual { unchecked { _balances[account] += value; } } /** * @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner * (or `to`) is the zero address. Returns the owner of the `tokenId` before the update. * * The `auth` argument is optional. If the value passed is non 0, then this function will check that * `auth` is either the owner of the token, or approved to operate on the token (by the owner). * * Emits a {Transfer} event. * * NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}. */ function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) { address from = _ownerOf(tokenId); // Perform (optional) operator check if (auth != address(0)) { _checkAuthorized(from, auth, tokenId); } // Execute the update if (from != address(0)) { // Clear approval. No need to re-authorize or emit the Approval event _approve(address(0), tokenId, address(0), false); unchecked { _balances[from] -= 1; } } if (to != address(0)) { unchecked { _balances[to] += 1; } } _owners[tokenId] = to; emit Transfer(from, to, tokenId); return from; } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } address previousOwner = _update(to, tokenId, address(0)); if (previousOwner != address(0)) { revert ERC721InvalidSender(address(0)); } } /** * @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual { _mint(to, tokenId); _checkOnERC721Received(address(0), to, tokenId, data); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal { address previousOwner = _update(address(0), tokenId, address(0)); if (previousOwner == address(0)) { revert ERC721NonexistentToken(tokenId); } } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } address previousOwner = _update(to, tokenId, address(0)); if (previousOwner == address(0)) { revert ERC721NonexistentToken(tokenId); } else if (previousOwner != from) { revert ERC721IncorrectOwner(from, tokenId, previousOwner); } } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients * are aware of the ERC721 standard to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is like {safeTransferFrom} in the sense that it invokes * {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `tokenId` token must exist and be owned by `from`. * - `to` cannot be the zero address. * - `from` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId) internal { _safeTransfer(from, to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual { _transfer(from, to, tokenId); _checkOnERC721Received(from, to, tokenId, data); } /** * @dev Approve `to` to operate on `tokenId` * * The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is * either the owner of the token, or approved to operate on all tokens held by this owner. * * Emits an {Approval} event. * * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. */ function _approve(address to, uint256 tokenId, address auth) internal { _approve(to, tokenId, auth, true); } /** * @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not * emitted in the context of transfers. */ function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual { // Avoid reading the owner unless necessary if (emitEvent || auth != address(0)) { address owner = _requireOwned(tokenId); // We do not use _isAuthorized because single-token approvals should not be able to call approve if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) { revert ERC721InvalidApprover(auth); } if (emitEvent) { emit Approval(owner, to, tokenId); } } _tokenApprovals[tokenId] = to; } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Requirements: * - operator can't be the address zero. * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { if (operator == address(0)) { revert ERC721InvalidOperator(operator); } _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned). * Returns the owner. * * Overrides to ownership logic should be done to {_ownerOf}. */ function _requireOwned(uint256 tokenId) internal view returns (address) { address owner = _ownerOf(tokenId); if (owner == address(0)) { revert ERC721NonexistentToken(tokenId); } return owner; } /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the * recipient doesn't accept the token transfer. The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private { if (to.code.length > 0) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { if (retval != IERC721Receiver.onERC721Received.selector) { revert ERC721InvalidReceiver(to); } } catch (bytes memory reason) { if (reason.length == 0) { revert ERC721InvalidReceiver(to); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } } } // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @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 or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * 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. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @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`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) 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 FailedInnerCall(); } } } // File contracts/IAIOracle.sol // SampleContract.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.9; interface IAIOracle { /// @notice Event emitted upon receiving a callback request through requestCallback. event AICallbackRequest( address indexed account, uint256 indexed requestId, uint256 modelId, bytes input, address callbackContract, uint64 gasLimit, bytes callbackData ); /// @notice Event emitted when the result is uploaded or update. event AICallbackResult( address indexed account, uint256 indexed requestId, address invoker, bytes output ); /** * initiate a request in OAO * @param modelId ID for AI model * @param input input for AI model * @param callbackContract address of callback contract * @param gasLimit gas limitation of calling the callback function * @param callbackData optional, user-defined data, will send back to the callback function * @return requestID */ function requestCallback( uint256 modelId, bytes memory input, address callbackContract, uint64 gasLimit, bytes memory callbackData ) external payable returns (uint256); function estimateFee(uint256 modelId, uint256 gasLimit) external view returns (uint256); function isFinalized(uint256 requestId) external view returns (bool); } // File contracts/AIOracleCallbackReceiver.sol // SampleContract.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.9; /// @notice A base contract for writing a AIOracle app abstract contract AIOracleCallbackReceiver { // Address of the AIOracle contract IAIOracle public immutable aiOracle; // Invalid callback source error error UnauthorizedCallbackSource(IAIOracle expected, IAIOracle found); /// @notice Initialize the contract, binding it to a specified AIOracle contract constructor(IAIOracle _aiOracle) { aiOracle = _aiOracle; } /// @notice Verify this is a callback by the aiOracle contract modifier onlyAIOracleCallback() { IAIOracle foundRelayAddress = IAIOracle(msg.sender); if (foundRelayAddress != aiOracle) { revert UnauthorizedCallbackSource(aiOracle, foundRelayAddress); } _; } /** * @dev the callback function in OAO, should add the modifier onlyAIOracleCallback! * @param requestId Id for the request in OAO (unique per request) * @param output AI model's output * @param callbackData user-defined data (The same as when the user call aiOracle.requestCallback) */ function aiOracleCallback(uint256 requestId, bytes calldata output, bytes calldata callbackData) external virtual; function isFinalized(uint256 requestId) external view returns (bool) { return aiOracle.isFinalized(requestId); } } // File contracts/IERC7007.sol // Original license: SPDX_License_Identifier: UNLICENSED pragma solidity ^0.8.23; /** * @dev Required interface of an ERC7007 compliant contract. */ interface IERC7007 is IERC165, IERC721 { /** * @dev Emitted when AI Generated Content (AIGC) data is added to token at `tokenId`. */ event AigcData( uint256 indexed tokenId, bytes indexed prompt, bytes aigcData, bytes proof ); /** * @dev Add AIGC data to token at `tokenId` given `prompt`, `aigcData` and `proof`. * * Optional: * - `proof` should not include `aigcData` to save gas. * - verify(`prompt`, `aigcData`, `proof`) should return true for zkML scenario. */ function addAigcData( uint256 tokenId, bytes calldata prompt, bytes calldata aigcData, bytes calldata proof ) external; /** * @dev Verify the `prompt`, `aigcData` and `proof`. */ function verify( bytes calldata prompt, bytes calldata aigcData, bytes calldata proof ) external view returns (bool success); } // File contracts/IERC7007Updatable.sol // Original license: SPDX_License_Identifier: UNLICENSED pragma solidity ^0.8.23; /** * @title ERC7007 Token Standard, optional updatable extension */ interface IERC7007Updatable is IERC7007 { /** * @dev Update the `aigcData` of `prompt`. */ function update( bytes calldata prompt, bytes calldata aigcData ) external; /** * @dev Emitted when `tokenId` token is updated. */ event Update( uint256 indexed tokenId, bytes indexed prompt, bytes indexed aigcData ); } // File contracts/IOpmlLib.sol // Original license: SPDX_License_Identifier: UNLICENSED pragma solidity ^0.8.23; interface IOpmlLib { function initOpmlRequest(bytes calldata input) external returns (uint256 requestId); function uploadResult(uint256 requestId, bytes calldata output) external; function startChallenge(uint256 requestId, bytes32 finalState) external returns (uint256 challengeId); function respondState(uint256 challengeId, bytes32 stateHash) external; function proposeState(uint256 challengeId, bytes32 stateHash) external; function assertStateTransition(uint256 challengeId) external; function isFinalized(uint256 requestId) external view returns (bool); function getOutput(uint256 requestId) external view returns (bytes memory output); } // File contracts/AIGC_NFT_LLM.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.23; // ref: https://sepolia.etherscan.io/address/0xe75af5294f4CB4a8423ef8260595a54298c7a2FB#code contract AIGC_NFT_LLM is IERC2981, IERC7007Updatable, AIOracleCallbackReceiver, Ownable, ERC721 { using Address for address; uint256 public immutable aiModelId; address public immutable opmlLib; uint256 public mintPrice; uint256 public totalSupply; bool public hasStartMint; address public royaltyReceiver = 0xe5018913F2fdf33971864804dDB5fcA25C539032; uint256 public royaltyPercentage = 10; // 10% royalty /// @notice Gas limit set on the callback from AIOracle. /// @dev Should be set to the maximum amount of gas your callback might reasonably consume. uint64 public aiOracleCallbackGasLimit = 1000000; // default sd: 500k // mapping(address => uint256) public _mintedCounts; struct AIGC_Token { string prompt; string neg_prompt; string title; uint256 seed; address author; } struct AIOracleRequest { address sender; uint256 modelId; bytes input; bytes output; } mapping(uint256 => AIGC_Token) public AIGC_tokens; // token ID => xx mapping(uint256 => AIOracleRequest) public requests; mapping(bytes => uint256) public promptToTokenId; mapping(uint256 => mapping(string => string)) public prompts; mapping (uint256 => uint256) public tokenIdToRequestId; event promptsUpdated( uint256 requestId, uint256 modelId, string input, string output, bytes callbackData ); event promptRequest( uint256 requestId, address sender, uint256 modelId, string prompt ); constructor( IAIOracle _aiOracle, // 0x0A0f4321214BB6C7811dD8a71cF587bdaF03f0A0 string memory _name, string memory _symbol, uint256 _mintPrice, uint256 _aiModelId, address _opmlLib // 0xF0794e464b0dAa63b84571D729CF42754b2Eb365 ) AIOracleCallbackReceiver(_aiOracle) ERC721(_name, _symbol) Ownable(msg.sender) { mintPrice = _mintPrice; aiModelId = _aiModelId; opmlLib = _opmlLib; } function royaltyInfo(uint256 tokenId, uint256 salePrice) external view override returns (address receiver, uint256 royaltyAmount) { receiver = royaltyReceiver; royaltyAmount = (salePrice * royaltyPercentage) / 100; } // Function to set the royalty receiver function setRoyaltyReceiver(address _receiver) external onlyOwner { royaltyReceiver = _receiver; } function getAIResultFromTokenId(uint256 tokenId) public view returns (string memory) { return prompts[aiModelId][AIGC_tokens[tokenId].prompt]; } function startOrStopMint() external onlyOwner { hasStartMint = !hasStartMint; } function setMaxCallbackGas(uint64 newGas) external onlyOwner { aiOracleCallbackGasLimit = newGas; } /** * @dev See {IERC7007-addAigcData}. */ function addAigcData( uint256 tokenId, bytes calldata prompt, bytes calldata aigcData, bytes calldata proof ) public virtual override { tokenIdToRequestId[tokenId] = IOpmlLib(opmlLib).initOpmlRequest(prompt); IOpmlLib(opmlLib).uploadResult(tokenIdToRequestId[tokenId], aigcData); emit AigcData(tokenId, prompt, aigcData, proof); } /** * @dev See {IERC7007-verify}. */ function verify( bytes calldata prompt, bytes calldata aigcData, bytes calldata proof ) public view virtual override returns (bool success) { uint256 tokenId = promptToTokenId[prompt]; bytes memory output = IOpmlLib(opmlLib).getOutput(tokenIdToRequestId[tokenId]); return IOpmlLib(opmlLib).isFinalized(tokenIdToRequestId[tokenId]) && (keccak256(output) == keccak256(aigcData)); } /** * @dev See {IERC7007Updatable-update}. */ function update( bytes calldata prompt, bytes calldata aigcData ) public virtual override { require(verify(prompt, aigcData, prompt), "ERC7007: invalid aigcData"); // proof argument is not used in verify() function for opML, so we can pass prompt as proof uint256 tokenId = promptToTokenId[prompt]; emit Update(tokenId, prompt, aigcData); } function updateAIOracleCallbackGasLimit(uint64 _gasLimit) external onlyOwner { aiOracleCallbackGasLimit = _gasLimit; } // only the AI Oracle can call this function function aiOracleCallback(uint256 requestId, bytes calldata output, bytes calldata callbackData) external override onlyAIOracleCallback() { AIOracleRequest storage request = requests[requestId]; require(request.sender != address(0), "request not exists"); prompts[aiModelId][string(request.input)] = string(output); emit promptsUpdated(requestId, request.modelId, string(request.input), string(output), callbackData); } function calculateAIResult(string memory prompt) internal { bytes memory input = bytes(prompt); // we do not need to set the callbackData in this example uint256 requestId = aiOracle.requestCallback{value: msg.value}( aiModelId, input, address(this), aiOracleCallbackGasLimit, "" ); AIOracleRequest storage request = requests[requestId]; request.input = input; request.sender = msg.sender; request.modelId = aiModelId; emit promptRequest(requestId, msg.sender, aiModelId, prompt); } function estimateOAOFee() public view returns (uint256) { return aiOracle.estimateFee(aiModelId, aiOracleCallbackGasLimit); } function estimateTotalFee() public view returns (uint256) { return estimateOAOFee() + mintPrice; } /// NFT related function mint(address to, string calldata positive_prompt, string calldata neg_prompt, string calldata title, uint256 seed) external payable returns (uint256 tokenId) { // check time require(hasStartMint, "Sale not started"); string memory prompt = positive_prompt; require(promptToTokenId[bytes(prompt)] == 0, "prompt and seed has already minted"); // check fund require(msg.value >= estimateTotalFee(), "Not enough fund to mint NFT"); // calculate AI result AIGC_tokens[totalSupply] = AIGC_Token(positive_prompt, neg_prompt, title, seed, to); calculateAIResult(prompt); // mint super._safeMint(to, totalSupply); // increase minted count // _mintedCounts[to] ++; totalSupply ++; promptToTokenId[bytes(prompt)] = totalSupply; // actual value is minus 1 return totalSupply - 1; } /// @dev Withdraw. The contract owner can withdraw all ETH from the NFT sale function withdraw() external onlyOwner { Address.sendValue(payable(_msgSender()), address(this).balance); } function tokenURI(uint256 tokenId) override public view returns (string memory) { string memory svg = generateSVG(tokenId); string memory json = generateJSON(tokenId, svg); return string(abi.encodePacked('data:application/json;base64,', json)); } function generateSVG(uint256 tokenId) internal view returns (string memory) { string memory text = getAIResultFromTokenId(tokenId); uint256 length = bytes(text).length; uint256 numLines = (length + 59) / 60; // Calculates the number of lines needed string memory svgPart1 = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: white; font-family: serif; font-size: 12px; }</style><rect width="100%" height="100%" fill="black" /><text x="10" y="10" class="base">'; string memory svgPart2 = ''; for (uint256 i = 0; i < numLines; i++) { uint256 start = i * 60; uint256 end = start + 60; if (end > length) { end = length; } string memory line = substring(text, start, end); svgPart2 = string(abi.encodePacked(svgPart2, '<tspan x="10" dy="20">', line, '</tspan>')); } string memory svgPart3 = '</text></svg>'; return string(abi.encodePacked(svgPart1, svgPart2, svgPart3)); } function generateJSON(uint256 tokenId, string memory svg) internal view returns (string memory) { string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name":"', AIGC_tokens[tokenId].title, '", "attributes": [{"trait_type": "prompt", "value": "', AIGC_tokens[tokenId].prompt, '"}, {"trait_type": "result", "value": "', removeUnwantedCharacters(getAIResultFromTokenId(tokenId)), '"}, {"trait_type": "author", "value": "0x', toAsciiString(AIGC_tokens[tokenId].author), '"}, {"trait_type": "model", "value": "OpenLM"}], "description": "A community-driven initiative, OpenLM promotes open access to large language models, fostering innovation in language technology across diverse sectors.", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(svg)), '"}')))); return json; } function removeUnwantedCharacters(string memory str) internal pure returns (string memory) { bytes memory strBytes = bytes(str); bytes memory result = new bytes(strBytes.length); uint256 index = 0; for (uint256 i = 0; i < strBytes.length; i++) { if (strBytes[i] != "\n" && strBytes[i] != "\r" && strBytes[i] != '"' && strBytes[i] != "'") { result[index] = strBytes[i]; index++; } } bytes memory finalResult = new bytes(index); for (uint256 j = 0; j < index; j++) { finalResult[j] = result[j]; } return string(finalResult); } function substring(string memory str, uint256 startIndex, uint256 endIndex) internal pure returns (string memory) { bytes memory strBytes = bytes(str); bytes memory result = new bytes(endIndex - startIndex); for (uint256 i = startIndex; i < endIndex; i++) { result[i - startIndex] = strBytes[i]; } return string(result); } function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT license // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } } function toAsciiString(address x) pure returns (string memory) { bytes memory s = new bytes(40); for (uint i = 0; i < 20; i++) { bytes1 b = bytes1(uint8(uint(uint160(x)) / (2**(8*(19 - i))))); bytes1 hi = bytes1(uint8(b) / 16); bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi)); s[2*i] = char(hi); s[2*i+1] = char(lo); } return string(s); } function char(bytes1 b) pure returns (bytes1 c) { if (uint8(b) < 10) return bytes1(uint8(b) + 0x30); else return bytes1(uint8(b) + 0x57); } /// [MIT License] /// @title Base64 /// @notice Provides a function for encoding some bytes in base64 /// @author Brecht Devos <[email protected]> library Base64 { bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /// @notice Encodes some bytes to the base64 representation function encode(bytes memory data) internal pure returns (string memory) { uint256 len = data.length; if (len == 0) return ""; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((len + 2) / 3); // Add some extra buffer at the end bytes memory result = new bytes(encodedLen + 32); bytes memory table = TABLE; assembly { let tablePtr := add(table, 1) let resultPtr := add(result, 32) for { let i := 0 } lt(i, len) { } { i := add(i, 3) let input := and(mload(add(data, i)), 0xffffff) let out := mload(add(tablePtr, and(shr(18, input), 0x3F))) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)) out := shl(224, out) mstore(resultPtr, out) resultPtr := add(resultPtr, 4) } switch mod(len, 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } mstore(result, encodedLen) } return string(result); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IAIOracle","name":"_aiOracle","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_mintPrice","type":"uint256"},{"internalType":"uint256","name":"_aiModelId","type":"uint256"},{"internalType":"address","name":"_opmlLib","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721IncorrectOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721InsufficientApproval","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC721InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC721InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721InvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC721InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC721InvalidSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonexistentToken","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"contract IAIOracle","name":"expected","type":"address"},{"internalType":"contract IAIOracle","name":"found","type":"address"}],"name":"UnauthorizedCallbackSource","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"bytes","name":"prompt","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"aigcData","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"proof","type":"bytes"}],"name":"AigcData","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"bytes","name":"prompt","type":"bytes"},{"indexed":true,"internalType":"bytes","name":"aigcData","type":"bytes"}],"name":"Update","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"modelId","type":"uint256"},{"indexed":false,"internalType":"string","name":"prompt","type":"string"}],"name":"promptRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"modelId","type":"uint256"},{"indexed":false,"internalType":"string","name":"input","type":"string"},{"indexed":false,"internalType":"string","name":"output","type":"string"},{"indexed":false,"internalType":"bytes","name":"callbackData","type":"bytes"}],"name":"promptsUpdated","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"AIGC_tokens","outputs":[{"internalType":"string","name":"prompt","type":"string"},{"internalType":"string","name":"neg_prompt","type":"string"},{"internalType":"string","name":"title","type":"string"},{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"address","name":"author","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"prompt","type":"bytes"},{"internalType":"bytes","name":"aigcData","type":"bytes"},{"internalType":"bytes","name":"proof","type":"bytes"}],"name":"addAigcData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"aiModelId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aiOracle","outputs":[{"internalType":"contract IAIOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"bytes","name":"output","type":"bytes"},{"internalType":"bytes","name":"callbackData","type":"bytes"}],"name":"aiOracleCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"aiOracleCallbackGasLimit","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"estimateOAOFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"estimateTotalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAIResultFromTokenId","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasStartMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"}],"name":"isFinalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"positive_prompt","type":"string"},{"internalType":"string","name":"neg_prompt","type":"string"},{"internalType":"string","name":"title","type":"string"},{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"opmlLib","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"promptToTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"string","name":"","type":"string"}],"name":"prompts","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"requests","outputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"modelId","type":"uint256"},{"internalType":"bytes","name":"input","type":"bytes"},{"internalType":"bytes","name":"output","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"newGas","type":"uint64"}],"name":"setMaxCallbackGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"setRoyaltyReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startOrStopMint","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":"","type":"uint256"}],"name":"tokenIdToRequestId","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":[{"internalType":"bytes","name":"prompt","type":"bytes"},{"internalType":"bytes","name":"aigcData","type":"bytes"}],"name":"update","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_gasLimit","type":"uint64"}],"name":"updateAIOracleCallbackGasLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"prompt","type":"bytes"},{"internalType":"bytes","name":"aigcData","type":"bytes"},{"internalType":"bytes","name":"proof","type":"bytes"}],"name":"verify","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60e06040526009805474e5018913f2fdf33971864804ddb5fca25c53903200610100600160a81b0319909116179055600a8055600b80546001600160401b031916620f424017905534801562000053575f80fd5b506040516200417e3803806200417e83398101604081905262000076916200021e565b6001600160a01b03861660805284843380620000ab57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b620000b681620000f6565b506001620000c583826200034a565b506002620000d482826200034a565b50505060079290925560a0526001600160a01b031660c0525062000416915050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200015a575f80fd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011262000181575f80fd5b81516001600160401b03808211156200019e576200019e6200015d565b604051601f8301601f19908116603f01168101908282118183101715620001c957620001c96200015d565b8160405283815260209250866020858801011115620001e6575f80fd5b5f91505b83821015620002095785820183015181830184015290820190620001ea565b5f602085830101528094505050505092915050565b5f805f805f8060c0878903121562000234575f80fd5b8651620002418162000145565b60208801519096506001600160401b03808211156200025e575f80fd5b6200026c8a838b0162000171565b9650604089015191508082111562000282575f80fd5b506200029189828a0162000171565b945050606087015192506080870151915060a0870151620002b28162000145565b809150509295509295509295565b600181811c90821680620002d557607f821691505b602082108103620002f457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200034557805f5260205f20601f840160051c81016020851015620003215750805b601f840160051c820191505b8181101562000342575f81556001016200032d565b50505b505050565b81516001600160401b038111156200036657620003666200015d565b6200037e81620003778454620002c0565b84620002fa565b602080601f831160018114620003b4575f84156200039c5750858301515b5f19600386901b1c1916600185901b1785556200040e565b5f85815260208120601f198616915b82811015620003e457888601518255948401946001909101908401620003c3565b50858210156200040257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60805160a05160c051613cdb620004a35f395f81816103cb0152818161146201528181611500015281816118c4015261196001525f818161071401528181610beb015281816116a10152818161179101528181611d080152611db201525f81816103fe01528181610a69015281816115cf0152818161160c015281816117c90152611cd90152613cdb5ff3fe60806040526004361061026a575f3560e01c80638a71bb2d1161014a578063b0347814116100be578063ca94138b11610078578063ca94138b1461039b578063de8f50a11461079c578063e985e9c5146107bb578063ec3e5f45146107da578063f2fde38b14610811578063f907dd0414610830575f80fd5b8063b0347814146106e4578063b0f7a3ff14610703578063b7b6ccd514610736578063b88d4fde1461074a578063c1d88c4414610769578063c87b56dd1461077d575f80fd5b80639ee74dd11161010f5780639ee74dd11461060d5780639fbc871314610620578063a22cb46514610644578063aa2e084e14610663578063ad72e1a51461069a578063aea30507146106c5575f80fd5b80638a71bb2d1461058a5780638cbc52d91461059f5780638da5cb5b146105be5780638dc251e3146105da57806395d89b41146105f9575f80fd5b80633ccfd60b116101e15780636352211e116101a65780636352211e146104e05780636817c76c146104ff578063702de1e31461051457806370a0823114610528578063715018a61461054757806381d12c581461055b575f80fd5b80633ccfd60b1461043f5780633f37dce21461045357806342842e0e1461047257806358fd416d146104915780635bb4688d146104b0575f80fd5b806323b872dd1161023257806323b872dd1461033e5780632a55205a1461035d5780632cfb20801461039b5780632f03012e146103ba57806331b221cd146103ed57806333727c4d14610420575f80fd5b806301ffc9a71461026e57806306fdde03146102a2578063081812fc146102c3578063095ea7b3146102fa57806318160ddd1461031b575b5f80fd5b348015610279575f80fd5b5061028d61028836600461299f565b610849565b60405190151581526020015b60405180910390f35b3480156102ad575f80fd5b506102b661089a565b6040516102999190612a0e565b3480156102ce575f80fd5b506102e26102dd366004612a20565b61092a565b6040516001600160a01b039091168152602001610299565b348015610305575f80fd5b50610319610314366004612a4d565b610951565b005b348015610326575f80fd5b5061033060085481565b604051908152602001610299565b348015610349575f80fd5b50610319610358366004612a75565b610960565b348015610368575f80fd5b5061037c610377366004612aae565b6109ee565b604080516001600160a01b039093168352602083019190915201610299565b3480156103a6575f80fd5b506103196103b5366004612ace565b610a26565b3480156103c5575f80fd5b506102e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156103f8575f80fd5b506102e27f000000000000000000000000000000000000000000000000000000000000000081565b34801561042b575f80fd5b5061028d61043a366004612a20565b610a51565b34801561044a575f80fd5b50610319610ada565b34801561045e575f80fd5b5061031961046d366004612b38565b610aee565b34801561047d575f80fd5b5061031961048c366004612a75565b610bca565b34801561049c575f80fd5b506102b66104ab366004612a20565b610be9565b3480156104bb575f80fd5b506104cf6104ca366004612a20565b610cd0565b604051610299959493929190612b9e565b3480156104eb575f80fd5b506102e26104fa366004612a20565b610e99565b34801561050a575f80fd5b5061033060075481565b34801561051f575f80fd5b50610330610ea3565b348015610533575f80fd5b50610330610542366004612bf9565b610ebe565b348015610552575f80fd5b50610319610f03565b348015610566575f80fd5b5061057a610575366004612a20565b610f14565b6040516102999493929190612c12565b348015610595575f80fd5b50610330600a5481565b3480156105aa575f80fd5b506102b66105b9366004612cfa565b611052565b3480156105c9575f80fd5b505f546001600160a01b03166102e2565b3480156105e5575f80fd5b506103196105f4366004612bf9565b611105565b348015610604575f80fd5b506102b6611135565b61033061061b366004612d50565b611144565b34801561062b575f80fd5b506009546102e29061010090046001600160a01b031681565b34801561064f575f80fd5b5061031961065e366004612e06565b611440565b34801561066e575f80fd5b5061033061067d366004612e59565b8051602081830181018051600e8252928201919093012091525481565b3480156106a5575f80fd5b506103306106b4366004612a20565b60106020525f908152604090205481565b3480156106d0575f80fd5b506103196106df366004612e8a565b61144b565b3480156106ef575f80fd5b506103196106fe366004612f25565b6115c4565b34801561070e575f80fd5b506103307f000000000000000000000000000000000000000000000000000000000000000081565b348015610741575f80fd5b5061031961174d565b348015610755575f80fd5b50610319610764366004612f98565b611769565b348015610774575f80fd5b50610330611780565b348015610788575f80fd5b506102b6610797366004612a20565b611839565b3480156107a7575f80fd5b5061028d6107b6366004612ffb565b61187d565b3480156107c6575f80fd5b5061028d6107d536600461308d565b611a0c565b3480156107e5575f80fd5b50600b546107f9906001600160401b031681565b6040516001600160401b039091168152602001610299565b34801561081c575f80fd5b5061031961082b366004612bf9565b611a39565b34801561083b575f80fd5b5060095461028d9060ff1681565b5f6001600160e01b031982166380ac58cd60e01b148061087957506001600160e01b03198216635b5e139f60e01b145b8061089457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546108a9906130b5565b80601f01602080910402602001604051908101604052809291908181526020018280546108d5906130b5565b80156109205780601f106108f757610100808354040283529160200191610920565b820191905f5260205f20905b81548152906001019060200180831161090357829003601f168201915b5050505050905090565b5f61093482611a76565b505f828152600560205260409020546001600160a01b0316610894565b61095c828233611aae565b5050565b6001600160a01b03821661098e57604051633250574960e11b81525f60048201526024015b60405180910390fd5b5f61099a838333611abb565b9050836001600160a01b0316816001600160a01b0316146109e8576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610985565b50505050565b600954600a546101009091046001600160a01b0316905f90606490610a139085613101565b610a1d919061312c565b90509250929050565b610a2e611bad565b600b805467ffffffffffffffff19166001600160401b0392909216919091179055565b6040516333727c4d60e01b8152600481018290525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa158015610ab6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610894919061313f565b610ae2611bad565b610aec3347611bd9565b565b610afc84848484888861187d565b610b485760405162461bcd60e51b815260206004820152601960248201527f455243373030373a20696e76616c6964206169676344617461000000000000006044820152606401610985565b5f600e8585604051610b5b92919061315a565b908152604051908190036020018120549150610b7a908490849061315a565b60405180910390208585604051610b9292919061315a565b6040519081900381209083907fd77aab0eeab3a3cbdac072fcdbc34709b18d6c4af91f7869c71cbbb13d71a6b9905f90a45050505050565b610be483838360405180602001604052805f815250611769565b505050565b7f00000000000000000000000000000000000000000000000000000000000000005f908152600f60209081526040808320848452600c909252918290209151606092610c34916131d8565b90815260200160405180910390208054610c4d906130b5565b80601f0160208091040260200160405190810160405280929190818152602001828054610c79906130b5565b8015610cc45780601f10610c9b57610100808354040283529160200191610cc4565b820191905f5260205f20905b815481529060010190602001808311610ca757829003601f168201915b50505050509050919050565b600c6020525f9081526040902080548190610cea906130b5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d16906130b5565b8015610d615780601f10610d3857610100808354040283529160200191610d61565b820191905f5260205f20905b815481529060010190602001808311610d4457829003601f168201915b505050505090806001018054610d76906130b5565b80601f0160208091040260200160405190810160405280929190818152602001828054610da2906130b5565b8015610ded5780601f10610dc457610100808354040283529160200191610ded565b820191905f5260205f20905b815481529060010190602001808311610dd057829003601f168201915b505050505090806002018054610e02906130b5565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2e906130b5565b8015610e795780601f10610e5057610100808354040283529160200191610e79565b820191905f5260205f20905b815481529060010190602001808311610e5c57829003601f168201915b5050505060038301546004909301549192916001600160a01b0316905085565b5f61089482611a76565b5f600754610eaf611780565b610eb991906131e3565b905090565b5f6001600160a01b038216610ee8576040516322718ad960e21b81525f6004820152602401610985565b506001600160a01b03165f9081526004602052604090205490565b610f0b611bad565b610aec5f611c6c565b600d6020525f90815260409020805460018201546002830180546001600160a01b03909316939192610f45906130b5565b80601f0160208091040260200160405190810160405280929190818152602001828054610f71906130b5565b8015610fbc5780601f10610f9357610100808354040283529160200191610fbc565b820191905f5260205f20905b815481529060010190602001808311610f9f57829003601f168201915b505050505090806003018054610fd1906130b5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ffd906130b5565b80156110485780601f1061101f57610100808354040283529160200191611048565b820191905f5260205f20905b81548152906001019060200180831161102b57829003601f168201915b5050505050905084565b600f60209081525f9283526040909220815180830184018051928152908401929093019190912091528054611086906130b5565b80601f01602080910402602001604051908101604052809291908181526020018280546110b2906130b5565b80156110fd5780601f106110d4576101008083540402835291602001916110fd565b820191905f5260205f20905b8154815290600101906020018083116110e057829003601f168201915b505050505081565b61110d611bad565b600980546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6060600280546108a9906130b5565b6009545f9060ff1661118b5760405162461bcd60e51b815260206004820152601060248201526f14d85b19481b9bdd081cdd185c9d195960821b6044820152606401610985565b5f88888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604051929350600e926111d59250849150613211565b9081526020016040518091039020545f1461123d5760405162461bcd60e51b815260206004820152602260248201527f70726f6d707420616e6420736565642068617320616c7265616479206d696e74604482015261195960f21b6064820152608401610985565b611245610ea3565b3410156112945760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f7567682066756e6420746f206d696e74204e465400000000006044820152606401610985565b6040518060a001604052808a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250604080516020601f8b0181900481028201810190925289815291810191908a908a90819084018382808284375f92019190915250505090825250604080516020601f8901819004810282018101909252878152918101919088908890819084018382808284375f92018290525093855250505060208083018790526001600160a01b038e166040938401526008548252600c9052208151819061137a9082613270565b506020820151600182019061138f9082613270565b50604082015160028201906113a49082613270565b5060608201516003820155608090910151600490910180546001600160a01b0319166001600160a01b039092169190911790556113e081611cbb565b6113ec8a600854611e18565b60088054905f6113fb8361332f565b9190505550600854600e826040516114139190613211565b9081526040519081900360200190205560085461143290600190613347565b9a9950505050505050505050565b61095c338383611e31565b60405163c4be5cab60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c4be5cab906114999089908990600401613382565b6020604051808303815f875af11580156114b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114d99190613395565b5f888152601060205260409081902082905551630901e0f960e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163480f07c8916115389190889088906004016133ac565b5f604051808303815f87803b15801561154f575f80fd5b505af1158015611561573d5f803e3d5ffd5b50505050858560405161157592919061315a565b6040518091039020877f65deac95b53ba76b9cdc6cf446af81731e1218c91eaf9811a95d28bde23b893e868686866040516115b394939291906133ce565b60405180910390a350505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001681146116415760405163432e033760e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015282166024820152604401610985565b5f868152600d6020526040902080546001600160a01b031661169a5760405162461bcd60e51b815260206004820152601260248201527172657175657374206e6f742065786973747360701b6044820152606401610985565b8585600f5f7f000000000000000000000000000000000000000000000000000000000000000081526020019081526020015f20836002016040516116de91906131d8565b908152602001604051809103902091826116f99291906133f4565b507faf2b2381ddcb18a2b18a7826186fd216acdd9c852a8c7a9a49e7eab127f96ccf878260010154836002018989898960405161173c97969594939291906134ad565b60405180910390a150505050505050565b611755611bad565b6009805460ff19811660ff90911615179055565b611774848484610960565b6109e884848484611ecf565b600b54604051620e1d8d60e41b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160401b0390911660248201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169062e1d8d090604401602060405180830381865afa158015611815573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb99190613395565b60605f61184583611ff5565b90505f611852848361211b565b9050806040516020016118659190613564565b60405160208183030381529060405292505050919050565b5f80600e888860405161189192919061315a565b9081526040805160209281900383018120545f8181526010909452918320546317861f8760e01b825260048201529092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906317861f87906024015f60405180830381865afa158015611910573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261193791908101906135a8565b5f83815260106020526040908190205490516333727c4d60e01b81529192506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916333727c4d916119979160040190815260200190565b602060405180830381865afa1580156119b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d6919061313f565b80156119ff575086866040516119ed92919061315a565b60405180910390208180519060200120145b9998505050505050505050565b6001600160a01b039182165f90815260066020908152604080832093909416825291909152205460ff1690565b611a41611bad565b6001600160a01b038116611a6a57604051631e4fbdf760e01b81525f6004820152602401610985565b611a7381611c6c565b50565b5f818152600360205260408120546001600160a01b03168061089457604051637e27328960e01b815260048101849052602401610985565b610be483838360016121a2565b5f828152600360205260408120546001600160a01b0390811690831615611ae757611ae78184866122a6565b6001600160a01b03811615611b2157611b025f855f806121a2565b6001600160a01b0381165f90815260046020526040902080545f190190555b6001600160a01b03851615611b4f576001600160a01b0385165f908152600460205260409020805460010190555b5f8481526003602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b5f546001600160a01b03163314610aec5760405163118cdaa760e01b8152336004820152602401610985565b80471015611bfc5760405163cd78605960e01b8152306004820152602401610985565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611c45576040519150601f19603f3d011682016040523d82523d5f602084013e611c4a565b606091505b5050905080610be457604051630a12f52160e11b815260040160405180910390fd5b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600b54604051632dca9c0360e11b815282915f916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691635b953806913491611d3e917f000000000000000000000000000000000000000000000000000000000000000091889130916001600160401b031690600401613610565b60206040518083038185885af1158015611d5a573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611d7f9190613395565b5f818152600d6020526040902090915060028101611d9d8482613270565b5080546001600160a01b0319163390811782557f0000000000000000000000000000000000000000000000000000000000000000600183018190556040517fa0faead83d70148ae18b694377f9bef079251342ab90e14af0f9ef68b891269f92611e0a9286928990613660565b60405180910390a150505050565b61095c828260405180602001604052805f81525061230a565b6001600160a01b038216611e6357604051630b61174360e31b81526001600160a01b0383166004820152602401610985565b6001600160a01b038381165f81815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b156109e857604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290611f11903390889087908790600401613696565b6020604051808303815f875af1925050508015611f4b575060408051601f3d908101601f19168201909252611f48918101906136c8565b60015b611fb2573d808015611f78576040519150601f19603f3d011682016040523d82523d5f602084013e611f7d565b606091505b5080515f03611faa57604051633250574960e11b81526001600160a01b0385166004820152602401610985565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b14611fee57604051633250574960e11b81526001600160a01b0385166004820152602401610985565b5050505050565b60605f61200183610be9565b80519091505f603c61201483603b6131e3565b61201e919061312c565b90505f60405180610120016040528060fd8152602001613b6960fd913960408051602081019091525f808252919250905b838110156120c0575f61206382603c613101565b90505f61207182603c6131e3565b90508681111561207e5750855b5f61208a898484612320565b9050848160405160200161209f9291906136e3565b6040516020818303038152906040529450505050808060010191505061204f565b505f6040518060400160405280600d81526020016c1e17ba32bc3a1f1e17b9bb339f60991b81525090508282826040516020016120ff93929190613748565b6040516020818303038152906040529650505050505050919050565b5f828152600c602052604081206060919061219a90600281019061214661214188610be9565b6123e0565b5f888152600c6020526040902060040154612169906001600160a01b03166125f3565b6121728861272c565b60405160200161218695949392919061378a565b60405160208183030381529060405261272c565b949350505050565b80806121b657506001600160a01b03821615155b15612277575f6121c584611a76565b90506001600160a01b038316158015906121f15750826001600160a01b0316816001600160a01b031614155b801561220457506122028184611a0c565b155b1561222d5760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610985565b81156122755783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260056020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6122b183838361288e565b610be4576001600160a01b0383166122df57604051637e27328960e01b815260048101829052602401610985565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610985565b61231483836128ef565b610be45f848484611ecf565b6060835f61232e8585613347565b6001600160401b0381111561234557612345612c55565b6040519080825280601f01601f19166020018201604052801561236f576020820181803683370190505b509050845b848110156123d65782818151811061238e5761238e6139fa565b01602001516001600160f81b031916826123a88884613347565b815181106123b8576123b86139fa565b60200101906001600160f81b03191690815f1a905350600101612374565b5095945050505050565b60605f8290505f81516001600160401b0381111561240057612400612c55565b6040519080825280601f01601f19166020018201604052801561242a576020820181803683370190505b5090505f805b83518110156125555783818151811061244b5761244b6139fa565b6020910101516001600160f81b031916600560f91b14801590612493575083818151811061247b5761247b6139fa565b6020910101516001600160f81b031916600d60f81b14155b80156124c457508381815181106124ac576124ac6139fa565b6020910101516001600160f81b031916601160f91b14155b80156124f557508381815181106124dd576124dd6139fa565b6020910101516001600160f81b031916602760f81b14155b1561254d5783818151811061250c5761250c6139fa565b602001015160f81c60f81b838381518110612529576125296139fa565b60200101906001600160f81b03191690815f1a905350816125498161332f565b9250505b600101612430565b505f816001600160401b0381111561256f5761256f612c55565b6040519080825280601f01601f191660200182016040528015612599576020820181803683370190505b5090505f5b828110156123d6578381815181106125b8576125b86139fa565b602001015160f81c60f81b8282815181106125d5576125d56139fa565b60200101906001600160f81b03191690815f1a90535060010161259e565b60408051602880825260608281019093525f91906020820181803683370190505090505f5b6014811015612725575f61262d826013613347565b612638906008613101565b612643906002613aee565b612656906001600160a01b03871661312c565b60f81b90505f60108260f81c61266c9190613af9565b60f81b90505f8160f81c60106126829190613b1a565b8360f81c6126909190613b36565b60f81b905061269e82612950565b856126aa866002613101565b815181106126ba576126ba6139fa565b60200101906001600160f81b03191690815f1a9053506126d981612950565b856126e5866002613101565b6126f09060016131e3565b81518110612700576127006139fa565b60200101906001600160f81b03191690815f1a90535050600190920191506126189050565b5092915050565b80516060905f81900361274e57505060408051602081019091525f8152919050565b5f600361275c8360026131e3565b612766919061312c565b612771906004613101565b90505f61277f8260206131e3565b6001600160401b0381111561279657612796612c55565b6040519080825280601f01601f1916602001820160405280156127c0576020820181803683370190505b5090505f604051806060016040528060408152602001613c6660409139905060018101602083015f5b8681101561284a576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016127e9565b506003860660018114612864576002811461287557612880565b613d3d60f01b600119830152612880565b603d60f81b5f198301525b505050918152949350505050565b5f6001600160a01b0383161580159061219a5750826001600160a01b0316846001600160a01b031614806128c757506128c78484611a0c565b8061219a5750505f908152600560205260409020546001600160a01b03908116911614919050565b6001600160a01b03821661291857604051633250574960e11b81525f6004820152602401610985565b5f61292483835f611abb565b90506001600160a01b03811615610be4576040516339e3563760e11b81525f6004820152602401610985565b5f600a60f883901c10156129765761296d60f883901c6030613b4f565b60f81b92915050565b61296d60f883901c6057613b4f565b919050565b6001600160e01b031981168114611a73575f80fd5b5f602082840312156129af575f80fd5b81356129ba8161298a565b9392505050565b5f5b838110156129db5781810151838201526020016129c3565b50505f910152565b5f81518084526129fa8160208601602086016129c1565b601f01601f19169290920160200192915050565b602081525f6129ba60208301846129e3565b5f60208284031215612a30575f80fd5b5035919050565b80356001600160a01b0381168114612985575f80fd5b5f8060408385031215612a5e575f80fd5b612a6783612a37565b946020939093013593505050565b5f805f60608486031215612a87575f80fd5b612a9084612a37565b9250612a9e60208501612a37565b9150604084013590509250925092565b5f8060408385031215612abf575f80fd5b50508035926020909101359150565b5f60208284031215612ade575f80fd5b81356001600160401b03811681146129ba575f80fd5b5f8083601f840112612b04575f80fd5b5081356001600160401b03811115612b1a575f80fd5b602083019150836020828501011115612b31575f80fd5b9250929050565b5f805f8060408587031215612b4b575f80fd5b84356001600160401b0380821115612b61575f80fd5b612b6d88838901612af4565b90965094506020870135915080821115612b85575f80fd5b50612b9287828801612af4565b95989497509550505050565b60a081525f612bb060a08301886129e3565b8281036020840152612bc281886129e3565b90508281036040840152612bd681876129e3565b606084019590955250506001600160a01b03919091166080909101529392505050565b5f60208284031215612c09575f80fd5b6129ba82612a37565b60018060a01b0385168152836020820152608060408201525f612c3860808301856129e3565b8281036060840152612c4a81856129e3565b979650505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715612c9157612c91612c55565b604052919050565b5f6001600160401b03821115612cb157612cb1612c55565b50601f01601f191660200190565b5f612cd1612ccc84612c99565b612c69565b9050828152838383011115612ce4575f80fd5b828260208301375f602084830101529392505050565b5f8060408385031215612d0b575f80fd5b8235915060208301356001600160401b03811115612d27575f80fd5b8301601f81018513612d37575f80fd5b612d4685823560208401612cbf565b9150509250929050565b5f805f805f805f8060a0898b031215612d67575f80fd5b612d7089612a37565b975060208901356001600160401b0380821115612d8b575f80fd5b612d978c838d01612af4565b909950975060408b0135915080821115612daf575f80fd5b612dbb8c838d01612af4565b909750955060608b0135915080821115612dd3575f80fd5b50612de08b828c01612af4565b999c989b50969995989497949560800135949350505050565b8015158114611a73575f80fd5b5f8060408385031215612e17575f80fd5b612e2083612a37565b91506020830135612e3081612df9565b809150509250929050565b5f82601f830112612e4a575f80fd5b6129ba83833560208501612cbf565b5f60208284031215612e69575f80fd5b81356001600160401b03811115612e7e575f80fd5b61219a84828501612e3b565b5f805f805f805f6080888a031215612ea0575f80fd5b8735965060208801356001600160401b0380821115612ebd575f80fd5b612ec98b838c01612af4565b909850965060408a0135915080821115612ee1575f80fd5b612eed8b838c01612af4565b909650945060608a0135915080821115612f05575f80fd5b50612f128a828b01612af4565b989b979a50959850939692959293505050565b5f805f805f60608688031215612f39575f80fd5b8535945060208601356001600160401b0380821115612f56575f80fd5b612f6289838a01612af4565b90965094506040880135915080821115612f7a575f80fd5b50612f8788828901612af4565b969995985093965092949392505050565b5f805f8060808587031215612fab575f80fd5b612fb485612a37565b9350612fc260208601612a37565b92506040850135915060608501356001600160401b03811115612fe3575f80fd5b612fef87828801612e3b565b91505092959194509250565b5f805f805f8060608789031215613010575f80fd5b86356001600160401b0380821115613026575f80fd5b6130328a838b01612af4565b9098509650602089013591508082111561304a575f80fd5b6130568a838b01612af4565b9096509450604089013591508082111561306e575f80fd5b5061307b89828a01612af4565b979a9699509497509295939492505050565b5f806040838503121561309e575f80fd5b6130a783612a37565b9150610a1d60208401612a37565b600181811c908216806130c957607f821691505b6020821081036130e757634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610894576108946130ed565b634e487b7160e01b5f52601260045260245ffd5b5f8261313a5761313a613118565b500490565b5f6020828403121561314f575f80fd5b81516129ba81612df9565b818382375f9101908152919050565b5f8154613175816130b5565b6001828116801561318d57600181146131a2576131ce565b60ff19841687528215158302870194506131ce565b855f526020805f205f5b858110156131c55781548a8201529084019082016131ac565b50505082870194505b5050505092915050565b5f6129ba8284613169565b80820180821115610894576108946130ed565b5f81516132078185602086016129c1565b9290920192915050565b5f82516132228184602087016129c1565b9190910192915050565b601f821115610be457805f5260205f20601f840160051c810160208510156132515750805b601f840160051c820191505b81811015611fee575f815560010161325d565b81516001600160401b0381111561328957613289612c55565b61329d8161329784546130b5565b8461322c565b602080601f8311600181146132d0575f84156132b95750858301515b5f19600386901b1c1916600185901b178555613327565b5f85815260208120601f198616915b828110156132fe578886015182559484019460019091019084016132df565b508582101561331b57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60018201613340576133406130ed565b5060010190565b81810381811115610894576108946130ed565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f61219a60208301848661335a565b5f602082840312156133a5575f80fd5b5051919050565b838152604060208201525f6133c560408301848661335a565b95945050505050565b604081525f6133e160408301868861335a565b8281036020840152612c4a81858761335a565b6001600160401b0383111561340b5761340b612c55565b61341f8361341983546130b5565b8361322c565b5f601f841160018114613450575f85156134395750838201355b5f19600387901b1c1916600186901b178355611fee565b5f83815260208120601f198716915b8281101561347f578685013582556020948501946001909201910161345f565b508682101561349b575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b8781525f602088602084015260a060408401525f88546134cc816130b5565b8060a087015260c060018084165f81146134ed576001811461350957613536565b60ff19851660c08a015260c084151560051b8a01019550613536565b8d5f5260205f205f5b8581101561352d5781548b8201860152908301908801613512565b8a0160c0019650505b5050505050838103606085015261354e81888a61335a565b915050828103608084015261143281858761335a565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f825161359b81601d8501602087016129c1565b91909101601d0192915050565b5f602082840312156135b8575f80fd5b81516001600160401b038111156135cd575f80fd5b8201601f810184136135dd575f80fd5b80516135eb612ccc82612c99565b8181528560208385010111156135ff575f80fd5b6133c58260208301602086016129c1565b84815260a060208201525f61362860a08301866129e3565b6001600160a01b03949094166040830152506001600160401b039190911660608201528082036080909101525f815260200192915050565b84815260018060a01b0384166020820152826040820152608060608201525f61368c60808301846129e3565b9695505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061368c908301846129e3565b5f602082840312156136d8575f80fd5b81516129ba8161298a565b5f83516136f48184602088016129c1565b751e3a39b830b7103c1e9118981110323c9e911918111f60511b90830190815283516137278160168401602088016129c1565b671e17ba39b830b71f60c11b60169290910191820152601e01949350505050565b5f84516137598184602089016129c1565b84519083019061376d8183602089016129c1565b84519101906137808183602088016129c1565b0195945050505050565b683d913730b6b2911d1160b91b81525f6137a76009830188613169565b7f222c202261747472696275746573223a205b7b2274726169745f74797065223a8152741011383937b6b83a111610113b30b63ab2911d101160591b60208201526137f56035820188613169565b90507f227d2c207b2274726169745f74797065223a2022726573756c74222c20227661815266363ab2911d101160c91b6020820152855161383d816027840160208a016129c1565b7f227d2c207b2274726169745f74797065223a2022617574686f72222c2022766160279290910191820152680d8eaca4474404460f60bb1b6047820152845161388d8160508401602089016129c1565b7f227d2c207b2274726169745f74797065223a20226d6f64656c222c202276616c605092909101918201527f7565223a20224f70656e4c4d227d5d2c2020226465736372697074696f6e223a60708201527f20224120636f6d6d756e6974792d64726976656e20696e69746961746976652c60908201527f204f70656e4c4d2070726f6d6f746573206f70656e2061636365737320746f2060b08201527f6c61726765206c616e6775616765206d6f64656c732c20666f73746572696e6760d08201527f20696e6e6f766174696f6e20696e206c616e677561676520746563686e6f6c6f60f08201527f6779206163726f7373206469766572736520736563746f72732e222c2022696d6101108201527f616765223a2022646174613a696d6167652f7376672b786d6c3b626173653634610130820152600b60fa1b6101508201526139ee6139e06101518301866131f6565b61227d60f01b815260020190565b98975050505050505050565b634e487b7160e01b5f52603260045260245ffd5b600181815b80851115613a4857815f1904821115613a2e57613a2e6130ed565b80851615613a3b57918102915b93841c9390800290613a13565b509250929050565b5f82613a5e57506001610894565b81613a6a57505f610894565b8160018114613a805760028114613a8a57613aa6565b6001915050610894565b60ff841115613a9b57613a9b6130ed565b50506001821b610894565b5060208310610133831016604e8410600b8410161715613ac9575081810a610894565b613ad38383613a0e565b805f1904821115613ae657613ae66130ed565b029392505050565b5f6129ba8383613a50565b5f60ff831680613b0b57613b0b613118565b8060ff84160491505092915050565b60ff8181168382160290811690818114612725576127256130ed565b60ff8281168282160390811115610894576108946130ed565b60ff8181168382160190811115610894576108946130ed56fe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313270783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2231302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220980c8884994ba0cfe8a0c29296d1997e4fb2bc132d37eea4739a95069c6b2e4064736f6c634300081700330000000000000000000000000a0f4321214bb6c7811dd8a71cf587bdaf03f0a000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000c3287bdef03b925a7c7f54791edadcd88e632ccd00000000000000000000000000000000000000000000000000000000000000064f70656e4c4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034f4c4d0000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061026a575f3560e01c80638a71bb2d1161014a578063b0347814116100be578063ca94138b11610078578063ca94138b1461039b578063de8f50a11461079c578063e985e9c5146107bb578063ec3e5f45146107da578063f2fde38b14610811578063f907dd0414610830575f80fd5b8063b0347814146106e4578063b0f7a3ff14610703578063b7b6ccd514610736578063b88d4fde1461074a578063c1d88c4414610769578063c87b56dd1461077d575f80fd5b80639ee74dd11161010f5780639ee74dd11461060d5780639fbc871314610620578063a22cb46514610644578063aa2e084e14610663578063ad72e1a51461069a578063aea30507146106c5575f80fd5b80638a71bb2d1461058a5780638cbc52d91461059f5780638da5cb5b146105be5780638dc251e3146105da57806395d89b41146105f9575f80fd5b80633ccfd60b116101e15780636352211e116101a65780636352211e146104e05780636817c76c146104ff578063702de1e31461051457806370a0823114610528578063715018a61461054757806381d12c581461055b575f80fd5b80633ccfd60b1461043f5780633f37dce21461045357806342842e0e1461047257806358fd416d146104915780635bb4688d146104b0575f80fd5b806323b872dd1161023257806323b872dd1461033e5780632a55205a1461035d5780632cfb20801461039b5780632f03012e146103ba57806331b221cd146103ed57806333727c4d14610420575f80fd5b806301ffc9a71461026e57806306fdde03146102a2578063081812fc146102c3578063095ea7b3146102fa57806318160ddd1461031b575b5f80fd5b348015610279575f80fd5b5061028d61028836600461299f565b610849565b60405190151581526020015b60405180910390f35b3480156102ad575f80fd5b506102b661089a565b6040516102999190612a0e565b3480156102ce575f80fd5b506102e26102dd366004612a20565b61092a565b6040516001600160a01b039091168152602001610299565b348015610305575f80fd5b50610319610314366004612a4d565b610951565b005b348015610326575f80fd5b5061033060085481565b604051908152602001610299565b348015610349575f80fd5b50610319610358366004612a75565b610960565b348015610368575f80fd5b5061037c610377366004612aae565b6109ee565b604080516001600160a01b039093168352602083019190915201610299565b3480156103a6575f80fd5b506103196103b5366004612ace565b610a26565b3480156103c5575f80fd5b506102e27f000000000000000000000000c3287bdef03b925a7c7f54791edadcd88e632ccd81565b3480156103f8575f80fd5b506102e27f0000000000000000000000000a0f4321214bb6c7811dd8a71cf587bdaf03f0a081565b34801561042b575f80fd5b5061028d61043a366004612a20565b610a51565b34801561044a575f80fd5b50610319610ada565b34801561045e575f80fd5b5061031961046d366004612b38565b610aee565b34801561047d575f80fd5b5061031961048c366004612a75565b610bca565b34801561049c575f80fd5b506102b66104ab366004612a20565b610be9565b3480156104bb575f80fd5b506104cf6104ca366004612a20565b610cd0565b604051610299959493929190612b9e565b3480156104eb575f80fd5b506102e26104fa366004612a20565b610e99565b34801561050a575f80fd5b5061033060075481565b34801561051f575f80fd5b50610330610ea3565b348015610533575f80fd5b50610330610542366004612bf9565b610ebe565b348015610552575f80fd5b50610319610f03565b348015610566575f80fd5b5061057a610575366004612a20565b610f14565b6040516102999493929190612c12565b348015610595575f80fd5b50610330600a5481565b3480156105aa575f80fd5b506102b66105b9366004612cfa565b611052565b3480156105c9575f80fd5b505f546001600160a01b03166102e2565b3480156105e5575f80fd5b506103196105f4366004612bf9565b611105565b348015610604575f80fd5b506102b6611135565b61033061061b366004612d50565b611144565b34801561062b575f80fd5b506009546102e29061010090046001600160a01b031681565b34801561064f575f80fd5b5061031961065e366004612e06565b611440565b34801561066e575f80fd5b5061033061067d366004612e59565b8051602081830181018051600e8252928201919093012091525481565b3480156106a5575f80fd5b506103306106b4366004612a20565b60106020525f908152604090205481565b3480156106d0575f80fd5b506103196106df366004612e8a565b61144b565b3480156106ef575f80fd5b506103196106fe366004612f25565b6115c4565b34801561070e575f80fd5b506103307f000000000000000000000000000000000000000000000000000000000000000d81565b348015610741575f80fd5b5061031961174d565b348015610755575f80fd5b50610319610764366004612f98565b611769565b348015610774575f80fd5b50610330611780565b348015610788575f80fd5b506102b6610797366004612a20565b611839565b3480156107a7575f80fd5b5061028d6107b6366004612ffb565b61187d565b3480156107c6575f80fd5b5061028d6107d536600461308d565b611a0c565b3480156107e5575f80fd5b50600b546107f9906001600160401b031681565b6040516001600160401b039091168152602001610299565b34801561081c575f80fd5b5061031961082b366004612bf9565b611a39565b34801561083b575f80fd5b5060095461028d9060ff1681565b5f6001600160e01b031982166380ac58cd60e01b148061087957506001600160e01b03198216635b5e139f60e01b145b8061089457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546108a9906130b5565b80601f01602080910402602001604051908101604052809291908181526020018280546108d5906130b5565b80156109205780601f106108f757610100808354040283529160200191610920565b820191905f5260205f20905b81548152906001019060200180831161090357829003601f168201915b5050505050905090565b5f61093482611a76565b505f828152600560205260409020546001600160a01b0316610894565b61095c828233611aae565b5050565b6001600160a01b03821661098e57604051633250574960e11b81525f60048201526024015b60405180910390fd5b5f61099a838333611abb565b9050836001600160a01b0316816001600160a01b0316146109e8576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610985565b50505050565b600954600a546101009091046001600160a01b0316905f90606490610a139085613101565b610a1d919061312c565b90509250929050565b610a2e611bad565b600b805467ffffffffffffffff19166001600160401b0392909216919091179055565b6040516333727c4d60e01b8152600481018290525f907f0000000000000000000000000a0f4321214bb6c7811dd8a71cf587bdaf03f0a06001600160a01b0316906333727c4d90602401602060405180830381865afa158015610ab6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610894919061313f565b610ae2611bad565b610aec3347611bd9565b565b610afc84848484888861187d565b610b485760405162461bcd60e51b815260206004820152601960248201527f455243373030373a20696e76616c6964206169676344617461000000000000006044820152606401610985565b5f600e8585604051610b5b92919061315a565b908152604051908190036020018120549150610b7a908490849061315a565b60405180910390208585604051610b9292919061315a565b6040519081900381209083907fd77aab0eeab3a3cbdac072fcdbc34709b18d6c4af91f7869c71cbbb13d71a6b9905f90a45050505050565b610be483838360405180602001604052805f815250611769565b505050565b7f000000000000000000000000000000000000000000000000000000000000000d5f908152600f60209081526040808320848452600c909252918290209151606092610c34916131d8565b90815260200160405180910390208054610c4d906130b5565b80601f0160208091040260200160405190810160405280929190818152602001828054610c79906130b5565b8015610cc45780601f10610c9b57610100808354040283529160200191610cc4565b820191905f5260205f20905b815481529060010190602001808311610ca757829003601f168201915b50505050509050919050565b600c6020525f9081526040902080548190610cea906130b5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d16906130b5565b8015610d615780601f10610d3857610100808354040283529160200191610d61565b820191905f5260205f20905b815481529060010190602001808311610d4457829003601f168201915b505050505090806001018054610d76906130b5565b80601f0160208091040260200160405190810160405280929190818152602001828054610da2906130b5565b8015610ded5780601f10610dc457610100808354040283529160200191610ded565b820191905f5260205f20905b815481529060010190602001808311610dd057829003601f168201915b505050505090806002018054610e02906130b5565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2e906130b5565b8015610e795780601f10610e5057610100808354040283529160200191610e79565b820191905f5260205f20905b815481529060010190602001808311610e5c57829003601f168201915b5050505060038301546004909301549192916001600160a01b0316905085565b5f61089482611a76565b5f600754610eaf611780565b610eb991906131e3565b905090565b5f6001600160a01b038216610ee8576040516322718ad960e21b81525f6004820152602401610985565b506001600160a01b03165f9081526004602052604090205490565b610f0b611bad565b610aec5f611c6c565b600d6020525f90815260409020805460018201546002830180546001600160a01b03909316939192610f45906130b5565b80601f0160208091040260200160405190810160405280929190818152602001828054610f71906130b5565b8015610fbc5780601f10610f9357610100808354040283529160200191610fbc565b820191905f5260205f20905b815481529060010190602001808311610f9f57829003601f168201915b505050505090806003018054610fd1906130b5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ffd906130b5565b80156110485780601f1061101f57610100808354040283529160200191611048565b820191905f5260205f20905b81548152906001019060200180831161102b57829003601f168201915b5050505050905084565b600f60209081525f9283526040909220815180830184018051928152908401929093019190912091528054611086906130b5565b80601f01602080910402602001604051908101604052809291908181526020018280546110b2906130b5565b80156110fd5780601f106110d4576101008083540402835291602001916110fd565b820191905f5260205f20905b8154815290600101906020018083116110e057829003601f168201915b505050505081565b61110d611bad565b600980546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6060600280546108a9906130b5565b6009545f9060ff1661118b5760405162461bcd60e51b815260206004820152601060248201526f14d85b19481b9bdd081cdd185c9d195960821b6044820152606401610985565b5f88888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604051929350600e926111d59250849150613211565b9081526020016040518091039020545f1461123d5760405162461bcd60e51b815260206004820152602260248201527f70726f6d707420616e6420736565642068617320616c7265616479206d696e74604482015261195960f21b6064820152608401610985565b611245610ea3565b3410156112945760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f7567682066756e6420746f206d696e74204e465400000000006044820152606401610985565b6040518060a001604052808a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250604080516020601f8b0181900481028201810190925289815291810191908a908a90819084018382808284375f92019190915250505090825250604080516020601f8901819004810282018101909252878152918101919088908890819084018382808284375f92018290525093855250505060208083018790526001600160a01b038e166040938401526008548252600c9052208151819061137a9082613270565b506020820151600182019061138f9082613270565b50604082015160028201906113a49082613270565b5060608201516003820155608090910151600490910180546001600160a01b0319166001600160a01b039092169190911790556113e081611cbb565b6113ec8a600854611e18565b60088054905f6113fb8361332f565b9190505550600854600e826040516114139190613211565b9081526040519081900360200190205560085461143290600190613347565b9a9950505050505050505050565b61095c338383611e31565b60405163c4be5cab60e01b81526001600160a01b037f000000000000000000000000c3287bdef03b925a7c7f54791edadcd88e632ccd169063c4be5cab906114999089908990600401613382565b6020604051808303815f875af11580156114b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114d99190613395565b5f888152601060205260409081902082905551630901e0f960e31b81526001600160a01b037f000000000000000000000000c3287bdef03b925a7c7f54791edadcd88e632ccd169163480f07c8916115389190889088906004016133ac565b5f604051808303815f87803b15801561154f575f80fd5b505af1158015611561573d5f803e3d5ffd5b50505050858560405161157592919061315a565b6040518091039020877f65deac95b53ba76b9cdc6cf446af81731e1218c91eaf9811a95d28bde23b893e868686866040516115b394939291906133ce565b60405180910390a350505050505050565b336001600160a01b037f0000000000000000000000000a0f4321214bb6c7811dd8a71cf587bdaf03f0a01681146116415760405163432e033760e11b81526001600160a01b037f0000000000000000000000000a0f4321214bb6c7811dd8a71cf587bdaf03f0a08116600483015282166024820152604401610985565b5f868152600d6020526040902080546001600160a01b031661169a5760405162461bcd60e51b815260206004820152601260248201527172657175657374206e6f742065786973747360701b6044820152606401610985565b8585600f5f7f000000000000000000000000000000000000000000000000000000000000000d81526020019081526020015f20836002016040516116de91906131d8565b908152602001604051809103902091826116f99291906133f4565b507faf2b2381ddcb18a2b18a7826186fd216acdd9c852a8c7a9a49e7eab127f96ccf878260010154836002018989898960405161173c97969594939291906134ad565b60405180910390a150505050505050565b611755611bad565b6009805460ff19811660ff90911615179055565b611774848484610960565b6109e884848484611ecf565b600b54604051620e1d8d60e41b81527f000000000000000000000000000000000000000000000000000000000000000d60048201526001600160401b0390911660248201525f907f0000000000000000000000000a0f4321214bb6c7811dd8a71cf587bdaf03f0a06001600160a01b03169062e1d8d090604401602060405180830381865afa158015611815573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb99190613395565b60605f61184583611ff5565b90505f611852848361211b565b9050806040516020016118659190613564565b60405160208183030381529060405292505050919050565b5f80600e888860405161189192919061315a565b9081526040805160209281900383018120545f8181526010909452918320546317861f8760e01b825260048201529092507f000000000000000000000000c3287bdef03b925a7c7f54791edadcd88e632ccd6001600160a01b0316906317861f87906024015f60405180830381865afa158015611910573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261193791908101906135a8565b5f83815260106020526040908190205490516333727c4d60e01b81529192506001600160a01b037f000000000000000000000000c3287bdef03b925a7c7f54791edadcd88e632ccd16916333727c4d916119979160040190815260200190565b602060405180830381865afa1580156119b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d6919061313f565b80156119ff575086866040516119ed92919061315a565b60405180910390208180519060200120145b9998505050505050505050565b6001600160a01b039182165f90815260066020908152604080832093909416825291909152205460ff1690565b611a41611bad565b6001600160a01b038116611a6a57604051631e4fbdf760e01b81525f6004820152602401610985565b611a7381611c6c565b50565b5f818152600360205260408120546001600160a01b03168061089457604051637e27328960e01b815260048101849052602401610985565b610be483838360016121a2565b5f828152600360205260408120546001600160a01b0390811690831615611ae757611ae78184866122a6565b6001600160a01b03811615611b2157611b025f855f806121a2565b6001600160a01b0381165f90815260046020526040902080545f190190555b6001600160a01b03851615611b4f576001600160a01b0385165f908152600460205260409020805460010190555b5f8481526003602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b5f546001600160a01b03163314610aec5760405163118cdaa760e01b8152336004820152602401610985565b80471015611bfc5760405163cd78605960e01b8152306004820152602401610985565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611c45576040519150601f19603f3d011682016040523d82523d5f602084013e611c4a565b606091505b5050905080610be457604051630a12f52160e11b815260040160405180910390fd5b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600b54604051632dca9c0360e11b815282915f916001600160a01b037f0000000000000000000000000a0f4321214bb6c7811dd8a71cf587bdaf03f0a01691635b953806913491611d3e917f000000000000000000000000000000000000000000000000000000000000000d91889130916001600160401b031690600401613610565b60206040518083038185885af1158015611d5a573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611d7f9190613395565b5f818152600d6020526040902090915060028101611d9d8482613270565b5080546001600160a01b0319163390811782557f000000000000000000000000000000000000000000000000000000000000000d600183018190556040517fa0faead83d70148ae18b694377f9bef079251342ab90e14af0f9ef68b891269f92611e0a9286928990613660565b60405180910390a150505050565b61095c828260405180602001604052805f81525061230a565b6001600160a01b038216611e6357604051630b61174360e31b81526001600160a01b0383166004820152602401610985565b6001600160a01b038381165f81815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b156109e857604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290611f11903390889087908790600401613696565b6020604051808303815f875af1925050508015611f4b575060408051601f3d908101601f19168201909252611f48918101906136c8565b60015b611fb2573d808015611f78576040519150601f19603f3d011682016040523d82523d5f602084013e611f7d565b606091505b5080515f03611faa57604051633250574960e11b81526001600160a01b0385166004820152602401610985565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b14611fee57604051633250574960e11b81526001600160a01b0385166004820152602401610985565b5050505050565b60605f61200183610be9565b80519091505f603c61201483603b6131e3565b61201e919061312c565b90505f60405180610120016040528060fd8152602001613b6960fd913960408051602081019091525f808252919250905b838110156120c0575f61206382603c613101565b90505f61207182603c6131e3565b90508681111561207e5750855b5f61208a898484612320565b9050848160405160200161209f9291906136e3565b6040516020818303038152906040529450505050808060010191505061204f565b505f6040518060400160405280600d81526020016c1e17ba32bc3a1f1e17b9bb339f60991b81525090508282826040516020016120ff93929190613748565b6040516020818303038152906040529650505050505050919050565b5f828152600c602052604081206060919061219a90600281019061214661214188610be9565b6123e0565b5f888152600c6020526040902060040154612169906001600160a01b03166125f3565b6121728861272c565b60405160200161218695949392919061378a565b60405160208183030381529060405261272c565b949350505050565b80806121b657506001600160a01b03821615155b15612277575f6121c584611a76565b90506001600160a01b038316158015906121f15750826001600160a01b0316816001600160a01b031614155b801561220457506122028184611a0c565b155b1561222d5760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610985565b81156122755783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260056020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6122b183838361288e565b610be4576001600160a01b0383166122df57604051637e27328960e01b815260048101829052602401610985565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610985565b61231483836128ef565b610be45f848484611ecf565b6060835f61232e8585613347565b6001600160401b0381111561234557612345612c55565b6040519080825280601f01601f19166020018201604052801561236f576020820181803683370190505b509050845b848110156123d65782818151811061238e5761238e6139fa565b01602001516001600160f81b031916826123a88884613347565b815181106123b8576123b86139fa565b60200101906001600160f81b03191690815f1a905350600101612374565b5095945050505050565b60605f8290505f81516001600160401b0381111561240057612400612c55565b6040519080825280601f01601f19166020018201604052801561242a576020820181803683370190505b5090505f805b83518110156125555783818151811061244b5761244b6139fa565b6020910101516001600160f81b031916600560f91b14801590612493575083818151811061247b5761247b6139fa565b6020910101516001600160f81b031916600d60f81b14155b80156124c457508381815181106124ac576124ac6139fa565b6020910101516001600160f81b031916601160f91b14155b80156124f557508381815181106124dd576124dd6139fa565b6020910101516001600160f81b031916602760f81b14155b1561254d5783818151811061250c5761250c6139fa565b602001015160f81c60f81b838381518110612529576125296139fa565b60200101906001600160f81b03191690815f1a905350816125498161332f565b9250505b600101612430565b505f816001600160401b0381111561256f5761256f612c55565b6040519080825280601f01601f191660200182016040528015612599576020820181803683370190505b5090505f5b828110156123d6578381815181106125b8576125b86139fa565b602001015160f81c60f81b8282815181106125d5576125d56139fa565b60200101906001600160f81b03191690815f1a90535060010161259e565b60408051602880825260608281019093525f91906020820181803683370190505090505f5b6014811015612725575f61262d826013613347565b612638906008613101565b612643906002613aee565b612656906001600160a01b03871661312c565b60f81b90505f60108260f81c61266c9190613af9565b60f81b90505f8160f81c60106126829190613b1a565b8360f81c6126909190613b36565b60f81b905061269e82612950565b856126aa866002613101565b815181106126ba576126ba6139fa565b60200101906001600160f81b03191690815f1a9053506126d981612950565b856126e5866002613101565b6126f09060016131e3565b81518110612700576127006139fa565b60200101906001600160f81b03191690815f1a90535050600190920191506126189050565b5092915050565b80516060905f81900361274e57505060408051602081019091525f8152919050565b5f600361275c8360026131e3565b612766919061312c565b612771906004613101565b90505f61277f8260206131e3565b6001600160401b0381111561279657612796612c55565b6040519080825280601f01601f1916602001820160405280156127c0576020820181803683370190505b5090505f604051806060016040528060408152602001613c6660409139905060018101602083015f5b8681101561284a576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016127e9565b506003860660018114612864576002811461287557612880565b613d3d60f01b600119830152612880565b603d60f81b5f198301525b505050918152949350505050565b5f6001600160a01b0383161580159061219a5750826001600160a01b0316846001600160a01b031614806128c757506128c78484611a0c565b8061219a5750505f908152600560205260409020546001600160a01b03908116911614919050565b6001600160a01b03821661291857604051633250574960e11b81525f6004820152602401610985565b5f61292483835f611abb565b90506001600160a01b03811615610be4576040516339e3563760e11b81525f6004820152602401610985565b5f600a60f883901c10156129765761296d60f883901c6030613b4f565b60f81b92915050565b61296d60f883901c6057613b4f565b919050565b6001600160e01b031981168114611a73575f80fd5b5f602082840312156129af575f80fd5b81356129ba8161298a565b9392505050565b5f5b838110156129db5781810151838201526020016129c3565b50505f910152565b5f81518084526129fa8160208601602086016129c1565b601f01601f19169290920160200192915050565b602081525f6129ba60208301846129e3565b5f60208284031215612a30575f80fd5b5035919050565b80356001600160a01b0381168114612985575f80fd5b5f8060408385031215612a5e575f80fd5b612a6783612a37565b946020939093013593505050565b5f805f60608486031215612a87575f80fd5b612a9084612a37565b9250612a9e60208501612a37565b9150604084013590509250925092565b5f8060408385031215612abf575f80fd5b50508035926020909101359150565b5f60208284031215612ade575f80fd5b81356001600160401b03811681146129ba575f80fd5b5f8083601f840112612b04575f80fd5b5081356001600160401b03811115612b1a575f80fd5b602083019150836020828501011115612b31575f80fd5b9250929050565b5f805f8060408587031215612b4b575f80fd5b84356001600160401b0380821115612b61575f80fd5b612b6d88838901612af4565b90965094506020870135915080821115612b85575f80fd5b50612b9287828801612af4565b95989497509550505050565b60a081525f612bb060a08301886129e3565b8281036020840152612bc281886129e3565b90508281036040840152612bd681876129e3565b606084019590955250506001600160a01b03919091166080909101529392505050565b5f60208284031215612c09575f80fd5b6129ba82612a37565b60018060a01b0385168152836020820152608060408201525f612c3860808301856129e3565b8281036060840152612c4a81856129e3565b979650505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715612c9157612c91612c55565b604052919050565b5f6001600160401b03821115612cb157612cb1612c55565b50601f01601f191660200190565b5f612cd1612ccc84612c99565b612c69565b9050828152838383011115612ce4575f80fd5b828260208301375f602084830101529392505050565b5f8060408385031215612d0b575f80fd5b8235915060208301356001600160401b03811115612d27575f80fd5b8301601f81018513612d37575f80fd5b612d4685823560208401612cbf565b9150509250929050565b5f805f805f805f8060a0898b031215612d67575f80fd5b612d7089612a37565b975060208901356001600160401b0380821115612d8b575f80fd5b612d978c838d01612af4565b909950975060408b0135915080821115612daf575f80fd5b612dbb8c838d01612af4565b909750955060608b0135915080821115612dd3575f80fd5b50612de08b828c01612af4565b999c989b50969995989497949560800135949350505050565b8015158114611a73575f80fd5b5f8060408385031215612e17575f80fd5b612e2083612a37565b91506020830135612e3081612df9565b809150509250929050565b5f82601f830112612e4a575f80fd5b6129ba83833560208501612cbf565b5f60208284031215612e69575f80fd5b81356001600160401b03811115612e7e575f80fd5b61219a84828501612e3b565b5f805f805f805f6080888a031215612ea0575f80fd5b8735965060208801356001600160401b0380821115612ebd575f80fd5b612ec98b838c01612af4565b909850965060408a0135915080821115612ee1575f80fd5b612eed8b838c01612af4565b909650945060608a0135915080821115612f05575f80fd5b50612f128a828b01612af4565b989b979a50959850939692959293505050565b5f805f805f60608688031215612f39575f80fd5b8535945060208601356001600160401b0380821115612f56575f80fd5b612f6289838a01612af4565b90965094506040880135915080821115612f7a575f80fd5b50612f8788828901612af4565b969995985093965092949392505050565b5f805f8060808587031215612fab575f80fd5b612fb485612a37565b9350612fc260208601612a37565b92506040850135915060608501356001600160401b03811115612fe3575f80fd5b612fef87828801612e3b565b91505092959194509250565b5f805f805f8060608789031215613010575f80fd5b86356001600160401b0380821115613026575f80fd5b6130328a838b01612af4565b9098509650602089013591508082111561304a575f80fd5b6130568a838b01612af4565b9096509450604089013591508082111561306e575f80fd5b5061307b89828a01612af4565b979a9699509497509295939492505050565b5f806040838503121561309e575f80fd5b6130a783612a37565b9150610a1d60208401612a37565b600181811c908216806130c957607f821691505b6020821081036130e757634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610894576108946130ed565b634e487b7160e01b5f52601260045260245ffd5b5f8261313a5761313a613118565b500490565b5f6020828403121561314f575f80fd5b81516129ba81612df9565b818382375f9101908152919050565b5f8154613175816130b5565b6001828116801561318d57600181146131a2576131ce565b60ff19841687528215158302870194506131ce565b855f526020805f205f5b858110156131c55781548a8201529084019082016131ac565b50505082870194505b5050505092915050565b5f6129ba8284613169565b80820180821115610894576108946130ed565b5f81516132078185602086016129c1565b9290920192915050565b5f82516132228184602087016129c1565b9190910192915050565b601f821115610be457805f5260205f20601f840160051c810160208510156132515750805b601f840160051c820191505b81811015611fee575f815560010161325d565b81516001600160401b0381111561328957613289612c55565b61329d8161329784546130b5565b8461322c565b602080601f8311600181146132d0575f84156132b95750858301515b5f19600386901b1c1916600185901b178555613327565b5f85815260208120601f198616915b828110156132fe578886015182559484019460019091019084016132df565b508582101561331b57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60018201613340576133406130ed565b5060010190565b81810381811115610894576108946130ed565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f61219a60208301848661335a565b5f602082840312156133a5575f80fd5b5051919050565b838152604060208201525f6133c560408301848661335a565b95945050505050565b604081525f6133e160408301868861335a565b8281036020840152612c4a81858761335a565b6001600160401b0383111561340b5761340b612c55565b61341f8361341983546130b5565b8361322c565b5f601f841160018114613450575f85156134395750838201355b5f19600387901b1c1916600186901b178355611fee565b5f83815260208120601f198716915b8281101561347f578685013582556020948501946001909201910161345f565b508682101561349b575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b8781525f602088602084015260a060408401525f88546134cc816130b5565b8060a087015260c060018084165f81146134ed576001811461350957613536565b60ff19851660c08a015260c084151560051b8a01019550613536565b8d5f5260205f205f5b8581101561352d5781548b8201860152908301908801613512565b8a0160c0019650505b5050505050838103606085015261354e81888a61335a565b915050828103608084015261143281858761335a565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f825161359b81601d8501602087016129c1565b91909101601d0192915050565b5f602082840312156135b8575f80fd5b81516001600160401b038111156135cd575f80fd5b8201601f810184136135dd575f80fd5b80516135eb612ccc82612c99565b8181528560208385010111156135ff575f80fd5b6133c58260208301602086016129c1565b84815260a060208201525f61362860a08301866129e3565b6001600160a01b03949094166040830152506001600160401b039190911660608201528082036080909101525f815260200192915050565b84815260018060a01b0384166020820152826040820152608060608201525f61368c60808301846129e3565b9695505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061368c908301846129e3565b5f602082840312156136d8575f80fd5b81516129ba8161298a565b5f83516136f48184602088016129c1565b751e3a39b830b7103c1e9118981110323c9e911918111f60511b90830190815283516137278160168401602088016129c1565b671e17ba39b830b71f60c11b60169290910191820152601e01949350505050565b5f84516137598184602089016129c1565b84519083019061376d8183602089016129c1565b84519101906137808183602088016129c1565b0195945050505050565b683d913730b6b2911d1160b91b81525f6137a76009830188613169565b7f222c202261747472696275746573223a205b7b2274726169745f74797065223a8152741011383937b6b83a111610113b30b63ab2911d101160591b60208201526137f56035820188613169565b90507f227d2c207b2274726169745f74797065223a2022726573756c74222c20227661815266363ab2911d101160c91b6020820152855161383d816027840160208a016129c1565b7f227d2c207b2274726169745f74797065223a2022617574686f72222c2022766160279290910191820152680d8eaca4474404460f60bb1b6047820152845161388d8160508401602089016129c1565b7f227d2c207b2274726169745f74797065223a20226d6f64656c222c202276616c605092909101918201527f7565223a20224f70656e4c4d227d5d2c2020226465736372697074696f6e223a60708201527f20224120636f6d6d756e6974792d64726976656e20696e69746961746976652c60908201527f204f70656e4c4d2070726f6d6f746573206f70656e2061636365737320746f2060b08201527f6c61726765206c616e6775616765206d6f64656c732c20666f73746572696e6760d08201527f20696e6e6f766174696f6e20696e206c616e677561676520746563686e6f6c6f60f08201527f6779206163726f7373206469766572736520736563746f72732e222c2022696d6101108201527f616765223a2022646174613a696d6167652f7376672b786d6c3b626173653634610130820152600b60fa1b6101508201526139ee6139e06101518301866131f6565b61227d60f01b815260020190565b98975050505050505050565b634e487b7160e01b5f52603260045260245ffd5b600181815b80851115613a4857815f1904821115613a2e57613a2e6130ed565b80851615613a3b57918102915b93841c9390800290613a13565b509250929050565b5f82613a5e57506001610894565b81613a6a57505f610894565b8160018114613a805760028114613a8a57613aa6565b6001915050610894565b60ff841115613a9b57613a9b6130ed565b50506001821b610894565b5060208310610133831016604e8410600b8410161715613ac9575081810a610894565b613ad38383613a0e565b805f1904821115613ae657613ae66130ed565b029392505050565b5f6129ba8383613a50565b5f60ff831680613b0b57613b0b613118565b8060ff84160491505092915050565b60ff8181168382160290811690818114612725576127256130ed565b60ff8281168282160390811115610894576108946130ed565b60ff8181168382160190811115610894576108946130ed56fe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313270783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2231302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220980c8884994ba0cfe8a0c29296d1997e4fb2bc132d37eea4739a95069c6b2e4064736f6c63430008170033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000a0f4321214bb6c7811dd8a71cf587bdaf03f0a000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000c3287bdef03b925a7c7f54791edadcd88e632ccd00000000000000000000000000000000000000000000000000000000000000064f70656e4c4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034f4c4d0000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _aiOracle (address): 0x0A0f4321214BB6C7811dD8a71cF587bdaF03f0A0
Arg [1] : _name (string): OpenLM
Arg [2] : _symbol (string): OLM
Arg [3] : _mintPrice (uint256): 0
Arg [4] : _aiModelId (uint256): 13
Arg [5] : _opmlLib (address): 0xC3287BDEF03b925A7C7f54791EDADCD88e632CcD
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000a0f4321214bb6c7811dd8a71cf587bdaf03f0a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [5] : 000000000000000000000000c3287bdef03b925a7c7f54791edadcd88e632ccd
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [7] : 4f70656e4c4d0000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [9] : 4f4c4d0000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
71651:10993:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42698:305;;;;;;;;;;-1:-1:-1;42698:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;42698:305:0;;;;;;;;43529:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;44701:158::-;;;;;;;;;;-1:-1:-1;44701:158:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;44701:158:0;1533:203:1;44520:115:0;;;;;;;;;;-1:-1:-1;44520:115:0;;;;;:::i;:::-;;:::i;:::-;;71903:26;;;;;;;;;;;;;;;;;;;2324:25:1;;;2312:2;2297:18;71903:26:0;2178:177:1;45370:588:0;;;;;;;;;;-1:-1:-1;45370:588:0;;;;;:::i;:::-;;:::i;73810:280::-;;;;;;;;;;-1:-1:-1;73810:280:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3138:32:1;;;3120:51;;3202:2;3187:18;;3180:34;;;;3093:18;73810:280:0;2946:274:1;76095:132:0;;;;;;;;;;-1:-1:-1;76095:132:0;;;;;:::i;:::-;;:::i;71831:32::-;;;;;;;;;;;;;;;67599:35;;;;;;;;;;;;;;;68695:126;;;;;;;;;;-1:-1:-1;68695:126:0;;;;;:::i;:::-;;:::i;78661:121::-;;;;;;;;;;;;;:::i;75692:395::-;;;;;;;;;;-1:-1:-1;75692:395:0;;;;;:::i;:::-;;:::i;46029:134::-;;;;;;;;;;-1:-1:-1;46029:134:0;;;;;:::i;:::-;;:::i;74263:158::-;;;;;;;;;;-1:-1:-1;74263:158:0;;;;;:::i;:::-;;:::i;72698:49::-;;;;;;;;;;-1:-1:-1;72698:49:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;43342:120::-;;;;;;;;;;-1:-1:-1;43342:120:0;;;;;:::i;:::-;;:::i;71872:24::-;;;;;;;;;;;;;;;;77487:112;;;;;;;;;;;;;:::i;43067:213::-;;;;;;;;;;-1:-1:-1;43067:213:0;;;;;:::i;:::-;;:::i;3586:103::-;;;;;;;;;;;;;:::i;72772:51::-;;;;;;;;;;-1:-1:-1;72772:51:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;72051:37::-;;;;;;;;;;;;;;;;72885:60;;;;;;;;;;-1:-1:-1;72885:60:0;;;;;:::i;:::-;;:::i;2911:87::-;;;;;;;;;;-1:-1:-1;2957:7:0;2984:6;-1:-1:-1;;;;;2984:6:0;2911:87;;74143:112;;;;;;;;;;-1:-1:-1;74143:112:0;;;;;:::i;:::-;;:::i;43689:95::-;;;;;;;;;;;;;:::i;77630:941::-;;;;;;:::i;:::-;;:::i;71969:75::-;;;;;;;;;;-1:-1:-1;71969:75:0;;;;;;;-1:-1:-1;;;;;71969:75:0;;;44931:146;;;;;;;;;;-1:-1:-1;44931:146:0;;;;;:::i;:::-;;:::i;72830:48::-;;;;;;;;;;-1:-1:-1;72830:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;72952:54;;;;;;;;;;-1:-1:-1;72952:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;74710:403;;;;;;;;;;-1:-1:-1;74710:403:0;;;;;:::i;:::-;;:::i;76285:460::-;;;;;;;;;;-1:-1:-1;76285:460:0;;;;;:::i;:::-;;:::i;71790:34::-;;;;;;;;;;;;;;;74429:93;;;;;;;;;;;;;:::i;46234:211::-;;;;;;;;;;-1:-1:-1;46234:211:0;;;;;:::i;:::-;;:::i;77342:139::-;;;;;;;;;;;;;:::i;78790:262::-;;;;;;;;;;-1:-1:-1;78790:262:0;;;;;:::i;:::-;;:::i;75175:445::-;;;;;;;;;;-1:-1:-1;75175:445:0;;;;;:::i;:::-;;:::i;45148:155::-;;;;;;;;;;-1:-1:-1;45148:155:0;;;;;:::i;:::-;;:::i;72271:48::-;;;;;;;;;;-1:-1:-1;72271:48:0;;;;-1:-1:-1;;;;;72271:48:0;;;;;;-1:-1:-1;;;;;13748:31:1;;;13730:50;;13718:2;13703:18;72271:48:0;13586:200:1;3844:220:0;;;;;;;;;;-1:-1:-1;3844:220:0;;;;;:::i;:::-;;:::i;71936:24::-;;;;;;;;;;-1:-1:-1;71936:24:0;;;;;;;;42698:305;42800:4;-1:-1:-1;;;;;;42837:40:0;;-1:-1:-1;;;42837:40:0;;:105;;-1:-1:-1;;;;;;;42894:48:0;;-1:-1:-1;;;42894:48:0;42837:105;:158;;;-1:-1:-1;;;;;;;;;;21143:40:0;;;42959:36;42817:178;42698:305;-1:-1:-1;;42698:305:0:o;43529:91::-;43574:13;43607:5;43600:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43529:91;:::o;44701:158::-;44768:7;44788:22;44802:7;44788:13;:22::i;:::-;-1:-1:-1;47277:7:0;47304:24;;;:15;:24;;;;;;-1:-1:-1;;;;;47304:24:0;44830:21;47207:129;44520:115;44592:35;44601:2;44605:7;945:10;44592:8;:35::i;:::-;44520:115;;:::o;45370:588::-;-1:-1:-1;;;;;45465:16:0;;45461:89;;45505:33;;-1:-1:-1;;;45505:33:0;;45535:1;45505:33;;;1679:51:1;1652:18;;45505:33:0;;;;;;;;45461:89;45771:21;45795:34;45803:2;45807:7;945:10;45795:7;:34::i;:::-;45771:58;;45861:4;-1:-1:-1;;;;;45844:21:0;:13;-1:-1:-1;;;;;45844:21:0;;45840:111;;45889:50;;-1:-1:-1;;;45889:50:0;;-1:-1:-1;;;;;14434:15:1;;;45889:50:0;;;14416:34:1;14466:18;;;14459:34;;;14529:15;;14509:18;;;14502:43;14351:18;;45889:50:0;14176:375:1;45840:111:0;45450:508;45370:588;;;:::o;73810:280::-;74003:15;;74058:17;;74003:15;;;;-1:-1:-1;;;;;74003:15:0;;73935:16;;74079:3;;74046:29;;:9;:29;:::i;:::-;74045:37;;;;:::i;:::-;74029:53;;73810:280;;;;;:::o;76095:132::-;2797:13;:11;:13::i;:::-;76183:24:::1;:36:::0;;-1:-1:-1;;76183:36:0::1;-1:-1:-1::0;;;;;76183:36:0;;;::::1;::::0;;;::::1;::::0;;76095:132::o;68695:126::-;68782:31;;-1:-1:-1;;;68782:31:0;;;;;2324:25:1;;;68758:4:0;;68782:8;-1:-1:-1;;;;;68782:20:0;;;;2297:18:1;;68782:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;78661:121::-;2797:13;:11;:13::i;:::-;78711:63:::1;945:10:::0;78752:21:::1;78711:17;:63::i;:::-;78661:121::o:0;75692:395::-;75824:32;75831:6;;75839:8;;75849:6;;75824;:32::i;:::-;75816:70;;;;-1:-1:-1;;;75816:70:0;;15570:2:1;75816:70:0;;;15552:21:1;15609:2;15589:18;;;15582:30;15648:27;15628:18;;;15621:55;15693:18;;75816:70:0;15368:349:1;75816:70:0;75989:15;76007;76023:6;;76007:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;76046:33:0;;76070:8;;;;76046:33;:::i;:::-;;;;;;;;76062:6;;76046:33;;;;;;;:::i;:::-;;;;;;;;;;76053:7;;76046:33;;;;;75805:282;75692:395;;;;:::o;46029:134::-;46116:39;46133:4;46139:2;46143:7;46116:39;;;;;;;;;;;;:16;:39::i;:::-;46029:134;;;:::o;74263:158::-;74374:9;74366:18;;;;:7;:18;;;;;;;;74385:20;;;:11;:20;;;;;;;74366:47;;74333:13;;74366:47;;;:::i;:::-;;;;;;;;;;;;;74359:54;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74263:158;;;:::o;72698:49::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;72698:49:0;;;;;;;;;;;;-1:-1:-1;;;;;72698:49:0;;-1:-1:-1;72698:49:0;:::o;43342:120::-;43405:7;43432:22;43446:7;43432:13;:22::i;77487:112::-;77536:7;77582:9;;77563:16;:14;:16::i;:::-;:28;;;;:::i;:::-;77556:35;;77487:112;:::o;43067:213::-;43130:7;-1:-1:-1;;;;;43154:19:0;;43150:89;;43197:30;;-1:-1:-1;;;43197:30:0;;43224:1;43197:30;;;1679:51:1;1652:18;;43197:30:0;1533:203:1;43150:89:0;-1:-1:-1;;;;;;43256:16:0;;;;;:9;:16;;;;;;;43067:213::o;3586:103::-;2797:13;:11;:13::i;:::-;3651:30:::1;3678:1;3651:18;:30::i;72772:51::-:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;72772:51:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;72885:60::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;74143:112::-;2797:13;:11;:13::i;:::-;74220:15:::1;:27:::0;;-1:-1:-1;;;;;74220:27:0;;::::1;;;-1:-1:-1::0;;;;;;74220:27:0;;::::1;::::0;;;::::1;::::0;;74143:112::o;43689:95::-;43736:13;43769:7;43762:14;;;;;:::i;77630:941::-;77839:12;;77780:15;;77839:12;;77831:41;;;;-1:-1:-1;;;77831:41:0;;17386:2:1;77831:41:0;;;17368:21:1;17425:2;17405:18;;;17398:30;-1:-1:-1;;;17444:18:1;;;17437:46;17500:18;;77831:41:0;17184:340:1;77831:41:0;77883:20;77906:15;;77883:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;77940:30:0;;77883:38;;-1:-1:-1;77940:15:0;;:30;;-1:-1:-1;77883:38:0;;-1:-1:-1;77940:30:0;:::i;:::-;;;;;;;;;;;;;;77974:1;77940:35;77932:82;;;;-1:-1:-1;;;77932:82:0;;18225:2:1;77932:82:0;;;18207:21:1;18264:2;18244:18;;;18237:30;18303:34;18283:18;;;18276:62;-1:-1:-1;;;18354:18:1;;;18347:32;18396:19;;77932:82:0;18023:398:1;77932:82:0;78069:18;:16;:18::i;:::-;78056:9;:31;;78048:71;;;;-1:-1:-1;;;78048:71:0;;18628:2:1;78048:71:0;;;18610:21:1;18667:2;18647:18;;;18640:30;18706:29;18686:18;;;18679:57;18753:18;;78048:71:0;18426:351:1;78048:71:0;78199:56;;;;;;;;78210:15;;78199:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;78199:56:0;;;-1:-1:-1;78199:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;78227:10;;;;;;78199:56;;78227:10;;;;78199:56;;;;;;;;;-1:-1:-1;;;78199:56:0;;;-1:-1:-1;78199:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;78239:5;;;;;;78199:56;;78239:5;;;;78199:56;;;;;;;;-1:-1:-1;78199:56:0;;;-1:-1:-1;;;78199:56:0;;;;;;;-1:-1:-1;;;;;78199:56:0;;;;;;;78184:11;;78172:24;;:11;:24;;;:83;;:24;;:83;;:24;:83;:::i;:::-;-1:-1:-1;78172:83:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;78172:83:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;78172:83:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;78172:83:0;-1:-1:-1;;;;;78172:83:0;;;;;;;;;78266:25;78284:6;78266:17;:25::i;:::-;78319:32;78335:2;78339:11;;78319:15;:32::i;:::-;78432:11;:14;;;:11;:14;;;:::i;:::-;;;;;;78490:11;;78457:15;78479:6;78457:30;;;;;;:::i;:::-;;;;;;;;;;;;;;:44;78548:11;;:15;;78562:1;;78548:15;:::i;:::-;78541:22;77630:941;-1:-1:-1;;;;;;;;;;77630:941:0:o;44931:146::-;45017:52;945:10;45050:8;45060;45017:18;:52::i;74710:403::-;74926:41;;-1:-1:-1;;;74926:41:0;;-1:-1:-1;;;;;74935:7:0;74926:33;;;;:41;;74960:6;;;;74926:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74896:27;;;;:18;:27;;;;;;;:71;;;74978:69;-1:-1:-1;;;74978:69:0;;-1:-1:-1;;;;;74987:7:0;74978:30;;;;:69;;74896:71;75038:8;;;;74978:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75081:6;;75063:42;;;;;;;:::i;:::-;;;;;;;;75072:7;75063:42;75089:8;;75099:5;;75063:42;;;;;;;;;:::i;:::-;;;;;;;;74710:403;;;;;;;:::o;76285:460::-;68077:10;-1:-1:-1;;;;;68124:8:0;68103:29;;;68099:124;;68156:55;;-1:-1:-1;;;68156:55:0;;-1:-1:-1;;;;;68183:8:0;22830:15:1;;68156:55:0;;;22812:34:1;22882:15;;22862:18;;;22855:43;22747:18;;68156:55:0;22564:340:1;68099:124:0;76434:31:::1;76468:19:::0;;;:8:::1;:19;::::0;;;;76506:14;;-1:-1:-1;;;;;76506:14:0::1;76498:59;;;::::0;-1:-1:-1;;;76498:59:0;;23111:2:1;76498:59:0::1;::::0;::::1;23093:21:1::0;23150:2;23130:18;;;23123:30;-1:-1:-1;;;23169:18:1;;;23162:48;23227:18;;76498:59:0::1;22909:342:1::0;76498:59:0::1;76619:6;;76568:7;:18;76576:9;76568:18;;;;;;;;;;;76594:7;:13;;76568:41;;;;;;:::i;:::-;;;;;;;;;;;;;:58;;;;;;;:::i;:::-;;76642:95;76657:9;76668:7;:15;;;76692:7;:13;;76715:6;;76724:12;;76642:95;;;;;;;;;;;;:::i;:::-;;;;;;;;76423:322;68026:216:::0;76285:460;;;;;:::o;74429:93::-;2797:13;:11;:13::i;:::-;74502:12:::1;::::0;;-1:-1:-1;;74486:28:0;::::1;74502:12;::::0;;::::1;74501:13;74486:28;::::0;;74429:93::o;46234:211::-;46348:31;46361:4;46367:2;46371:7;46348:12;:31::i;:::-;46390:47;46413:4;46419:2;46423:7;46432:4;46390:22;:47::i;77342:139::-;77448:24;;77416:57;;-1:-1:-1;;;77416:57:0;;77437:9;77416:57;;;26302:25:1;-1:-1:-1;;;;;77448:24:0;;;26343:18:1;;;26336:59;77389:7:0;;77416:8;-1:-1:-1;;;;;77416:20:0;;;;26275:18:1;;77416:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;78790:262::-;78855:13;78877:17;78897:20;78909:7;78897:11;:20::i;:::-;78877:40;;78924:18;78945:26;78958:7;78967:3;78945:12;:26::i;:::-;78924:47;;79042:4;78992:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;78978:70;;;;78790:262;;;:::o;75175:445::-;75333:12;75358:15;75376;75392:6;;75376:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;75410:19;75460:27;;;:18;:27;;;;;;;-1:-1:-1;;;75432:56:0;;;;;2324:25:1;75376:23:0;;-1:-1:-1;75441:7:0;-1:-1:-1;;;;;75432:27:0;;;;2297:18:1;;75432:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;75432:56:0;;;;;;;;;;;;:::i;:::-;75538:27;;;;:18;:27;;;;;;;;75508:58;;-1:-1:-1;;;75508:58:0;;75410:78;;-1:-1:-1;;;;;;75517:7:0;75508:29;;;;:58;;;;2324:25:1;;;2312:2;2297:18;;2178:177;75508:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:104;;;;;75602:8;;75592:19;;;;;;;:::i;:::-;;;;;;;;75581:6;75571:17;;;;;;:40;75508:104;75501:111;75175:445;-1:-1:-1;;;;;;;;;75175:445:0:o;45148:155::-;-1:-1:-1;;;;;45260:25:0;;;45236:4;45260:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;45148:155::o;3844:220::-;2797:13;:11;:13::i;:::-;-1:-1:-1;;;;;3929:22:0;::::1;3925:93;;3975:31;::::0;-1:-1:-1;;;3975:31:0;;4003:1:::1;3975:31;::::0;::::1;1679:51:1::0;1652:18;;3975:31:0::1;1533:203:1::0;3925:93:0::1;4028:28;4047:8;4028:18;:28::i;:::-;3844:220:::0;:::o;57676:247::-;57739:7;47062:16;;;:7;:16;;;;;;-1:-1:-1;;;;;47062:16:0;;57803:90;;57850:31;;-1:-1:-1;;;57850:31:0;;;;;2324:25:1;;;2297:18;;57850:31:0;2178:177:1;55908:122:0;55989:33;55998:2;56002:7;56011:4;56017;55989:8;:33::i;50169:824::-;50255:7;47062:16;;;:7;:16;;;;;;-1:-1:-1;;;;;47062:16:0;;;;50370:18;;;50366:88;;50405:37;50422:4;50428;50434:7;50405:16;:37::i;:::-;-1:-1:-1;;;;;50501:18:0;;;50497:263;;50619:48;50636:1;50640:7;50657:1;50661:5;50619:8;:48::i;:::-;-1:-1:-1;;;;;50713:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;50713:20:0;;;50497:263;-1:-1:-1;;;;;50776:16:0;;;50772:111;;-1:-1:-1;;;;;50838:13:0;;;;;;:9;:13;;;;;:18;;50855:1;50838:18;;;50772:111;50895:16;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;50895:21:0;-1:-1:-1;;;;;50895:21:0;;;;;;;;;50934:27;;50895:16;;50934:27;;;;;;;50981:4;50169:824;-1:-1:-1;;;;50169:824:0:o;3076:166::-;2957:7;2984:6;-1:-1:-1;;;;;2984:6:0;945:10;3136:23;3132:103;;3183:40;;-1:-1:-1;;;3183:40:0;;945:10;3183:40;;;1679:51:1;1652:18;;3183:40:0;1533:203:1;60930:340:0;61040:6;61016:21;:30;61012:111;;;61070:41;;-1:-1:-1;;;61070:41:0;;61105:4;61070:41;;;1679:51:1;1652:18;;61070:41:0;1533:203:1;61012:111:0;61136:12;61154:9;-1:-1:-1;;;;;61154:14:0;61176:6;61154:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61135:52;;;61203:7;61198:65;;61234:17;;-1:-1:-1;;;61234:17:0;;;;;;;;;;;4224:191;4298:16;4317:6;;-1:-1:-1;;;;;4334:17:0;;;-1:-1:-1;;;;;;4334:17:0;;;;;;4367:40;;4317:6;;;;;;;4367:40;;4298:16;4367:40;4287:128;4224:191;:::o;76753:581::-;77044:24;;76954:129;;-1:-1:-1;;;76954:129:0;;76849:6;;76822:18;;-1:-1:-1;;;;;76954:8:0;:24;;;;76986:9;;76954:129;;77011:9;;76849:6;;77037:4;;-1:-1:-1;;;;;77044:24:0;;76954:129;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77094:31;77128:19;;;:8;:19;;;;;76934:149;;-1:-1:-1;77158:13:0;;;:21;77174:5;77158:13;:21;:::i;:::-;-1:-1:-1;77190:27:0;;-1:-1:-1;;;;;;77190:27:0;77207:10;77190:27;;;;;77246:9;77190:27;77228:15;;:27;;;77271:55;;;;;;77285:9;;77319:6;;77271:55;:::i;:::-;;;;;;;;76811:523;;;76753:581;:::o;52027:102::-;52095:26;52105:2;52109:7;52095:26;;;;;;;;;;;;:9;:26::i;57115:318::-;-1:-1:-1;;;;;57223:22:0;;57219:93;;57269:31;;-1:-1:-1;;;57269:31:0;;-1:-1:-1;;;;;1697:32:1;;57269:31:0;;;1679:51:1;1652:18;;57269:31:0;1533:203:1;57219:93:0;-1:-1:-1;;;;;57322:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;57322:46:0;;;;;;;;;;57384:41;;540::1;;;57384::0;;513:18:1;57384:41:0;;;;;;;57115:318;;;:::o;58473:799::-;-1:-1:-1;;;;;58590:14:0;;;:18;58586:679;;58629:71;;-1:-1:-1;;;58629:71:0;;-1:-1:-1;;;;;58629:36:0;;;;;:71;;945:10;;58680:4;;58686:7;;58695:4;;58629:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58629:71:0;;;;;;;;-1:-1:-1;;58629:71:0;;;;;;;;;;;;:::i;:::-;;;58625:629;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58943:6;:13;58960:1;58943:18;58939:300;;58993:25;;-1:-1:-1;;;58993:25:0;;-1:-1:-1;;;;;1697:32:1;;58993:25:0;;;1679:51:1;1652:18;;58993:25:0;1533:203:1;58939:300:0;59189:6;59183:13;59174:6;59170:2;59166:15;59159:38;58625:629;-1:-1:-1;;;;;;58748:51:0;;-1:-1:-1;;;58748:51:0;58744:132;;58831:25;;-1:-1:-1;;;58831:25:0;;-1:-1:-1;;;;;1697:32:1;;58831:25:0;;;1679:51:1;1652:18;;58831:25:0;1533:203:1;58744:132:0;58701:190;58473:799;;;;:::o;79056:1055::-;79117:13;79139:18;79160:31;79183:7;79160:22;:31::i;:::-;79215:18;;79139:52;;-1:-1:-1;79198:14:0;79275:2;79260:11;79215:18;79269:2;79260:11;:::i;:::-;79259:18;;;;:::i;:::-;79240:37;;79325:22;:280;;;;;;;;;;;;;;;;;79612:27;;;;;;;;;:22;:27;;;79325:280;;-1:-1:-1;79612:27:0;79646:341;79670:8;79666:1;:12;79646:341;;;79696:13;79712:6;:1;79716:2;79712:6;:::i;:::-;79696:22;-1:-1:-1;79729:11:0;79743:10;79696:22;79751:2;79743:10;:::i;:::-;79729:24;;79774:6;79768:3;:12;79764:57;;;-1:-1:-1;79803:6:0;79764:57;79831:18;79852:27;79862:4;79868:5;79875:3;79852:9;:27::i;:::-;79831:48;;79925:8;79961:4;79908:70;;;;;;;;;:::i;:::-;;;;;;;;;;;;;79890:89;;79685:302;;;79680:3;;;;;;;79646:341;;;;79993:22;:40;;;;;;;;;;;;;-1:-1:-1;;;79993:40:0;;;;;80077:8;80087;80097;80060:46;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;80046:61;;;;;;;;79056:1055;;;:::o;80115:807::-;80218:18;80296:20;;;:11;:20;;;;;80196:13;;80218:18;80239:659;;80296:26;;;;80453:57;80478:31;80308:7;80478:22;:31::i;:::-;80453:24;:57::i;:::-;80572:20;;;;:11;:20;;;;;:27;;;80558:42;;-1:-1:-1;;;;;80572:27:0;80558:13;:42::i;:::-;80863:25;80883:3;80863:13;:25::i;:::-;80266:629;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;80239:13;:659::i;:::-;80218:680;80115:807;-1:-1:-1;;;;80115:807:0:o;56218:678::-;56380:9;:31;;;-1:-1:-1;;;;;;56393:18:0;;;;56380:31;56376:471;;;56428:13;56444:22;56458:7;56444:13;:22::i;:::-;56428:38;-1:-1:-1;;;;;;56597:18:0;;;;;;:35;;;56628:4;-1:-1:-1;;;;;56619:13:0;:5;-1:-1:-1;;;;;56619:13:0;;;56597:35;:69;;;;;56637:29;56654:5;56661:4;56637:16;:29::i;:::-;56636:30;56597:69;56593:144;;;56694:27;;-1:-1:-1;;;56694:27:0;;-1:-1:-1;;;;;1697:32:1;;56694:27:0;;;1679:51:1;1652:18;;56694:27:0;1533:203:1;56593:144:0;56757:9;56753:83;;;56812:7;56808:2;-1:-1:-1;;;;;56792:28:0;56801:5;-1:-1:-1;;;;;56792:28:0;;;;;;;;;;;56753:83;56413:434;56376:471;-1:-1:-1;;56859:24:0;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;56859:29:0;-1:-1:-1;;;;;56859:29:0;;;;;;;;;;56218:678::o;48376:376::-;48489:38;48503:5;48510:7;48519;48489:13;:38::i;:::-;48484:261;;-1:-1:-1;;;;;48548:19:0;;48544:190;;48595:31;;-1:-1:-1;;;48595:31:0;;;;;2324:25:1;;;2297:18;;48595:31:0;2178:177:1;48544:190:0;48674:44;;-1:-1:-1;;;48674:44:0;;-1:-1:-1;;;;;3138:32:1;;48674:44:0;;;3120:51:1;3187:18;;;3180:34;;;3093:18;;48674:44:0;2946:274:1;52356:185:0;52451:18;52457:2;52461:7;52451:5;:18::i;:::-;52480:53;52511:1;52515:2;52519:7;52528:4;52480:22;:53::i;81559:357::-;81658:13;81710:3;81680:21;81753;81764:10;81753:8;:21;:::i;:::-;-1:-1:-1;;;;;81743:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;81743:32:0;-1:-1:-1;81721:54:0;-1:-1:-1;81799:10:0;81782:103;81815:8;81811:1;:12;81782:103;;;81866:8;81875:1;81866:11;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;81866:11:0;81841:6;81848:14;81852:10;81848:1;:14;:::i;:::-;81841:22;;;;;;;;:::i;:::-;;;;:36;-1:-1:-1;;;;;81841:36:0;;;;;;;;-1:-1:-1;81825:3:0;;81782:103;;;-1:-1:-1;81905:6:0;81559:357;-1:-1:-1;;;;;81559:357:0:o;80926:629::-;81002:13;81024:21;81054:3;81024:34;;81065:19;81097:8;:15;-1:-1:-1;;;;;81087:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;81087:26:0;;81065:48;;81120:13;81151:9;81146:232;81170:8;:15;81166:1;:19;81146:232;;;81207:8;81216:1;81207:11;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;;81207:11:0;-1:-1:-1;;;81207:19:0;;;;:42;;;81230:8;81239:1;81230:11;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;;81230:11:0;-1:-1:-1;;;81230:19:0;;81207:42;:64;;;;;81253:8;81262:1;81253:11;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;;81253:11:0;-1:-1:-1;;;81253:18:0;;81207:64;:86;;;;;81275:8;81284:1;81275:11;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;;81275:11:0;-1:-1:-1;;;81275:18:0;;81207:86;81203:168;;;81326:8;81335:1;81326:11;;;;;;;;:::i;:::-;;;;;;;;;81310:6;81317:5;81310:13;;;;;;;;:::i;:::-;;;;:27;-1:-1:-1;;;;;81310:27:0;;;;;;;;-1:-1:-1;81352:7:0;;;;:::i;:::-;;;;81203:168;81187:3;;81146:232;;;;81386:24;81423:5;-1:-1:-1;;;;;81413:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;81413:16:0;;81386:43;;81441:9;81436:81;81460:5;81456:1;:9;81436:81;;;81500:6;81507:1;81500:9;;;;;;;;:::i;:::-;;;;;;;;;81483:11;81495:1;81483:14;;;;;;;;:::i;:::-;;;;:26;-1:-1:-1;;;;;81483:26:0;;;;;;;;-1:-1:-1;81467:3:0;;81436:81;;82648:414;82735:13;;;82745:2;82735:13;;;82696;82735;;;;;;82718:14;;82735:13;;;;;;;;;;;-1:-1:-1;82735:13:0;82718:30;;82760:6;82755:281;82776:2;82772:1;:6;82755:281;;;82796:8;82847:6;82852:1;82847:2;:6;:::i;:::-;82844:10;;:1;:10;:::i;:::-;82840:15;;:1;:15;:::i;:::-;82820:36;;-1:-1:-1;;;;;82820:16:0;;:36;:::i;:::-;82807:51;;82796:62;;82869:9;82899:2;82894:1;82888:8;;:13;;;;:::i;:::-;82881:21;;82869:33;;82913:9;82954:2;82948:9;;82943:2;:14;;;;:::i;:::-;82938:1;82932:8;;:25;;;;:::i;:::-;82925:33;;82913:45;;82978:8;82983:2;82978:4;:8::i;:::-;82969:1;82971:3;82973:1;82971;:3;:::i;:::-;82969:6;;;;;;;;:::i;:::-;;;;:17;-1:-1:-1;;;;;82969:17:0;;;;;;;;;83008:8;83013:2;83008:4;:8::i;:::-;82997:1;82999:3;83001:1;82999;:3;:::i;:::-;:5;;83003:1;82999:5;:::i;:::-;82997:8;;;;;;;;:::i;:::-;;;;:19;-1:-1:-1;;;;;82997:19:0;;;;;;;;-1:-1:-1;;82780:3:0;;;;;-1:-1:-1;82755:281:0;;-1:-1:-1;82755:281:0;;-1:-1:-1;83056:1:0;82648:414;-1:-1:-1;;82648:414:0:o;83567:1607::-;83665:11;;83625:13;;83651:11;83691:8;;;83687:23;;-1:-1:-1;;83701:9:0;;;;;;;;;-1:-1:-1;83701:9:0;;;83567:1607;-1:-1:-1;83567:1607:0:o;83687:23::-;83762:18;83800:1;83789:7;:3;83795:1;83789:7;:::i;:::-;83788:13;;;;:::i;:::-;83783:19;;:1;:19;:::i;:::-;83762:40;-1:-1:-1;83860:19:0;83892:15;83762:40;83905:2;83892:15;:::i;:::-;-1:-1:-1;;;;;83882:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;83882:26:0;;83860:48;;83921:18;83942:5;;;;;;;;;;;;;;;;;83921:26;;84011:1;84004:5;84000:13;84056:2;84048:6;84044:15;84107:1;84075:777;84130:3;84127:1;84124:10;84075:777;;;84185:1;84228:12;;;;;84222:19;84323:4;84311:2;84307:14;;;;;84289:40;;84283:47;84432:2;84428:14;;;84424:25;;84410:40;;84404:47;84561:1;84557:13;;;84553:24;;84539:39;;84533:46;84681:16;;;;84667:31;;84661:38;84359:1;84355:11;;;84453:4;84400:58;;;84391:68;84484:11;;84529:57;;;84520:67;;;;84612:11;;84657:49;;84648:59;84736:3;84732:13;84765:22;;84835:1;84820:17;;;;84178:9;84075:777;;;84079:44;84884:1;84879:3;84875:11;84905:1;84900:84;;;;85003:1;84998:82;;;;84868:212;;84900:84;-1:-1:-1;;;;;84933:17:0;;84926:43;84900:84;;84998:82;-1:-1:-1;;;;;85031:17:0;;85024:41;84868:212;-1:-1:-1;;;85096:26:0;;;85103:6;83567:1607;-1:-1:-1;;;;83567:1607:0:o;47656:276::-;47759:4;-1:-1:-1;;;;;47796:21:0;;;;;;:128;;;47844:7;-1:-1:-1;;;;;47835:16:0;:5;-1:-1:-1;;;;;47835:16:0;;:52;;;;47855:32;47872:5;47879:7;47855:16;:32::i;:::-;47835:88;;;-1:-1:-1;;47277:7:0;47304:24;;;:15;:24;;;;;;-1:-1:-1;;;;;47304:24:0;;;47891:32;;;;47776:148;-1:-1:-1;47656:276:0:o;51329:335::-;-1:-1:-1;;;;;51397:16:0;;51393:89;;51437:33;;-1:-1:-1;;;51437:33:0;;51467:1;51437:33;;;1679:51:1;1652:18;;51437:33:0;1533:203:1;51393:89:0;51492:21;51516:32;51524:2;51528:7;51545:1;51516:7;:32::i;:::-;51492:56;-1:-1:-1;;;;;;51563:27:0;;;51559:98;;51614:31;;-1:-1:-1;;;51614:31:0;;51642:1;51614:31;;;1679:51:1;1652:18;;51614:31:0;1533:203:1;83066:150:0;83104:8;83136:2;83125:8;;;;:13;83121:91;;;83154:15;:8;;;;83165:4;83154:15;:::i;:::-;83147:23;;;83066:150;-1:-1:-1;;83066:150:0:o;83121:91::-;83196:15;:8;;;;83207:4;83196:15;:::i;83121:91::-;83066:150;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1919:254;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2360:328::-;2437:6;2445;2453;2506:2;2494:9;2485:7;2481:23;2477:32;2474:52;;;2522:1;2519;2512:12;2474:52;2545:29;2564:9;2545:29;:::i;:::-;2535:39;;2593:38;2627:2;2616:9;2612:18;2593:38;:::i;:::-;2583:48;;2678:2;2667:9;2663:18;2650:32;2640:42;;2360:328;;;;;:::o;2693:248::-;2761:6;2769;2822:2;2810:9;2801:7;2797:23;2793:32;2790:52;;;2838:1;2835;2828:12;2790:52;-1:-1:-1;;2861:23:1;;;2931:2;2916:18;;;2903:32;;-1:-1:-1;2693:248:1:o;3225:284::-;3283:6;3336:2;3324:9;3315:7;3311:23;3307:32;3304:52;;;3352:1;3349;3342:12;3304:52;3391:9;3378:23;-1:-1:-1;;;;;3434:5:1;3430:30;3423:5;3420:41;3410:69;;3475:1;3472;3465:12;3740:347;3791:8;3801:6;3855:3;3848:4;3840:6;3836:17;3832:27;3822:55;;3873:1;3870;3863:12;3822:55;-1:-1:-1;3896:20:1;;-1:-1:-1;;;;;3928:30:1;;3925:50;;;3971:1;3968;3961:12;3925:50;4008:4;4000:6;3996:17;3984:29;;4060:3;4053:4;4044:6;4036;4032:19;4028:30;4025:39;4022:59;;;4077:1;4074;4067:12;4022:59;3740:347;;;;;:::o;4092:717::-;4182:6;4190;4198;4206;4259:2;4247:9;4238:7;4234:23;4230:32;4227:52;;;4275:1;4272;4265:12;4227:52;4315:9;4302:23;-1:-1:-1;;;;;4385:2:1;4377:6;4374:14;4371:34;;;4401:1;4398;4391:12;4371:34;4440:58;4490:7;4481:6;4470:9;4466:22;4440:58;:::i;:::-;4517:8;;-1:-1:-1;4414:84:1;-1:-1:-1;4605:2:1;4590:18;;4577:32;;-1:-1:-1;4621:16:1;;;4618:36;;;4650:1;4647;4640:12;4618:36;;4689:60;4741:7;4730:8;4719:9;4715:24;4689:60;:::i;:::-;4092:717;;;;-1:-1:-1;4768:8:1;-1:-1:-1;;;;4092:717:1:o;4814:::-;5115:3;5104:9;5097:22;5078:4;5142:46;5183:3;5172:9;5168:19;5160:6;5142:46;:::i;:::-;5236:9;5228:6;5224:22;5219:2;5208:9;5204:18;5197:50;5270:33;5296:6;5288;5270:33;:::i;:::-;5256:47;;5351:9;5343:6;5339:22;5334:2;5323:9;5319:18;5312:50;5379:33;5405:6;5397;5379:33;:::i;:::-;5443:2;5428:18;;5421:34;;;;-1:-1:-1;;;;;;;5492:32:1;;;;5486:3;5471:19;;;5464:61;5371:41;4814:717;-1:-1:-1;;;4814:717:1:o;5536:186::-;5595:6;5648:2;5636:9;5627:7;5623:23;5619:32;5616:52;;;5664:1;5661;5654:12;5616:52;5687:29;5706:9;5687:29;:::i;5727:549::-;6005:1;6001;5996:3;5992:11;5988:19;5980:6;5976:32;5965:9;5958:51;6045:6;6040:2;6029:9;6025:18;6018:34;6088:3;6083:2;6072:9;6068:18;6061:31;5939:4;6115:46;6156:3;6145:9;6141:19;6133:6;6115:46;:::i;:::-;6209:9;6201:6;6197:22;6192:2;6181:9;6177:18;6170:50;6237:33;6263:6;6255;6237:33;:::i;:::-;6229:41;5727:549;-1:-1:-1;;;;;;;5727:549:1:o;6281:127::-;6342:10;6337:3;6333:20;6330:1;6323:31;6373:4;6370:1;6363:15;6397:4;6394:1;6387:15;6413:275;6484:2;6478:9;6549:2;6530:13;;-1:-1:-1;;6526:27:1;6514:40;;-1:-1:-1;;;;;6569:34:1;;6605:22;;;6566:62;6563:88;;;6631:18;;:::i;:::-;6667:2;6660:22;6413:275;;-1:-1:-1;6413:275:1:o;6693:187::-;6742:4;-1:-1:-1;;;;;6767:6:1;6764:30;6761:56;;;6797:18;;:::i;:::-;-1:-1:-1;6863:2:1;6842:15;-1:-1:-1;;6838:29:1;6869:4;6834:40;;6693:187::o;6885:338::-;6950:5;6979:53;6995:36;7024:6;6995:36;:::i;:::-;6979:53;:::i;:::-;6970:62;;7055:6;7048:5;7041:21;7095:3;7086:6;7081:3;7077:16;7074:25;7071:45;;;7112:1;7109;7102:12;7071:45;7161:6;7156:3;7149:4;7142:5;7138:16;7125:43;7215:1;7208:4;7199:6;7192:5;7188:18;7184:29;7177:40;6885:338;;;;;:::o;7228:519::-;7306:6;7314;7367:2;7355:9;7346:7;7342:23;7338:32;7335:52;;;7383:1;7380;7373:12;7335:52;7419:9;7406:23;7396:33;;7480:2;7469:9;7465:18;7452:32;-1:-1:-1;;;;;7499:6:1;7496:30;7493:50;;;7539:1;7536;7529:12;7493:50;7562:22;;7615:4;7607:13;;7603:27;-1:-1:-1;7593:55:1;;7644:1;7641;7634:12;7593:55;7667:74;7733:7;7728:2;7715:16;7710:2;7706;7702:11;7667:74;:::i;:::-;7657:84;;;7228:519;;;;;:::o;7752:1151::-;7883:6;7891;7899;7907;7915;7923;7931;7939;7992:3;7980:9;7971:7;7967:23;7963:33;7960:53;;;8009:1;8006;7999:12;7960:53;8032:29;8051:9;8032:29;:::i;:::-;8022:39;;8112:2;8101:9;8097:18;8084:32;-1:-1:-1;;;;;8176:2:1;8168:6;8165:14;8162:34;;;8192:1;8189;8182:12;8162:34;8231:58;8281:7;8272:6;8261:9;8257:22;8231:58;:::i;:::-;8308:8;;-1:-1:-1;8205:84:1;-1:-1:-1;8396:2:1;8381:18;;8368:32;;-1:-1:-1;8412:16:1;;;8409:36;;;8441:1;8438;8431:12;8409:36;8480:60;8532:7;8521:8;8510:9;8506:24;8480:60;:::i;:::-;8559:8;;-1:-1:-1;8454:86:1;-1:-1:-1;8647:2:1;8632:18;;8619:32;;-1:-1:-1;8663:16:1;;;8660:36;;;8692:1;8689;8682:12;8660:36;;8731:60;8783:7;8772:8;8761:9;8757:24;8731:60;:::i;:::-;7752:1151;;;;-1:-1:-1;7752:1151:1;;;;;;8705:86;;8892:3;8877:19;8864:33;;7752:1151;-1:-1:-1;;;;7752:1151:1:o;8908:118::-;8994:5;8987:13;8980:21;8973:5;8970:32;8960:60;;9016:1;9013;9006:12;9031:315;9096:6;9104;9157:2;9145:9;9136:7;9132:23;9128:32;9125:52;;;9173:1;9170;9163:12;9125:52;9196:29;9215:9;9196:29;:::i;:::-;9186:39;;9275:2;9264:9;9260:18;9247:32;9288:28;9310:5;9288:28;:::i;:::-;9335:5;9325:15;;;9031:315;;;;;:::o;9351:221::-;9393:5;9446:3;9439:4;9431:6;9427:17;9423:27;9413:55;;9464:1;9461;9454:12;9413:55;9486:80;9562:3;9553:6;9540:20;9533:4;9525:6;9521:17;9486:80;:::i;9577:320::-;9645:6;9698:2;9686:9;9677:7;9673:23;9669:32;9666:52;;;9714:1;9711;9704:12;9666:52;9754:9;9741:23;-1:-1:-1;;;;;9779:6:1;9776:30;9773:50;;;9819:1;9816;9809:12;9773:50;9842:49;9883:7;9874:6;9863:9;9859:22;9842:49;:::i;9902:1073::-;10021:6;10029;10037;10045;10053;10061;10069;10122:3;10110:9;10101:7;10097:23;10093:33;10090:53;;;10139:1;10136;10129:12;10090:53;10175:9;10162:23;10152:33;;10236:2;10225:9;10221:18;10208:32;-1:-1:-1;;;;;10300:2:1;10292:6;10289:14;10286:34;;;10316:1;10313;10306:12;10286:34;10355:58;10405:7;10396:6;10385:9;10381:22;10355:58;:::i;:::-;10432:8;;-1:-1:-1;10329:84:1;-1:-1:-1;10520:2:1;10505:18;;10492:32;;-1:-1:-1;10536:16:1;;;10533:36;;;10565:1;10562;10555:12;10533:36;10604:60;10656:7;10645:8;10634:9;10630:24;10604:60;:::i;:::-;10683:8;;-1:-1:-1;10578:86:1;-1:-1:-1;10771:2:1;10756:18;;10743:32;;-1:-1:-1;10787:16:1;;;10784:36;;;10816:1;10813;10806:12;10784:36;;10855:60;10907:7;10896:8;10885:9;10881:24;10855:60;:::i;:::-;9902:1073;;;;-1:-1:-1;9902:1073:1;;-1:-1:-1;9902:1073:1;;;;10829:86;;-1:-1:-1;;;9902:1073:1:o;10980:785::-;11079:6;11087;11095;11103;11111;11164:2;11152:9;11143:7;11139:23;11135:32;11132:52;;;11180:1;11177;11170:12;11132:52;11216:9;11203:23;11193:33;;11277:2;11266:9;11262:18;11249:32;-1:-1:-1;;;;;11341:2:1;11333:6;11330:14;11327:34;;;11357:1;11354;11347:12;11327:34;11396:58;11446:7;11437:6;11426:9;11422:22;11396:58;:::i;:::-;11473:8;;-1:-1:-1;11370:84:1;-1:-1:-1;11561:2:1;11546:18;;11533:32;;-1:-1:-1;11577:16:1;;;11574:36;;;11606:1;11603;11596:12;11574:36;;11645:60;11697:7;11686:8;11675:9;11671:24;11645:60;:::i;:::-;10980:785;;;;-1:-1:-1;10980:785:1;;-1:-1:-1;11724:8:1;;11619:86;10980:785;-1:-1:-1;;;10980:785:1:o;11770:537::-;11865:6;11873;11881;11889;11942:3;11930:9;11921:7;11917:23;11913:33;11910:53;;;11959:1;11956;11949:12;11910:53;11982:29;12001:9;11982:29;:::i;:::-;11972:39;;12030:38;12064:2;12053:9;12049:18;12030:38;:::i;:::-;12020:48;;12115:2;12104:9;12100:18;12087:32;12077:42;;12170:2;12159:9;12155:18;12142:32;-1:-1:-1;;;;;12189:6:1;12186:30;12183:50;;;12229:1;12226;12219:12;12183:50;12252:49;12293:7;12284:6;12273:9;12269:22;12252:49;:::i;:::-;12242:59;;;11770:537;;;;;;;:::o;12312:1004::-;12422:6;12430;12438;12446;12454;12462;12515:2;12503:9;12494:7;12490:23;12486:32;12483:52;;;12531:1;12528;12521:12;12483:52;12571:9;12558:23;-1:-1:-1;;;;;12641:2:1;12633:6;12630:14;12627:34;;;12657:1;12654;12647:12;12627:34;12696:58;12746:7;12737:6;12726:9;12722:22;12696:58;:::i;:::-;12773:8;;-1:-1:-1;12670:84:1;-1:-1:-1;12861:2:1;12846:18;;12833:32;;-1:-1:-1;12877:16:1;;;12874:36;;;12906:1;12903;12896:12;12874:36;12945:60;12997:7;12986:8;12975:9;12971:24;12945:60;:::i;:::-;13024:8;;-1:-1:-1;12919:86:1;-1:-1:-1;13112:2:1;13097:18;;13084:32;;-1:-1:-1;13128:16:1;;;13125:36;;;13157:1;13154;13147:12;13125:36;;13196:60;13248:7;13237:8;13226:9;13222:24;13196:60;:::i;:::-;12312:1004;;;;-1:-1:-1;12312:1004:1;;-1:-1:-1;12312:1004:1;;13275:8;;12312:1004;-1:-1:-1;;;12312:1004:1:o;13321:260::-;13389:6;13397;13450:2;13438:9;13429:7;13425:23;13421:32;13418:52;;;13466:1;13463;13456:12;13418:52;13489:29;13508:9;13489:29;:::i;:::-;13479:39;;13537:38;13571:2;13560:9;13556:18;13537:38;:::i;13791:380::-;13870:1;13866:12;;;;13913;;;13934:61;;13988:4;13980:6;13976:17;13966:27;;13934:61;14041:2;14033:6;14030:14;14010:18;14007:38;14004:161;;14087:10;14082:3;14078:20;14075:1;14068:31;14122:4;14119:1;14112:15;14150:4;14147:1;14140:15;14004:161;;13791:380;;;:::o;14556:127::-;14617:10;14612:3;14608:20;14605:1;14598:31;14648:4;14645:1;14638:15;14672:4;14669:1;14662:15;14688:168;14761:9;;;14792;;14809:15;;;14803:22;;14789:37;14779:71;;14830:18;;:::i;14861:127::-;14922:10;14917:3;14913:20;14910:1;14903:31;14953:4;14950:1;14943:15;14977:4;14974:1;14967:15;14993:120;15033:1;15059;15049:35;;15064:18;;:::i;:::-;-1:-1:-1;15098:9:1;;14993:120::o;15118:245::-;15185:6;15238:2;15226:9;15217:7;15213:23;15209:32;15206:52;;;15254:1;15251;15244:12;15206:52;15286:9;15280:16;15305:28;15327:5;15305:28;:::i;15722:271::-;15905:6;15897;15892:3;15879:33;15861:3;15931:16;;15956:13;;;15931:16;15722:271;-1:-1:-1;15722:271:1:o;16124:723::-;16174:3;16215:5;16209:12;16244:36;16270:9;16244:36;:::i;:::-;16299:1;16316:17;;;16342:133;;;;16489:1;16484:357;;;;16309:532;;16342:133;-1:-1:-1;;16375:24:1;;16363:37;;16448:14;;16441:22;16429:35;;16420:45;;;-1:-1:-1;16342:133:1;;16484:357;16515:5;16512:1;16505:16;16544:4;16589;16586:1;16576:18;16616:1;16630:165;16644:6;16641:1;16638:13;16630:165;;;16722:14;;16709:11;;;16702:35;16765:16;;;;16659:10;;16630:165;;;16634:3;;;16824:6;16819:3;16815:16;16808:23;;16309:532;;;;;16124:723;;;;:::o;16852:197::-;16980:3;17005:38;17039:3;17031:6;17005:38;:::i;17054:125::-;17119:9;;;17140:10;;;17137:36;;;17153:18;;:::i;17529:197::-;17570:3;17608:5;17602:12;17623:65;17681:6;17676:3;17669:4;17662:5;17658:16;17623:65;:::i;:::-;17704:16;;;;;17529:197;-1:-1:-1;;17529:197:1:o;17731:287::-;17860:3;17898:6;17892:13;17914:66;17973:6;17968:3;17961:4;17953:6;17949:17;17914:66;:::i;:::-;17996:16;;;;;17731:287;-1:-1:-1;;17731:287:1:o;18782:518::-;18884:2;18879:3;18876:11;18873:421;;;18920:5;18917:1;18910:16;18964:4;18961:1;18951:18;19034:2;19022:10;19018:19;19015:1;19011:27;19005:4;19001:38;19070:4;19058:10;19055:20;19052:47;;;-1:-1:-1;19093:4:1;19052:47;19148:2;19143:3;19139:12;19136:1;19132:20;19126:4;19122:31;19112:41;;19203:81;19221:2;19214:5;19211:13;19203:81;;;19280:1;19266:16;;19247:1;19236:13;19203:81;;19476:1345;19602:3;19596:10;-1:-1:-1;;;;;19621:6:1;19618:30;19615:56;;;19651:18;;:::i;:::-;19680:97;19770:6;19730:38;19762:4;19756:11;19730:38;:::i;:::-;19724:4;19680:97;:::i;:::-;19832:4;;19889:2;19878:14;;19906:1;19901:663;;;;20608:1;20625:6;20622:89;;;-1:-1:-1;20677:19:1;;;20671:26;20622:89;-1:-1:-1;;19433:1:1;19429:11;;;19425:24;19421:29;19411:40;19457:1;19453:11;;;19408:57;20724:81;;19871:944;;19901:663;16071:1;16064:14;;;16108:4;16095:18;;-1:-1:-1;;19937:20:1;;;20055:236;20069:7;20066:1;20063:14;20055:236;;;20158:19;;;20152:26;20137:42;;20250:27;;;;20218:1;20206:14;;;;20085:19;;20055:236;;;20059:3;20319:6;20310:7;20307:19;20304:201;;;20380:19;;;20374:26;-1:-1:-1;;20463:1:1;20459:14;;;20475:3;20455:24;20451:37;20447:42;20432:58;20417:74;;20304:201;;;20551:1;20542:6;20539:1;20535:14;20531:22;20525:4;20518:36;19871:944;;;;;19476:1345;;:::o;20826:135::-;20865:3;20886:17;;;20883:43;;20906:18;;:::i;:::-;-1:-1:-1;20953:1:1;20942:13;;20826:135::o;20966:128::-;21033:9;;;21054:11;;;21051:37;;;21068:18;;:::i;21099:266::-;21187:6;21182:3;21175:19;21239:6;21232:5;21225:4;21220:3;21216:14;21203:43;-1:-1:-1;21291:1:1;21266:16;;;21284:4;21262:27;;;21255:38;;;;21347:2;21326:15;;;-1:-1:-1;;21322:29:1;21313:39;;;21309:50;;21099:266::o;21370:244::-;21527:2;21516:9;21509:21;21490:4;21547:61;21604:2;21593:9;21589:18;21581:6;21573;21547:61;:::i;21619:184::-;21689:6;21742:2;21730:9;21721:7;21717:23;21713:32;21710:52;;;21758:1;21755;21748:12;21710:52;-1:-1:-1;21781:16:1;;21619:184;-1:-1:-1;21619:184:1:o;21808:315::-;21993:6;21982:9;21975:25;22036:2;22031;22020:9;22016:18;22009:30;21956:4;22056:61;22113:2;22102:9;22098:18;22090:6;22082;22056:61;:::i;:::-;22048:69;21808:315;-1:-1:-1;;;;;21808:315:1:o;22128:431::-;22341:2;22330:9;22323:21;22304:4;22367:61;22424:2;22413:9;22409:18;22401:6;22393;22367:61;:::i;:::-;22476:9;22468:6;22464:22;22459:2;22448:9;22444:18;22437:50;22504:49;22546:6;22538;22530;22504:49;:::i;23462:1198::-;-1:-1:-1;;;;;23581:3:1;23578:27;23575:53;;;23608:18;;:::i;:::-;23637:94;23727:3;23687:38;23719:4;23713:11;23687:38;:::i;:::-;23681:4;23637:94;:::i;:::-;23757:1;23782:2;23777:3;23774:11;23799:1;23794:608;;;;24446:1;24463:3;24460:93;;;-1:-1:-1;24519:19:1;;;24506:33;24460:93;-1:-1:-1;;19433:1:1;19429:11;;;19425:24;19421:29;19411:40;19457:1;19453:11;;;19408:57;24566:78;;23767:887;;23794:608;16071:1;16064:14;;;16108:4;16095:18;;-1:-1:-1;;23830:17:1;;;23945:229;23959:7;23956:1;23953:14;23945:229;;;24048:19;;;24035:33;24020:49;;24155:4;24140:20;;;;24108:1;24096:14;;;;23975:12;23945:229;;;23949:3;24202;24193:7;24190:16;24187:159;;;24326:1;24322:6;24316:3;24310;24307:1;24303:11;24299:21;24295:34;24291:39;24278:9;24273:3;24269:19;24256:33;24252:79;24244:6;24237:95;24187:159;;;24389:1;24383:3;24380:1;24376:11;24372:19;24366:4;24359:33;23767:887;;23462:1198;;;:::o;24665:1459::-;24985:6;24974:9;24967:25;24948:4;25011:2;25049:6;25044:2;25033:9;25029:18;25022:34;25092:3;25087:2;25076:9;25072:18;25065:31;25116:1;25149:6;25143:13;25179:36;25205:9;25179:36;:::i;:::-;25252:6;25246:3;25235:9;25231:19;25224:35;25278:3;25300:1;25332;25321:9;25317:17;25348:1;25343:160;;;;25517:1;25512:355;;;;25310:557;;25343:160;25411:3;25407:8;25396:9;25392:24;25386:3;25375:9;25371:19;25364:53;25489:3;25477:6;25470:14;25463:22;25460:1;25456:30;25445:9;25441:46;25437:56;25430:63;;25343:160;;25512:355;25543:6;25540:1;25533:17;25591:2;25588:1;25578:16;25616:1;25630:180;25644:6;25641:1;25638:13;25630:180;;;25737:14;;25713:17;;;25709:26;;25702:50;25780:16;;;;25659:10;;25630:180;;;25834:17;;25853:3;25830:27;;-1:-1:-1;;25310:557:1;;;;;;25912:9;25907:3;25903:19;25898:2;25887:9;25883:18;25876:47;25946:46;25988:3;25980:6;25972;25946:46;:::i;:::-;25932:60;;;26041:9;26033:6;26029:22;26023:3;26012:9;26008:19;26001:51;26069:49;26111:6;26103;26095;26069:49;:::i;26406:461::-;26668:31;26663:3;26656:44;26638:3;26729:6;26723:13;26745:75;26813:6;26808:2;26803:3;26799:12;26792:4;26784:6;26780:17;26745:75;:::i;:::-;26840:16;;;;26858:2;26836:25;;26406:461;-1:-1:-1;;26406:461:1:o;26872:648::-;26951:6;27004:2;26992:9;26983:7;26979:23;26975:32;26972:52;;;27020:1;27017;27010:12;26972:52;27053:9;27047:16;-1:-1:-1;;;;;27078:6:1;27075:30;27072:50;;;27118:1;27115;27108:12;27072:50;27141:22;;27194:4;27186:13;;27182:27;-1:-1:-1;27172:55:1;;27223:1;27220;27213:12;27172:55;27252:2;27246:9;27277:49;27293:32;27322:2;27293:32;:::i;27277:49::-;27349:2;27342:5;27335:17;27389:7;27384:2;27379;27375;27371:11;27367:20;27364:33;27361:53;;;27410:1;27407;27400:12;27361:53;27423:67;27487:2;27482;27475:5;27471:14;27466:2;27462;27458:11;27423:67;:::i;27735:706::-;28064:6;28053:9;28046:25;28107:3;28102:2;28091:9;28087:18;28080:31;28027:4;28134:46;28175:3;28164:9;28160:19;28152:6;28134:46;:::i;:::-;-1:-1:-1;;;;;28216:32:1;;;;28211:2;28196:18;;28189:60;-1:-1:-1;;;;;;28285:31:1;;;;28280:2;28265:18;;28258:59;28354:22;;;28348:3;28333:19;;;28326:51;-1:-1:-1;28386:17:1;;28432:2;28420:15;;27735:706;-1:-1:-1;;27735:706:1:o;29794:461::-;30027:6;30016:9;30009:25;30099:1;30095;30090:3;30086:11;30082:19;30074:6;30070:32;30065:2;30054:9;30050:18;30043:60;30139:6;30134:2;30123:9;30119:18;30112:34;30182:3;30177:2;30166:9;30162:18;30155:31;29990:4;30203:46;30244:3;30233:9;30229:19;30221:6;30203:46;:::i;:::-;30195:54;29794:461;-1:-1:-1;;;;;;29794:461:1:o;30260:489::-;-1:-1:-1;;;;;30529:15:1;;;30511:34;;30581:15;;30576:2;30561:18;;30554:43;30628:2;30613:18;;30606:34;;;30676:3;30671:2;30656:18;;30649:31;;;30454:4;;30697:46;;30723:19;;30715:6;30697:46;:::i;30754:249::-;30823:6;30876:2;30864:9;30855:7;30851:23;30847:32;30844:52;;;30892:1;30889;30882:12;30844:52;30924:9;30918:16;30943:30;30967:5;30943:30;:::i;31008:856::-;31389:3;31427:6;31421:13;31443:66;31502:6;31497:3;31490:4;31482:6;31478:17;31443:66;:::i;:::-;-1:-1:-1;;;31531:16:1;;;31556:70;;;31651:13;;31673:79;31651:13;31738:2;31727:14;;31720:4;31708:17;;31673:79;:::i;:::-;-1:-1:-1;;;31815:2:1;31771:20;;;;31807:11;;;31800:31;31855:2;31847:11;;31008:856;-1:-1:-1;;;;31008:856:1:o;31869:703::-;32096:3;32134:6;32128:13;32150:66;32209:6;32204:3;32197:4;32189:6;32185:17;32150:66;:::i;:::-;32279:13;;32238:16;;;;32301:70;32279:13;32238:16;32348:4;32336:17;;32301:70;:::i;:::-;32438:13;;32393:20;;;32460:70;32438:13;32393:20;32507:4;32495:17;;32460:70;:::i;:::-;32546:20;;31869:703;-1:-1:-1;;;;;31869:703:1:o;32707:2695::-;-1:-1:-1;;;33648:43:1;;33630:3;33710:46;33753:1;33744:11;;33736:6;33710:46;:::i;:::-;33776:66;33765:78;;-1:-1:-1;;;33867:2:1;33859:11;;33852:74;33945:46;33987:2;33979:11;;33971:6;33945:46;:::i;:::-;33935:56;;34011:66;34007:2;34000:78;34116:16;34111:3;34107:26;34102:2;34098;34094:11;34087:47;34163:6;34157:13;34179:72;34244:6;34239:2;34235;34231:11;34226:2;34218:6;34214:15;34179:72;:::i;:::-;34314:66;34309:2;34270:15;;;;34301:11;;;34294:87;-1:-1:-1;;;34405:2:1;34397:11;;34390:51;34466:13;;34488:74;34466:13;34548:2;34540:11;;34535:2;34523:15;;34488:74;:::i;:::-;34627:66;34622:2;34581:17;;;;34614:11;;;34607:87;34724:66;34718:3;34710:12;;34703:88;34821:66;34815:3;34807:12;;34800:88;34918:34;34912:3;34904:12;;34897:56;34983:34;34977:3;34969:12;;34962:56;35048:34;35042:3;35034:12;;35027:56;35113:66;35107:3;35099:12;;35092:88;35210:66;35204:3;35196:12;;35189:88;-1:-1:-1;;;35301:3:1;35293:12;;35286:25;35327:69;35357:38;35390:3;35382:12;;35374:6;35357:38;:::i;:::-;-1:-1:-1;;;32642:27:1;;32694:1;32685:11;;32577:125;35327:69;35320:76;32707:2695;-1:-1:-1;;;;;;;;32707:2695:1:o;35407:127::-;35468:10;35463:3;35459:20;35456:1;35449:31;35499:4;35496:1;35489:15;35523:4;35520:1;35513:15;35539:416;35628:1;35665:5;35628:1;35679:270;35700:7;35690:8;35687:21;35679:270;;;35759:4;35755:1;35751:6;35747:17;35741:4;35738:27;35735:53;;;35768:18;;:::i;:::-;35818:7;35808:8;35804:22;35801:55;;;35838:16;;;;35801:55;35917:22;;;;35877:15;;;;35679:270;;;35683:3;35539:416;;;;;:::o;35960:806::-;36009:5;36039:8;36029:80;;-1:-1:-1;36080:1:1;36094:5;;36029:80;36128:4;36118:76;;-1:-1:-1;36165:1:1;36179:5;;36118:76;36210:4;36228:1;36223:59;;;;36296:1;36291:130;;;;36203:218;;36223:59;36253:1;36244:10;;36267:5;;;36291:130;36328:3;36318:8;36315:17;36312:43;;;36335:18;;:::i;:::-;-1:-1:-1;;36391:1:1;36377:16;;36406:5;;36203:218;;36505:2;36495:8;36492:16;36486:3;36480:4;36477:13;36473:36;36467:2;36457:8;36454:16;36449:2;36443:4;36440:12;36436:35;36433:77;36430:159;;;-1:-1:-1;36542:19:1;;;36574:5;;36430:159;36621:34;36646:8;36640:4;36621:34;:::i;:::-;36691:6;36687:1;36683:6;36679:19;36670:7;36667:32;36664:58;;;36702:18;;:::i;:::-;36740:20;;35960:806;-1:-1:-1;;;35960:806:1:o;36771:131::-;36831:5;36860:36;36887:8;36881:4;36860:36;:::i;36907:165::-;36945:1;36979:4;36976:1;36972:12;37003:3;36993:37;;37010:18;;:::i;:::-;37062:3;37055:4;37052:1;37048:12;37044:22;37039:27;;;36907:165;;;;:::o;37077:225::-;37181:4;37160:12;;;37174;;;37156:31;37207:22;;;;37248:24;;;37238:58;;37276:18;;:::i;37307:151::-;37397:4;37390:12;;;37376;;;37372:31;;37415:14;;37412:40;;;37432:18;;:::i;37463:148::-;37551:4;37530:12;;;37544;;;37526:31;;37569:13;;37566:39;;;37585:18;;:::i
Swarm Source
ipfs://980c8884994ba0cfe8a0c29296d1997e4fb2bc132d37eea4739a95069c6b2e40
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
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.