More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 1,828 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 55977081 | 4 days ago | IN | 0 AVAX | 0.00005787 | ||||
Set Approval For... | 55948229 | 5 days ago | IN | 0 AVAX | 0.0000321 | ||||
Set Approval For... | 55847980 | 7 days ago | IN | 0 AVAX | 0.00011574 | ||||
Set Approval For... | 55846700 | 7 days ago | IN | 0 AVAX | 0.00005138 | ||||
Set Approval For... | 55777766 | 9 days ago | IN | 0 AVAX | 0.00002947 | ||||
Set Approval For... | 55762815 | 9 days ago | IN | 0 AVAX | 0.00017417 | ||||
Set Approval For... | 55705557 | 10 days ago | IN | 0 AVAX | 0.00011574 | ||||
Set Approval For... | 55687030 | 11 days ago | IN | 0 AVAX | 0.00011599 | ||||
Set Approval For... | 55633846 | 12 days ago | IN | 0 AVAX | 0.00016203 | ||||
Transfer From | 55446815 | 16 days ago | IN | 0 AVAX | 0.0002275 | ||||
Set Approval For... | 55428790 | 16 days ago | IN | 0 AVAX | 0.00004675 | ||||
Set Approval For... | 55416057 | 16 days ago | IN | 0 AVAX | 0.00003648 | ||||
Set Approval For... | 55325922 | 18 days ago | IN | 0 AVAX | 0.00011574 | ||||
Set Approval For... | 55138932 | 22 days ago | IN | 0 AVAX | 0.00016203 | ||||
Set Approval For... | 55138295 | 22 days ago | IN | 0 AVAX | 0.00016203 | ||||
Set Approval For... | 55112409 | 23 days ago | IN | 0 AVAX | 0.00004675 | ||||
Set Approval For... | 55103685 | 23 days ago | IN | 0 AVAX | 0.00007296 | ||||
Set Approval For... | 55055520 | 24 days ago | IN | 0 AVAX | 0.00011553 | ||||
Set Approval For... | 54825138 | 29 days ago | IN | 0 AVAX | 0.00007296 | ||||
Set Approval For... | 54789184 | 30 days ago | IN | 0 AVAX | 0.00006759 | ||||
Set Approval For... | 54710639 | 32 days ago | IN | 0 AVAX | 0.00002947 | ||||
Set Approval For... | 54710607 | 32 days ago | IN | 0 AVAX | 0.00004675 | ||||
Set Approval For... | 54655801 | 33 days ago | IN | 0 AVAX | 0.00011574 | ||||
Set Approval For... | 54648103 | 33 days ago | IN | 0 AVAX | 0.00007296 | ||||
Set Approval For... | 54581189 | 34 days ago | IN | 0 AVAX | 0.00011574 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
49448475 | 156 days ago | 34 AVAX | ||||
49448475 | 156 days ago | 306 AVAX | ||||
49376837 | 158 days ago | 0.6 AVAX | ||||
49376837 | 158 days ago | 5.4 AVAX | ||||
49364447 | 158 days ago | 6.6 AVAX | ||||
49364447 | 158 days ago | 59.4 AVAX | ||||
49258378 | 161 days ago | 1 AVAX | ||||
49258378 | 161 days ago | 9 AVAX | ||||
49241595 | 161 days ago | 1.8 AVAX | ||||
49241595 | 161 days ago | 16.2 AVAX | ||||
49206918 | 162 days ago | 0.8 AVAX | ||||
49206918 | 162 days ago | 7.2 AVAX | ||||
49158411 | 163 days ago | 2.2 AVAX | ||||
49158411 | 163 days ago | 19.8 AVAX | ||||
49115445 | 165 days ago | 1 AVAX | ||||
49115445 | 165 days ago | 9 AVAX | ||||
49092055 | 165 days ago | 1 AVAX | ||||
49092055 | 165 days ago | 9 AVAX | ||||
49091273 | 165 days ago | 1.6 AVAX | ||||
49091273 | 165 days ago | 14.4 AVAX | ||||
49035233 | 167 days ago | 0.6 AVAX | ||||
49035233 | 167 days ago | 5.4 AVAX | ||||
49004064 | 167 days ago | 1 AVAX | ||||
49004064 | 167 days ago | 9 AVAX | ||||
48992804 | 168 days ago | 0.4 AVAX |
Loading...
Loading
Contract Name:
LilCoqMint
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at snowscan.xyz on 2024-04-24 */ // Sources flattened with hardhat v2.19.2 https://hardhat.org // SPDX-License-Identifier: MIT // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/token/ERC721/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File @openzeppelin/contracts/utils/introspection/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/utils/math/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // File @openzeppelin/contracts/utils/math/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // File @openzeppelin/contracts/token/ERC721/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File contracts/lil-coq/mint.erc721.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.16; contract LilCoqMint is ERC721Enumerable, Ownable { using Counters for Counters.Counter; using Strings for uint256; Counters.Counter private _tokenIds; bool public isSaleActive = false; bool public isAllowListActive = false; string private _baseURIAddr; uint256 public MAX_SUPPLY = 2420; uint256 public MAX_PUBLIC_MINT = 20; uint256 public PRICE_PER_TOKEN = 2 ether; uint256 public ALLOWLIST_PRICE_PER_TOKEN = 1.5 ether; uint256 private _royaltyAmount = 500; uint256 private constant OPERATIONS_SHARE = 90; uint256 private constant TEAM_SHARE = 10; uint256 public totalSupplyAtWithdrawal; address private _operationsWallet; address private _teamWallet; address private _royaltyReceiver; mapping(address => uint256) private _allowList; mapping(address => bool) private approvedAddresses; constructor( address operationsAddr, address royaltyReceiver, address teamAddrr, string memory baseURI_ ) ERC721("Lil Coq", "LilCoq") { _baseURIAddr = baseURI_; _operationsWallet = operationsAddr; _royaltyReceiver = royaltyReceiver; _teamWallet = teamAddrr; } modifier onlyOwnerOrApproved() { require( msg.sender == owner() || approvedAddresses[msg.sender], "Caller is not the owner or an approved address" ); _; } function addApprovedAddress(address _addr) external onlyOwner { approvedAddresses[_addr] = true; } function removeApprovedAddress(address _addr) external onlyOwner { approvedAddresses[_addr] = false; } function isOwnerOrApproved(address _addr) public view returns (bool) { return _addr == owner() || approvedAddresses[_addr]; } function setIsAllowListActive(bool _isAllowListActive) external onlyOwner { isAllowListActive = _isAllowListActive; } function setAllowList( address[] calldata addresses, uint8 numAllowedToMint ) external onlyOwnerOrApproved { for (uint256 i = 0; i < addresses.length; i++) { _allowList[addresses[i]] = numAllowedToMint; } } function numAvailableToMint(address addr) external view returns (uint256) { return _allowList[addr]; } function updateMaxMint(uint256 _max) external onlyOwnerOrApproved { MAX_PUBLIC_MINT = _max; } function updateMintCost(uint256 _newMintCost) external onlyOwnerOrApproved { PRICE_PER_TOKEN = _newMintCost; } function updateWlMintCost( uint256 _newMintCost ) external onlyOwnerOrApproved { ALLOWLIST_PRICE_PER_TOKEN = _newMintCost; } function setBaseURI(string memory baseURI_) external onlyOwnerOrApproved { _baseURIAddr = baseURI_; } function _baseURI() internal view virtual override returns (string memory) { return _baseURIAddr; } function reserveMint( uint256 amount, address to ) public onlyOwnerOrApproved { _mintTokens(amount, to); } function mint(uint256 numberOfTokens) public payable { require(isSaleActive, "Sale must be active to mint tokens"); require( numberOfTokens <= MAX_PUBLIC_MINT, "Exceeded max token purchase" ); require( totalSupply() + numberOfTokens <= MAX_SUPPLY, "Purchase would exceed max tokens" ); require( PRICE_PER_TOKEN * numberOfTokens <= msg.value, "Value sent is not correct" ); _mintTokens(numberOfTokens, msg.sender); } function mintAllowList(uint256 numberOfTokens) external payable { require(isAllowListActive, "Allow list is not active"); require( numberOfTokens <= _allowList[msg.sender], "Exceeded max available to purchase" ); require( totalSupply() + numberOfTokens <= MAX_SUPPLY, "Purchase would exceed max tokens" ); require( ALLOWLIST_PRICE_PER_TOKEN * numberOfTokens <= msg.value, "Value sent is not correct" ); _allowList[msg.sender] -= numberOfTokens; _mintTokens(numberOfTokens, msg.sender); } function _mintTokens(uint256 numberOfTokens, address recipient) private { for (uint256 i = 0; i < numberOfTokens; i++) { _tokenIds.increment(); _safeMint(recipient, _tokenIds.current()); } } function withdraw() public onlyOwnerOrApproved { uint256 balance = address(this).balance; require(balance > 0, "No balance to withdraw"); totalSupplyAtWithdrawal = totalSupply(); uint256 operationsAmount = (balance * OPERATIONS_SHARE) / 100; uint256 teamAmount = (balance * TEAM_SHARE) / 100; payable(_operationsWallet).transfer(operationsAmount); payable(_teamWallet).transfer(teamAmount); } function setOperationsWallet(address addr_) public onlyOwnerOrApproved { _operationsWallet = addr_; } function setTeamWallet(address addr_) public onlyOwnerOrApproved { _teamWallet = addr_; } function setSaleState(bool newState) public onlyOwnerOrApproved { isSaleActive = newState; } function royaltyInfo( uint256 _tokenId, uint256 _salePrice ) external view returns (address receiver, uint256 royaltyAmount) { return (_royaltyReceiver, (_salePrice * _royaltyAmount) / 10000); } function supportsInterface( bytes4 interfaceId ) public view override(ERC721Enumerable) returns (bool) { return interfaceId == 0x2a55205a || super.supportsInterface(interfaceId); } function setRoyaltyInfo( address _receiver, uint256 _royaltyFee ) public onlyOwnerOrApproved { _royaltyReceiver = _receiver; _royaltyAmount = _royaltyFee; } function tokenURI( uint256 tokenId ) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json")) : ""; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"operationsAddr","type":"address"},{"internalType":"address","name":"royaltyReceiver","type":"address"},{"internalType":"address","name":"teamAddrr","type":"address"},{"internalType":"string","name":"baseURI_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRICE_PER_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PER_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"addApprovedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAllowListActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"isOwnerOrApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintAllowList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"numAvailableToMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"removeApprovedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"reserveMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint8","name":"numAllowedToMint","type":"uint8"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isAllowListActive","type":"bool"}],"name":"setIsAllowListActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr_","type":"address"}],"name":"setOperationsWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_royaltyFee","type":"uint256"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr_","type":"address"}],"name":"setTeamWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplyAtWithdrawal","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":"uint256","name":"_max","type":"uint256"}],"name":"updateMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMintCost","type":"uint256"}],"name":"updateMintCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMintCost","type":"uint256"}],"name":"updateWlMintCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600c805461ffff19169055610974600e556014600f55671bc16d674ec800006010556714d1120d7b1600006011556101f46012553480156200004557600080fd5b5060405162002fce38038062002fce8339810160408190526200006891620001c0565b604051806040016040528060078152602001664c696c20436f7160c81b815250604051806040016040528060068152602001654c696c436f7160d01b8152508160009081620000b891906200035c565b506001620000c782826200035c565b505050620000e4620000de6200013760201b60201c565b6200013b565b600d620000f282826200035c565b5050601480546001600160a01b039485166001600160a01b03199182161790915560168054938516938216939093179092556015805491909316911617905562000428565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80516001600160a01b0381168114620001a557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215620001d757600080fd5b620001e2856200018d565b93506020620001f38187016200018d565b935062000203604087016200018d565b60608701519093506001600160401b03808211156200022157600080fd5b818801915088601f8301126200023657600080fd5b8151818111156200024b576200024b620001aa565b604051601f8201601f19908116603f01168101908382118183101715620002765762000276620001aa565b816040528281528b868487010111156200028f57600080fd5b600093505b82841015620002b3578484018601518185018701529285019262000294565b600086848301015280965050505050505092959194509250565b600181811c90821680620002e257607f821691505b6020821081036200030357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200035757600081815260208120601f850160051c81016020861015620003325750805b601f850160051c820191505b8181101562000353578281556001016200033e565b5050505b505050565b81516001600160401b03811115620003785762000378620001aa565b6200039081620003898454620002cd565b8462000309565b602080601f831160018114620003c85760008415620003af5750858301515b600019600386901b1c1916600185901b17855562000353565b600085815260208120601f198616915b82811015620003f957888601518255948401946001909101908401620003d8565b5085821015620004185787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612b9680620004386000396000f3fe6080604052600436106102725760003560e01c8063715018a61161014f578063c4e37095116100c1578063e6c6df591161007a578063e6c6df5914610753578063e86fe2bb14610773578063e985e9c514610786578063ee5ecc89146107cf578063f2fde38b146107ef578063f5b3f4241461080f57600080fd5b8063c4e370951461069d578063c87b56dd146106bd578063d2ac1c8e146106dd578063d83151f5146106fd578063da4cecbe1461071d578063e2e784d51461073357600080fd5b806395d89b411161011357806395d89b41146105e95780639ca3d8df146105fe578063a0712d6814610614578063a22cb46514610627578063b88d4fde14610647578063c04a28361461066757600080fd5b8063715018a614610560578063718bc4af146105755780638295784d14610595578063833b9499146105b55780638da5cb5b146105cb57600080fd5b80632f745c59116101e857806355f804b3116101ac57806355f804b3146104b0578063564566a8146104d057806360b02f70146104ea5780636352211e1461050a57806365f130971461052a57806370a082311461054057600080fd5b80632f745c591461042557806332cb6b0c146104455780633ccfd60b1461045b57806342842e0e146104705780634f6ccce71461049057600080fd5b806318160ddd1161023a57806318160ddd1461034857806320f1d85b1461036757806323b872dd1461038757806328d911fb146103a757806329fc6bae146103c75780632a55205a146103e657600080fd5b806301ffc9a71461027757806306fdde03146102ac578063081812fc146102ce578063095ea7b3146103065780631525ff7d14610328575b600080fd5b34801561028357600080fd5b506102976102923660046123ab565b61082f565b60405190151581526020015b60405180910390f35b3480156102b857600080fd5b506102c161085a565b6040516102a39190612418565b3480156102da57600080fd5b506102ee6102e936600461242b565b6108ec565b6040516001600160a01b0390911681526020016102a3565b34801561031257600080fd5b50610326610321366004612460565b610913565b005b34801561033457600080fd5b5061032661034336600461248a565b610a2d565b34801561035457600080fd5b506008545b6040519081526020016102a3565b34801561037357600080fd5b5061032661038236600461248a565b610a93565b34801561039357600080fd5b506103266103a23660046124a5565b610abc565b3480156103b357600080fd5b506103266103c236600461242b565b610aed565b3480156103d357600080fd5b50600c5461029790610100900460ff1681565b3480156103f257600080fd5b506104066104013660046124e1565b610b36565b604080516001600160a01b0390931683526020830191909152016102a3565b34801561043157600080fd5b50610359610440366004612460565b610b70565b34801561045157600080fd5b50610359600e5481565b34801561046757600080fd5b50610326610c06565b34801561047c57600080fd5b5061032661048b3660046124a5565b610d47565b34801561049c57600080fd5b506103596104ab36600461242b565b610d62565b3480156104bc57600080fd5b506103266104cb36600461258f565b610df5565b3480156104dc57600080fd5b50600c546102979060ff1681565b3480156104f657600080fd5b506103266105053660046125d8565b610e49565b34801561051657600080fd5b506102ee61052536600461242b565b610e97565b34801561053657600080fd5b50610359600f5481565b34801561054c57600080fd5b5061035961055b36600461248a565b610ef7565b34801561056c57600080fd5b50610326610f7d565b34801561058157600080fd5b50610326610590366004612614565b610f91565b3480156105a157600080fd5b506103266105b036600461262f565b610fb3565b3480156105c157600080fd5b5061035960105481565b3480156105d757600080fd5b50600a546001600160a01b03166102ee565b3480156105f557600080fd5b506102c161105d565b34801561060a57600080fd5b5061035960135481565b61032661062236600461242b565b61106c565b34801561063357600080fd5b506103266106423660046126bb565b6111e6565b34801561065357600080fd5b506103266106623660046126e5565b6111f1565b34801561067357600080fd5b5061035961068236600461248a565b6001600160a01b031660009081526017602052604090205490565b3480156106a957600080fd5b506103266106b8366004612614565b611223565b3480156106c957600080fd5b506102c16106d836600461242b565b61127a565b3480156106e957600080fd5b506103266106f836600461248a565b611355565b34801561070957600080fd5b5061032661071836600461242b565b611381565b34801561072957600080fd5b5061035960115481565b34801561073f57600080fd5b5061032661074e366004612460565b6113ca565b34801561075f57600080fd5b5061032661076e36600461242b565b611434565b61032661078136600461242b565b61147d565b34801561079257600080fd5b506102976107a1366004612761565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107db57600080fd5b506103266107ea36600461248a565b61162b565b3480156107fb57600080fd5b5061032661080a36600461248a565b611691565b34801561081b57600080fd5b5061029761082a36600461248a565b611707565b600063152a902d60e11b6001600160e01b031983161480610854575061085482611754565b92915050565b6060600080546108699061278b565b80601f01602080910402602001604051908101604052809291908181526020018280546108959061278b565b80156108e25780601f106108b7576101008083540402835291602001916108e2565b820191906000526020600020905b8154815290600101906020018083116108c557829003601f168201915b5050505050905090565b60006108f782611779565b506000908152600460205260409020546001600160a01b031690565b600061091e82610e97565b9050806001600160a01b0316836001600160a01b0316036109905760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806109ac57506109ac81336107a1565b610a1e5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610987565b610a2883836117d8565b505050565b600a546001600160a01b0316331480610a5557503360009081526018602052604090205460ff165b610a715760405162461bcd60e51b8152600401610987906127c5565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b610a9b611846565b6001600160a01b03166000908152601860205260409020805460ff19169055565b610ac633826118a0565b610ae25760405162461bcd60e51b815260040161098790612813565b610a2883838361191f565b600a546001600160a01b0316331480610b1557503360009081526018602052604090205460ff165b610b315760405162461bcd60e51b8152600401610987906127c5565b601055565b60165460125460009182916001600160a01b039091169061271090610b5b9086612876565b610b659190612895565b915091509250929050565b6000610b7b83610ef7565b8210610bdd5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610987565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b0316331480610c2e57503360009081526018602052604090205460ff165b610c4a5760405162461bcd60e51b8152600401610987906127c5565b4780610c915760405162461bcd60e51b81526020600482015260166024820152754e6f2062616c616e636520746f20776974686472617760501b6044820152606401610987565b60085460135560006064610ca6605a84612876565b610cb09190612895565b905060006064610cc1600a85612876565b610ccb9190612895565b6014546040519192506001600160a01b03169083156108fc029084906000818181858888f19350505050158015610d06573d6000803e3d6000fd5b506015546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610d41573d6000803e3d6000fd5b50505050565b610a28838383604051806020016040528060008152506111f1565b6000610d6d60085490565b8210610dd05760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610987565b60088281548110610de357610de36128b7565b90600052602060002001549050919050565b600a546001600160a01b0316331480610e1d57503360009081526018602052604090205460ff165b610e395760405162461bcd60e51b8152600401610987906127c5565b600d610e45828261291b565b5050565b600a546001600160a01b0316331480610e7157503360009081526018602052604090205460ff165b610e8d5760405162461bcd60e51b8152600401610987906127c5565b610e458282611a90565b6000818152600260205260408120546001600160a01b0316806108545760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610987565b60006001600160a01b038216610f615760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610987565b506001600160a01b031660009081526003602052604090205490565b610f85611846565b610f8f6000611acd565b565b610f99611846565b600c80549115156101000261ff0019909216919091179055565b600a546001600160a01b0316331480610fdb57503360009081526018602052604090205460ff165b610ff75760405162461bcd60e51b8152600401610987906127c5565b60005b82811015610d41578160ff166017600086868581811061101c5761101c6128b7565b9050602002016020810190611031919061248a565b6001600160a01b0316815260208101919091526040016000205580611055816129db565b915050610ffa565b6060600180546108699061278b565b600c5460ff166110c95760405162461bcd60e51b815260206004820152602260248201527f53616c65206d7573742062652061637469766520746f206d696e7420746f6b656044820152616e7360f01b6064820152608401610987565b600f5481111561111b5760405162461bcd60e51b815260206004820152601b60248201527f4578636565646564206d617820746f6b656e20707572636861736500000000006044820152606401610987565b600e548161112860085490565b61113291906129f4565b11156111805760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e736044820152606401610987565b348160105461118f9190612876565b11156111d95760405162461bcd60e51b815260206004820152601960248201527815985b1d59481cd95b9d081a5cc81b9bdd0818dbdc9c9958dd603a1b6044820152606401610987565b6111e38133611a90565b50565b610e45338383611b1f565b6111fb33836118a0565b6112175760405162461bcd60e51b815260040161098790612813565b610d4184848484611bed565b600a546001600160a01b031633148061124b57503360009081526018602052604090205460ff165b6112675760405162461bcd60e51b8152600401610987906127c5565b600c805460ff1916911515919091179055565b6000818152600260205260409020546060906001600160a01b03166112f95760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610987565b6000611303611c20565b90506000815111611323576040518060200160405280600081525061134e565b8061132d84611c2f565b60405160200161133e929190612a07565b6040516020818303038152906040525b9392505050565b61135d611846565b6001600160a01b03166000908152601860205260409020805460ff19166001179055565b600a546001600160a01b03163314806113a957503360009081526018602052604090205460ff165b6113c55760405162461bcd60e51b8152600401610987906127c5565b601155565b600a546001600160a01b03163314806113f257503360009081526018602052604090205460ff165b61140e5760405162461bcd60e51b8152600401610987906127c5565b601680546001600160a01b0319166001600160a01b039390931692909217909155601255565b600a546001600160a01b031633148061145c57503360009081526018602052604090205460ff165b6114785760405162461bcd60e51b8152600401610987906127c5565b600f55565b600c54610100900460ff166114d45760405162461bcd60e51b815260206004820152601860248201527f416c6c6f77206c697374206973206e6f742061637469766500000000000000006044820152606401610987565b3360009081526017602052604090205481111561153e5760405162461bcd60e51b815260206004820152602260248201527f4578636565646564206d617820617661696c61626c6520746f20707572636861604482015261736560f01b6064820152608401610987565b600e548161154b60085490565b61155591906129f4565b11156115a35760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e736044820152606401610987565b34816011546115b29190612876565b11156115fc5760405162461bcd60e51b815260206004820152601960248201527815985b1d59481cd95b9d081a5cc81b9bdd0818dbdc9c9958dd603a1b6044820152606401610987565b336000908152601760205260408120805483929061161b908490612a46565b909155506111e390508133611a90565b600a546001600160a01b031633148061165357503360009081526018602052604090205460ff165b61166f5760405162461bcd60e51b8152600401610987906127c5565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b611699611846565b6001600160a01b0381166116fe5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610987565b6111e381611acd565b600061171b600a546001600160a01b031690565b6001600160a01b0316826001600160a01b031614806108545750506001600160a01b031660009081526018602052604090205460ff1690565b60006001600160e01b0319821663780e9d6360e01b1480610854575061085482611cc2565b6000818152600260205260409020546001600160a01b03166111e35760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610987565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061180d82610e97565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600a546001600160a01b03163314610f8f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610987565b6000806118ac83610e97565b9050806001600160a01b0316846001600160a01b031614806118f357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806119175750836001600160a01b031661190c846108ec565b6001600160a01b0316145b949350505050565b826001600160a01b031661193282610e97565b6001600160a01b0316146119585760405162461bcd60e51b815260040161098790612a59565b6001600160a01b0382166119ba5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610987565b6119c78383836001611d12565b826001600160a01b03166119da82610e97565b6001600160a01b031614611a005760405162461bcd60e51b815260040161098790612a59565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b82811015610a2857611aa9600b80546001019055565b611abb82611ab6600b5490565b611e46565b80611ac5816129db565b915050611a93565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603611b805760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610987565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611bf884848461191f565b611c0484848484611e60565b610d415760405162461bcd60e51b815260040161098790612a9e565b6060600d80546108699061278b565b60606000611c3c83611f61565b600101905060008167ffffffffffffffff811115611c5c57611c5c612503565b6040519080825280601f01601f191660200182016040528015611c86576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611c9057509392505050565b60006001600160e01b031982166380ac58cd60e01b1480611cf357506001600160e01b03198216635b5e139f60e01b145b8061085457506301ffc9a760e01b6001600160e01b0319831614610854565b6001811115611d815760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610987565b816001600160a01b038516611ddd57611dd881600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611e00565b836001600160a01b0316856001600160a01b031614611e0057611e008582612039565b6001600160a01b038416611e1c57611e17816120d6565b611e3f565b846001600160a01b0316846001600160a01b031614611e3f57611e3f8482612185565b5050505050565b610e458282604051806020016040528060008152506121c9565b60006001600160a01b0384163b15611f5657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ea4903390899088908890600401612af0565b6020604051808303816000875af1925050508015611edf575060408051601f3d908101601f19168201909252611edc91810190612b2d565b60015b611f3c573d808015611f0d576040519150601f19603f3d011682016040523d82523d6000602084013e611f12565b606091505b508051600003611f345760405162461bcd60e51b815260040161098790612a9e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611917565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611fa05772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611fcc576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611fea57662386f26fc10000830492506010015b6305f5e1008310612002576305f5e100830492506008015b612710831061201657612710830492506004015b60648310612028576064830492506002015b600a83106108545760010192915050565b6000600161204684610ef7565b6120509190612a46565b6000838152600760205260409020549091508082146120a3576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906120e890600190612a46565b60008381526009602052604081205460088054939450909284908110612110576121106128b7565b906000526020600020015490508060088381548110612131576121316128b7565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061216957612169612b4a565b6001900381819060005260206000200160009055905550505050565b600061219083610ef7565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6121d383836121fc565b6121e06000848484611e60565b610a285760405162461bcd60e51b815260040161098790612a9e565b6001600160a01b0382166122525760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610987565b6000818152600260205260409020546001600160a01b0316156122b75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610987565b6122c5600083836001611d12565b6000818152600260205260409020546001600160a01b03161561232a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610987565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b0319811681146111e357600080fd5b6000602082840312156123bd57600080fd5b813561134e81612395565b60005b838110156123e35781810151838201526020016123cb565b50506000910152565b600081518084526124048160208601602086016123c8565b601f01601f19169290920160200192915050565b60208152600061134e60208301846123ec565b60006020828403121561243d57600080fd5b5035919050565b80356001600160a01b038116811461245b57600080fd5b919050565b6000806040838503121561247357600080fd5b61247c83612444565b946020939093013593505050565b60006020828403121561249c57600080fd5b61134e82612444565b6000806000606084860312156124ba57600080fd5b6124c384612444565b92506124d160208501612444565b9150604084013590509250925092565b600080604083850312156124f457600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561253457612534612503565b604051601f8501601f19908116603f0116810190828211818310171561255c5761255c612503565b8160405280935085815286868601111561257557600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156125a157600080fd5b813567ffffffffffffffff8111156125b857600080fd5b8201601f810184136125c957600080fd5b61191784823560208401612519565b600080604083850312156125eb57600080fd5b823591506125fb60208401612444565b90509250929050565b8035801515811461245b57600080fd5b60006020828403121561262657600080fd5b61134e82612604565b60008060006040848603121561264457600080fd5b833567ffffffffffffffff8082111561265c57600080fd5b818601915086601f83011261267057600080fd5b81358181111561267f57600080fd5b8760208260051b850101111561269457600080fd5b6020928301955093505084013560ff811681146126b057600080fd5b809150509250925092565b600080604083850312156126ce57600080fd5b6126d783612444565b91506125fb60208401612604565b600080600080608085870312156126fb57600080fd5b61270485612444565b935061271260208601612444565b925060408501359150606085013567ffffffffffffffff81111561273557600080fd5b8501601f8101871361274657600080fd5b61275587823560208401612519565b91505092959194509250565b6000806040838503121561277457600080fd5b61277d83612444565b91506125fb60208401612444565b600181811c9082168061279f57607f821691505b6020821081036127bf57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f43616c6c6572206973206e6f7420746865206f776e6572206f7220616e20617060408201526d70726f766564206164647265737360901b606082015260800190565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561289057612890612860565b500290565b6000826128b257634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b601f821115610a2857600081815260208120601f850160051c810160208610156128f45750805b601f850160051c820191505b8181101561291357828155600101612900565b505050505050565b815167ffffffffffffffff81111561293557612935612503565b61294981612943845461278b565b846128cd565b602080601f83116001811461297e57600084156129665750858301515b600019600386901b1c1916600185901b178555612913565b600085815260208120601f198616915b828110156129ad5788860151825594840194600190910190840161298e565b50858210156129cb5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000600182016129ed576129ed612860565b5060010190565b8082018082111561085457610854612860565b60008351612a198184602088016123c8565b835190830190612a2d8183602088016123c8565b64173539b7b760d91b9101908152600501949350505050565b8181038181111561085457610854612860565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b23908301846123ec565b9695505050505050565b600060208284031215612b3f57600080fd5b815161134e81612395565b634e487b7160e01b600052603160045260246000fdfea26469706673582212205b5f7892dbf9945ac14fda8ac8bd9ffe8ca24dc286e6162da4dfe6378528073864736f6c6343000810003300000000000000000000000049d6c45cb1ff1797d49482c30e106d463ad71311000000000000000000000000c2b20506830c7b227e4399b65ea64fd12486c46d000000000000000000000000c2b20506830c7b227e4399b65ea64fd12486c46d0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000003b68747470733a2f2f6a616e6b796d6574612e6a616e6b7973747564696f732e78797a2f6170692f6e66742f6c696c636f712f6d657461646174612f0000000000
Deployed Bytecode
0x6080604052600436106102725760003560e01c8063715018a61161014f578063c4e37095116100c1578063e6c6df591161007a578063e6c6df5914610753578063e86fe2bb14610773578063e985e9c514610786578063ee5ecc89146107cf578063f2fde38b146107ef578063f5b3f4241461080f57600080fd5b8063c4e370951461069d578063c87b56dd146106bd578063d2ac1c8e146106dd578063d83151f5146106fd578063da4cecbe1461071d578063e2e784d51461073357600080fd5b806395d89b411161011357806395d89b41146105e95780639ca3d8df146105fe578063a0712d6814610614578063a22cb46514610627578063b88d4fde14610647578063c04a28361461066757600080fd5b8063715018a614610560578063718bc4af146105755780638295784d14610595578063833b9499146105b55780638da5cb5b146105cb57600080fd5b80632f745c59116101e857806355f804b3116101ac57806355f804b3146104b0578063564566a8146104d057806360b02f70146104ea5780636352211e1461050a57806365f130971461052a57806370a082311461054057600080fd5b80632f745c591461042557806332cb6b0c146104455780633ccfd60b1461045b57806342842e0e146104705780634f6ccce71461049057600080fd5b806318160ddd1161023a57806318160ddd1461034857806320f1d85b1461036757806323b872dd1461038757806328d911fb146103a757806329fc6bae146103c75780632a55205a146103e657600080fd5b806301ffc9a71461027757806306fdde03146102ac578063081812fc146102ce578063095ea7b3146103065780631525ff7d14610328575b600080fd5b34801561028357600080fd5b506102976102923660046123ab565b61082f565b60405190151581526020015b60405180910390f35b3480156102b857600080fd5b506102c161085a565b6040516102a39190612418565b3480156102da57600080fd5b506102ee6102e936600461242b565b6108ec565b6040516001600160a01b0390911681526020016102a3565b34801561031257600080fd5b50610326610321366004612460565b610913565b005b34801561033457600080fd5b5061032661034336600461248a565b610a2d565b34801561035457600080fd5b506008545b6040519081526020016102a3565b34801561037357600080fd5b5061032661038236600461248a565b610a93565b34801561039357600080fd5b506103266103a23660046124a5565b610abc565b3480156103b357600080fd5b506103266103c236600461242b565b610aed565b3480156103d357600080fd5b50600c5461029790610100900460ff1681565b3480156103f257600080fd5b506104066104013660046124e1565b610b36565b604080516001600160a01b0390931683526020830191909152016102a3565b34801561043157600080fd5b50610359610440366004612460565b610b70565b34801561045157600080fd5b50610359600e5481565b34801561046757600080fd5b50610326610c06565b34801561047c57600080fd5b5061032661048b3660046124a5565b610d47565b34801561049c57600080fd5b506103596104ab36600461242b565b610d62565b3480156104bc57600080fd5b506103266104cb36600461258f565b610df5565b3480156104dc57600080fd5b50600c546102979060ff1681565b3480156104f657600080fd5b506103266105053660046125d8565b610e49565b34801561051657600080fd5b506102ee61052536600461242b565b610e97565b34801561053657600080fd5b50610359600f5481565b34801561054c57600080fd5b5061035961055b36600461248a565b610ef7565b34801561056c57600080fd5b50610326610f7d565b34801561058157600080fd5b50610326610590366004612614565b610f91565b3480156105a157600080fd5b506103266105b036600461262f565b610fb3565b3480156105c157600080fd5b5061035960105481565b3480156105d757600080fd5b50600a546001600160a01b03166102ee565b3480156105f557600080fd5b506102c161105d565b34801561060a57600080fd5b5061035960135481565b61032661062236600461242b565b61106c565b34801561063357600080fd5b506103266106423660046126bb565b6111e6565b34801561065357600080fd5b506103266106623660046126e5565b6111f1565b34801561067357600080fd5b5061035961068236600461248a565b6001600160a01b031660009081526017602052604090205490565b3480156106a957600080fd5b506103266106b8366004612614565b611223565b3480156106c957600080fd5b506102c16106d836600461242b565b61127a565b3480156106e957600080fd5b506103266106f836600461248a565b611355565b34801561070957600080fd5b5061032661071836600461242b565b611381565b34801561072957600080fd5b5061035960115481565b34801561073f57600080fd5b5061032661074e366004612460565b6113ca565b34801561075f57600080fd5b5061032661076e36600461242b565b611434565b61032661078136600461242b565b61147d565b34801561079257600080fd5b506102976107a1366004612761565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107db57600080fd5b506103266107ea36600461248a565b61162b565b3480156107fb57600080fd5b5061032661080a36600461248a565b611691565b34801561081b57600080fd5b5061029761082a36600461248a565b611707565b600063152a902d60e11b6001600160e01b031983161480610854575061085482611754565b92915050565b6060600080546108699061278b565b80601f01602080910402602001604051908101604052809291908181526020018280546108959061278b565b80156108e25780601f106108b7576101008083540402835291602001916108e2565b820191906000526020600020905b8154815290600101906020018083116108c557829003601f168201915b5050505050905090565b60006108f782611779565b506000908152600460205260409020546001600160a01b031690565b600061091e82610e97565b9050806001600160a01b0316836001600160a01b0316036109905760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806109ac57506109ac81336107a1565b610a1e5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610987565b610a2883836117d8565b505050565b600a546001600160a01b0316331480610a5557503360009081526018602052604090205460ff165b610a715760405162461bcd60e51b8152600401610987906127c5565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b610a9b611846565b6001600160a01b03166000908152601860205260409020805460ff19169055565b610ac633826118a0565b610ae25760405162461bcd60e51b815260040161098790612813565b610a2883838361191f565b600a546001600160a01b0316331480610b1557503360009081526018602052604090205460ff165b610b315760405162461bcd60e51b8152600401610987906127c5565b601055565b60165460125460009182916001600160a01b039091169061271090610b5b9086612876565b610b659190612895565b915091509250929050565b6000610b7b83610ef7565b8210610bdd5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610987565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b0316331480610c2e57503360009081526018602052604090205460ff165b610c4a5760405162461bcd60e51b8152600401610987906127c5565b4780610c915760405162461bcd60e51b81526020600482015260166024820152754e6f2062616c616e636520746f20776974686472617760501b6044820152606401610987565b60085460135560006064610ca6605a84612876565b610cb09190612895565b905060006064610cc1600a85612876565b610ccb9190612895565b6014546040519192506001600160a01b03169083156108fc029084906000818181858888f19350505050158015610d06573d6000803e3d6000fd5b506015546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610d41573d6000803e3d6000fd5b50505050565b610a28838383604051806020016040528060008152506111f1565b6000610d6d60085490565b8210610dd05760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610987565b60088281548110610de357610de36128b7565b90600052602060002001549050919050565b600a546001600160a01b0316331480610e1d57503360009081526018602052604090205460ff165b610e395760405162461bcd60e51b8152600401610987906127c5565b600d610e45828261291b565b5050565b600a546001600160a01b0316331480610e7157503360009081526018602052604090205460ff165b610e8d5760405162461bcd60e51b8152600401610987906127c5565b610e458282611a90565b6000818152600260205260408120546001600160a01b0316806108545760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610987565b60006001600160a01b038216610f615760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610987565b506001600160a01b031660009081526003602052604090205490565b610f85611846565b610f8f6000611acd565b565b610f99611846565b600c80549115156101000261ff0019909216919091179055565b600a546001600160a01b0316331480610fdb57503360009081526018602052604090205460ff165b610ff75760405162461bcd60e51b8152600401610987906127c5565b60005b82811015610d41578160ff166017600086868581811061101c5761101c6128b7565b9050602002016020810190611031919061248a565b6001600160a01b0316815260208101919091526040016000205580611055816129db565b915050610ffa565b6060600180546108699061278b565b600c5460ff166110c95760405162461bcd60e51b815260206004820152602260248201527f53616c65206d7573742062652061637469766520746f206d696e7420746f6b656044820152616e7360f01b6064820152608401610987565b600f5481111561111b5760405162461bcd60e51b815260206004820152601b60248201527f4578636565646564206d617820746f6b656e20707572636861736500000000006044820152606401610987565b600e548161112860085490565b61113291906129f4565b11156111805760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e736044820152606401610987565b348160105461118f9190612876565b11156111d95760405162461bcd60e51b815260206004820152601960248201527815985b1d59481cd95b9d081a5cc81b9bdd0818dbdc9c9958dd603a1b6044820152606401610987565b6111e38133611a90565b50565b610e45338383611b1f565b6111fb33836118a0565b6112175760405162461bcd60e51b815260040161098790612813565b610d4184848484611bed565b600a546001600160a01b031633148061124b57503360009081526018602052604090205460ff165b6112675760405162461bcd60e51b8152600401610987906127c5565b600c805460ff1916911515919091179055565b6000818152600260205260409020546060906001600160a01b03166112f95760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610987565b6000611303611c20565b90506000815111611323576040518060200160405280600081525061134e565b8061132d84611c2f565b60405160200161133e929190612a07565b6040516020818303038152906040525b9392505050565b61135d611846565b6001600160a01b03166000908152601860205260409020805460ff19166001179055565b600a546001600160a01b03163314806113a957503360009081526018602052604090205460ff165b6113c55760405162461bcd60e51b8152600401610987906127c5565b601155565b600a546001600160a01b03163314806113f257503360009081526018602052604090205460ff165b61140e5760405162461bcd60e51b8152600401610987906127c5565b601680546001600160a01b0319166001600160a01b039390931692909217909155601255565b600a546001600160a01b031633148061145c57503360009081526018602052604090205460ff165b6114785760405162461bcd60e51b8152600401610987906127c5565b600f55565b600c54610100900460ff166114d45760405162461bcd60e51b815260206004820152601860248201527f416c6c6f77206c697374206973206e6f742061637469766500000000000000006044820152606401610987565b3360009081526017602052604090205481111561153e5760405162461bcd60e51b815260206004820152602260248201527f4578636565646564206d617820617661696c61626c6520746f20707572636861604482015261736560f01b6064820152608401610987565b600e548161154b60085490565b61155591906129f4565b11156115a35760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e736044820152606401610987565b34816011546115b29190612876565b11156115fc5760405162461bcd60e51b815260206004820152601960248201527815985b1d59481cd95b9d081a5cc81b9bdd0818dbdc9c9958dd603a1b6044820152606401610987565b336000908152601760205260408120805483929061161b908490612a46565b909155506111e390508133611a90565b600a546001600160a01b031633148061165357503360009081526018602052604090205460ff165b61166f5760405162461bcd60e51b8152600401610987906127c5565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b611699611846565b6001600160a01b0381166116fe5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610987565b6111e381611acd565b600061171b600a546001600160a01b031690565b6001600160a01b0316826001600160a01b031614806108545750506001600160a01b031660009081526018602052604090205460ff1690565b60006001600160e01b0319821663780e9d6360e01b1480610854575061085482611cc2565b6000818152600260205260409020546001600160a01b03166111e35760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610987565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061180d82610e97565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600a546001600160a01b03163314610f8f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610987565b6000806118ac83610e97565b9050806001600160a01b0316846001600160a01b031614806118f357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806119175750836001600160a01b031661190c846108ec565b6001600160a01b0316145b949350505050565b826001600160a01b031661193282610e97565b6001600160a01b0316146119585760405162461bcd60e51b815260040161098790612a59565b6001600160a01b0382166119ba5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610987565b6119c78383836001611d12565b826001600160a01b03166119da82610e97565b6001600160a01b031614611a005760405162461bcd60e51b815260040161098790612a59565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b82811015610a2857611aa9600b80546001019055565b611abb82611ab6600b5490565b611e46565b80611ac5816129db565b915050611a93565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603611b805760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610987565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611bf884848461191f565b611c0484848484611e60565b610d415760405162461bcd60e51b815260040161098790612a9e565b6060600d80546108699061278b565b60606000611c3c83611f61565b600101905060008167ffffffffffffffff811115611c5c57611c5c612503565b6040519080825280601f01601f191660200182016040528015611c86576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611c9057509392505050565b60006001600160e01b031982166380ac58cd60e01b1480611cf357506001600160e01b03198216635b5e139f60e01b145b8061085457506301ffc9a760e01b6001600160e01b0319831614610854565b6001811115611d815760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610987565b816001600160a01b038516611ddd57611dd881600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611e00565b836001600160a01b0316856001600160a01b031614611e0057611e008582612039565b6001600160a01b038416611e1c57611e17816120d6565b611e3f565b846001600160a01b0316846001600160a01b031614611e3f57611e3f8482612185565b5050505050565b610e458282604051806020016040528060008152506121c9565b60006001600160a01b0384163b15611f5657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ea4903390899088908890600401612af0565b6020604051808303816000875af1925050508015611edf575060408051601f3d908101601f19168201909252611edc91810190612b2d565b60015b611f3c573d808015611f0d576040519150601f19603f3d011682016040523d82523d6000602084013e611f12565b606091505b508051600003611f345760405162461bcd60e51b815260040161098790612a9e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611917565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611fa05772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611fcc576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611fea57662386f26fc10000830492506010015b6305f5e1008310612002576305f5e100830492506008015b612710831061201657612710830492506004015b60648310612028576064830492506002015b600a83106108545760010192915050565b6000600161204684610ef7565b6120509190612a46565b6000838152600760205260409020549091508082146120a3576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906120e890600190612a46565b60008381526009602052604081205460088054939450909284908110612110576121106128b7565b906000526020600020015490508060088381548110612131576121316128b7565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061216957612169612b4a565b6001900381819060005260206000200160009055905550505050565b600061219083610ef7565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6121d383836121fc565b6121e06000848484611e60565b610a285760405162461bcd60e51b815260040161098790612a9e565b6001600160a01b0382166122525760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610987565b6000818152600260205260409020546001600160a01b0316156122b75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610987565b6122c5600083836001611d12565b6000818152600260205260409020546001600160a01b03161561232a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610987565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b0319811681146111e357600080fd5b6000602082840312156123bd57600080fd5b813561134e81612395565b60005b838110156123e35781810151838201526020016123cb565b50506000910152565b600081518084526124048160208601602086016123c8565b601f01601f19169290920160200192915050565b60208152600061134e60208301846123ec565b60006020828403121561243d57600080fd5b5035919050565b80356001600160a01b038116811461245b57600080fd5b919050565b6000806040838503121561247357600080fd5b61247c83612444565b946020939093013593505050565b60006020828403121561249c57600080fd5b61134e82612444565b6000806000606084860312156124ba57600080fd5b6124c384612444565b92506124d160208501612444565b9150604084013590509250925092565b600080604083850312156124f457600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561253457612534612503565b604051601f8501601f19908116603f0116810190828211818310171561255c5761255c612503565b8160405280935085815286868601111561257557600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156125a157600080fd5b813567ffffffffffffffff8111156125b857600080fd5b8201601f810184136125c957600080fd5b61191784823560208401612519565b600080604083850312156125eb57600080fd5b823591506125fb60208401612444565b90509250929050565b8035801515811461245b57600080fd5b60006020828403121561262657600080fd5b61134e82612604565b60008060006040848603121561264457600080fd5b833567ffffffffffffffff8082111561265c57600080fd5b818601915086601f83011261267057600080fd5b81358181111561267f57600080fd5b8760208260051b850101111561269457600080fd5b6020928301955093505084013560ff811681146126b057600080fd5b809150509250925092565b600080604083850312156126ce57600080fd5b6126d783612444565b91506125fb60208401612604565b600080600080608085870312156126fb57600080fd5b61270485612444565b935061271260208601612444565b925060408501359150606085013567ffffffffffffffff81111561273557600080fd5b8501601f8101871361274657600080fd5b61275587823560208401612519565b91505092959194509250565b6000806040838503121561277457600080fd5b61277d83612444565b91506125fb60208401612444565b600181811c9082168061279f57607f821691505b6020821081036127bf57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f43616c6c6572206973206e6f7420746865206f776e6572206f7220616e20617060408201526d70726f766564206164647265737360901b606082015260800190565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561289057612890612860565b500290565b6000826128b257634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b601f821115610a2857600081815260208120601f850160051c810160208610156128f45750805b601f850160051c820191505b8181101561291357828155600101612900565b505050505050565b815167ffffffffffffffff81111561293557612935612503565b61294981612943845461278b565b846128cd565b602080601f83116001811461297e57600084156129665750858301515b600019600386901b1c1916600185901b178555612913565b600085815260208120601f198616915b828110156129ad5788860151825594840194600190910190840161298e565b50858210156129cb5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000600182016129ed576129ed612860565b5060010190565b8082018082111561085457610854612860565b60008351612a198184602088016123c8565b835190830190612a2d8183602088016123c8565b64173539b7b760d91b9101908152600501949350505050565b8181038181111561085457610854612860565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b23908301846123ec565b9695505050505050565b600060208284031215612b3f57600080fd5b815161134e81612395565b634e487b7160e01b600052603160045260246000fdfea26469706673582212205b5f7892dbf9945ac14fda8ac8bd9ffe8ca24dc286e6162da4dfe6378528073864736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000049d6c45cb1ff1797d49482c30e106d463ad71311000000000000000000000000c2b20506830c7b227e4399b65ea64fd12486c46d000000000000000000000000c2b20506830c7b227e4399b65ea64fd12486c46d0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000003b68747470733a2f2f6a616e6b796d6574612e6a616e6b7973747564696f732e78797a2f6170692f6e66742f6c696c636f712f6d657461646174612f0000000000
-----Decoded View---------------
Arg [0] : operationsAddr (address): 0x49D6C45cB1Ff1797d49482C30e106D463ad71311
Arg [1] : royaltyReceiver (address): 0xc2B20506830c7B227E4399B65eA64fD12486C46D
Arg [2] : teamAddrr (address): 0xc2B20506830c7B227E4399B65eA64fD12486C46D
Arg [3] : baseURI_ (string): https://jankymeta.jankystudios.xyz/api/nft/lilcoq/metadata/
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 00000000000000000000000049d6c45cb1ff1797d49482c30e106d463ad71311
Arg [1] : 000000000000000000000000c2b20506830c7b227e4399b65ea64fd12486c46d
Arg [2] : 000000000000000000000000c2b20506830c7b227e4399b65ea64fd12486c46d
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [4] : 000000000000000000000000000000000000000000000000000000000000003b
Arg [5] : 68747470733a2f2f6a616e6b796d6574612e6a616e6b7973747564696f732e78
Arg [6] : 797a2f6170692f6e66742f6c696c636f712f6d657461646174612f0000000000
Deployed Bytecode Sourcemap
67185:6634:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72934:221;;;;;;;;;;-1:-1:-1;72934:221:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;72934:221:0;;;;;;;;42451:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43963:171::-;;;;;;;;;;-1:-1:-1;43963:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;43963:171:0;1533:203:1;43481:416:0;;;;;;;;;;-1:-1:-1;43481:416:0;;;;;:::i;:::-;;:::i;:::-;;72470:103;;;;;;;;;;-1:-1:-1;72470:103:0;;;;;:::i;:::-;;:::i;60232:113::-;;;;;;;;;;-1:-1:-1;60320:10:0;:17;60232:113;;;2515:25:1;;;2503:2;2488:18;60232:113:0;2369:177:1;68774:116:0;;;;;;;;;;-1:-1:-1;68774:116:0;;;;;:::i;:::-;;:::i;44663:301::-;;;;;;;;;;-1:-1:-1;44663:301:0;;;;;:::i;:::-;;:::i;69696:124::-;;;;;;;;;;-1:-1:-1;69696:124:0;;;;;:::i;:::-;;:::i;67397:37::-;;;;;;;;;;-1:-1:-1;67397:37:0;;;;;;;;;;;72695:231;;;;;;;;;;-1:-1:-1;72695:231:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3329:32:1;;;3311:51;;3393:2;3378:18;;3371:34;;;;3284:18;72695:231:0;3137:274:1;59900:256:0;;;;;;;;;;-1:-1:-1;59900:256:0;;;;;:::i;:::-;;:::i;67477:32::-;;;;;;;;;;;;;;;;71871:466;;;;;;;;;;;;;:::i;45035:151::-;;;;;;;;;;-1:-1:-1;45035:151:0;;;;;:::i;:::-;;:::i;60422:233::-;;;;;;;;;;-1:-1:-1;60422:233:0;;;;;:::i;:::-;;:::i;69988:115::-;;;;;;;;;;-1:-1:-1;69988:115:0;;;;;:::i;:::-;;:::i;67358:32::-;;;;;;;;;;-1:-1:-1;67358:32:0;;;;;;;;70232:143;;;;;;;;;;-1:-1:-1;70232:143:0;;;;;:::i;:::-;;:::i;42161:223::-;;;;;;;;;;-1:-1:-1;42161:223:0;;;;;:::i;:::-;;:::i;67516:35::-;;;;;;;;;;;;;;;;41892:207;;;;;;;;;;-1:-1:-1;41892:207:0;;;;;:::i;:::-;;:::i;2979:103::-;;;;;;;;;;;;;:::i;69045:131::-;;;;;;;;;;-1:-1:-1;69045:131:0;;;;;:::i;:::-;;:::i;69184:265::-;;;;;;;;;;-1:-1:-1;69184:265:0;;;;;:::i;:::-;;:::i;67558:40::-;;;;;;;;;;;;;;;;2338:87;;;;;;;;;;-1:-1:-1;2411:6:0;;-1:-1:-1;;;;;2411:6:0;2338:87;;42620:104;;;;;;;;;;;;;:::i;67811:38::-;;;;;;;;;;;;;;;;70383:572;;;;;;:::i;:::-;;:::i;44206:155::-;;;;;;;;;;-1:-1:-1;44206:155:0;;;;;:::i;:::-;;:::i;45257:279::-;;;;;;;;;;-1:-1:-1;45257:279:0;;;;;:::i;:::-;;:::i;69457:116::-;;;;;;;;;;-1:-1:-1;69457:116:0;;;;;:::i;:::-;-1:-1:-1;;;;;69549:16:0;69522:7;69549:16;;;:10;:16;;;;;;;69457:116;72581:106;;;;;;;;;;-1:-1:-1;72581:106:0;;;;;:::i;:::-;;:::i;73373:443::-;;;;;;;;;;-1:-1:-1;73373:443:0;;;;;:::i;:::-;;:::i;68654:112::-;;;;;;;;;;-1:-1:-1;68654:112:0;;;;;:::i;:::-;;:::i;69828:152::-;;;;;;;;;;-1:-1:-1;69828:152:0;;;;;:::i;:::-;;:::i;67605:52::-;;;;;;;;;;;;;;;;73163:202;;;;;;;;;;-1:-1:-1;73163:202:0;;;;;:::i;:::-;;:::i;69581:107::-;;;;;;;;;;-1:-1:-1;69581:107:0;;;;;:::i;:::-;;:::i;70963:653::-;;;;;;:::i;:::-;;:::i;44432:164::-;;;;;;;;;;-1:-1:-1;44432:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;44553:25:0;;;44529:4;44553:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;44432:164;72345:115;;;;;;;;;;-1:-1:-1;72345:115:0;;;;;:::i;:::-;;:::i;3237:201::-;;;;;;;;;;-1:-1:-1;3237:201:0;;;;;:::i;:::-;;:::i;68898:139::-;;;;;;;;;;-1:-1:-1;68898:139:0;;;;;:::i;:::-;;:::i;72934:221::-;73045:4;-1:-1:-1;;;;;;;;;73082:25:0;;;;:65;;;73111:36;73135:11;73111:23;:36::i;:::-;73062:85;72934:221;-1:-1:-1;;72934:221:0:o;42451:100::-;42505:13;42538:5;42531:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42451:100;:::o;43963:171::-;44039:7;44059:23;44074:7;44059:14;:23::i;:::-;-1:-1:-1;44102:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;44102:24:0;;43963:171::o;43481:416::-;43562:13;43578:23;43593:7;43578:14;:23::i;:::-;43562:39;;43626:5;-1:-1:-1;;;;;43620:11:0;:2;-1:-1:-1;;;;;43620:11:0;;43612:57;;;;-1:-1:-1;;;43612:57:0;;7816:2:1;43612:57:0;;;7798:21:1;7855:2;7835:18;;;7828:30;7894:34;7874:18;;;7867:62;-1:-1:-1;;;7945:18:1;;;7938:31;7986:19;;43612:57:0;;;;;;;;;914:10;-1:-1:-1;;;;;43704:21:0;;;;:62;;-1:-1:-1;43729:37:0;43746:5;914:10;44432:164;:::i;43729:37::-;43682:173;;;;-1:-1:-1;;;43682:173:0;;8218:2:1;43682:173:0;;;8200:21:1;8257:2;8237:18;;;8230:30;8296:34;8276:18;;;8269:62;8367:31;8347:18;;;8340:59;8416:19;;43682:173:0;8016:425:1;43682:173:0;43868:21;43877:2;43881:7;43868:8;:21::i;:::-;43551:346;43481:416;;:::o;72470:103::-;2411:6;;-1:-1:-1;;;;;2411:6:0;68498:10;:21;;:54;;-1:-1:-1;68541:10:0;68523:29;;;;:17;:29;;;;;;;;68498:54;68476:150;;;;-1:-1:-1;;;68476:150:0;;;;;;;:::i;:::-;72546:11:::1;:19:::0;;-1:-1:-1;;;;;;72546:19:0::1;-1:-1:-1::0;;;;;72546:19:0;;;::::1;::::0;;;::::1;::::0;;72470:103::o;68774:116::-;2224:13;:11;:13::i;:::-;-1:-1:-1;;;;;68850:24:0::1;68877:5;68850:24:::0;;;:17:::1;:24;::::0;;;;:32;;-1:-1:-1;;68850:32:0::1;::::0;;68774:116::o;44663:301::-;44824:41;914:10;44857:7;44824:18;:41::i;:::-;44816:99;;;;-1:-1:-1;;;44816:99:0;;;;;;;:::i;:::-;44928:28;44938:4;44944:2;44948:7;44928:9;:28::i;69696:124::-;2411:6;;-1:-1:-1;;;;;2411:6:0;68498:10;:21;;:54;;-1:-1:-1;68541:10:0;68523:29;;;;:17;:29;;;;;;;;68498:54;68476:150;;;;-1:-1:-1;;;68476:150:0;;;;;;;:::i;:::-;69782:15:::1;:30:::0;69696:124::o;72695:231::-;72862:16;;72894:14;;72802:16;;;;-1:-1:-1;;;;;72862:16:0;;;;72912:5;;72881:27;;:10;:27;:::i;:::-;72880:37;;;;:::i;:::-;72854:64;;;;72695:231;;;;;:::o;59900:256::-;59997:7;60033:23;60050:5;60033:16;:23::i;:::-;60025:5;:31;60017:87;;;;-1:-1:-1;;;60017:87:0;;10136:2:1;60017:87:0;;;10118:21:1;10175:2;10155:18;;;10148:30;10214:34;10194:18;;;10187:62;-1:-1:-1;;;10265:18:1;;;10258:41;10316:19;;60017:87:0;9934:407:1;60017:87:0;-1:-1:-1;;;;;;60122:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;59900:256::o;71871:466::-;2411:6;;-1:-1:-1;;;;;2411:6:0;68498:10;:21;;:54;;-1:-1:-1;68541:10:0;68523:29;;;;:17;:29;;;;;;;;68498:54;68476:150;;;;-1:-1:-1;;;68476:150:0;;;;;;;:::i;:::-;71947:21:::1;71987:11:::0;71979:46:::1;;;::::0;-1:-1:-1;;;71979:46:0;;10548:2:1;71979:46:0::1;::::0;::::1;10530:21:1::0;10587:2;10567:18;;;10560:30;-1:-1:-1;;;10606:18:1;;;10599:52;10668:18;;71979:46:0::1;10346:346:1::0;71979:46:0::1;60320:10:::0;:17;72038:23:::1;:39:::0;72090:24:::1;72148:3;72118:26;67753:2;72118:7:::0;:26:::1;:::i;:::-;72117:34;;;;:::i;:::-;72090:61:::0;-1:-1:-1;72162:18:0::1;72208:3;72184:20;67800:2;72184:7:::0;:20:::1;:::i;:::-;72183:28;;;;:::i;:::-;72232:17;::::0;72224:53:::1;::::0;72162:49;;-1:-1:-1;;;;;;72232:17:0::1;::::0;72224:53;::::1;;;::::0;72260:16;;72232:17:::1;72224:53:::0;72232:17;72224:53;72260:16;72232:17;72224:53;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;72296:11:0::1;::::0;72288:41:::1;::::0;-1:-1:-1;;;;;72296:11:0;;::::1;::::0;72288:41;::::1;;;::::0;72318:10;;72296:11:::1;72288:41:::0;72296:11;72288:41;72318:10;72296:11;72288:41;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;71918:419;;;71871:466::o:0;45035:151::-;45139:39;45156:4;45162:2;45166:7;45139:39;;;;;;;;;;;;:16;:39::i;60422:233::-;60497:7;60533:30;60320:10;:17;;60232:113;60533:30;60525:5;:38;60517:95;;;;-1:-1:-1;;;60517:95:0;;10899:2:1;60517:95:0;;;10881:21:1;10938:2;10918:18;;;10911:30;10977:34;10957:18;;;10950:62;-1:-1:-1;;;11028:18:1;;;11021:42;11080:19;;60517:95:0;10697:408:1;60517:95:0;60630:10;60641:5;60630:17;;;;;;;;:::i;:::-;;;;;;;;;60623:24;;60422:233;;;:::o;69988:115::-;2411:6;;-1:-1:-1;;;;;2411:6:0;68498:10;:21;;:54;;-1:-1:-1;68541:10:0;68523:29;;;;:17;:29;;;;;;;;68498:54;68476:150;;;;-1:-1:-1;;;68476:150:0;;;;;;;:::i;:::-;70072:12:::1;:23;70087:8:::0;70072:12;:23:::1;:::i;:::-;;69988:115:::0;:::o;70232:143::-;2411:6;;-1:-1:-1;;;;;2411:6:0;68498:10;:21;;:54;;-1:-1:-1;68541:10:0;68523:29;;;;:17;:29;;;;;;;;68498:54;68476:150;;;;-1:-1:-1;;;68476:150:0;;;;;;;:::i;:::-;70344:23:::1;70356:6;70364:2;70344:11;:23::i;42161:223::-:0;42233:7;46894:16;;;:7;:16;;;;;;-1:-1:-1;;;;;46894:16:0;;42297:56;;;;-1:-1:-1;;;42297:56:0;;13648:2:1;42297:56:0;;;13630:21:1;13687:2;13667:18;;;13660:30;-1:-1:-1;;;13706:18:1;;;13699:54;13770:18;;42297:56:0;13446:348:1;41892:207:0;41964:7;-1:-1:-1;;;;;41992:19:0;;41984:73;;;;-1:-1:-1;;;41984:73:0;;14001:2:1;41984:73:0;;;13983:21:1;14040:2;14020:18;;;14013:30;14079:34;14059:18;;;14052:62;-1:-1:-1;;;14130:18:1;;;14123:39;14179:19;;41984:73:0;13799:405:1;41984:73:0;-1:-1:-1;;;;;;42075:16:0;;;;;:9;:16;;;;;;;41892:207::o;2979:103::-;2224:13;:11;:13::i;:::-;3044:30:::1;3071:1;3044:18;:30::i;:::-;2979:103::o:0;69045:131::-;2224:13;:11;:13::i;:::-;69130:17:::1;:38:::0;;;::::1;;;;-1:-1:-1::0;;69130:38:0;;::::1;::::0;;;::::1;::::0;;69045:131::o;69184:265::-;2411:6;;-1:-1:-1;;;;;2411:6:0;68498:10;:21;;:54;;-1:-1:-1;68541:10:0;68523:29;;;;:17;:29;;;;;;;;68498:54;68476:150;;;;-1:-1:-1;;;68476:150:0;;;;;;;:::i;:::-;69330:9:::1;69325:117;69345:20:::0;;::::1;69325:117;;;69414:16;69387:43;;:10;:24;69398:9;;69408:1;69398:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;69387:24:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;69387:24:0;:43;69367:3;::::1;::::0;::::1;:::i;:::-;;;;69325:117;;42620:104:::0;42676:13;42709:7;42702:14;;;;;:::i;70383:572::-;70455:12;;;;70447:59;;;;-1:-1:-1;;;70447:59:0;;14551:2:1;70447:59:0;;;14533:21:1;14590:2;14570:18;;;14563:30;14629:34;14609:18;;;14602:62;-1:-1:-1;;;14680:18:1;;;14673:32;14722:19;;70447:59:0;14349:398:1;70447:59:0;70557:15;;70539:14;:33;;70517:110;;;;-1:-1:-1;;;70517:110:0;;14954:2:1;70517:110:0;;;14936:21:1;14993:2;14973:18;;;14966:30;15032:29;15012:18;;;15005:57;15079:18;;70517:110:0;14752:351:1;70517:110:0;70694:10;;70676:14;70660:13;60320:10;:17;;60232:113;70660:13;:30;;;;:::i;:::-;:44;;70638:126;;;;-1:-1:-1;;;70638:126:0;;15440:2:1;70638:126:0;;;15422:21:1;;;15459:18;;;15452:30;15518:34;15498:18;;;15491:62;15570:18;;70638:126:0;15238:356:1;70638:126:0;70833:9;70815:14;70797:15;;:32;;;;:::i;:::-;:45;;70775:120;;;;-1:-1:-1;;;70775:120:0;;15801:2:1;70775:120:0;;;15783:21:1;15840:2;15820:18;;;15813:30;-1:-1:-1;;;15859:18:1;;;15852:55;15924:18;;70775:120:0;15599:349:1;70775:120:0;70908:39;70920:14;70936:10;70908:11;:39::i;:::-;70383:572;:::o;44206:155::-;44301:52;914:10;44334:8;44344;44301:18;:52::i;45257:279::-;45388:41;914:10;45421:7;45388:18;:41::i;:::-;45380:99;;;;-1:-1:-1;;;45380:99:0;;;;;;;:::i;:::-;45490:38;45504:4;45510:2;45514:7;45523:4;45490:13;:38::i;72581:106::-;2411:6;;-1:-1:-1;;;;;2411:6:0;68498:10;:21;;:54;;-1:-1:-1;68541:10:0;68523:29;;;;:17;:29;;;;;;;;68498:54;68476:150;;;;-1:-1:-1;;;68476:150:0;;;;;;;:::i;:::-;72656:12:::1;:23:::0;;-1:-1:-1;;72656:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;72581:106::o;73373:443::-;47296:4;46894:16;;;:7;:16;;;;;;73462:13;;-1:-1:-1;;;;;46894:16:0;73488:113;;;;-1:-1:-1;;;73488:113:0;;16155:2:1;73488:113:0;;;16137:21:1;16194:2;16174:18;;;16167:30;16233:34;16213:18;;;16206:62;-1:-1:-1;;;16284:18:1;;;16277:45;16339:19;;73488:113:0;15953:411:1;73488:113:0;73614:21;73638:10;:8;:10::i;:::-;73614:34;;73703:1;73685:7;73679:21;:25;:129;;;;;;;;;;;;;;;;;73748:7;73757:18;:7;:16;:18::i;:::-;73731:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;73679:129;73659:149;73373:443;-1:-1:-1;;;73373:443:0:o;68654:112::-;2224:13;:11;:13::i;:::-;-1:-1:-1;;;;;68727:24:0::1;;::::0;;;:17:::1;:24;::::0;;;;:31;;-1:-1:-1;;68727:31:0::1;68754:4;68727:31;::::0;;68654:112::o;69828:152::-;2411:6;;-1:-1:-1;;;;;2411:6:0;68498:10;:21;;:54;;-1:-1:-1;68541:10:0;68523:29;;;;:17;:29;;;;;;;;68498:54;68476:150;;;;-1:-1:-1;;;68476:150:0;;;;;;;:::i;:::-;69932:25:::1;:40:::0;69828:152::o;73163:202::-;2411:6;;-1:-1:-1;;;;;2411:6:0;68498:10;:21;;:54;;-1:-1:-1;68541:10:0;68523:29;;;;:17;:29;;;;;;;;68498:54;68476:150;;;;-1:-1:-1;;;68476:150:0;;;;;;;:::i;:::-;73290:16:::1;:28:::0;;-1:-1:-1;;;;;;73290:28:0::1;-1:-1:-1::0;;;;;73290:28:0;;;::::1;::::0;;;::::1;::::0;;;73329:14:::1;:28:::0;73163:202::o;69581:107::-;2411:6;;-1:-1:-1;;;;;2411:6:0;68498:10;:21;;:54;;-1:-1:-1;68541:10:0;68523:29;;;;:17;:29;;;;;;;;68498:54;68476:150;;;;-1:-1:-1;;;68476:150:0;;;;;;;:::i;:::-;69658:15:::1;:22:::0;69581:107::o;70963:653::-;71046:17;;;;;;;71038:54;;;;-1:-1:-1;;;71038:54:0;;17239:2:1;71038:54:0;;;17221:21:1;17278:2;17258:18;;;17251:30;17317:26;17297:18;;;17290:54;17361:18;;71038:54:0;17037:348:1;71038:54:0;71154:10;71143:22;;;;:10;:22;;;;;;71125:40;;;71103:124;;;;-1:-1:-1;;;71103:124:0;;17592:2:1;71103:124:0;;;17574:21:1;17631:2;17611:18;;;17604:30;17670:34;17650:18;;;17643:62;-1:-1:-1;;;17721:18:1;;;17714:32;17763:19;;71103:124:0;17390:398:1;71103:124:0;71294:10;;71276:14;71260:13;60320:10;:17;;60232:113;71260:13;:30;;;;:::i;:::-;:44;;71238:126;;;;-1:-1:-1;;;71238:126:0;;15440:2:1;71238:126:0;;;15422:21:1;;;15459:18;;;15452:30;15518:34;15498:18;;;15491:62;15570:18;;71238:126:0;15238:356:1;71238:126:0;71443:9;71425:14;71397:25;;:42;;;;:::i;:::-;:55;;71375:130;;;;-1:-1:-1;;;71375:130:0;;15801:2:1;71375:130:0;;;15783:21:1;15840:2;15820:18;;;15813:30;-1:-1:-1;;;15859:18:1;;;15852:55;15924:18;;71375:130:0;15599:349:1;71375:130:0;71529:10;71518:22;;;;:10;:22;;;;;:40;;71544:14;;71518:22;:40;;71544:14;;71518:40;:::i;:::-;;;;-1:-1:-1;71569:39:0;;-1:-1:-1;71581:14:0;71597:10;71569:11;:39::i;72345:115::-;2411:6;;-1:-1:-1;;;;;2411:6:0;68498:10;:21;;:54;;-1:-1:-1;68541:10:0;68523:29;;;;:17;:29;;;;;;;;68498:54;68476:150;;;;-1:-1:-1;;;68476:150:0;;;;;;;:::i;:::-;72427:17:::1;:25:::0;;-1:-1:-1;;;;;;72427:25:0::1;-1:-1:-1::0;;;;;72427:25:0;;;::::1;::::0;;;::::1;::::0;;72345:115::o;3237:201::-;2224:13;:11;:13::i;:::-;-1:-1:-1;;;;;3326:22:0;::::1;3318:73;;;::::0;-1:-1:-1;;;3318:73:0;;18128:2:1;3318:73:0::1;::::0;::::1;18110:21:1::0;18167:2;18147:18;;;18140:30;18206:34;18186:18;;;18179:62;-1:-1:-1;;;18257:18:1;;;18250:36;18303:19;;3318:73:0::1;17926:402:1::0;3318:73:0::1;3402:28;3421:8;3402:18;:28::i;68898:139::-:0;68961:4;68994:7;2411:6;;-1:-1:-1;;;;;2411:6:0;;2338:87;68994:7;-1:-1:-1;;;;;68985:16:0;:5;-1:-1:-1;;;;;68985:16:0;;:44;;;-1:-1:-1;;;;;;;69005:24:0;;;;;:17;:24;;;;;;;;;68898:139::o;59592:224::-;59694:4;-1:-1:-1;;;;;;59718:50:0;;-1:-1:-1;;;59718:50:0;;:90;;;59772:36;59796:11;59772:23;:36::i;53526:135::-;47296:4;46894:16;;;:7;:16;;;;;;-1:-1:-1;;;;;46894:16:0;53600:53;;;;-1:-1:-1;;;53600:53:0;;13648:2:1;53600:53:0;;;13630:21:1;13687:2;13667:18;;;13660:30;-1:-1:-1;;;13706:18:1;;;13699:54;13770:18;;53600:53:0;13446:348:1;52839:174:0;52914:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;52914:29:0;-1:-1:-1;;;;;52914:29:0;;;;;;;;:24;;52968:23;52914:24;52968:14;:23::i;:::-;-1:-1:-1;;;;;52959:46:0;;;;;;;;;;;52839:174;;:::o;2503:132::-;2411:6;;-1:-1:-1;;;;;2411:6:0;914:10;2567:23;2559:68;;;;-1:-1:-1;;;2559:68:0;;18535:2:1;2559:68:0;;;18517:21:1;;;18554:18;;;18547:30;18613:34;18593:18;;;18586:62;18665:18;;2559:68:0;18333:356:1;47526:264:0;47619:4;47636:13;47652:23;47667:7;47652:14;:23::i;:::-;47636:39;;47705:5;-1:-1:-1;;;;;47694:16:0;:7;-1:-1:-1;;;;;47694:16:0;;:52;;;-1:-1:-1;;;;;;44553:25:0;;;44529:4;44553:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;47714:32;47694:87;;;;47774:7;-1:-1:-1;;;;;47750:31:0;:20;47762:7;47750:11;:20::i;:::-;-1:-1:-1;;;;;47750:31:0;;47694:87;47686:96;47526:264;-1:-1:-1;;;;47526:264:0:o;51491:1229::-;51616:4;-1:-1:-1;;;;;51589:31:0;:23;51604:7;51589:14;:23::i;:::-;-1:-1:-1;;;;;51589:31:0;;51581:81;;;;-1:-1:-1;;;51581:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51681:16:0;;51673:65;;;;-1:-1:-1;;;51673:65:0;;19302:2:1;51673:65:0;;;19284:21:1;19341:2;19321:18;;;19314:30;19380:34;19360:18;;;19353:62;-1:-1:-1;;;19431:18:1;;;19424:34;19475:19;;51673:65:0;19100:400:1;51673:65:0;51751:42;51772:4;51778:2;51782:7;51791:1;51751:20;:42::i;:::-;51923:4;-1:-1:-1;;;;;51896:31:0;:23;51911:7;51896:14;:23::i;:::-;-1:-1:-1;;;;;51896:31:0;;51888:81;;;;-1:-1:-1;;;51888:81:0;;;;;;;:::i;:::-;52041:24;;;;:15;:24;;;;;;;;52034:31;;-1:-1:-1;;;;;;52034:31:0;;;;;;-1:-1:-1;;;;;52517:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;52517:20:0;;;52552:13;;;;;;;;;:18;;52034:31;52552:18;;;52592:16;;;:7;:16;;;;;;:21;;;;;;;;;;52631:27;;52057:7;;52631:27;;;43551:346;43481:416;;:::o;71624:239::-;71712:9;71707:149;71731:14;71727:1;:18;71707:149;;;71767:21;:9;66667:19;;66685:1;66667:19;;;66578:127;71767:21;71803:41;71813:9;71824:19;:9;66548:14;;66456:114;71824:19;71803:9;:41::i;:::-;71747:3;;;;:::i;:::-;;;;71707:149;;3598:191;3691:6;;;-1:-1:-1;;;;;3708:17:0;;;-1:-1:-1;;;;;;3708:17:0;;;;;;;3741:40;;3691:6;;;3708:17;3691:6;;3741:40;;3672:16;;3741:40;3661:128;3598:191;:::o;53156:281::-;53277:8;-1:-1:-1;;;;;53268:17:0;:5;-1:-1:-1;;;;;53268:17:0;;53260:55;;;;-1:-1:-1;;;53260:55:0;;19707:2:1;53260:55:0;;;19689:21:1;19746:2;19726:18;;;19719:30;19785:27;19765:18;;;19758:55;19830:18;;53260:55:0;19505:349:1;53260:55:0;-1:-1:-1;;;;;53326:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;53326:46:0;;;;;;;;;;53388:41;;540::1;;;53388::0;;513:18:1;53388:41:0;;;;;;;53156:281;;;:::o;46417:270::-;46530:28;46540:4;46546:2;46550:7;46530:9;:28::i;:::-;46577:47;46600:4;46606:2;46610:7;46619:4;46577:22;:47::i;:::-;46569:110;;;;-1:-1:-1;;;46569:110:0;;;;;;;:::i;70111:113::-;70171:13;70204:12;70197:19;;;;;:::i;37659:716::-;37715:13;37766:14;37783:17;37794:5;37783:10;:17::i;:::-;37803:1;37783:21;37766:38;;37819:20;37853:6;37842:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37842:18:0;-1:-1:-1;37819:41:0;-1:-1:-1;37984:28:0;;;38000:2;37984:28;38041:288;-1:-1:-1;;38073:5:0;-1:-1:-1;;;38210:2:0;38199:14;;38194:30;38073:5;38181:44;38271:2;38262:11;;;-1:-1:-1;38292:21:0;38041:288;38292:21;-1:-1:-1;38350:6:0;37659:716;-1:-1:-1;;;37659:716:0:o;41523:305::-;41625:4;-1:-1:-1;;;;;;41662:40:0;;-1:-1:-1;;;41662:40:0;;:105;;-1:-1:-1;;;;;;;41719:48:0;;-1:-1:-1;;;41719:48:0;41662:105;:158;;;-1:-1:-1;;;;;;;;;;22515:40:0;;;41784:36;22406:157;60729:915;60996:1;60984:9;:13;60980:222;;;61127:63;;-1:-1:-1;;;61127:63:0;;20480:2:1;61127:63:0;;;20462:21:1;20519:2;20499:18;;;20492:30;20558:34;20538:18;;;20531:62;-1:-1:-1;;;20609:18:1;;;20602:51;20670:19;;61127:63:0;20278:417:1;60980:222:0;61232:12;-1:-1:-1;;;;;61261:18:0;;61257:187;;61296:40;61328:7;62471:10;:17;;62444:24;;;;:15;:24;;;;;:44;;;62499:24;;;;;;;;;;;;62367:164;61296:40;61257:187;;;61366:2;-1:-1:-1;;;;;61358:10:0;:4;-1:-1:-1;;;;;61358:10:0;;61354:90;;61385:47;61418:4;61424:7;61385:32;:47::i;:::-;-1:-1:-1;;;;;61458:16:0;;61454:183;;61491:45;61528:7;61491:36;:45::i;:::-;61454:183;;;61564:4;-1:-1:-1;;;;;61558:10:0;:2;-1:-1:-1;;;;;61558:10:0;;61554:83;;61585:40;61613:2;61617:7;61585:27;:40::i;:::-;60895:749;60729:915;;;;:::o;48132:110::-;48208:26;48218:2;48222:7;48208:26;;;;;;;;;;;;:9;:26::i;54225:853::-;54379:4;-1:-1:-1;;;;;54400:13:0;;13622:19;:23;54396:675;;54436:71;;-1:-1:-1;;;54436:71:0;;-1:-1:-1;;;;;54436:36:0;;;;;:71;;914:10;;54487:4;;54493:7;;54502:4;;54436:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54436:71:0;;;;;;;;-1:-1:-1;;54436:71:0;;;;;;;;;;;;:::i;:::-;;;54432:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54677:6;:13;54694:1;54677:18;54673:328;;54720:60;;-1:-1:-1;;;54720:60:0;;;;;;;:::i;54673:328::-;54951:6;54945:13;54936:6;54932:2;54928:15;54921:38;54432:584;-1:-1:-1;;;;;;54558:51:0;-1:-1:-1;;;54558:51:0;;-1:-1:-1;54551:58:0;;54396:675;-1:-1:-1;55055:4:0;54225:853;;;;;;:::o;33042:948::-;33095:7;;-1:-1:-1;;;33173:17:0;;33169:106;;-1:-1:-1;;;33211:17:0;;;-1:-1:-1;33257:2:0;33247:12;33169:106;33302:8;33293:5;:17;33289:106;;33340:8;33331:17;;;-1:-1:-1;33377:2:0;33367:12;33289:106;33422:8;33413:5;:17;33409:106;;33460:8;33451:17;;;-1:-1:-1;33497:2:0;33487:12;33409:106;33542:7;33533:5;:16;33529:103;;33579:7;33570:16;;;-1:-1:-1;33615:1:0;33605:11;33529:103;33659:7;33650:5;:16;33646:103;;33696:7;33687:16;;;-1:-1:-1;33732:1:0;33722:11;33646:103;33776:7;33767:5;:16;33763:103;;33813:7;33804:16;;;-1:-1:-1;33849:1:0;33839:11;33763:103;33893:7;33884:5;:16;33880:68;;33931:1;33921:11;33976:6;33042:948;-1:-1:-1;;33042:948:0:o;63158:988::-;63424:22;63474:1;63449:22;63466:4;63449:16;:22::i;:::-;:26;;;;:::i;:::-;63486:18;63507:26;;;:17;:26;;;;;;63424:51;;-1:-1:-1;63640:28:0;;;63636:328;;-1:-1:-1;;;;;63707:18:0;;63685:19;63707:18;;;:12;:18;;;;;;;;:34;;;;;;;;;63758:30;;;;;;:44;;;63875:30;;:17;:30;;;;;:43;;;63636:328;-1:-1:-1;64060:26:0;;;;:17;:26;;;;;;;;64053:33;;;-1:-1:-1;;;;;64104:18:0;;;;;:12;:18;;;;;:34;;;;;;;64097:41;63158:988::o;64441:1079::-;64719:10;:17;64694:22;;64719:21;;64739:1;;64719:21;:::i;:::-;64751:18;64772:24;;;:15;:24;;;;;;65145:10;:26;;64694:46;;-1:-1:-1;64772:24:0;;64694:46;;65145:26;;;;;;:::i;:::-;;;;;;;;;65123:48;;65209:11;65184:10;65195;65184:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;65289:28;;;:15;:28;;;;;;;:41;;;65461:24;;;;;65454:31;65496:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;64512:1008;;;64441:1079;:::o;61945:221::-;62030:14;62047:20;62064:2;62047:16;:20::i;:::-;-1:-1:-1;;;;;62078:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;62123:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;61945:221:0:o;48469:285::-;48564:18;48570:2;48574:7;48564:5;:18::i;:::-;48615:53;48646:1;48650:2;48654:7;48663:4;48615:22;:53::i;:::-;48593:153;;;;-1:-1:-1;;;48593:153:0;;;;;;;:::i;49090:942::-;-1:-1:-1;;;;;49170:16:0;;49162:61;;;;-1:-1:-1;;;49162:61:0;;21782:2:1;49162:61:0;;;21764:21:1;;;21801:18;;;21794:30;21860:34;21840:18;;;21833:62;21912:18;;49162:61:0;21580:356:1;49162:61:0;47296:4;46894:16;;;:7;:16;;;;;;-1:-1:-1;;;;;46894:16:0;47320:31;49234:58;;;;-1:-1:-1;;;49234:58:0;;22143:2:1;49234:58:0;;;22125:21:1;22182:2;22162:18;;;22155:30;22221;22201:18;;;22194:58;22269:18;;49234:58:0;21941:352:1;49234:58:0;49305:48;49334:1;49338:2;49342:7;49351:1;49305:20;:48::i;:::-;47296:4;46894:16;;;:7;:16;;;;;;-1:-1:-1;;;;;46894:16:0;47320:31;49443:58;;;;-1:-1:-1;;;49443:58:0;;22143:2:1;49443:58:0;;;22125:21:1;22182:2;22162:18;;;22155:30;22221;22201:18;;;22194:58;22269:18;;49443:58:0;21941:352:1;49443:58:0;-1:-1:-1;;;;;49850:13:0;;;;;;:9;:13;;;;;;;;:18;;49867:1;49850:18;;;49892:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;49892:21:0;;;;;49931:33;49900:7;;49850:13;;49931:33;;49850:13;;49931:33;70072:23:::1;69988:115:::0;:::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;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;1838:70;1741:173;;;:::o;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;2178:186::-;2237:6;2290:2;2278:9;2269:7;2265:23;2261:32;2258:52;;;2306:1;2303;2296:12;2258:52;2329:29;2348:9;2329:29;:::i;2551:328::-;2628:6;2636;2644;2697:2;2685:9;2676:7;2672:23;2668:32;2665:52;;;2713:1;2710;2703:12;2665:52;2736:29;2755:9;2736:29;:::i;:::-;2726:39;;2784:38;2818:2;2807:9;2803:18;2784:38;:::i;:::-;2774:48;;2869:2;2858:9;2854:18;2841:32;2831:42;;2551:328;;;;;:::o;2884:248::-;2952:6;2960;3013:2;3001:9;2992:7;2988:23;2984:32;2981:52;;;3029:1;3026;3019:12;2981:52;-1:-1:-1;;3052:23:1;;;3122:2;3107:18;;;3094:32;;-1:-1:-1;2884:248:1:o;3416:127::-;3477:10;3472:3;3468:20;3465:1;3458:31;3508:4;3505:1;3498:15;3532:4;3529:1;3522:15;3548:632;3613:5;3643:18;3684:2;3676:6;3673:14;3670:40;;;3690:18;;:::i;:::-;3765:2;3759:9;3733:2;3819:15;;-1:-1:-1;;3815:24:1;;;3841:2;3811:33;3807:42;3795:55;;;3865:18;;;3885:22;;;3862:46;3859:72;;;3911:18;;:::i;:::-;3951:10;3947:2;3940:22;3980:6;3971:15;;4010:6;4002;3995:22;4050:3;4041:6;4036:3;4032:16;4029:25;4026:45;;;4067:1;4064;4057:12;4026:45;4117:6;4112:3;4105:4;4097:6;4093:17;4080:44;4172:1;4165:4;4156:6;4148;4144:19;4140:30;4133:41;;;;3548:632;;;;;:::o;4185:451::-;4254:6;4307:2;4295:9;4286:7;4282:23;4278:32;4275:52;;;4323:1;4320;4313:12;4275:52;4363:9;4350:23;4396:18;4388:6;4385:30;4382:50;;;4428:1;4425;4418:12;4382:50;4451:22;;4504:4;4496:13;;4492:27;-1:-1:-1;4482:55:1;;4533:1;4530;4523:12;4482:55;4556:74;4622:7;4617:2;4604:16;4599:2;4595;4591:11;4556:74;:::i;4641:254::-;4709:6;4717;4770:2;4758:9;4749:7;4745:23;4741:32;4738:52;;;4786:1;4783;4776:12;4738:52;4822:9;4809:23;4799:33;;4851:38;4885:2;4874:9;4870:18;4851:38;:::i;:::-;4841:48;;4641:254;;;;;:::o;4900:160::-;4965:20;;5021:13;;5014:21;5004:32;;4994:60;;5050:1;5047;5040:12;5065:180;5121:6;5174:2;5162:9;5153:7;5149:23;5145:32;5142:52;;;5190:1;5187;5180:12;5142:52;5213:26;5229:9;5213:26;:::i;5250:778::-;5343:6;5351;5359;5412:2;5400:9;5391:7;5387:23;5383:32;5380:52;;;5428:1;5425;5418:12;5380:52;5468:9;5455:23;5497:18;5538:2;5530:6;5527:14;5524:34;;;5554:1;5551;5544:12;5524:34;5592:6;5581:9;5577:22;5567:32;;5637:7;5630:4;5626:2;5622:13;5618:27;5608:55;;5659:1;5656;5649:12;5608:55;5699:2;5686:16;5725:2;5717:6;5714:14;5711:34;;;5741:1;5738;5731:12;5711:34;5796:7;5789:4;5779:6;5776:1;5772:14;5768:2;5764:23;5760:34;5757:47;5754:67;;;5817:1;5814;5807:12;5754:67;5848:4;5840:13;;;;-1:-1:-1;5872:6:1;-1:-1:-1;;5913:20:1;;5900:34;5974:4;5963:16;;5953:27;;5943:55;;5994:1;5991;5984:12;5943:55;6017:5;6007:15;;;5250:778;;;;;:::o;6033:254::-;6098:6;6106;6159:2;6147:9;6138:7;6134:23;6130:32;6127:52;;;6175:1;6172;6165:12;6127:52;6198:29;6217:9;6198:29;:::i;:::-;6188:39;;6246:35;6277:2;6266:9;6262:18;6246:35;:::i;6292:667::-;6387:6;6395;6403;6411;6464:3;6452:9;6443:7;6439:23;6435:33;6432:53;;;6481:1;6478;6471:12;6432:53;6504:29;6523:9;6504:29;:::i;:::-;6494:39;;6552:38;6586:2;6575:9;6571:18;6552:38;:::i;:::-;6542:48;;6637:2;6626:9;6622:18;6609:32;6599:42;;6692:2;6681:9;6677:18;6664:32;6719:18;6711:6;6708:30;6705:50;;;6751:1;6748;6741:12;6705:50;6774:22;;6827:4;6819:13;;6815:27;-1:-1:-1;6805:55:1;;6856:1;6853;6846:12;6805:55;6879:74;6945:7;6940:2;6927:16;6922:2;6918;6914:11;6879:74;:::i;:::-;6869:84;;;6292:667;;;;;;;:::o;6964:260::-;7032:6;7040;7093:2;7081:9;7072:7;7068:23;7064:32;7061:52;;;7109:1;7106;7099:12;7061:52;7132:29;7151:9;7132:29;:::i;:::-;7122:39;;7180:38;7214:2;7203:9;7199:18;7180:38;:::i;7229:380::-;7308:1;7304:12;;;;7351;;;7372:61;;7426:4;7418:6;7414:17;7404:27;;7372:61;7479:2;7471:6;7468:14;7448:18;7445:38;7442:161;;7525:10;7520:3;7516:20;7513:1;7506:31;7560:4;7557:1;7550:15;7588:4;7585:1;7578:15;7442:161;;7229:380;;;:::o;8446:410::-;8648:2;8630:21;;;8687:2;8667:18;;;8660:30;8726:34;8721:2;8706:18;;8699:62;-1:-1:-1;;;8792:2:1;8777:18;;8770:44;8846:3;8831:19;;8446:410::o;8861:409::-;9063:2;9045:21;;;9102:2;9082:18;;;9075:30;9141:34;9136:2;9121:18;;9114:62;-1:-1:-1;;;9207:2:1;9192:18;;9185:43;9260:3;9245:19;;8861:409::o;9275:127::-;9336:10;9331:3;9327:20;9324:1;9317:31;9367:4;9364:1;9357:15;9391:4;9388:1;9381:15;9407:168;9447:7;9513:1;9509;9505:6;9501:14;9498:1;9495:21;9490:1;9483:9;9476:17;9472:45;9469:71;;;9520:18;;:::i;:::-;-1:-1:-1;9560:9:1;;9407:168::o;9712:217::-;9752:1;9778;9768:132;;9822:10;9817:3;9813:20;9810:1;9803:31;9857:4;9854:1;9847:15;9885:4;9882:1;9875:15;9768:132;-1:-1:-1;9914:9:1;;9712:217::o;11110:127::-;11171:10;11166:3;11162:20;11159:1;11152:31;11202:4;11199:1;11192:15;11226:4;11223:1;11216:15;11368:545;11470:2;11465:3;11462:11;11459:448;;;11506:1;11531:5;11527:2;11520:17;11576:4;11572:2;11562:19;11646:2;11634:10;11630:19;11627:1;11623:27;11617:4;11613:38;11682:4;11670:10;11667:20;11664:47;;;-1:-1:-1;11705:4:1;11664:47;11760:2;11755:3;11751:12;11748:1;11744:20;11738:4;11734:31;11724:41;;11815:82;11833:2;11826:5;11823:13;11815:82;;;11878:17;;;11859:1;11848:13;11815:82;;;11819:3;;;11368:545;;;:::o;12089:1352::-;12215:3;12209:10;12242:18;12234:6;12231:30;12228:56;;;12264:18;;:::i;:::-;12293:97;12383:6;12343:38;12375:4;12369:11;12343:38;:::i;:::-;12337:4;12293:97;:::i;:::-;12445:4;;12509:2;12498:14;;12526:1;12521:663;;;;13228:1;13245:6;13242:89;;;-1:-1:-1;13297:19:1;;;13291:26;13242:89;-1:-1:-1;;12046:1:1;12042:11;;;12038:24;12034:29;12024:40;12070:1;12066:11;;;12021:57;13344:81;;12491:944;;12521:663;11315:1;11308:14;;;11352:4;11339:18;;-1:-1:-1;;12557:20:1;;;12675:236;12689:7;12686:1;12683:14;12675:236;;;12778:19;;;12772:26;12757:42;;12870:27;;;;12838:1;12826:14;;;;12705:19;;12675:236;;;12679:3;12939:6;12930:7;12927:19;12924:201;;;13000:19;;;12994:26;-1:-1:-1;;13083:1:1;13079:14;;;13095:3;13075:24;13071:37;13067:42;13052:58;13037:74;;12924:201;-1:-1:-1;;;;;13171:1:1;13155:14;;;13151:22;13138:36;;-1:-1:-1;12089:1352:1:o;14209:135::-;14248:3;14269:17;;;14266:43;;14289:18;;:::i;:::-;-1:-1:-1;14336:1:1;14325:13;;14209:135::o;15108:125::-;15173:9;;;15194:10;;;15191:36;;;15207:18;;:::i;16369:663::-;16649:3;16687:6;16681:13;16703:66;16762:6;16757:3;16750:4;16742:6;16738:17;16703:66;:::i;:::-;16832:13;;16791:16;;;;16854:70;16832:13;16791:16;16901:4;16889:17;;16854:70;:::i;:::-;-1:-1:-1;;;16946:20:1;;16975:22;;;17024:1;17013:13;;16369:663;-1:-1:-1;;;;16369:663:1:o;17793:128::-;17860:9;;;17881:11;;;17878:37;;;17895:18;;:::i;18694:401::-;18896:2;18878:21;;;18935:2;18915:18;;;18908:30;18974:34;18969:2;18954:18;;18947:62;-1:-1:-1;;;19040:2:1;19025:18;;19018:35;19085:3;19070:19;;18694:401::o;19859:414::-;20061:2;20043:21;;;20100:2;20080:18;;;20073:30;20139:34;20134:2;20119:18;;20112:62;-1:-1:-1;;;20205:2:1;20190:18;;20183:48;20263:3;20248:19;;19859:414::o;20700:489::-;-1:-1:-1;;;;;20969:15:1;;;20951:34;;21021:15;;21016:2;21001:18;;20994:43;21068:2;21053:18;;21046:34;;;21116:3;21111:2;21096:18;;21089:31;;;20894:4;;21137:46;;21163:19;;21155:6;21137:46;:::i;:::-;21129:54;20700:489;-1:-1:-1;;;;;;20700:489:1:o;21194:249::-;21263:6;21316:2;21304:9;21295:7;21291:23;21287:32;21284:52;;;21332:1;21329;21322:12;21284:52;21364:9;21358:16;21383:30;21407:5;21383:30;:::i;21448:127::-;21509:10;21504:3;21500:20;21497:1;21490:31;21540:4;21537:1;21530:15;21564:4;21561:1;21554:15
Swarm Source
ipfs://5b5f7892dbf9945ac14fda8ac8bd9ffe8ca24dc286e6162da4dfe63785280738
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 29 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.