Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Public Mint | 16526062 | 1135 days ago | 0.01 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Qzuki
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-02-01 */ // Sources flattened with hardhat v2.12.6 https://hardhat.org // File @openzeppelin/contracts-upgradeable/utils/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return 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 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-upgradeable/proxy/utils/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Internal function that returns the initialized version. Returns `_initialized` */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Internal function that returns the initialized version. Returns `_initializing` */ function _isInitializing() internal view returns (bool) { return _initializing; } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // 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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] // OpenZeppelin Contracts (last updated v4.7.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 OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _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 anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/cryptography/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProofUpgradeable { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File erc721a-upgradeable/contracts/[email protected] pragma solidity ^0.8.0; /** * @dev This is a base storage for the initialization function for upgradeable diamond facet contracts **/ library ERC721A__InitializableStorage { struct Layout { /* * Indicates that the contract has been initialized. */ bool _initialized; /* * Indicates that the contract is in the process of being initialized. */ bool _initializing; } bytes32 internal constant STORAGE_SLOT = keccak256('ERC721A.contracts.storage.initializable.facet'); function layout() internal pure returns (Layout storage l) { bytes32 slot = STORAGE_SLOT; assembly { l.slot := slot } } } // File erc721a-upgradeable/contracts/[email protected] pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable diamond facet contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract ERC721A__Initializable { using ERC721A__InitializableStorage for ERC721A__InitializableStorage.Layout; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializerERC721A() { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the // contract may have been reentered. require( ERC721A__InitializableStorage.layout()._initializing ? _isConstructor() : !ERC721A__InitializableStorage.layout()._initialized, 'ERC721A__Initializable: contract is already initialized' ); bool isTopLevelCall = !ERC721A__InitializableStorage.layout()._initializing; if (isTopLevelCall) { ERC721A__InitializableStorage.layout()._initializing = true; ERC721A__InitializableStorage.layout()._initialized = true; } _; if (isTopLevelCall) { ERC721A__InitializableStorage.layout()._initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} modifier, directly or indirectly. */ modifier onlyInitializingERC721A() { require( ERC721A__InitializableStorage.layout()._initializing, 'ERC721A__Initializable: contract is not initializing' ); _; } /// @dev Returns true if and only if the function is running in the constructor function _isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } } // File erc721a-upgradeable/contracts/[email protected] pragma solidity ^0.8.0; library ERC721AStorage { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } struct Layout { // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 _currentIndex; // The number of tokens burned. uint256 _burnCounter; // Token name string _name; // Token symbol string _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => ERC721AStorage.TokenApprovalRef) _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) _operatorApprovals; } bytes32 internal constant STORAGE_SLOT = keccak256('ERC721A.contracts.storage.ERC721A'); function layout() internal pure returns (Layout storage l) { bytes32 slot = STORAGE_SLOT; assembly { l.slot := slot } } } // File erc721a-upgradeable/contracts/[email protected] // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721AUpgradeable { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @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`, * 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 be 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, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @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 payable; /** * @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); // ============================================================= // IERC721Metadata // ============================================================= /** * @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); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File erc721a-upgradeable/contracts/[email protected] // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721ReceiverUpgradeable { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721AUpgradeable is ERC721A__Initializable, IERC721AUpgradeable { using ERC721AStorage for ERC721AStorage.Layout; // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // CONSTRUCTOR // ============================================================= function __ERC721A_init(string memory name_, string memory symbol_) internal onlyInitializingERC721A { __ERC721A_init_unchained(name_, symbol_); } function __ERC721A_init_unchained(string memory name_, string memory symbol_) internal onlyInitializingERC721A { ERC721AStorage.layout()._name = name_; ERC721AStorage.layout()._symbol = symbol_; ERC721AStorage.layout()._currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return ERC721AStorage.layout()._currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return ERC721AStorage.layout()._currentIndex - ERC721AStorage.layout()._burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return ERC721AStorage.layout()._currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return ERC721AStorage.layout()._burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return ERC721AStorage.layout()._packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (ERC721AStorage.layout()._packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (ERC721AStorage.layout()._packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(ERC721AStorage.layout()._packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = ERC721AStorage.layout()._packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); ERC721AStorage.layout()._packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return ERC721AStorage.layout()._name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return ERC721AStorage.layout()._symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @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, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(ERC721AStorage.layout()._packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (ERC721AStorage.layout()._packedOwnerships[index] == 0) { ERC721AStorage.layout()._packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256 packed) { if (_startTokenId() <= tokenId) { packed = ERC721AStorage.layout()._packedOwnerships[tokenId]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // If the data at the starting slot does not exist, start the scan. if (packed == 0) { if (tokenId >= ERC721AStorage.layout()._currentIndex) revert OwnerQueryForNonexistentToken(); // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `tokenId` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. for (;;) { unchecked { packed = ERC721AStorage.layout()._packedOwnerships[--tokenId]; } if (packed == 0) continue; return packed; } } // Otherwise, the data exists and is not burned. We can skip the scan. // This is possible because we have already achieved the target condition. // This saves 2143 gas on transfers of initialized tokens. return packed; } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. * * Requirements: * * - The caller must own the token or be an approved operator. */ function approve(address to, uint256 tokenId) public payable virtual override { _approve(to, tokenId, true); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return ERC721AStorage.layout()._tokenApprovals[tokenId].value; } /** * @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) public virtual override { ERC721AStorage.layout()._operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return ERC721AStorage.layout()._operatorApprovals[owner][operator]; } /** * @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. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < ERC721AStorage.layout()._currentIndex && // If within bounds, ERC721AStorage.layout()._packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { ERC721AStorage.TokenApprovalRef storage tokenApproval = ERC721AStorage.layout()._tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --ERC721AStorage.layout()._packedAddressData[from]; // Updates: `balance -= 1`. ++ERC721AStorage.layout()._packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. ERC721AStorage.layout()._packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (ERC721AStorage.layout()._packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != ERC721AStorage.layout()._currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. ERC721AStorage.layout()._packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @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 memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721ReceiverUpgradeable(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (bytes4 retval) { return retval == ERC721A__IERC721ReceiverUpgradeable(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = ERC721AStorage.layout()._currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. ERC721AStorage.layout()._packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. ERC721AStorage.layout()._packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); ERC721AStorage.layout()._currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = ERC721AStorage.layout()._currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. ERC721AStorage.layout()._packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. ERC721AStorage.layout()._packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); ERC721AStorage.layout()._currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = ERC721AStorage.layout()._currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (ERC721AStorage.layout()._currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Equivalent to `_approve(to, tokenId, false)`. */ function _approve(address to, uint256 tokenId) internal virtual { _approve(to, tokenId, false); } /** * @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: * * - `tokenId` must exist. * * Emits an {Approval} event. */ function _approve( address to, uint256 tokenId, bool approvalCheck ) internal virtual { address owner = ownerOf(tokenId); if (approvalCheck) if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } ERC721AStorage.layout()._tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. ERC721AStorage.layout()._packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. ERC721AStorage.layout()._packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (ERC721AStorage.layout()._packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != ERC721AStorage.layout()._currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. ERC721AStorage.layout()._packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { ERC721AStorage.layout()._burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = ERC721AStorage.layout()._packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); ERC721AStorage.layout()._packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File contracts/Qzuki.sol pragma solidity ^0.8.4; contract Qzuki is ERC721AUpgradeable, OwnableUpgradeable { uint16 constant public MAX_AMOUNT = 10000; uint16 constant public AZUKI_MINT_AMOUNT = 3000; uint16 constant public BEANZ_MINT_AMOUNT = 2000; uint16 constant public TEAM_HOLD_NUM = 500; uint256 public constant PRICE = 10000000000000000;//0.01ETH address private AZUKI_ADDR; address private BEANZ_ADDR; uint8 public mintStatus; string private baseURI; bytes32 private whitelistMerkleRoot; mapping(address => bool) public whitelistMintedList; mapping(uint16 => bool) public mintByAzukiList; mapping(uint16 => bool) public mintByBeanzList; uint16 public azukiRemainCount; uint16 public beanzRemainCount; mapping(address => bool) public publicMintedList; // Take note of the initializer modifiers. // - `initializerERC721A` for `ERC721AUpgradeable`. // - `initializer` for OpenZeppelin's `OwnableUpgradeable`. function initialize(string memory name, string memory symbol, string memory baseURI_, address azuki, address beanz) initializerERC721A initializer public { __ERC721A_init(name, symbol); __Ownable_init(); baseURI = baseURI_; AZUKI_ADDR = azuki; BEANZ_ADDR = beanz; azukiRemainCount = AZUKI_MINT_AMOUNT; beanzRemainCount = BEANZ_MINT_AMOUNT; } function changeBaseURI(string memory newUri) public onlyOwner { baseURI = newUri; } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function updateMintStatus(uint8 status) public onlyOwner { mintStatus = status; } function updateWhitelistMerkleRoot(bytes32 root) public onlyOwner { whitelistMerkleRoot = root; } function whitelistMint(bytes32[] memory proof) public { require(mintStatus == 1, "Whitelist Mint is not available"); require(getAvailable() > 0, "No more NFT"); require(checkWhitelist(whitelistMerkleRoot, proof), "You are not in whitelist"); require(!whitelistMintedList[_msgSender()], "You have minted"); whitelistMintedList[_msgSender()] = true; _safeMint(_msgSender(), 1); } function holderMint(address to, uint16[] memory azukiTokenIds, uint16[] memory beanzTokenIds) public { require(mintStatus == 2, "Holder Mint is not available"); require(to != address(0), "Can't mint to empty address"); uint16 azukiNum=0; uint16 beanzNum=0; //check azuki tokenIds for (uint i = 0; i < azukiTokenIds.length; i++) { require(!mintByAzukiList[azukiTokenIds[i]], "Azuki tokenId is used"); require(IERC721AUpgradeable(AZUKI_ADDR).ownerOf(azukiTokenIds[i]) == to, "Don't have this nft"); mintByAzukiList[azukiTokenIds[i]] = true; azukiNum += 2; if(azukiNum >= azukiRemainCount){ azukiNum = azukiRemainCount; break; } } //check beanz tokenIds for (uint i = 0; i < beanzTokenIds.length; i++) { require(!mintByBeanzList[beanzTokenIds[i]], "BEANZ tokenId is used"); require(IERC721AUpgradeable(BEANZ_ADDR).ownerOf(beanzTokenIds[i]) == to, "Don't have this nft"); mintByBeanzList[beanzTokenIds[i]] = true; beanzNum++; if(beanzNum >= beanzRemainCount){ beanzNum = beanzRemainCount; break; } } //check num uint16 mintNum = azukiNum + beanzNum; require(mintNum > 0, "Reached holder mint max supply"); require(mintNum <= 10, "One can only mint 10"); //mint _safeMint(to, (uint256)(mintNum)); //update remain count if(azukiNum > 0){ azukiRemainCount -= azukiNum; } if(beanzNum > 0){ beanzRemainCount -= beanzNum; } } function publicMint() public payable { require(mintStatus == 3, "Public Mint is not available"); require(tx.origin == _msgSender(), "The caller is another contract"); require(getAvailable() > 0, "No more NFT"); require(!publicMintedList[_msgSender()], "You have minted"); require(PRICE == msg.value, "Insufficient value"); publicMintedList[_msgSender()] = true; _safeMint(_msgSender(), 1); } function withdraw() public onlyOwner { uint balance = address(this).balance; payable(_msgSender()).transfer(balance); } function ownerMint(bool mintBeforeHolderMint,address[] memory accounts, uint16[] memory nums) public onlyOwner { require(accounts.length > 0 && accounts.length == nums.length, "Length not match"); uint16 mintNum = 0; for (uint i = 0; i < accounts.length; i++) { _safeMint(accounts[i], nums[i]); mintNum += nums[i]; } require(_totalMinted() <= MAX_AMOUNT, "No more NFT"); if(mintBeforeHolderMint){ azukiRemainCount -= mintNum; } } function getAvailable() public view returns (uint16) { if(MAX_AMOUNT >= ((uint16)(_totalMinted()) + TEAM_HOLD_NUM)){ return MAX_AMOUNT - (uint16)(_totalMinted()) - TEAM_HOLD_NUM; } return 0; } function checkTokensMinted(uint16[] memory tokenIds, bool azuki) public view returns (bool[] memory) { bool[] memory results = new bool[](tokenIds.length); for (uint i = 0; i < tokenIds.length; i++) { if (azuki) { results[i] = mintByAzukiList[tokenIds[i]]; } else { results[i] = mintByBeanzList[tokenIds[i]]; } } return results; } function checkWhitelist(bytes32 root, bytes32[] memory proof) public view returns (bool){ return MerkleProofUpgradeable.verify(proof, root, keccak256(abi.encodePacked(_msgSender()))); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","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":"AZUKI_MINT_AMOUNT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BEANZ_MINT_AMOUNT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_AMOUNT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TEAM_HOLD_NUM","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"azukiRemainCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beanzRemainCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"newUri","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"},{"internalType":"bool","name":"azuki","type":"bool"}],"name":"checkTokensMinted","outputs":[{"internalType":"bool[]","name":"","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"checkWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAvailable","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16[]","name":"azukiTokenIds","type":"uint16[]"},{"internalType":"uint16[]","name":"beanzTokenIds","type":"uint16[]"}],"name":"holderMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"address","name":"azuki","type":"address"},{"internalType":"address","name":"beanz","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","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":"uint16","name":"","type":"uint16"}],"name":"mintByAzukiList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"mintByBeanzList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintStatus","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"mintBeforeHolderMint","type":"bool"},{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint16[]","name":"nums","type":"uint16[]"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicMintedList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"status","type":"uint8"}],"name":"updateMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"updateWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMintedList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50612e97806100206000396000f3fe6080604052600436106102465760003560e01c8063715018a611610139578063b88d4fde116100b6578063d6d0faee1161007a578063d6d0faee146106b2578063e985e9c5146106d2578063f2fde38b146106f2578063f78ebbed14610712578063f905f15414610732578063f9cc06051461075257600080fd5b8063b88d4fde14610609578063c87b56dd1461061c578063cf2806d21461063c578063d1dbd7651461066c578063d40dc8701461069c57600080fd5b806395d89b41116100fd57806395d89b41146105665780639cfc53861461057b5780639da3f8fd14610596578063a22cb465146105c9578063b138e155146105e957600080fd5b8063715018a6146104bb57806378268c3e146104d057806380ac49e5146105005780638d859f3e1461052d5780638da5cb5b1461054857600080fd5b806339a0c6f9116101c75780636352211e1161018b5780636352211e146104155780636957637b1461043557806369def03f146104555780636e654ea11461048557806370a082311461049b57600080fd5b806339a0c6f9146103975780633ccfd60b146103b757806342842e0e146103cc57806356ab4243146103df5780635f1cf0e2146103ff57600080fd5b80631a1b979d1161020e5780631a1b979d1461031257806323b872dd1461034657806326092b8314610359578063372f657c146103615780633880292a1461038157600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806318160ddd146102ef575b600080fd5b34801561025757600080fd5b5061026b610266366004612494565b610767565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102956107b9565b6040516102779190612509565b3480156102ae57600080fd5b506102c26102bd36600461251c565b610854565b6040516001600160a01b039091168152602001610277565b6102ed6102e836600461254a565b6108a1565b005b3480156102fb57600080fd5b506103046108b1565b604051908152602001610277565b34801561031e57600080fd5b50606c546103339062010000900461ffff1681565b60405161ffff9091168152602001610277565b6102ed610354366004612576565b6108d0565b6102ed610ac0565b34801561036d57600080fd5b506102ed61037c36600461268b565b610c60565b34801561038d57600080fd5b50610333610bb881565b3480156103a357600080fd5b506102ed6103b2366004612736565b610db7565b3480156103c357600080fd5b506102ed610dd2565b6102ed6103da366004612576565b610e09565b3480156103eb57600080fd5b506102ed6103fa3660046127de565b610e29565b34801561040b57600080fd5b506103336107d081565b34801561042157600080fd5b506102c261043036600461251c565b611418565b34801561044157600080fd5b506102ed61045036600461251c565b611423565b34801561046157600080fd5b5061026b610470366004612853565b606d6020526000908152604090205460ff1681565b34801561049157600080fd5b506103336101f481565b3480156104a757600080fd5b506103046104b6366004612853565b611430565b3480156104c757600080fd5b506102ed611498565b3480156104dc57600080fd5b5061026b6104eb366004612870565b606b6020526000908152604090205460ff1681565b34801561050c57600080fd5b5061052061051b36600461289b565b6114aa565b60405161027791906128e8565b34801561053957600080fd5b50610304662386f26fc1000081565b34801561055457600080fd5b506033546001600160a01b03166102c2565b34801561057257600080fd5b506102956115ed565b34801561058757600080fd5b50606c546103339061ffff1681565b3480156105a257600080fd5b506066546105b790600160a01b900460ff1681565b60405160ff9091168152602001610277565b3480156105d557600080fd5b506102ed6105e436600461292e565b611605565b3480156105f557600080fd5b5061026b61060436600461295a565b611682565b6102ed6106173660046129a0565b6116cd565b34801561062857600080fd5b5061029561063736600461251c565b611717565b34801561064857600080fd5b5061026b610657366004612870565b606a6020526000908152604090205460ff1681565b34801561067857600080fd5b5061026b610687366004612853565b60696020526000908152604090205460ff1681565b3480156106a857600080fd5b5061033361271081565b3480156106be57600080fd5b506102ed6106cd366004612a1f565b61179b565b3480156106de57600080fd5b5061026b6106ed366004612ace565b611a1a565b3480156106fe57600080fd5b506102ed61070d366004612853565b611a57565b34801561071e57600080fd5b506102ed61072d366004612b07565b611acd565b34801561073e57600080fd5b506102ed61074d366004612bd0565b611c15565b34801561075e57600080fd5b50610333611c3d565b60006301ffc9a760e01b6001600160e01b03198316148061079857506380ac58cd60e01b6001600160e01b03198316145b806107b35750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606107c3611c8c565b60020180546107d190612bf3565b80601f01602080910402602001604051908101604052809291908181526020018280546107fd90612bf3565b801561084a5780601f1061081f5761010080835404028352916020019161084a565b820191906000526020600020905b81548152906001019060200180831161082d57829003601f168201915b5050505050905090565b600061085f82611cb0565b61087c576040516333d1c03960e21b815260040160405180910390fd5b610884611c8c565b60009283526006016020525060409020546001600160a01b031690565b6108ad82826001611cec565b5050565b6000806108bc611c8c565b600101546108c8611c8c565b540303919050565b60006108db82611da1565b9050836001600160a01b0316816001600160a01b03161461090e5760405162a1148160e81b815260040160405180910390fd5b60008061091a84611e44565b9150915061093f818761092a3390565b6001600160a01b039081169116811491141790565b61096a5761094d8633611a1a565b61096a57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661099157604051633a954ecd60e21b815260040160405180910390fd5b801561099c57600082555b6109a4611c8c565b6001600160a01b03871660009081526005919091016020526040902080546000190190556109d0611c8c565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b17610a07611c8c565b60008681526004919091016020526040902055600160e11b8316610a765760018401610a31611c8c565b60008281526004919091016020526040902054610a7457610a50611c8c565b548114610a745783610a60611c8c565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b606654600160a01b900460ff16600314610b215760405162461bcd60e51b815260206004820152601c60248201527f5075626c6963204d696e74206973206e6f7420617661696c61626c650000000060448201526064015b60405180910390fd5b323314610b705760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610b18565b6000610b7a611c3d565b61ffff1611610b9b5760405162461bcd60e51b8152600401610b1890612c2e565b336000908152606d602052604090205460ff1615610bed5760405162461bcd60e51b815260206004820152600f60248201526e165bdd481a185d99481b5a5b9d1959608a1b6044820152606401610b18565b34662386f26fc1000014610c385760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742076616c756560701b6044820152606401610b18565b336000818152606d60205260409020805460ff19166001179055610c5e905b6001611e6c565b565b606654600160a01b900460ff16600114610cbc5760405162461bcd60e51b815260206004820152601f60248201527f57686974656c697374204d696e74206973206e6f7420617661696c61626c65006044820152606401610b18565b6000610cc6611c3d565b61ffff1611610ce75760405162461bcd60e51b8152600401610b1890612c2e565b610cf360685482611682565b610d3f5760405162461bcd60e51b815260206004820152601860248201527f596f7520617265206e6f7420696e2077686974656c69737400000000000000006044820152606401610b18565b3360009081526069602052604090205460ff1615610d915760405162461bcd60e51b815260206004820152600f60248201526e165bdd481a185d99481b5a5b9d1959608a1b6044820152606401610b18565b336000818152606960205260409020805460ff19166001179055610db490610c57565b50565b610dbf611e86565b80516108ad9060679060208401906123e5565b610dda611e86565b6040514790339082156108fc029083906000818181858888f193505050501580156108ad573d6000803e3d6000fd5b610e24838383604051806020016040528060008152506116cd565b505050565b606654600160a01b900460ff16600214610e855760405162461bcd60e51b815260206004820152601c60248201527f486f6c646572204d696e74206973206e6f7420617661696c61626c65000000006044820152606401610b18565b6001600160a01b038316610edb5760405162461bcd60e51b815260206004820152601b60248201527f43616e2774206d696e7420746f20656d707479206164647265737300000000006044820152606401610b18565b60008060005b84518110156110d157606a6000868381518110610f0057610f00612c53565b60209081029190910181015161ffff1682528101919091526040016000205460ff1615610f675760405162461bcd60e51b8152602060048201526015602482015274105e9d5ada481d1bdad95b9259081a5cc81d5cd959605a1b6044820152606401610b18565b60655485516001600160a01b03808916921690636352211e90889085908110610f9257610f92612c53565b60200260200101516040518263ffffffff1660e01b8152600401610fc0919061ffff91909116815260200190565b602060405180830381865afa158015610fdd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110019190612c69565b6001600160a01b03161461104d5760405162461bcd60e51b8152602060048201526013602482015272111bdb89dd081a185d99481d1a1a5cc81b999d606a1b6044820152606401610b18565b6001606a600087848151811061106557611065612c53565b60209081029190910181015161ffff168252810191909152604001600020805460ff191691151591909117905561109d600284612c9c565b606c5490935061ffff908116908416106110bf57606c5461ffff1692506110d1565b806110c981612cc2565b915050610ee1565b5060005b83518110156112d257606b60008583815181106110f4576110f4612c53565b60209081029190910181015161ffff1682528101919091526040016000205460ff161561115b5760405162461bcd60e51b81526020600482015260156024820152741091505396881d1bdad95b9259081a5cc81d5cd959605a1b6044820152606401610b18565b60665484516001600160a01b03808916921690636352211e9087908590811061118657611186612c53565b60200260200101516040518263ffffffff1660e01b81526004016111b4919061ffff91909116815260200190565b602060405180830381865afa1580156111d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f59190612c69565b6001600160a01b0316146112415760405162461bcd60e51b8152602060048201526013602482015272111bdb89dd081a185d99481d1a1a5cc81b999d606a1b6044820152606401610b18565b6001606b600086848151811061125957611259612c53565b60209081029190910181015161ffff168252810191909152604001600020805460ff19169115159190911790558161129081612cdd565b606c5490935061ffff6201000090910481169084161090506112c057606c5462010000900461ffff1691506112d2565b806112ca81612cc2565b9150506110d5565b5060006112df8284612c9c565b905060008161ffff16116113355760405162461bcd60e51b815260206004820152601e60248201527f5265616368656420686f6c646572206d696e74206d617820737570706c7900006044820152606401610b18565b600a8161ffff1611156113815760405162461bcd60e51b815260206004820152601460248201527304f6e652063616e206f6e6c79206d696e742031360641b6044820152606401610b18565b61138f868261ffff16611e6c565b61ffff8316156113cd57606c80548491906000906113b290849061ffff16612cff565b92506101000a81548161ffff021916908361ffff1602179055505b61ffff821615610ab85781606c60028282829054906101000a900461ffff166113f69190612cff565b92506101000a81548161ffff021916908361ffff160217905550505050505050565b60006107b382611da1565b61142b611e86565b606855565b60006001600160a01b038216611459576040516323d3ad8160e21b815260040160405180910390fd5b6001600160401b03611469611c8c565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b6114a0611e86565b610c5e6000611ee0565b6060600083516001600160401b038111156114c7576114c76125b7565b6040519080825280602002602001820160405280156114f0578160200160208202803683370190505b50905060005b84518110156115e557831561156e57606a600086838151811061151b5761151b612c53565b602002602001015161ffff1661ffff16815260200190815260200160002060009054906101000a900460ff1682828151811061155957611559612c53565b911515602092830291909101909101526115d3565b606b600086838151811061158457611584612c53565b602002602001015161ffff1661ffff16815260200190815260200160002060009054906101000a900460ff168282815181106115c2576115c2612c53565b911515602092830291909101909101525b806115dd81612cc2565b9150506114f6565b509392505050565b60606115f7611c8c565b60030180546107d190612bf3565b8061160e611c8c565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6040516bffffffffffffffffffffffff193360601b1660208201526000906116c6908390859060340160405160208183030381529060405280519060200120611f32565b9392505050565b6116d88484846108d0565b6001600160a01b0383163b15611711576116f484848484611f48565b611711576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061172282611cb0565b61173f57604051630a14c4b560e41b815260040160405180910390fd5b6000611749612031565b905080516000141561176a57604051806020016040528060008152506116c6565b8061177484612040565b604051602001611785929190612d22565b6040516020818303038152906040529392505050565b600080516020612e4283398151915254610100900460ff166117d057600080516020612e428339815191525460ff16156117d4565b303b155b6118465760405162461bcd60e51b815260206004820152603760248201527f455243373231415f5f496e697469616c697a61626c653a20636f6e747261637460448201527f20697320616c726561647920696e697469616c697a65640000000000000000006064820152608401610b18565b600080516020612e4283398151915254610100900460ff1615801561188257600080516020612e42833981519152805461ffff19166101011790555b600054610100900460ff16158080156118a25750600054600160ff909116105b806118bc5750303b1580156118bc575060005460ff166001145b61191f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610b18565b6000805460ff191660011790558015611942576000805461ff0019166101001790555b61194c878761208e565b6119546120cc565b84516119679060679060208801906123e5565b50606580546001600160a01b038087166001600160a01b0319928316179092556066805492861692909116919091179055606c80546307d00bb863ffffffff1990911617905580156119f3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b508015610ab8575050600080516020612e42833981519152805461ff001916905550505050565b6000611a24611c8c565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b611a5f611e86565b6001600160a01b038116611ac45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b18565b610db481611ee0565b611ad5611e86565b60008251118015611ae7575080518251145b611b265760405162461bcd60e51b815260206004820152601060248201526f098cadccee8d040dcdee840dac2e8c6d60831b6044820152606401610b18565b6000805b8351811015611bac57611b73848281518110611b4857611b48612c53565b6020026020010151848381518110611b6257611b62612c53565b602002602001015161ffff16611e6c565b828181518110611b8557611b85612c53565b602002602001015182611b989190612c9c565b915080611ba481612cc2565b915050611b2a565b50612710611bb86120fb565b1115611bd65760405162461bcd60e51b8152600401610b1890612c2e565b831561171157606c8054829190600090611bf590849061ffff16612cff565b92506101000a81548161ffff021916908361ffff16021790555050505050565b611c1d611e86565b6066805460ff909216600160a01b0260ff60a01b19909216919091179055565b60006101f4611c4a6120fb565b611c549190612c9c565b61ffff1661271010611c86576101f4611c6b6120fb565b611c7790612710612cff565b611c819190612cff565b905090565b50600090565b7f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c4090565b6000611cba611c8c565b54821080156107b35750600160e01b611cd1611c8c565b60008481526004919091016020526040902054161592915050565b6000611cf783611418565b90508115611d3657336001600160a01b03821614611d3657611d198133611a1a565b611d36576040516367d9dca160e11b815260040160405180910390fd5b83611d3f611c8c565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b6000611dab611c8c565b600083815260049190910160205260409020549050600160e01b8116611e2b5780611e2657611dd8611c8c565b548210611df857604051636f96cda160e11b815260040160405180910390fd5b611e00611c8c565b6000199092016000818152600493909301602052604090922054905080611e2657611df8565b919050565b604051636f96cda160e11b815260040160405180910390fd5b6000806000611e51611c8c565b60009485526006016020525050604090912080549092909150565b6108ad82826040518060200160405280600081525061210d565b6033546001600160a01b03163314610c5e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b18565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600082611f3f858461218a565b14949350505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611f7d903390899088908890600401612d48565b6020604051808303816000875af1925050508015611fb8575060408051601f3d908101601f19168201909252611fb591810190612d85565b60015b612013573d808015611fe6576040519150601f19603f3d011682016040523d82523d6000602084013e611feb565b606091505b50805161200b576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060606780546107d190612bf3565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806120775761207c565b61205a565b50819003601f19909101908152919050565b600080516020612e4283398151915254610100900460ff166120c25760405162461bcd60e51b8152600401610b1890612da2565b6108ad82826121cf565b600054610100900460ff166120f35760405162461bcd60e51b8152600401610b1890612df6565b610c5e612252565b600080612106611c8c565b5403919050565b6121178383612282565b6001600160a01b0383163b15610e24576000612131611c8c565b5490508281035b61214b6000868380600101945086611f48565b612168576040516368d2bf6b60e11b815260040160405180910390fd5b8181106121385781612178611c8c565b541461218357600080fd5b5050505050565b600081815b84518110156115e5576121bb828683815181106121ae576121ae612c53565b60200260200101516123b6565b9150806121c781612cc2565b91505061218f565b600080516020612e4283398151915254610100900460ff166122035760405162461bcd60e51b8152600401610b1890612da2565b8161220c611c8c565b60020190805190602001906122229291906123e5565b508061222c611c8c565b60030190805190602001906122429291906123e5565b50600061224d611c8c565b555050565b600054610100900460ff166122795760405162461bcd60e51b8152600401610b1890612df6565b610c5e33611ee0565b600061228c611c8c565b549050816122ad5760405163b562e8dd60e01b815260040160405180910390fd5b6801000000000000000182026122c1611c8c565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b17176122fc611c8c565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461238657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460010161234e565b50816123a457604051622e076360e81b815260040160405180910390fd5b806123ad611c8c565b5550610e249050565b60008183106123d25760008281526020849052604090206116c6565b60008381526020839052604090206116c6565b8280546123f190612bf3565b90600052602060002090601f0160209004810192826124135760008555612459565b82601f1061242c57805160ff1916838001178555612459565b82800160010185558215612459579182015b8281111561245957825182559160200191906001019061243e565b50612465929150612469565b5090565b5b80821115612465576000815560010161246a565b6001600160e01b031981168114610db457600080fd5b6000602082840312156124a657600080fd5b81356116c68161247e565b60005b838110156124cc5781810151838201526020016124b4565b838111156117115750506000910152565b600081518084526124f58160208601602086016124b1565b601f01601f19169290920160200192915050565b6020815260006116c660208301846124dd565b60006020828403121561252e57600080fd5b5035919050565b6001600160a01b0381168114610db457600080fd5b6000806040838503121561255d57600080fd5b823561256881612535565b946020939093013593505050565b60008060006060848603121561258b57600080fd5b833561259681612535565b925060208401356125a681612535565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156125f5576125f56125b7565b604052919050565b60006001600160401b03821115612616576126166125b7565b5060051b60200190565b600082601f83011261263157600080fd5b81356020612646612641836125fd565b6125cd565b82815260059290921b8401810191818101908684111561266557600080fd5b8286015b848110156126805780358352918301918301612669565b509695505050505050565b60006020828403121561269d57600080fd5b81356001600160401b038111156126b357600080fd5b61202984828501612620565b60006001600160401b038311156126d8576126d86125b7565b6126eb601f8401601f19166020016125cd565b90508281528383830111156126ff57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261272757600080fd5b6116c6838335602085016126bf565b60006020828403121561274857600080fd5b81356001600160401b0381111561275e57600080fd5b61202984828501612716565b803561ffff81168114611e2657600080fd5b600082601f83011261278d57600080fd5b8135602061279d612641836125fd565b82815260059290921b840181019181810190868411156127bc57600080fd5b8286015b84811015612680576127d18161276a565b83529183019183016127c0565b6000806000606084860312156127f357600080fd5b83356127fe81612535565b925060208401356001600160401b038082111561281a57600080fd5b6128268783880161277c565b9350604086013591508082111561283c57600080fd5b506128498682870161277c565b9150509250925092565b60006020828403121561286557600080fd5b81356116c681612535565b60006020828403121561288257600080fd5b6116c68261276a565b80358015158114611e2657600080fd5b600080604083850312156128ae57600080fd5b82356001600160401b038111156128c457600080fd5b6128d08582860161277c565b9250506128df6020840161288b565b90509250929050565b6020808252825182820181905260009190848201906040850190845b81811015612922578351151583529284019291840191600101612904565b50909695505050505050565b6000806040838503121561294157600080fd5b823561294c81612535565b91506128df6020840161288b565b6000806040838503121561296d57600080fd5b8235915060208301356001600160401b0381111561298a57600080fd5b61299685828601612620565b9150509250929050565b600080600080608085870312156129b657600080fd5b84356129c181612535565b935060208501356129d181612535565b92506040850135915060608501356001600160401b038111156129f357600080fd5b8501601f81018713612a0457600080fd5b612a13878235602084016126bf565b91505092959194509250565b600080600080600060a08688031215612a3757600080fd5b85356001600160401b0380821115612a4e57600080fd5b612a5a89838a01612716565b96506020880135915080821115612a7057600080fd5b612a7c89838a01612716565b95506040880135915080821115612a9257600080fd5b50612a9f88828901612716565b9350506060860135612ab081612535565b91506080860135612ac081612535565b809150509295509295909350565b60008060408385031215612ae157600080fd5b8235612aec81612535565b91506020830135612afc81612535565b809150509250929050565b600080600060608486031215612b1c57600080fd5b612b258461288b565b92506020808501356001600160401b0380821115612b4257600080fd5b818701915087601f830112612b5657600080fd5b8135612b64612641826125fd565b81815260059190911b8301840190848101908a831115612b8357600080fd5b938501935b82851015612baa578435612b9b81612535565b82529385019390850190612b88565b965050506040870135925080831115612bc257600080fd5b50506128498682870161277c565b600060208284031215612be257600080fd5b813560ff811681146116c657600080fd5b600181811c90821680612c0757607f821691505b60208210811415612c2857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600b908201526a139bc81b5bdc994813919560aa1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612c7b57600080fd5b81516116c681612535565b634e487b7160e01b600052601160045260246000fd5b600061ffff808316818516808303821115612cb957612cb9612c86565b01949350505050565b6000600019821415612cd657612cd6612c86565b5060010190565b600061ffff80831681811415612cf557612cf5612c86565b6001019392505050565b600061ffff83811690831681811015612d1a57612d1a612c86565b039392505050565b60008351612d348184602088016124b1565b835190830190612cb98183602088016124b1565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d7b908301846124dd565b9695505050505050565b600060208284031215612d9757600080fd5b81516116c68161247e565b60208082526034908201527f455243373231415f5f496e697469616c697a61626c653a20636f6e7472616374604082015273206973206e6f7420696e697469616c697a696e6760601b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056feee151c8401928dc223602bb187aff91b9a56c7cae5476ef1b3287b085a16c85fa2646970667358221220618b62a85d584983d3561b4ce0e86b58e702f494018d18da367ae7bd77ac194c64736f6c634300080b0033
Deployed Bytecode
0x6080604052600436106102465760003560e01c8063715018a611610139578063b88d4fde116100b6578063d6d0faee1161007a578063d6d0faee146106b2578063e985e9c5146106d2578063f2fde38b146106f2578063f78ebbed14610712578063f905f15414610732578063f9cc06051461075257600080fd5b8063b88d4fde14610609578063c87b56dd1461061c578063cf2806d21461063c578063d1dbd7651461066c578063d40dc8701461069c57600080fd5b806395d89b41116100fd57806395d89b41146105665780639cfc53861461057b5780639da3f8fd14610596578063a22cb465146105c9578063b138e155146105e957600080fd5b8063715018a6146104bb57806378268c3e146104d057806380ac49e5146105005780638d859f3e1461052d5780638da5cb5b1461054857600080fd5b806339a0c6f9116101c75780636352211e1161018b5780636352211e146104155780636957637b1461043557806369def03f146104555780636e654ea11461048557806370a082311461049b57600080fd5b806339a0c6f9146103975780633ccfd60b146103b757806342842e0e146103cc57806356ab4243146103df5780635f1cf0e2146103ff57600080fd5b80631a1b979d1161020e5780631a1b979d1461031257806323b872dd1461034657806326092b8314610359578063372f657c146103615780633880292a1461038157600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806318160ddd146102ef575b600080fd5b34801561025757600080fd5b5061026b610266366004612494565b610767565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102956107b9565b6040516102779190612509565b3480156102ae57600080fd5b506102c26102bd36600461251c565b610854565b6040516001600160a01b039091168152602001610277565b6102ed6102e836600461254a565b6108a1565b005b3480156102fb57600080fd5b506103046108b1565b604051908152602001610277565b34801561031e57600080fd5b50606c546103339062010000900461ffff1681565b60405161ffff9091168152602001610277565b6102ed610354366004612576565b6108d0565b6102ed610ac0565b34801561036d57600080fd5b506102ed61037c36600461268b565b610c60565b34801561038d57600080fd5b50610333610bb881565b3480156103a357600080fd5b506102ed6103b2366004612736565b610db7565b3480156103c357600080fd5b506102ed610dd2565b6102ed6103da366004612576565b610e09565b3480156103eb57600080fd5b506102ed6103fa3660046127de565b610e29565b34801561040b57600080fd5b506103336107d081565b34801561042157600080fd5b506102c261043036600461251c565b611418565b34801561044157600080fd5b506102ed61045036600461251c565b611423565b34801561046157600080fd5b5061026b610470366004612853565b606d6020526000908152604090205460ff1681565b34801561049157600080fd5b506103336101f481565b3480156104a757600080fd5b506103046104b6366004612853565b611430565b3480156104c757600080fd5b506102ed611498565b3480156104dc57600080fd5b5061026b6104eb366004612870565b606b6020526000908152604090205460ff1681565b34801561050c57600080fd5b5061052061051b36600461289b565b6114aa565b60405161027791906128e8565b34801561053957600080fd5b50610304662386f26fc1000081565b34801561055457600080fd5b506033546001600160a01b03166102c2565b34801561057257600080fd5b506102956115ed565b34801561058757600080fd5b50606c546103339061ffff1681565b3480156105a257600080fd5b506066546105b790600160a01b900460ff1681565b60405160ff9091168152602001610277565b3480156105d557600080fd5b506102ed6105e436600461292e565b611605565b3480156105f557600080fd5b5061026b61060436600461295a565b611682565b6102ed6106173660046129a0565b6116cd565b34801561062857600080fd5b5061029561063736600461251c565b611717565b34801561064857600080fd5b5061026b610657366004612870565b606a6020526000908152604090205460ff1681565b34801561067857600080fd5b5061026b610687366004612853565b60696020526000908152604090205460ff1681565b3480156106a857600080fd5b5061033361271081565b3480156106be57600080fd5b506102ed6106cd366004612a1f565b61179b565b3480156106de57600080fd5b5061026b6106ed366004612ace565b611a1a565b3480156106fe57600080fd5b506102ed61070d366004612853565b611a57565b34801561071e57600080fd5b506102ed61072d366004612b07565b611acd565b34801561073e57600080fd5b506102ed61074d366004612bd0565b611c15565b34801561075e57600080fd5b50610333611c3d565b60006301ffc9a760e01b6001600160e01b03198316148061079857506380ac58cd60e01b6001600160e01b03198316145b806107b35750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606107c3611c8c565b60020180546107d190612bf3565b80601f01602080910402602001604051908101604052809291908181526020018280546107fd90612bf3565b801561084a5780601f1061081f5761010080835404028352916020019161084a565b820191906000526020600020905b81548152906001019060200180831161082d57829003601f168201915b5050505050905090565b600061085f82611cb0565b61087c576040516333d1c03960e21b815260040160405180910390fd5b610884611c8c565b60009283526006016020525060409020546001600160a01b031690565b6108ad82826001611cec565b5050565b6000806108bc611c8c565b600101546108c8611c8c565b540303919050565b60006108db82611da1565b9050836001600160a01b0316816001600160a01b03161461090e5760405162a1148160e81b815260040160405180910390fd5b60008061091a84611e44565b9150915061093f818761092a3390565b6001600160a01b039081169116811491141790565b61096a5761094d8633611a1a565b61096a57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661099157604051633a954ecd60e21b815260040160405180910390fd5b801561099c57600082555b6109a4611c8c565b6001600160a01b03871660009081526005919091016020526040902080546000190190556109d0611c8c565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b17610a07611c8c565b60008681526004919091016020526040902055600160e11b8316610a765760018401610a31611c8c565b60008281526004919091016020526040902054610a7457610a50611c8c565b548114610a745783610a60611c8c565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b606654600160a01b900460ff16600314610b215760405162461bcd60e51b815260206004820152601c60248201527f5075626c6963204d696e74206973206e6f7420617661696c61626c650000000060448201526064015b60405180910390fd5b323314610b705760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610b18565b6000610b7a611c3d565b61ffff1611610b9b5760405162461bcd60e51b8152600401610b1890612c2e565b336000908152606d602052604090205460ff1615610bed5760405162461bcd60e51b815260206004820152600f60248201526e165bdd481a185d99481b5a5b9d1959608a1b6044820152606401610b18565b34662386f26fc1000014610c385760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742076616c756560701b6044820152606401610b18565b336000818152606d60205260409020805460ff19166001179055610c5e905b6001611e6c565b565b606654600160a01b900460ff16600114610cbc5760405162461bcd60e51b815260206004820152601f60248201527f57686974656c697374204d696e74206973206e6f7420617661696c61626c65006044820152606401610b18565b6000610cc6611c3d565b61ffff1611610ce75760405162461bcd60e51b8152600401610b1890612c2e565b610cf360685482611682565b610d3f5760405162461bcd60e51b815260206004820152601860248201527f596f7520617265206e6f7420696e2077686974656c69737400000000000000006044820152606401610b18565b3360009081526069602052604090205460ff1615610d915760405162461bcd60e51b815260206004820152600f60248201526e165bdd481a185d99481b5a5b9d1959608a1b6044820152606401610b18565b336000818152606960205260409020805460ff19166001179055610db490610c57565b50565b610dbf611e86565b80516108ad9060679060208401906123e5565b610dda611e86565b6040514790339082156108fc029083906000818181858888f193505050501580156108ad573d6000803e3d6000fd5b610e24838383604051806020016040528060008152506116cd565b505050565b606654600160a01b900460ff16600214610e855760405162461bcd60e51b815260206004820152601c60248201527f486f6c646572204d696e74206973206e6f7420617661696c61626c65000000006044820152606401610b18565b6001600160a01b038316610edb5760405162461bcd60e51b815260206004820152601b60248201527f43616e2774206d696e7420746f20656d707479206164647265737300000000006044820152606401610b18565b60008060005b84518110156110d157606a6000868381518110610f0057610f00612c53565b60209081029190910181015161ffff1682528101919091526040016000205460ff1615610f675760405162461bcd60e51b8152602060048201526015602482015274105e9d5ada481d1bdad95b9259081a5cc81d5cd959605a1b6044820152606401610b18565b60655485516001600160a01b03808916921690636352211e90889085908110610f9257610f92612c53565b60200260200101516040518263ffffffff1660e01b8152600401610fc0919061ffff91909116815260200190565b602060405180830381865afa158015610fdd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110019190612c69565b6001600160a01b03161461104d5760405162461bcd60e51b8152602060048201526013602482015272111bdb89dd081a185d99481d1a1a5cc81b999d606a1b6044820152606401610b18565b6001606a600087848151811061106557611065612c53565b60209081029190910181015161ffff168252810191909152604001600020805460ff191691151591909117905561109d600284612c9c565b606c5490935061ffff908116908416106110bf57606c5461ffff1692506110d1565b806110c981612cc2565b915050610ee1565b5060005b83518110156112d257606b60008583815181106110f4576110f4612c53565b60209081029190910181015161ffff1682528101919091526040016000205460ff161561115b5760405162461bcd60e51b81526020600482015260156024820152741091505396881d1bdad95b9259081a5cc81d5cd959605a1b6044820152606401610b18565b60665484516001600160a01b03808916921690636352211e9087908590811061118657611186612c53565b60200260200101516040518263ffffffff1660e01b81526004016111b4919061ffff91909116815260200190565b602060405180830381865afa1580156111d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f59190612c69565b6001600160a01b0316146112415760405162461bcd60e51b8152602060048201526013602482015272111bdb89dd081a185d99481d1a1a5cc81b999d606a1b6044820152606401610b18565b6001606b600086848151811061125957611259612c53565b60209081029190910181015161ffff168252810191909152604001600020805460ff19169115159190911790558161129081612cdd565b606c5490935061ffff6201000090910481169084161090506112c057606c5462010000900461ffff1691506112d2565b806112ca81612cc2565b9150506110d5565b5060006112df8284612c9c565b905060008161ffff16116113355760405162461bcd60e51b815260206004820152601e60248201527f5265616368656420686f6c646572206d696e74206d617820737570706c7900006044820152606401610b18565b600a8161ffff1611156113815760405162461bcd60e51b815260206004820152601460248201527304f6e652063616e206f6e6c79206d696e742031360641b6044820152606401610b18565b61138f868261ffff16611e6c565b61ffff8316156113cd57606c80548491906000906113b290849061ffff16612cff565b92506101000a81548161ffff021916908361ffff1602179055505b61ffff821615610ab85781606c60028282829054906101000a900461ffff166113f69190612cff565b92506101000a81548161ffff021916908361ffff160217905550505050505050565b60006107b382611da1565b61142b611e86565b606855565b60006001600160a01b038216611459576040516323d3ad8160e21b815260040160405180910390fd5b6001600160401b03611469611c8c565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b6114a0611e86565b610c5e6000611ee0565b6060600083516001600160401b038111156114c7576114c76125b7565b6040519080825280602002602001820160405280156114f0578160200160208202803683370190505b50905060005b84518110156115e557831561156e57606a600086838151811061151b5761151b612c53565b602002602001015161ffff1661ffff16815260200190815260200160002060009054906101000a900460ff1682828151811061155957611559612c53565b911515602092830291909101909101526115d3565b606b600086838151811061158457611584612c53565b602002602001015161ffff1661ffff16815260200190815260200160002060009054906101000a900460ff168282815181106115c2576115c2612c53565b911515602092830291909101909101525b806115dd81612cc2565b9150506114f6565b509392505050565b60606115f7611c8c565b60030180546107d190612bf3565b8061160e611c8c565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6040516bffffffffffffffffffffffff193360601b1660208201526000906116c6908390859060340160405160208183030381529060405280519060200120611f32565b9392505050565b6116d88484846108d0565b6001600160a01b0383163b15611711576116f484848484611f48565b611711576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061172282611cb0565b61173f57604051630a14c4b560e41b815260040160405180910390fd5b6000611749612031565b905080516000141561176a57604051806020016040528060008152506116c6565b8061177484612040565b604051602001611785929190612d22565b6040516020818303038152906040529392505050565b600080516020612e4283398151915254610100900460ff166117d057600080516020612e428339815191525460ff16156117d4565b303b155b6118465760405162461bcd60e51b815260206004820152603760248201527f455243373231415f5f496e697469616c697a61626c653a20636f6e747261637460448201527f20697320616c726561647920696e697469616c697a65640000000000000000006064820152608401610b18565b600080516020612e4283398151915254610100900460ff1615801561188257600080516020612e42833981519152805461ffff19166101011790555b600054610100900460ff16158080156118a25750600054600160ff909116105b806118bc5750303b1580156118bc575060005460ff166001145b61191f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610b18565b6000805460ff191660011790558015611942576000805461ff0019166101001790555b61194c878761208e565b6119546120cc565b84516119679060679060208801906123e5565b50606580546001600160a01b038087166001600160a01b0319928316179092556066805492861692909116919091179055606c80546307d00bb863ffffffff1990911617905580156119f3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b508015610ab8575050600080516020612e42833981519152805461ff001916905550505050565b6000611a24611c8c565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b611a5f611e86565b6001600160a01b038116611ac45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b18565b610db481611ee0565b611ad5611e86565b60008251118015611ae7575080518251145b611b265760405162461bcd60e51b815260206004820152601060248201526f098cadccee8d040dcdee840dac2e8c6d60831b6044820152606401610b18565b6000805b8351811015611bac57611b73848281518110611b4857611b48612c53565b6020026020010151848381518110611b6257611b62612c53565b602002602001015161ffff16611e6c565b828181518110611b8557611b85612c53565b602002602001015182611b989190612c9c565b915080611ba481612cc2565b915050611b2a565b50612710611bb86120fb565b1115611bd65760405162461bcd60e51b8152600401610b1890612c2e565b831561171157606c8054829190600090611bf590849061ffff16612cff565b92506101000a81548161ffff021916908361ffff16021790555050505050565b611c1d611e86565b6066805460ff909216600160a01b0260ff60a01b19909216919091179055565b60006101f4611c4a6120fb565b611c549190612c9c565b61ffff1661271010611c86576101f4611c6b6120fb565b611c7790612710612cff565b611c819190612cff565b905090565b50600090565b7f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c4090565b6000611cba611c8c565b54821080156107b35750600160e01b611cd1611c8c565b60008481526004919091016020526040902054161592915050565b6000611cf783611418565b90508115611d3657336001600160a01b03821614611d3657611d198133611a1a565b611d36576040516367d9dca160e11b815260040160405180910390fd5b83611d3f611c8c565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b6000611dab611c8c565b600083815260049190910160205260409020549050600160e01b8116611e2b5780611e2657611dd8611c8c565b548210611df857604051636f96cda160e11b815260040160405180910390fd5b611e00611c8c565b6000199092016000818152600493909301602052604090922054905080611e2657611df8565b919050565b604051636f96cda160e11b815260040160405180910390fd5b6000806000611e51611c8c565b60009485526006016020525050604090912080549092909150565b6108ad82826040518060200160405280600081525061210d565b6033546001600160a01b03163314610c5e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b18565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600082611f3f858461218a565b14949350505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611f7d903390899088908890600401612d48565b6020604051808303816000875af1925050508015611fb8575060408051601f3d908101601f19168201909252611fb591810190612d85565b60015b612013573d808015611fe6576040519150601f19603f3d011682016040523d82523d6000602084013e611feb565b606091505b50805161200b576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060606780546107d190612bf3565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806120775761207c565b61205a565b50819003601f19909101908152919050565b600080516020612e4283398151915254610100900460ff166120c25760405162461bcd60e51b8152600401610b1890612da2565b6108ad82826121cf565b600054610100900460ff166120f35760405162461bcd60e51b8152600401610b1890612df6565b610c5e612252565b600080612106611c8c565b5403919050565b6121178383612282565b6001600160a01b0383163b15610e24576000612131611c8c565b5490508281035b61214b6000868380600101945086611f48565b612168576040516368d2bf6b60e11b815260040160405180910390fd5b8181106121385781612178611c8c565b541461218357600080fd5b5050505050565b600081815b84518110156115e5576121bb828683815181106121ae576121ae612c53565b60200260200101516123b6565b9150806121c781612cc2565b91505061218f565b600080516020612e4283398151915254610100900460ff166122035760405162461bcd60e51b8152600401610b1890612da2565b8161220c611c8c565b60020190805190602001906122229291906123e5565b508061222c611c8c565b60030190805190602001906122429291906123e5565b50600061224d611c8c565b555050565b600054610100900460ff166122795760405162461bcd60e51b8152600401610b1890612df6565b610c5e33611ee0565b600061228c611c8c565b549050816122ad5760405163b562e8dd60e01b815260040160405180910390fd5b6801000000000000000182026122c1611c8c565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b17176122fc611c8c565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461238657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460010161234e565b50816123a457604051622e076360e81b815260040160405180910390fd5b806123ad611c8c565b5550610e249050565b60008183106123d25760008281526020849052604090206116c6565b60008381526020839052604090206116c6565b8280546123f190612bf3565b90600052602060002090601f0160209004810192826124135760008555612459565b82601f1061242c57805160ff1916838001178555612459565b82800160010185558215612459579182015b8281111561245957825182559160200191906001019061243e565b50612465929150612469565b5090565b5b80821115612465576000815560010161246a565b6001600160e01b031981168114610db457600080fd5b6000602082840312156124a657600080fd5b81356116c68161247e565b60005b838110156124cc5781810151838201526020016124b4565b838111156117115750506000910152565b600081518084526124f58160208601602086016124b1565b601f01601f19169290920160200192915050565b6020815260006116c660208301846124dd565b60006020828403121561252e57600080fd5b5035919050565b6001600160a01b0381168114610db457600080fd5b6000806040838503121561255d57600080fd5b823561256881612535565b946020939093013593505050565b60008060006060848603121561258b57600080fd5b833561259681612535565b925060208401356125a681612535565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156125f5576125f56125b7565b604052919050565b60006001600160401b03821115612616576126166125b7565b5060051b60200190565b600082601f83011261263157600080fd5b81356020612646612641836125fd565b6125cd565b82815260059290921b8401810191818101908684111561266557600080fd5b8286015b848110156126805780358352918301918301612669565b509695505050505050565b60006020828403121561269d57600080fd5b81356001600160401b038111156126b357600080fd5b61202984828501612620565b60006001600160401b038311156126d8576126d86125b7565b6126eb601f8401601f19166020016125cd565b90508281528383830111156126ff57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261272757600080fd5b6116c6838335602085016126bf565b60006020828403121561274857600080fd5b81356001600160401b0381111561275e57600080fd5b61202984828501612716565b803561ffff81168114611e2657600080fd5b600082601f83011261278d57600080fd5b8135602061279d612641836125fd565b82815260059290921b840181019181810190868411156127bc57600080fd5b8286015b84811015612680576127d18161276a565b83529183019183016127c0565b6000806000606084860312156127f357600080fd5b83356127fe81612535565b925060208401356001600160401b038082111561281a57600080fd5b6128268783880161277c565b9350604086013591508082111561283c57600080fd5b506128498682870161277c565b9150509250925092565b60006020828403121561286557600080fd5b81356116c681612535565b60006020828403121561288257600080fd5b6116c68261276a565b80358015158114611e2657600080fd5b600080604083850312156128ae57600080fd5b82356001600160401b038111156128c457600080fd5b6128d08582860161277c565b9250506128df6020840161288b565b90509250929050565b6020808252825182820181905260009190848201906040850190845b81811015612922578351151583529284019291840191600101612904565b50909695505050505050565b6000806040838503121561294157600080fd5b823561294c81612535565b91506128df6020840161288b565b6000806040838503121561296d57600080fd5b8235915060208301356001600160401b0381111561298a57600080fd5b61299685828601612620565b9150509250929050565b600080600080608085870312156129b657600080fd5b84356129c181612535565b935060208501356129d181612535565b92506040850135915060608501356001600160401b038111156129f357600080fd5b8501601f81018713612a0457600080fd5b612a13878235602084016126bf565b91505092959194509250565b600080600080600060a08688031215612a3757600080fd5b85356001600160401b0380821115612a4e57600080fd5b612a5a89838a01612716565b96506020880135915080821115612a7057600080fd5b612a7c89838a01612716565b95506040880135915080821115612a9257600080fd5b50612a9f88828901612716565b9350506060860135612ab081612535565b91506080860135612ac081612535565b809150509295509295909350565b60008060408385031215612ae157600080fd5b8235612aec81612535565b91506020830135612afc81612535565b809150509250929050565b600080600060608486031215612b1c57600080fd5b612b258461288b565b92506020808501356001600160401b0380821115612b4257600080fd5b818701915087601f830112612b5657600080fd5b8135612b64612641826125fd565b81815260059190911b8301840190848101908a831115612b8357600080fd5b938501935b82851015612baa578435612b9b81612535565b82529385019390850190612b88565b965050506040870135925080831115612bc257600080fd5b50506128498682870161277c565b600060208284031215612be257600080fd5b813560ff811681146116c657600080fd5b600181811c90821680612c0757607f821691505b60208210811415612c2857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600b908201526a139bc81b5bdc994813919560aa1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612c7b57600080fd5b81516116c681612535565b634e487b7160e01b600052601160045260246000fd5b600061ffff808316818516808303821115612cb957612cb9612c86565b01949350505050565b6000600019821415612cd657612cd6612c86565b5060010190565b600061ffff80831681811415612cf557612cf5612c86565b6001019392505050565b600061ffff83811690831681811015612d1a57612d1a612c86565b039392505050565b60008351612d348184602088016124b1565b835190830190612cb98183602088016124b1565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d7b908301846124dd565b9695505050505050565b600060208284031215612d9757600080fd5b81516116c68161247e565b60208082526034908201527f455243373231415f5f496e697469616c697a61626c653a20636f6e7472616374604082015273206973206e6f7420696e697469616c697a696e6760601b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056feee151c8401928dc223602bb187aff91b9a56c7cae5476ef1b3287b085a16c85fa2646970667358221220618b62a85d584983d3561b4ce0e86b58e702f494018d18da367ae7bd77ac194c64736f6c634300080b0033
Deployed Bytecode Sourcemap
88811:6120:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53542:639;;;;;;;;;;-1:-1:-1;53542:639:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;53542:639:0;;;;;;;;54444:124;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;61036:242::-;;;;;;;;;;-1:-1:-1;61036:242:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;61036:242:0;1528:203:1;60753:124:0;;;;;;:::i;:::-;;:::i;:::-;;49929:371;;;;;;;;;;;;;:::i;:::-;;;2338:25:1;;;2326:2;2311:18;49929:371:0;2192:177:1;89522:30:0;;;;;;;;;;-1:-1:-1;89522:30:0;;;;;;;;;;;;;;2548:6:1;2536:19;;;2518:38;;2506:2;2491:18;89522:30:0;2374:188:1;64834:2969:0;;;;;;:::i;:::-;;:::i;92869:461::-;;;:::i;90648:438::-;;;;;;;;;;-1:-1:-1;90648:438:0;;;;;:::i;:::-;;:::i;88924:47::-;;;;;;;;;;;;88967:4;88924:47;;90205:97;;;;;;;;;;-1:-1:-1;90205:97:0;;;;;:::i;:::-;;:::i;93338:142::-;;;;;;;;;;;;;:::i;67899:193::-;;;;;;:::i;:::-;;:::i;91094:1767::-;;;;;;;;;;-1:-1:-1;91094:1767:0;;;;;:::i;:::-;;:::i;88978:47::-;;;;;;;;;;;;89021:4;88978:47;;55885:152;;;;;;;;;;-1:-1:-1;55885:152:0;;;;;:::i;:::-;;:::i;90529:111::-;;;;;;;;;;-1:-1:-1;90529:111:0;;;;;:::i;:::-;;:::i;89561:48::-;;;;;;;;;;-1:-1:-1;89561:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;89032:42;;;;;;;;;;;;89071:3;89032:42;;51209:257;;;;;;;;;;-1:-1:-1;51209:257:0;;;;;:::i;:::-;;:::i;18922:103::-;;;;;;;;;;;;;:::i;89432:46::-;;;;;;;;;;-1:-1:-1;89432:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;94277:444;;;;;;;;;;-1:-1:-1;94277:444:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;89081:49::-;;;;;;;;;;;;89113:17;89081:49;;18274:87;;;;;;;;;;-1:-1:-1;18347:6:0;;-1:-1:-1;;;;;18347:6:0;18274:87;;54644:128;;;;;;;;;;;;;:::i;89485:30::-;;;;;;;;;;-1:-1:-1;89485:30:0;;;;;;;;89216:23;;;;;;;;;;-1:-1:-1;89216:23:0;;;;-1:-1:-1;;;89216:23:0;;;;;;;;;9209:4:1;9197:17;;;9179:36;;9167:2;9152:18;89216:23:0;9037:184:1;61618:258:0;;;;;;;;;;-1:-1:-1;61618:258:0;;;;;:::i;:::-;;:::i;94729:199::-;;;;;;;;;;-1:-1:-1;94729:199:0;;;;;:::i;:::-;;:::i;68690:407::-;;;;;;:::i;:::-;;:::i;54878:318::-;;;;;;;;;;-1:-1:-1;54878:318:0;;;;;:::i;:::-;;:::i;89379:46::-;;;;;;;;;;-1:-1:-1;89379:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;89321:51;;;;;;;;;;-1:-1:-1;89321:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;88876:41;;;;;;;;;;;;88912:5;88876:41;;89788:409;;;;;;;;;;-1:-1:-1;89788:409:0;;;;;:::i;:::-;;:::i;62033:188::-;;;;;;;;;;-1:-1:-1;62033:188:0;;;;;:::i;:::-;;:::i;19180:201::-;;;;;;;;;;-1:-1:-1;19180:201:0;;;;;:::i;:::-;;:::i;93488:536::-;;;;;;;;;;-1:-1:-1;93488:536:0;;;;;:::i;:::-;;:::i;90426:95::-;;;;;;;;;;-1:-1:-1;90426:95:0;;;;;:::i;:::-;;:::i;94032:237::-;;;;;;;;;;;;;:::i;53542:639::-;53627:4;-1:-1:-1;;;;;;;;;53951:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;54028:25:0;;;53951:102;:179;;;-1:-1:-1;;;;;;;;;;54105:25:0;;;53951:179;53931:199;53542:639;-1:-1:-1;;53542:639:0:o;54444:124::-;54498:13;54531:23;:21;:23::i;:::-;:29;;54524:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54444:124;:::o;61036:242::-;61112:7;61137:16;61145:7;61137;:16::i;:::-;61132:64;;61162:34;;-1:-1:-1;;;61162:34:0;;;;;;;;;;;61132:64;61216:23;:21;:23::i;:::-;:48;;;;:39;;:48;;-1:-1:-1;61216:48:0;;;:54;-1:-1:-1;;;;;61216:54:0;;61036:242::o;60753:124::-;60842:27;60851:2;60855:7;60864:4;60842:8;:27::i;:::-;60753:124;;:::o;49929:371::-;49990:7;;50227:23;:21;:23::i;:::-;:36;;;50187:23;:21;:23::i;:::-;:37;:76;:94;;49929:371;-1:-1:-1;49929:371:0:o;64834:2969::-;64976:27;65006;65025:7;65006:18;:27::i;:::-;64976:57;;65091:4;-1:-1:-1;;;;;65050:45:0;65066:19;-1:-1:-1;;;;;65050:45:0;;65046:86;;65104:28;;-1:-1:-1;;;65104:28:0;;;;;;;;;;;65046:86;65146:27;65175:23;65202:35;65229:7;65202:26;:35::i;:::-;65145:92;;;;65337:68;65362:15;65379:4;65385:19;86879:10;;86792:105;65385:19;-1:-1:-1;;;;;63377:32:0;;;63221:28;;63506:20;;63528:30;;63503:56;;62918:659;65337:68;65332:180;;65425:43;65442:4;86879:10;62033:188;:::i;65425:43::-;65420:92;;65477:35;;-1:-1:-1;;;65477:35:0;;;;;;;;;;;65420:92;-1:-1:-1;;;;;65529:16:0;;65525:52;;65554:23;;-1:-1:-1;;;65554:23:0;;;;;;;;;;;65525:52;65726:15;65723:160;;;65866:1;65845:19;65838:30;65723:160;66263:23;:21;:23::i;:::-;-1:-1:-1;;;;;66263:48:0;;;;;;:42;;;;;:48;;;;;66261:50;;-1:-1:-1;;66261:50:0;;;66356:23;:21;:23::i;:::-;-1:-1:-1;;;;;66356:46:0;;;;;;:42;;;;;:46;;;;;;66354:48;;;;;;59855:11;59830:23;59826:41;59813:63;-1:-1:-1;;;59813:63:0;66673:23;:21;:23::i;:::-;:50;;;;:41;;;;;:50;;;;;:199;-1:-1:-1;;;66992:47:0;;66988:699;;67097:1;67087:11;;67220:23;:21;:23::i;:::-;:54;;;;:41;;;;;:54;;;;;;67216:456;;67382:23;:21;:23::i;:::-;:37;67367:52;;67363:290;;67610:19;67553:23;:21;:23::i;:::-;:54;;;;:41;;;;;:54;;;;;:76;67363:290;67046:641;66988:699;67734:7;67730:2;-1:-1:-1;;;;;67715:27:0;67724:4;-1:-1:-1;;;;;67715:27:0;;;;;;;;;;;67753:42;64965:2838;;;64834:2969;;;:::o;92869:461::-;92925:10;;-1:-1:-1;;;92925:10:0;;;;92939:1;92925:15;92917:56;;;;-1:-1:-1;;;92917:56:0;;14331:2:1;92917:56:0;;;14313:21:1;14370:2;14350:18;;;14343:30;14409;14389:18;;;14382:58;14457:18;;92917:56:0;;;;;;;;;92992:9;86879:10;92992:25;92984:68;;;;-1:-1:-1;;;92984:68:0;;14688:2:1;92984:68:0;;;14670:21:1;14727:2;14707:18;;;14700:30;14766:32;14746:18;;;14739:60;14816:18;;92984:68:0;14486:354:1;92984:68:0;93088:1;93071:14;:12;:14::i;:::-;:18;;;93063:42;;;;-1:-1:-1;;;93063:42:0;;;;;;;:::i;:::-;86879:10;93125:30;;;;:16;:30;;;;;;;;93124:31;93116:59;;;;-1:-1:-1;;;93116:59:0;;15387:2:1;93116:59:0;;;15369:21:1;15426:2;15406:18;;;15399:30;-1:-1:-1;;;15445:18:1;;;15438:45;15500:18;;93116:59:0;15185:339:1;93116:59:0;93203:9;89113:17;93194:18;93186:49;;;;-1:-1:-1;;;93186:49:0;;15731:2:1;93186:49:0;;;15713:21:1;15770:2;15750:18;;;15743:30;-1:-1:-1;;;15789:18:1;;;15782:48;15847:18;;93186:49:0;15529:342:1;93186:49:0;86879:10;93248:30;;;;:16;:30;;;;;:37;;-1:-1:-1;;93248:37:0;93281:4;93248:37;;;93296:26;;93306:12;93320:1;93296:9;:26::i;:::-;92869:461::o;90648:438::-;90721:10;;-1:-1:-1;;;90721:10:0;;;;90735:1;90721:15;90713:59;;;;-1:-1:-1;;;90713:59:0;;16078:2:1;90713:59:0;;;16060:21:1;16117:2;16097:18;;;16090:30;16156:33;16136:18;;;16129:61;16207:18;;90713:59:0;15876:355:1;90713:59:0;90808:1;90791:14;:12;:14::i;:::-;:18;;;90783:42;;;;-1:-1:-1;;;90783:42:0;;;;;;;:::i;:::-;90844;90859:19;;90880:5;90844:14;:42::i;:::-;90836:79;;;;-1:-1:-1;;;90836:79:0;;16438:2:1;90836:79:0;;;16420:21:1;16477:2;16457:18;;;16450:30;16516:26;16496:18;;;16489:54;16560:18;;90836:79:0;16236:348:1;90836:79:0;86879:10;90935:33;;;;:19;:33;;;;;;;;90934:34;90926:62;;;;-1:-1:-1;;;90926:62:0;;15387:2:1;90926:62:0;;;15369:21:1;15426:2;15406:18;;;15399:30;-1:-1:-1;;;15445:18:1;;;15438:45;15500:18;;90926:62:0;15185:339:1;90926:62:0;86879:10;91001:33;;;;:19;:33;;;;;:40;;-1:-1:-1;;91001:40:0;91037:4;91001:40;;;91052:26;;91062:12;86792:105;91052:26;90648:438;:::o;90205:97::-;18160:13;:11;:13::i;:::-;90278:16;;::::1;::::0;:7:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;93338:142::-:0;18160:13;:11;:13::i;:::-;93433:39:::1;::::0;93401:21:::1;::::0;86879:10;;93433:39;::::1;;;::::0;93401:21;;93433:39:::1;::::0;;;93401:21;86879:10;93433:39;::::1;;;;;;;;;;;;;::::0;::::1;;;;67899:193:::0;68045:39;68062:4;68068:2;68072:7;68045:39;;;;;;;;;;;;:16;:39::i;:::-;67899:193;;;:::o;91094:1767::-;91214:10;;-1:-1:-1;;;91214:10:0;;;;91228:1;91214:15;91206:56;;;;-1:-1:-1;;;91206:56:0;;16791:2:1;91206:56:0;;;16773:21:1;16830:2;16810:18;;;16803:30;16869;16849:18;;;16842:58;16917:18;;91206:56:0;16589:352:1;91206:56:0;-1:-1:-1;;;;;91281:16:0;;91273:56;;;;-1:-1:-1;;;91273:56:0;;17148:2:1;91273:56:0;;;17130:21:1;17187:2;17167:18;;;17160:30;17226:29;17206:18;;;17199:57;17273:18;;91273:56:0;16946:351:1;91273:56:0;91340:15;91368;91433:6;91428:468;91449:13;:20;91445:1;:24;91428:468;;;91500:15;:33;91516:13;91530:1;91516:16;;;;;;;;:::i;:::-;;;;;;;;;;;;91500:33;;;;;;;;;;;;-1:-1:-1;91500:33:0;;;;91499:34;91491:68;;;;-1:-1:-1;;;91491:68:0;;17636:2:1;91491:68:0;;;17618:21:1;17675:2;17655:18;;;17648:30;-1:-1:-1;;;17694:18:1;;;17687:51;17755:18;;91491:68:0;17434:345:1;91491:68:0;91602:10;;91622:16;;-1:-1:-1;;;;;91582:63:0;;;;91602:10;;91582:39;;91622:13;;91636:1;;91622:16;;;;;;:::i;:::-;;;;;;;91582:57;;;;;;;;;;;;;;2548:6:1;2536:19;;;;2518:38;;2506:2;2491:18;;2374:188;91582:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;91582:63:0;;91574:95;;;;-1:-1:-1;;;91574:95:0;;18436:2:1;91574:95:0;;;18418:21:1;18475:2;18455:18;;;18448:30;-1:-1:-1;;;18494:18:1;;;18487:49;18553:18;;91574:95:0;18234:343:1;91574:95:0;91720:4;91684:15;:33;91700:13;91714:1;91700:16;;;;;;;;:::i;:::-;;;;;;;;;;;;91684:33;;;;;;;;;;;;-1:-1:-1;91684:33:0;:40;;-1:-1:-1;;91684:40:0;;;;;;;;;;91739:13;91751:1;91739:13;;:::i;:::-;91782:16;;91739:13;;-1:-1:-1;91782:16:0;;;;91770:28;;;;91767:118;;91829:16;;;;;-1:-1:-1;91864:5:0;;91767:118;91471:3;;;;:::i;:::-;;;;91428:468;;;;91945:6;91940:465;91961:13;:20;91957:1;:24;91940:465;;;92012:15;:33;92028:13;92042:1;92028:16;;;;;;;;:::i;:::-;;;;;;;;;;;;92012:33;;;;;;;;;;;;-1:-1:-1;92012:33:0;;;;92011:34;92003:68;;;;-1:-1:-1;;;92003:68:0;;19285:2:1;92003:68:0;;;19267:21:1;19324:2;19304:18;;;19297:30;-1:-1:-1;;;19343:18:1;;;19336:51;19404:18;;92003:68:0;19083:345:1;92003:68:0;92114:10;;92134:16;;-1:-1:-1;;;;;92094:63:0;;;;92114:10;;92094:39;;92134:13;;92148:1;;92134:16;;;;;;:::i;:::-;;;;;;;92094:57;;;;;;;;;;;;;;2548:6:1;2536:19;;;;2518:38;;2506:2;2491:18;;2374:188;92094:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;92094:63:0;;92086:95;;;;-1:-1:-1;;;92086:95:0;;18436:2:1;92086:95:0;;;18418:21:1;18475:2;18455:18;;;18448:30;-1:-1:-1;;;18494:18:1;;;18487:49;18553:18;;92086:95:0;18234:343:1;92086:95:0;92232:4;92196:15;:33;92212:13;92226:1;92212:16;;;;;;;;:::i;:::-;;;;;;;;;;;;92196:33;;;;;;;;;;;;-1:-1:-1;92196:33:0;:40;;-1:-1:-1;;92196:40:0;;;;;;;;;;92251:10;;;;:::i;:::-;92291:16;;92251:10;;-1:-1:-1;92291:16:0;;;;;;;92279:28;;;;;-1:-1:-1;92276:118:0;;92338:16;;;;;;;;-1:-1:-1;92373:5:0;;92276:118;91983:3;;;;:::i;:::-;;;;91940:465;;;-1:-1:-1;92438:14:0;92455:19;92466:8;92455;:19;:::i;:::-;92438:36;;92503:1;92493:7;:11;;;92485:54;;;;-1:-1:-1;;;92485:54:0;;19837:2:1;92485:54:0;;;19819:21:1;19876:2;19856:18;;;19849:30;19915:32;19895:18;;;19888:60;19965:18;;92485:54:0;19635:354:1;92485:54:0;92569:2;92558:7;:13;;;;92550:46;;;;-1:-1:-1;;;92550:46:0;;20196:2:1;92550:46:0;;;20178:21:1;20235:2;20215:18;;;20208:30;-1:-1:-1;;;20254:18:1;;;20247:50;20314:18;;92550:46:0;19994:344:1;92550:46:0;92625:33;92635:2;92649:7;92639:18;;92625:9;:33::i;:::-;92705:12;;;;92702:71;;92733:16;:28;;92753:8;;92733:16;;;:28;;92753:8;;92733:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;92702:71;92786:12;;;;92783:71;;92834:8;92814:16;;:28;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;91195:1666;;;91094:1767;;;:::o;55885:152::-;55957:7;56000:27;56019:7;56000:18;:27::i;90529:111::-;18160:13;:11;:13::i;:::-;90606:19:::1;:26:::0;90529:111::o;51209:257::-;51281:7;-1:-1:-1;;;;;51305:19:0;;51301:60;;51333:28;;-1:-1:-1;;;51333:28:0;;;;;;;;;;;51301:60;-1:-1:-1;;;;;51379:23:0;:21;:23::i;:::-;:42;;:49;51422:5;-1:-1:-1;;;;;51379:49:0;-1:-1:-1;;;;;51379:49:0;;;;;;;;;;;;;:79;51372:86;;51209:257;;;:::o;18922:103::-;18160:13;:11;:13::i;:::-;18987:30:::1;19014:1;18987:18;:30::i;94277:444::-:0;94363:13;94389:21;94424:8;:15;-1:-1:-1;;;;;94413:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;94413:27:0;;94389:51;;94456:6;94451:238;94472:8;:15;94468:1;:19;94451:238;;;94513:5;94509:169;;;94552:15;:28;94568:8;94577:1;94568:11;;;;;;;;:::i;:::-;;;;;;;94552:28;;;;;;;;;;;;;;;;;;;;;;;;;94539:7;94547:1;94539:10;;;;;;;;:::i;:::-;:41;;;:10;;;;;;;;;;;:41;94509:169;;;94634:15;:28;94650:8;94659:1;94650:11;;;;;;;;:::i;:::-;;;;;;;94634:28;;;;;;;;;;;;;;;;;;;;;;;;;94621:7;94629:1;94621:10;;;;;;;;:::i;:::-;:41;;;:10;;;;;;;;;;;:41;94509:169;94489:3;;;;:::i;:::-;;;;94451:238;;;-1:-1:-1;94706:7:0;94277:444;-1:-1:-1;;;94277:444:0:o;54644:128::-;54700:13;54733:23;:21;:23::i;:::-;:31;;54726:38;;;;;:::i;61618:258::-;61789:8;61713:23;:21;:23::i;:::-;86879:10;61713:63;;;;:42;;;;;:63;;;;;;;;-1:-1:-1;;;;;61713:73:0;;;;;;;;;;;;:84;;-1:-1:-1;;61713:84:0;;;;;;;;;;;61813:55;;565:14:1;;558:22;540:41;;61713:73:0;;86879:10;;61813:55;;513:18:1;61813:55:0;;;;;;;61618:258;;:::o;94729:199::-;94888:30;;-1:-1:-1;;86879:10:0;20714:2:1;20710:15;20706:53;94888:30:0;;;20694:66:1;94812:4:0;;94835:85;;94865:5;;94872:4;;20776:12:1;;94888:30:0;;;;;;;;;;;;94878:41;;;;;;94835:29;:85::i;:::-;94828:92;94729:199;-1:-1:-1;;;94729:199:0:o;68690:407::-;68865:31;68878:4;68884:2;68888:7;68865:12;:31::i;:::-;-1:-1:-1;;;;;68911:14:0;;;:19;68907:183;;68950:56;68981:4;68987:2;68991:7;69000:5;68950:30;:56::i;:::-;68945:145;;69034:40;;-1:-1:-1;;;69034:40:0;;;;;;;;;;;68945:145;68690:407;;;;:::o;54878:318::-;54951:13;54982:16;54990:7;54982;:16::i;:::-;54977:59;;55007:29;;-1:-1:-1;;;55007:29:0;;;;;;;;;;;54977:59;55049:21;55073:10;:8;:10::i;:::-;55049:34;;55107:7;55101:21;55126:1;55101:26;;:87;;;;;;;;;;;;;;;;;55154:7;55163:18;55173:7;55163:9;:18::i;:::-;55137:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55094:94;54878:318;-1:-1:-1;;;54878:318:0:o;89788:409::-;-1:-1:-1;;;;;;;;;;;32123:52:0;;;;;;:160;;-1:-1:-1;;;;;;;;;;;32232:51:0;;;32231:52;32123:160;;;33734:4;33801:17;33846:7;32195:16;32101:265;;;;-1:-1:-1;;;32101:265:0;;21476:2:1;32101:265:0;;;21458:21:1;21515:2;21495:18;;;21488:30;21554:34;21534:18;;;21527:62;21625:25;21605:18;;;21598:53;21668:19;;32101:265:0;21274:419:1;32101:265:0;-1:-1:-1;;;;;;;;;;;32402:52:0;;;;;;32401:53;32465:179;;;;-1:-1:-1;;;;;;;;;;;32500:59:0;;-1:-1:-1;;32574:58:0;;;;;32465:179;11978:19:::1;12001:13:::0;::::1;::::0;::::1;;;12000:14;::::0;12048:34;::::1;;;-1:-1:-1::0;12066:12:0::1;::::0;12081:1:::1;12066:12;::::0;;::::1;:16;12048:34;12047:108;;;-1:-1:-1::0;12127:4:0::1;1633:19:::0;:23;;;12088:66:::1;;-1:-1:-1::0;12137:12:0::1;::::0;::::1;;::::0;:17:::1;12088:66;12025:204;;;::::0;-1:-1:-1;;;12025:204:0;;21900:2:1;12025:204:0::1;::::0;::::1;21882:21:1::0;21939:2;21919:18;;;21912:30;21978:34;21958:18;;;21951:62;-1:-1:-1;;;22029:18:1;;;22022:44;22083:19;;12025:204:0::1;21698:410:1::0;12025:204:0::1;12240:12;:16:::0;;-1:-1:-1;;12240:16:0::1;12255:1;12240:16;::::0;;12267:67;::::1;;;12302:13;:20:::0;;-1:-1:-1;;12302:20:0::1;;;::::0;;12267:67:::1;89953:28:::2;89968:4;89974:6;89953:14;:28::i;:::-;89992:16;:14;:16::i;:::-;90019:18:::0;;::::2;::::0;:7:::2;::::0;:18:::2;::::0;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;90048:10:0::2;:18:::0;;-1:-1:-1;;;;;90048:18:0;;::::2;-1:-1:-1::0;;;;;;90048:18:0;;::::2;;::::0;;;90077:10:::2;:18:::0;;;;::::2;::::0;;;::::2;::::0;;;::::2;::::0;;90106:16:::2;:36:::0;;90153;-1:-1:-1;;90153:36:0;;;;;;12356:102;::::1;;;12407:5;12391:21:::0;;-1:-1:-1;;12391:21:0::1;::::0;;12432:14:::1;::::0;-1:-1:-1;9179:36:1;;12432:14:0::1;::::0;9167:2:1;9152:18;12432:14:0::1;;;;;;;12356:102;11967:498;32674:14:::0;32670:107;;;-1:-1:-1;;;;;;;;;;;;;32705:60:0;;-1:-1:-1;;32705:60:0;;;-1:-1:-1;;;;89788:409:0:o;62033:188::-;62130:4;62154:23;:21;:23::i;:::-;-1:-1:-1;;;;;62154:49:0;;;;;;;:42;;;;;:49;;;;;;;;:59;;;;;;;;;;-1:-1:-1;62154:59:0;;;;;62033:188::o;19180:201::-;18160:13;:11;:13::i;:::-;-1:-1:-1;;;;;19269:22:0;::::1;19261:73;;;::::0;-1:-1:-1;;;19261:73:0;;22514:2:1;19261:73:0::1;::::0;::::1;22496:21:1::0;22553:2;22533:18;;;22526:30;22592:34;22572:18;;;22565:62;-1:-1:-1;;;22643:18:1;;;22636:36;22689:19;;19261:73:0::1;22312:402:1::0;19261:73:0::1;19345:28;19364:8;19345:18;:28::i;93488:536::-:0;18160:13;:11;:13::i;:::-;93636:1:::1;93618:8;:15;:19;:53;;;;;93660:4;:11;93641:8;:15;:30;93618:53;93610:82;;;::::0;-1:-1:-1;;;93610:82:0;;22921:2:1;93610:82:0::1;::::0;::::1;22903:21:1::0;22960:2;22940:18;;;22933:30;-1:-1:-1;;;22979:18:1;;;22972:46;23035:18;;93610:82:0::1;22719:340:1::0;93610:82:0::1;93703:14;93737:6:::0;93732:134:::1;93753:8;:15;93749:1;:19;93732:134;;;93790:31;93800:8;93809:1;93800:11;;;;;;;;:::i;:::-;;;;;;;93813:4;93818:1;93813:7;;;;;;;;:::i;:::-;;;;;;;93790:31;;:9;:31::i;:::-;93847:4;93852:1;93847:7;;;;;;;;:::i;:::-;;;;;;;93836:18;;;;;:::i;:::-;::::0;-1:-1:-1;93770:3:0;::::1;::::0;::::1;:::i;:::-;;;;93732:134;;;-1:-1:-1::0;88912:5:0::1;93884:14;:12;:14::i;:::-;:28;;93876:52;;;;-1:-1:-1::0;;;93876:52:0::1;;;;;;;:::i;:::-;93942:20;93939:78;;;93978:16;:27:::0;;93998:7;;93978:16;::::1;::::0;:27:::1;::::0;93998:7;;93978:27:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;93599:425;93488:536:::0;;;:::o;90426:95::-;18160:13;:11;:13::i;:::-;90494:10:::1;:19:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;90494:19:0::1;-1:-1:-1::0;;;;90494:19:0;;::::1;::::0;;;::::1;::::0;;90426:95::o;94032:237::-;94077:6;89071:3;94123:14;:12;:14::i;:::-;94114:40;;;;:::i;:::-;94099:56;;88912:5;94099:56;94096:147;;89071:3;94200:14;:12;:14::i;:::-;94178:37;;88912:5;94178:37;:::i;:::-;:53;;;;:::i;:::-;94171:60;;94032:237;:::o;94096:147::-;-1:-1:-1;94260:1:0;;94032:237::o;35749:164::-;35694:46;;35749:164::o;62479:330::-;62544:4;62634:23;:21;:23::i;:::-;:37;62624:47;;62581:201;;;;;-1:-1:-1;;;62709:23:0;:21;:23::i;:::-;:50;;;;:41;;;;;:50;;;;;;:68;:73;62561:221;62479:330;-1:-1:-1;;62479:330:0:o;80028:516::-;80157:13;80173:16;80181:7;80173;:16::i;:::-;80157:32;;80206:13;80202:219;;;86879:10;-1:-1:-1;;;;;80238:28:0;;;80234:187;;80290:44;80307:5;86879:10;62033:188;:::i;80290:44::-;80285:136;;80366:35;;-1:-1:-1;;;80366:35:0;;;;;;;;;;;80285:136;80490:2;80433:23;:21;:23::i;:::-;:48;;;;:39;;;;;:48;;;;;;:59;;-1:-1:-1;;;;;;80433:59:0;-1:-1:-1;;;;;80433:59:0;;;;;;80508:28;80433:48;;80508:28;;;;;;;;;;80433:48;80508:28;80146:398;80028:516;;;:::o;57112:1784::-;57179:14;57262:23;:21;:23::i;:::-;:50;;;;:41;;;;;:50;;;;;;;-1:-1:-1;;;;57362:24:0;;57358:1471;;57501:11;57497:1029;;57552:23;:21;:23::i;:::-;:37;57541:48;;57537:92;;57598:31;;-1:-1:-1;;;57598:31:0;;;;;;;;;;;57537:92;58312:23;:21;:23::i;:::-;-1:-1:-1;;58354:9:0;;;58312:52;;;;:41;;;;;:52;;;;;;;;-1:-1:-1;58422:11:0;58418:25;;58226:281;;58418:25;57112:1784;;;:::o;57358:1471::-;58857:31;;-1:-1:-1;;;58857:31:0;;;;;;;;;;;63690:524;63792:27;63821:23;63862:53;63918:23;:21;:23::i;:::-;:48;;;;:39;;:48;;-1:-1:-1;;63918:48:0;;;;64170:26;;63918:48;;64170:26;;-1:-1:-1;63690:524:0:o;79110:112::-;79187:27;79197:2;79201:8;79187:27;;;;;;;;;;;;:9;:27::i;18439:132::-;18347:6;;-1:-1:-1;;;;;18347:6:0;86879:10;18503:23;18495:68;;;;-1:-1:-1;;;18495:68:0;;23266:2:1;18495:68:0;;;23248:21:1;;;23285:18;;;23278:30;23344:34;23324:18;;;23317:62;23396:18;;18495:68:0;23064:356:1;19541:191:0;19634:6;;;-1:-1:-1;;;;;19651:17:0;;;-1:-1:-1;;;;;;19651:17:0;;;;;;;19684:40;;19634:6;;;19651:17;19634:6;;19684:40;;19615:16;;19684:40;19604:128;19541:191;:::o;21301:190::-;21426:4;21479;21450:25;21463:5;21470:4;21450:12;:25::i;:::-;:33;;21301:190;-1:-1:-1;;;;21301:190:0:o;71181:736::-;71378:99;;-1:-1:-1;;;71378:99:0;;71344:4;;-1:-1:-1;;;;;71378:56:0;;;;;:99;;86879:10;;71456:4;;71462:7;;71471:5;;71378:99;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71378:99:0;;;;;;;;-1:-1:-1;;71378:99:0;;;;;;;;;;;;:::i;:::-;;;71361:549;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71668:13:0;;71664:235;;71714:40;;-1:-1:-1;;;71714:40:0;;;;;;;;;;;71664:235;71857:6;71851:13;71842:6;71838:2;71834:15;71827:38;71361:549;-1:-1:-1;;;;;;71533:75:0;-1:-1:-1;;;71533:75:0;;-1:-1:-1;71361:549:0;71181:736;;;;;;:::o;90310:108::-;90370:13;90403:7;90396:14;;;;;:::i;86999:1745::-;87064:17;87498:4;87491;87485:11;87481:22;87590:1;87584:4;87577:15;87665:4;87662:1;87658:12;87651:19;;;87747:1;87742:3;87735:14;87851:3;88090:5;88072:428;88138:1;88133:3;88129:11;88122:18;;88309:2;88303:4;88299:13;88295:2;88291:22;88286:3;88278:36;88403:2;88393:13;;;88460:25;;88478:5;;88460:25;88072:428;;;-1:-1:-1;88530:13:0;;;-1:-1:-1;;88645:14:0;;;88707:19;;;88645:14;86999:1745;-1:-1:-1;86999:1745:0:o;48632:160::-;-1:-1:-1;;;;;;;;;;;33047:52:0;;;;;;33025:154;;;;-1:-1:-1;;;33025:154:0;;;;;;;:::i;:::-;48744:40:::1;48769:5;48776:7;48744:24;:40::i;17817:97::-:0;14121:13;;;;;;;14113:69;;;;-1:-1:-1;;;14113:69:0;;;;;;;:::i;:::-;17880:26:::1;:24;:26::i;50398:320::-:0;50453:7;;50644:23;:21;:23::i;:::-;:37;:55;;50398:320;-1:-1:-1;50398:320:0:o;78289:737::-;78420:19;78426:2;78430:8;78420:5;:19::i;:::-;-1:-1:-1;;;;;78481:14:0;;;:19;78477:531;;78521:11;78535:23;:21;:23::i;:::-;:37;;-1:-1:-1;78607:14:0;;;78640:233;78671:62;78710:1;78714:2;78718:7;;;;;;78727:5;78671:30;:62::i;:::-;78666:167;;78769:40;;-1:-1:-1;;;78769:40:0;;;;;;;;;;;78666:167;78868:3;78860:5;:11;78640:233;;78979:3;78938:23;:21;:23::i;:::-;:37;:44;78934:58;;78984:8;;;78934:58;78502:506;;78289:737;;;:::o;22168:296::-;22251:7;22294:4;22251:7;22309:118;22333:5;:12;22329:1;:16;22309:118;;;22382:33;22392:12;22406:5;22412:1;22406:8;;;;;;;;:::i;:::-;;;;;;;22382:9;:33::i;:::-;22367:48;-1:-1:-1;22347:3:0;;;;:::i;:::-;;;;22309:118;;48800:285;-1:-1:-1;;;;;;;;;;;33047:52:0;;;;;;33025:154;;;;-1:-1:-1;;;33025:154:0;;;;;;;:::i;:::-;48954:5:::1;48922:23;:21;:23::i;:::-;:29;;:37;;;;;;;;;;;;:::i;:::-;;49004:7;48970:23;:21;:23::i;:::-;:31;;:41;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;49477:7:0;49022:23:::1;:21;:23::i;:::-;:55:::0;-1:-1:-1;;48800:285:0:o;17922:113::-;14121:13;;;;;;;14113:69;;;;-1:-1:-1;;;14113:69:0;;;;;;;:::i;:::-;17995:32:::1;86879:10:::0;17995:18:::1;:32::i;72379:3062::-:0;72452:20;72475:23;:21;:23::i;:::-;:37;;-1:-1:-1;72527:13:0;72523:44;;72549:18;;-1:-1:-1;;;72549:18:0;;;;;;;;;;;72523:44;73117:32;73105:45;;73055:23;:21;:23::i;:::-;-1:-1:-1;;;;;73055:46:0;;;;;;:42;;;;;:46;;;;;;:95;;;;;;;;;59855:11;59830:23;59826:41;-1:-1:-1;60286:15:0;;60260:24;60256:46;59823:52;59813:63;73393:23;:21;:23::i;:::-;:55;;;;:41;;;;;:55;;;;;:197;;;;-1:-1:-1;;;;;74180:25:0;;;73652:23;;;;73435:12;;74180:25;;74417;73393:55;;74270:335;74931:1;74917:12;74913:20;74871:346;74972:3;74963:7;74960:16;74871:346;;75190:7;75180:8;75177:1;75150:25;75147:1;75144;75139:59;75025:1;75012:15;74871:346;;;-1:-1:-1;75250:13:0;75246:45;;75272:19;;-1:-1:-1;;;75272:19:0;;;;;;;;;;;75246:45;75348:3;75308:23;:21;:23::i;:::-;:43;-1:-1:-1;75373:60:0;;-1:-1:-1;68690:407:0;29208:149;29271:7;29302:1;29298;:5;:51;;29433:13;29527:15;;;29563:4;29556:15;;;29610:4;29594:21;;29298:51;;;29433:13;29527:15;;;29563:4;29556:15;;;29610:4;29594:21;;29306:20;29365:268;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::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:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:131::-;-1:-1:-1;;;;;1811:31:1;;1801:42;;1791:70;;1857:1;1854;1847:12;1872:315;1940:6;1948;2001:2;1989:9;1980:7;1976:23;1972:32;1969:52;;;2017:1;2014;2007:12;1969:52;2056:9;2043:23;2075:31;2100:5;2075:31;:::i;:::-;2125:5;2177:2;2162:18;;;;2149:32;;-1:-1:-1;;;1872:315:1:o;2567:456::-;2644:6;2652;2660;2713:2;2701:9;2692:7;2688:23;2684:32;2681:52;;;2729:1;2726;2719:12;2681:52;2768:9;2755:23;2787:31;2812:5;2787:31;:::i;:::-;2837:5;-1:-1:-1;2894:2:1;2879:18;;2866:32;2907:33;2866:32;2907:33;:::i;:::-;2567:456;;2959:7;;-1:-1:-1;;;3013:2:1;2998:18;;;;2985:32;;2567:456::o;3028:127::-;3089:10;3084:3;3080:20;3077:1;3070:31;3120:4;3117:1;3110:15;3144:4;3141:1;3134:15;3160:275;3231:2;3225:9;3296:2;3277:13;;-1:-1:-1;;3273:27:1;3261:40;;-1:-1:-1;;;;;3316:34:1;;3352:22;;;3313:62;3310:88;;;3378:18;;:::i;:::-;3414:2;3407:22;3160:275;;-1:-1:-1;3160:275:1:o;3440:183::-;3500:4;-1:-1:-1;;;;;3525:6:1;3522:30;3519:56;;;3555:18;;:::i;:::-;-1:-1:-1;3600:1:1;3596:14;3612:4;3592:25;;3440:183::o;3628:662::-;3682:5;3735:3;3728:4;3720:6;3716:17;3712:27;3702:55;;3753:1;3750;3743:12;3702:55;3789:6;3776:20;3815:4;3839:60;3855:43;3895:2;3855:43;:::i;:::-;3839:60;:::i;:::-;3933:15;;;4019:1;4015:10;;;;4003:23;;3999:32;;;3964:12;;;;4043:15;;;4040:35;;;4071:1;4068;4061:12;4040:35;4107:2;4099:6;4095:15;4119:142;4135:6;4130:3;4127:15;4119:142;;;4201:17;;4189:30;;4239:12;;;;4152;;4119:142;;;-1:-1:-1;4279:5:1;3628:662;-1:-1:-1;;;;;;3628:662:1:o;4295:348::-;4379:6;4432:2;4420:9;4411:7;4407:23;4403:32;4400:52;;;4448:1;4445;4438:12;4400:52;4488:9;4475:23;-1:-1:-1;;;;;4513:6:1;4510:30;4507:50;;;4553:1;4550;4543:12;4507:50;4576:61;4629:7;4620:6;4609:9;4605:22;4576:61;:::i;4648:407::-;4713:5;-1:-1:-1;;;;;4739:6:1;4736:30;4733:56;;;4769:18;;:::i;:::-;4807:57;4852:2;4831:15;;-1:-1:-1;;4827:29:1;4858:4;4823:40;4807:57;:::i;:::-;4798:66;;4887:6;4880:5;4873:21;4927:3;4918:6;4913:3;4909:16;4906:25;4903:45;;;4944:1;4941;4934:12;4903:45;4993:6;4988:3;4981:4;4974:5;4970:16;4957:43;5047:1;5040:4;5031:6;5024:5;5020:18;5016:29;5009:40;4648:407;;;;;:::o;5060:222::-;5103:5;5156:3;5149:4;5141:6;5137:17;5133:27;5123:55;;5174:1;5171;5164:12;5123:55;5196:80;5272:3;5263:6;5250:20;5243:4;5235:6;5231:17;5196:80;:::i;5287:322::-;5356:6;5409:2;5397:9;5388:7;5384:23;5380:32;5377:52;;;5425:1;5422;5415:12;5377:52;5465:9;5452:23;-1:-1:-1;;;;;5490:6:1;5487:30;5484:50;;;5530:1;5527;5520:12;5484:50;5553;5595:7;5586:6;5575:9;5571:22;5553:50;:::i;5614:159::-;5681:20;;5741:6;5730:18;;5720:29;;5710:57;;5763:1;5760;5753:12;5778:666;5831:5;5884:3;5877:4;5869:6;5865:17;5861:27;5851:55;;5902:1;5899;5892:12;5851:55;5938:6;5925:20;5964:4;5988:60;6004:43;6044:2;6004:43;:::i;5988:60::-;6082:15;;;6168:1;6164:10;;;;6152:23;;6148:32;;;6113:12;;;;6192:15;;;6189:35;;;6220:1;6217;6210:12;6189:35;6256:2;6248:6;6244:15;6268:147;6284:6;6279:3;6276:15;6268:147;;;6350:22;6368:3;6350:22;:::i;:::-;6338:35;;6393:12;;;;6301;;6268:147;;6449:726;6574:6;6582;6590;6643:2;6631:9;6622:7;6618:23;6614:32;6611:52;;;6659:1;6656;6649:12;6611:52;6698:9;6685:23;6717:31;6742:5;6717:31;:::i;:::-;6767:5;-1:-1:-1;6823:2:1;6808:18;;6795:32;-1:-1:-1;;;;;6876:14:1;;;6873:34;;;6903:1;6900;6893:12;6873:34;6926:60;6978:7;6969:6;6958:9;6954:22;6926:60;:::i;:::-;6916:70;;7039:2;7028:9;7024:18;7011:32;6995:48;;7068:2;7058:8;7055:16;7052:36;;;7084:1;7081;7074:12;7052:36;;7107:62;7161:7;7150:8;7139:9;7135:24;7107:62;:::i;:::-;7097:72;;;6449:726;;;;;:::o;7365:247::-;7424:6;7477:2;7465:9;7456:7;7452:23;7448:32;7445:52;;;7493:1;7490;7483:12;7445:52;7532:9;7519:23;7551:31;7576:5;7551:31;:::i;7617:184::-;7675:6;7728:2;7716:9;7707:7;7703:23;7699:32;7696:52;;;7744:1;7741;7734:12;7696:52;7767:28;7785:9;7767:28;:::i;7806:160::-;7871:20;;7927:13;;7920:21;7910:32;;7900:60;;7956:1;7953;7946:12;7971:414;8060:6;8068;8121:2;8109:9;8100:7;8096:23;8092:32;8089:52;;;8137:1;8134;8127:12;8089:52;8177:9;8164:23;-1:-1:-1;;;;;8202:6:1;8199:30;8196:50;;;8242:1;8239;8232:12;8196:50;8265:60;8317:7;8308:6;8297:9;8293:22;8265:60;:::i;:::-;8255:70;;;8344:35;8375:2;8364:9;8360:18;8344:35;:::i;:::-;8334:45;;7971:414;;;;;:::o;8390:642::-;8555:2;8607:21;;;8677:13;;8580:18;;;8699:22;;;8526:4;;8555:2;8778:15;;;;8752:2;8737:18;;;8526:4;8821:185;8835:6;8832:1;8829:13;8821:185;;;8910:13;;8903:21;8896:29;8884:42;;8981:15;;;;8946:12;;;;8857:1;8850:9;8821:185;;;-1:-1:-1;9023:3:1;;8390:642;-1:-1:-1;;;;;;8390:642:1:o;9226:315::-;9291:6;9299;9352:2;9340:9;9331:7;9327:23;9323:32;9320:52;;;9368:1;9365;9358:12;9320:52;9407:9;9394:23;9426:31;9451:5;9426:31;:::i;:::-;9476:5;-1:-1:-1;9500:35:1;9531:2;9516:18;;9500:35;:::i;9546:416::-;9639:6;9647;9700:2;9688:9;9679:7;9675:23;9671:32;9668:52;;;9716:1;9713;9706:12;9668:52;9752:9;9739:23;9729:33;;9813:2;9802:9;9798:18;9785:32;-1:-1:-1;;;;;9832:6:1;9829:30;9826:50;;;9872:1;9869;9862:12;9826:50;9895:61;9948:7;9939:6;9928:9;9924:22;9895:61;:::i;:::-;9885:71;;;9546:416;;;;;:::o;9967:795::-;10062:6;10070;10078;10086;10139:3;10127:9;10118:7;10114:23;10110:33;10107:53;;;10156:1;10153;10146:12;10107:53;10195:9;10182:23;10214:31;10239:5;10214:31;:::i;:::-;10264:5;-1:-1:-1;10321:2:1;10306:18;;10293:32;10334:33;10293:32;10334:33;:::i;:::-;10386:7;-1:-1:-1;10440:2:1;10425:18;;10412:32;;-1:-1:-1;10495:2:1;10480:18;;10467:32;-1:-1:-1;;;;;10511:30:1;;10508:50;;;10554:1;10551;10544:12;10508:50;10577:22;;10630:4;10622:13;;10618:27;-1:-1:-1;10608:55:1;;10659:1;10656;10649:12;10608:55;10682:74;10748:7;10743:2;10730:16;10725:2;10721;10717:11;10682:74;:::i;:::-;10672:84;;;9967:795;;;;;;;:::o;10767:1021::-;10892:6;10900;10908;10916;10924;10977:3;10965:9;10956:7;10952:23;10948:33;10945:53;;;10994:1;10991;10984:12;10945:53;11034:9;11021:23;-1:-1:-1;;;;;11104:2:1;11096:6;11093:14;11090:34;;;11120:1;11117;11110:12;11090:34;11143:50;11185:7;11176:6;11165:9;11161:22;11143:50;:::i;:::-;11133:60;;11246:2;11235:9;11231:18;11218:32;11202:48;;11275:2;11265:8;11262:16;11259:36;;;11291:1;11288;11281:12;11259:36;11314:52;11358:7;11347:8;11336:9;11332:24;11314:52;:::i;:::-;11304:62;;11419:2;11408:9;11404:18;11391:32;11375:48;;11448:2;11438:8;11435:16;11432:36;;;11464:1;11461;11454:12;11432:36;;11487:52;11531:7;11520:8;11509:9;11505:24;11487:52;:::i;:::-;11477:62;;;11589:2;11578:9;11574:18;11561:32;11602:31;11627:5;11602:31;:::i;:::-;11652:5;-1:-1:-1;11709:3:1;11694:19;;11681:33;11723;11681;11723;:::i;:::-;11775:7;11765:17;;;10767:1021;;;;;;;;:::o;11793:388::-;11861:6;11869;11922:2;11910:9;11901:7;11897:23;11893:32;11890:52;;;11938:1;11935;11928:12;11890:52;11977:9;11964:23;11996:31;12021:5;11996:31;:::i;:::-;12046:5;-1:-1:-1;12103:2:1;12088:18;;12075:32;12116:33;12075:32;12116:33;:::i;:::-;12168:7;12158:17;;;11793:388;;;;;:::o;12186:1279::-;12309:6;12317;12325;12378:2;12366:9;12357:7;12353:23;12349:32;12346:52;;;12394:1;12391;12384:12;12346:52;12417:26;12433:9;12417:26;:::i;:::-;12407:36;;12462:2;12515;12504:9;12500:18;12487:32;-1:-1:-1;;;;;12579:2:1;12571:6;12568:14;12565:34;;;12595:1;12592;12585:12;12565:34;12633:6;12622:9;12618:22;12608:32;;12678:7;12671:4;12667:2;12663:13;12659:27;12649:55;;12700:1;12697;12690:12;12649:55;12736:2;12723:16;12759:60;12775:43;12815:2;12775:43;:::i;12759:60::-;12853:15;;;12935:1;12931:10;;;;12923:19;;12919:28;;;12884:12;;;;12959:19;;;12956:39;;;12991:1;12988;12981:12;12956:39;13015:11;;;;13035:217;13051:6;13046:3;13043:15;13035:217;;;13131:3;13118:17;13148:31;13173:5;13148:31;:::i;:::-;13192:18;;13068:12;;;;13230;;;;13035:217;;;13271:5;-1:-1:-1;;;13329:2:1;13314:18;;13301:32;;-1:-1:-1;13345:16:1;;;13342:36;;;13374:1;13371;13364:12;13342:36;;;13397:62;13451:7;13440:8;13429:9;13425:24;13397:62;:::i;13470:269::-;13527:6;13580:2;13568:9;13559:7;13555:23;13551:32;13548:52;;;13596:1;13593;13586:12;13548:52;13635:9;13622:23;13685:4;13678:5;13674:16;13667:5;13664:27;13654:55;;13705:1;13702;13695:12;13744:380;13823:1;13819:12;;;;13866;;;13887:61;;13941:4;13933:6;13929:17;13919:27;;13887:61;13994:2;13986:6;13983:14;13963:18;13960:38;13957:161;;;14040:10;14035:3;14031:20;14028:1;14021:31;14075:4;14072:1;14065:15;14103:4;14100:1;14093:15;13957:161;;13744:380;;;:::o;14845:335::-;15047:2;15029:21;;;15086:2;15066:18;;;15059:30;-1:-1:-1;;;15120:2:1;15105:18;;15098:41;15171:2;15156:18;;14845:335::o;17302:127::-;17363:10;17358:3;17354:20;17351:1;17344:31;17394:4;17391:1;17384:15;17418:4;17415:1;17408:15;17978:251;18048:6;18101:2;18089:9;18080:7;18076:23;18072:32;18069:52;;;18117:1;18114;18107:12;18069:52;18149:9;18143:16;18168:31;18193:5;18168:31;:::i;18582:127::-;18643:10;18638:3;18634:20;18631:1;18624:31;18674:4;18671:1;18664:15;18698:4;18695:1;18688:15;18714:224;18753:3;18781:6;18814:2;18811:1;18807:10;18844:2;18841:1;18837:10;18875:3;18871:2;18867:12;18862:3;18859:21;18856:47;;;18883:18;;:::i;:::-;18919:13;;18714:224;-1:-1:-1;;;;18714:224:1:o;18943:135::-;18982:3;-1:-1:-1;;19003:17:1;;19000:43;;;19023:18;;:::i;:::-;-1:-1:-1;19070:1:1;19059:13;;18943:135::o;19433:197::-;19471:3;19499:6;19540:2;19533:5;19529:14;19567:2;19558:7;19555:15;19552:41;;;19573:18;;:::i;:::-;19622:1;19609:15;;19433:197;-1:-1:-1;;;19433:197:1:o;20343:217::-;20382:4;20411:6;20467:10;;;;20437;;20489:12;;;20486:38;;;20504:18;;:::i;:::-;20541:13;;20343:217;-1:-1:-1;;;20343:217:1:o;20799:470::-;20978:3;21016:6;21010:13;21032:53;21078:6;21073:3;21066:4;21058:6;21054:17;21032:53;:::i;:::-;21148:13;;21107:16;;;;21170:57;21148:13;21107:16;21204:4;21192:17;;21170:57;:::i;23425:489::-;-1:-1:-1;;;;;23694:15:1;;;23676:34;;23746:15;;23741:2;23726:18;;23719:43;23793:2;23778:18;;23771:34;;;23841:3;23836:2;23821:18;;23814:31;;;23619:4;;23862:46;;23888:19;;23880:6;23862:46;:::i;:::-;23854:54;23425:489;-1:-1:-1;;;;;;23425:489:1:o;23919:249::-;23988:6;24041:2;24029:9;24020:7;24016:23;24012:32;24009:52;;;24057:1;24054;24047:12;24009:52;24089:9;24083:16;24108:30;24132:5;24108:30;:::i;24173:416::-;24375:2;24357:21;;;24414:2;24394:18;;;24387:30;24453:34;24448:2;24433:18;;24426:62;-1:-1:-1;;;24519:2:1;24504:18;;24497:50;24579:3;24564:19;;24173:416::o;24594:407::-;24796:2;24778:21;;;24835:2;24815:18;;;24808:30;24874:34;24869:2;24854:18;;24847:62;-1:-1:-1;;;24940:2:1;24925:18;;24918:41;24991:3;24976:19;;24594:407::o
Swarm Source
ipfs://618b62a85d584983d3561b4ce0e86b58e702f494018d18da367ae7bd77ac194c
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.