Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
NFTArtGenCreatorImpl
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-24 */ // Sources flattened with hardhat v2.8.0 https://hardhat.org // File @openzeppelin/contracts-upgradeable/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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 functionCall(target, data, "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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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 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 v4.4.1 (proxy/utils/Initializable.sol) pragma solidity ^0.8.0; /** * @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 a proxied contract can't have 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. * * [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 initialize the implementation contract, you can either invoke the * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() initializer {} * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { // 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(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _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 onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } } // 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 { __Context_init_unchained(); } 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; } uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] // OpenZeppelin Contracts v4.4.1 (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 { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { 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); } uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/cryptography/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @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 Returns the rebuilt hash obtained by traversing a Merklee 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++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash; } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/interfaces/[email protected] // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; // File @openzeppelin/contracts/interfaces/[email protected] // OpenZeppelin Contracts v4.4.1 (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard */ interface IERC2981 is IERC165 { /** * @dev Called with the sale price to determine how much royalty is owed and to whom. * @param tokenId - the NFT asset queried for royalty information * @param salePrice - the sale price of the NFT asset specified by `tokenId` * @return receiver - address of who should be sent the royalty payment * @return royaltyAmount - the royalty payment amount for `salePrice` */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, 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 ) external; /** * @dev Transfers `tokenId` token 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; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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 functionCall(target, data, "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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/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 Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165Upgradeable { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts-upgradeable/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @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 ) external; /** * @dev Transfers `tokenId` token 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; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @openzeppelin/contracts-upgradeable/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721ReceiverUpgradeable { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts-upgradeable/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721MetadataUpgradeable is IERC721Upgradeable { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts-upgradeable/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721EnumerableUpgradeable is IERC721Upgradeable { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing { __ERC165_init_unchained(); } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } uint256[50] private __gap; } // File contracts/utils/ERC721AUpgradeable.sol // Creators: locationtba.eth, 2pmflow.eth // Made upgradeable by: mrmcgoats.eth for Xenum Technology (xenum.io) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Does not support burning tokens to address(0). */ contract ERC721AUpgradeable is ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable, IERC721EnumerableUpgradeable { using AddressUpgradeable for address; using StringsUpgradeable for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 internal nextMintIndex; // Token name string private _name; // Token symbol string private _symbol; // Burn Address address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; function __ERC721A_init(string memory name_, string memory symbol_) public virtual onlyInitializing { _name = name_; _symbol = symbol_; nextMintIndex = 1; __ERC165_init_unchained(); __Context_init_unchained(); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public virtual view override returns (uint256) { return nextMintIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), 'ERC721AUpgradeable: global index out of bounds'); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), 'ERC721AUpgradeable: owner index out of bounds'); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } revert('ERC721AUpgradeable: unable to get token of owner by index'); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC721Upgradeable).interfaceId || interfaceId == type(IERC721MetadataUpgradeable).interfaceId || interfaceId == type(IERC721EnumerableUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), 'ERC721AUpgradeable: balance query for the zero address'); return uint256(_addressData[owner].balance); } function _numberMinted(address _owner) internal view returns (uint256) { require(_owner != address(0), 'ERC721AUpgradeable: number minted query for the zero address'); return uint256(_addressData[_owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), 'ERC721AUpgradeable: owner query for nonexistent token'); unchecked { for (uint256 curr = tokenId; curr >= 0; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } revert('ERC721AUpgradeable: unable to determine the owner of token'); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token'); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721AUpgradeable.ownerOf(tokenId); require(to != owner, 'ERC721AUpgradeable: approval to current owner'); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), 'ERC721AUpgradeable: approve caller is not owner nor approved for all' ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), 'ERC721AUpgradeable: approved query for nonexistent token'); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), 'ERC721AUpgradeable: approve to caller'); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), 'ERC721AUpgradeable: transfer to non ERC721Receiver implementer' ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { require(tokenId > 0, "ERC721Metadata: nonexistent token"); return tokenId < nextMintIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @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. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = nextMintIndex; require(to != address(0), 'ERC721AUpgradeable: mint to the zero address'); require(quantity != 0, 'ERC721AUpgradeable: quantity must be greater than 0'); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1 // updatedIndex overflows if nextMintIndex + quantity > 1.56e77 (2**256) - 1 unchecked { _addressData[to].balance += uint128(quantity); _addressData[to].numberMinted += uint128(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if (safe) { require( _checkOnERC721Received(address(0), to, updatedIndex, _data), 'ERC721AUpgradeable: transfer to non ERC721Receiver implementer' ); } updatedIndex++; } nextMintIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require(isApprovedOrOwner, 'ERC721AUpgradeable: transfer caller is not owner nor approved'); require(prevOwnership.addr == from, 'ERC721AUpgradeable: transfer from incorrect owner'); require(to != address(0), 'ERC721AUpgradeable: transfer to the zero address'); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // 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 { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == IERC721ReceiverUpgradeable(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert('ERC721AUpgradeable: transfer to non ERC721Receiver implementer'); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * 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`. */ 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. * * 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` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File contracts/NFTArtGenUpgradeable.sol pragma solidity ^0.8.4; // // Built by https://nft-generator.art // contract NFTArtGenUpgradeable is Initializable, IERC2981, ERC721AUpgradeable, OwnableUpgradeable { using AddressUpgradeable for address; using StringsUpgradeable for uint256; uint256 public cost; uint32 public maxPerMint; uint32 public maxPerWallet; bool public open; bool public revealed; bool public presaleOpen; bool public referralOpen; uint256 public referralCap; address public reqToken; uint256 internal maxSupply; string internal baseUri; address internal recipient; uint256 internal recipientFee; string internal uriNotRevealed; bytes32 private merkleRoot; mapping(address => uint256) private referralMap; uint256 private _commission; address private constant _NFTGen = 0x460Fd5059E7301680fA53E63bbBF7272E643e89C; function __NFTArtGen_init( string memory _name, string memory _symbol, uint256 _maxSupply ) internal onlyInitializing { __ERC721A_init(_name, _symbol); __Ownable_init(); maxSupply = _maxSupply; _commission = 49; revealed = false; } // ------ Dev Only ------ function setCommission(uint256 _val1) public { require(msg.sender == _NFTGen, "Invalid address"); _commission = _val1; } // ------ Owner Only ------ function updateSale( bool _open, uint256 _cost, uint32 _maxW, uint32 _maxM ) public onlyOwner { open = _open; cost = _cost; maxPerWallet = _maxW; maxPerMint = _maxM; } function updateReqToken(address _address) public onlyOwner { reqToken = _address; } function updatePresale(bool _open, bytes32 root) public onlyOwner { presaleOpen = _open; merkleRoot = root; } function updateReveal(bool _revealed, string memory _uri) public onlyOwner { revealed = _revealed; if (_revealed == false) { uriNotRevealed = _uri; } if (_revealed == true) { bytes memory b1 = bytes(baseUri); if (b1.length == 0) { baseUri = _uri; } } } function updateReferral(bool _open, uint256 _val) public onlyOwner { referralOpen = _open; referralCap = _val; } function updateRoyalties(address _recipient, uint256 _fee) public onlyOwner { recipient = _recipient; recipientFee = _fee; } function withdraw() public payable { uint256 balance = address(this).balance; require(balance > 0, "Zero balance"); uint256 commission = ((_commission * balance) / 1000); AddressUpgradeable.sendValue(payable(_NFTGen), commission); AddressUpgradeable.sendValue(payable(owner()), balance - commission); } // ------ Mint! ------ function airdrop(address[] memory _recipients, uint256[] memory _amount) public onlyOwner { require(_recipients.length == _amount.length); for (uint256 i = 0; i < _amount.length; i++) { require(supply() + _amount[i] <= totalSupply(), "reached max supply"); _safeMint(_recipients[i], _amount[i]); } } function mint(uint256 count) external payable preMintChecks(count) { require(open == true, "Mint not open"); _safeMint(msg.sender, count); } function mintAll() external payable onlyOwner { if (msg.value > 0) { AddressUpgradeable.sendValue(payable(_NFTGen), msg.value); } _safeMint(owner(), totalSupply() - supply()); } function presaleMint(uint32 count, bytes32[] calldata proof) external payable preMintChecks(count) { require(presaleOpen, "Presale not open"); require(merkleRoot != "", "Presale not ready"); require( MerkleProof.verify( proof, merkleRoot, keccak256(abi.encodePacked(msg.sender)) ), "Not a presale member" ); _safeMint(msg.sender, count); } function referralMint(uint32 count, address referrer) external payable preMintChecks(count) { require(referralOpen == true, "Referrals not open"); require(open == true, "Mint not open"); require(referralCap > 0, "Cap is set to zero"); require(_numberMinted(referrer) > 0, "Referrer has not minted"); require(msg.sender != referrer, "Cannot refer yourself"); _safeMint(msg.sender, count); referralMap[referrer] += 1; if (referralMap[referrer] % referralCap == 0) { if (supply() < totalSupply()) { _safeMint(referrer, 1); } } } // ------ Read ------ function supply() public view returns (uint256) { return nextMintIndex - 1; } function totalSupply() public view override returns (uint256) { return maxSupply; } function supportsInterface(bytes4 interfaceId) public view override(ERC721AUpgradeable, IERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view override returns (address receiver, uint256 royaltyAmount) { return (recipient, (_salePrice * recipientFee) / 1000); } function affiliatesOf(address owner) public view virtual returns (uint256) { return referralMap[owner]; } function tokenURI(uint256 _tokenId) public view override returns (string memory) { require(_exists(_tokenId), "Does not exist"); if (revealed == false) { return string( abi.encodePacked( uriNotRevealed, StringsUpgradeable.toString(_tokenId), ".json" ) ); } return string( abi.encodePacked( baseUri, StringsUpgradeable.toString(_tokenId), ".json" ) ); } // ------ Modifiers ------ modifier preMintChecks(uint256 count) { require(count > 0, "Mint at least one."); require(count <= maxPerMint, "Max mint reached."); require(supply() + count <= totalSupply() + 1, "reached max supply"); require( _numberMinted(msg.sender) + count <= maxPerWallet, "can not mint this many" ); require(msg.value >= cost * count, "Not enough fund."); if (reqToken != address(0)) { ERC721 accessToken = ERC721(reqToken); require(accessToken.balanceOf(msg.sender) > 0, "Access token not owned"); } _; } } // File contracts/NFTArtGenCreatorImpl.sol contract NFTArtGenCreatorImpl is NFTArtGenUpgradeable { function initialize( string memory _name, string memory _symbol, uint256 _maxSupply ) public initializer { __NFTArtGen_init(_name, _symbol, _maxSupply); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"name":"__ERC721A_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"affiliatesOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"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":[],"name":"maxPerMint","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintAll","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"open","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"count","type":"uint32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"count","type":"uint32"},{"internalType":"address","name":"referrer","type":"address"}],"name":"referralMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"referralOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reqToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_val1","type":"uint256"}],"name":"setCommission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_open","type":"bool"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"updatePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_open","type":"bool"},{"internalType":"uint256","name":"_val","type":"uint256"}],"name":"updateReferral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"updateReqToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_revealed","type":"bool"},{"internalType":"string","name":"_uri","type":"string"}],"name":"updateReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"updateRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_open","type":"bool"},{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint32","name":"_maxW","type":"uint32"},{"internalType":"uint32","name":"_maxM","type":"uint32"}],"name":"updateSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50613837806100206000396000f3fe6080604052600436106102885760003560e01c8063672434821161015a578063c7d12610116100c1578063e985e9c51161007a578063e985e9c5146107af578063f179dca1146107f8578063f2fde38b1461080b578063fccc28131461082b578063fcfff16f14610841578063fe25219a1461086257600080fd5b8063c7d12610146106e3578063c87b56dd14610703578063d2f01f1914610723578063d6c5b41414610743578063db31882b14610779578063dfdd9b9a1461079957600080fd5b806395d89b411161011357806395d89b411461063a578063a0712d681461064f578063a22cb46514610662578063b119490e14610682578063b88d4fde146106a2578063bee6348a146106c257600080fd5b806367243482146105875780636c2f5acd146105a757806370a08231146105c7578063715018a6146105e7578063828c12ce146105fc5780638da5cb5b1461061c57600080fd5b80632a55205a116101fe5780634f6ccce7116101b75780634f6ccce7146104e0578063507e094f14610500578063518302271461051d578063595882b31461053e5780636352211e1461054657806364bb10611461056657600080fd5b80632a55205a146103ff5780632f745c591461043e578063355e6b431461045e5780633ccfd60b1461047e57806342842e0e14610486578063453c2310146104a657600080fd5b8063095ea7b311610250578063095ea7b3146103545780631012c3301461037457806313faede61461039457806318160ddd146103aa5780631d02161d146103bf57806323b872dd146103df57600080fd5b806301ffc9a71461028d5780630364d22a146102c2578063047fc9aa146102d757806306fdde03146102fa578063081812fc1461031c575b600080fd5b34801561029957600080fd5b506102ad6102a8366004613117565b610882565b60405190151581526020015b60405180910390f35b6102d56102d0366004613286565b6108ad565b005b3480156102e357600080fd5b506102ec610bc1565b6040519081526020016102b9565b34801561030657600080fd5b5061030f610bd7565b6040516102b9919061344b565b34801561032857600080fd5b5061033c610337366004613216565b610c69565b6040516001600160a01b0390911681526020016102b9565b34801561036057600080fd5b506102d561036f366004612f7b565b610d02565b34801561038057600080fd5b506102d561038f366004612e4c565b610e33565b3480156103a057600080fd5b506102ec609e5481565b3480156103b657600080fd5b5060a2546102ec565b3480156103cb57600080fd5b506102d56103da3660046130ca565b610e7f565b3480156103eb57600080fd5b506102d56103fa366004612e9a565b610efd565b34801561040b57600080fd5b5061041f61041a366004613248565b610f08565b604080516001600160a01b0390931683526020830191909152016102b9565b34801561044a57600080fd5b506102ec610459366004612f7b565b610f42565b34801561046a57600080fd5b506102d5610479366004613216565b6110c3565b6102d561111d565b34801561049257600080fd5b506102d56104a1366004612e9a565b6111bf565b3480156104b257600080fd5b50609f546104cb90640100000000900463ffffffff1681565b60405163ffffffff90911681526020016102b9565b3480156104ec57600080fd5b506102ec6104fb366004613216565b6111da565b34801561050c57600080fd5b50609f546104cb9063ffffffff1681565b34801561052957600080fd5b50609f546102ad90600160481b900460ff1681565b6102d561124e565b34801561055257600080fd5b5061033c610561366004613216565b6112cd565b34801561057257600080fd5b50609f546102ad90600160581b900460ff1681565b34801561059357600080fd5b506102d56105a2366004612fa5565b6112df565b3480156105b357600080fd5b506102d56105c2366004612f7b565b6113be565b3480156105d357600080fd5b506102ec6105e2366004612e4c565b61140e565b3480156105f357600080fd5b506102d56114aa565b34801561060857600080fd5b506102d5610617366004613087565b6114de565b34801561062857600080fd5b50606c546001600160a01b031661033c565b34801561064657600080fd5b5061030f6115f5565b6102d561065d366004613216565b611604565b34801561066e57600080fd5b506102d561067d366004612f51565b611804565b34801561068e57600080fd5b506102d561069d3660046131aa565b6118d7565b3480156106ae57600080fd5b506102d56106bd366004612ed6565b61199d565b3480156106ce57600080fd5b50609f546102ad90600160501b900460ff1681565b3480156106ef57600080fd5b5060a15461033c906001600160a01b031681565b34801561070f57600080fd5b5061030f61071e366004613216565b6119d0565b34801561072f57600080fd5b506102d561073e366004613151565b611a66565b34801561074f57600080fd5b506102ec61075e366004612e4c565b6001600160a01b0316600090815260a8602052604090205490565b34801561078557600080fd5b506102d561079436600461306b565b611aca565b3480156107a557600080fd5b506102ec60a05481565b3480156107bb57600080fd5b506102ad6107ca366004612e67565b6001600160a01b039182166000908152606b6020908152604080832093909416825291909152205460ff1690565b6102d561080636600461326a565b611b16565b34801561081757600080fd5b506102d5610826366004612e4c565b611ed9565b34801561083757600080fd5b5061033c61dead81565b34801561084d57600080fd5b50609f546102ad90600160401b900460ff1681565b34801561086e57600080fd5b506102d561087d36600461306b565b611f74565b60006001600160e01b0319821663152a902d60e11b14806108a757506108a782611fc0565b92915050565b8263ffffffff16600081116108dd5760405162461bcd60e51b81526004016108d49061361c565b60405180910390fd5b609f5463ffffffff168111156109055760405162461bcd60e51b81526004016108d4906135f1565b60a25461091390600161369b565b8161091c610bc1565b610926919061369b565b11156109445760405162461bcd60e51b81526004016108d49061348e565b609f54640100000000900463ffffffff168161095f3361202b565b610969919061369b565b11156109875760405162461bcd60e51b81526004016108d49061354c565b80609e5461099591906136c7565b3410156109b45760405162461bcd60e51b81526004016108d4906135c7565b60a1546001600160a01b031615610a645760a1546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b158015610a0d57600080fd5b505afa158015610a21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a45919061322f565b11610a625760405162461bcd60e51b81526004016108d49061345e565b505b609f54600160501b900460ff16610ab05760405162461bcd60e51b815260206004820152601060248201526f283932b9b0b632903737ba1037b832b760811b60448201526064016108d4565b60a754610af35760405162461bcd60e51b815260206004820152601160248201527050726573616c65206e6f7420726561647960781b60448201526064016108d4565b610b688383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060a7546040516bffffffffffffffffffffffff193360601b1660208201529092506034019050604051602081830303815290604052805190602001206120d5565b610bab5760405162461bcd60e51b81526020600482015260146024820152732737ba103090383932b9b0b6329036b2b6b132b960611b60448201526064016108d4565b610bbb338563ffffffff166120eb565b50505050565b60006001606554610bd291906136e6565b905090565b606060668054610be690613729565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1290613729565b8015610c5f5780601f10610c3457610100808354040283529160200191610c5f565b820191906000526020600020905b815481529060010190602001808311610c4257829003601f168201915b5050505050905090565b6000610c7482612105565b610ce65760405162461bcd60e51b815260206004820152603860248201527f455243373231415570677261646561626c653a20617070726f7665642071756560448201527f727920666f72206e6f6e6578697374656e7420746f6b656e000000000000000060648201526084016108d4565b506000908152606a60205260409020546001600160a01b031690565b6000610d0d826112cd565b9050806001600160a01b0316836001600160a01b03161415610d875760405162461bcd60e51b815260206004820152602d60248201527f455243373231415570677261646561626c653a20617070726f76616c20746f2060448201526c31bab93932b73a1037bbb732b960991b60648201526084016108d4565b336001600160a01b0382161480610da35750610da381336107ca565b610e235760405162461bcd60e51b8152602060048201526044602482018190527f455243373231415570677261646561626c653a20617070726f76652063616c6c908201527f6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7260648201526308185b1b60e21b608482015260a4016108d4565b610e2e838383612168565b505050565b606c546001600160a01b03163314610e5d5760405162461bcd60e51b81526004016108d4906134ba565b60a180546001600160a01b0319166001600160a01b0392909216919091179055565b606c546001600160a01b03163314610ea95760405162461bcd60e51b81526004016108d4906134ba565b609f8054609e9490945568ffffffffff0000000019909316600160401b9415159490940267ffffffff0000000019169390931764010000000063ffffffff928316021763ffffffff19169216919091179055565b610e2e8383836121c4565b60a45460a55460009182916001600160a01b03909116906103e890610f2d90866136c7565b610f3791906136b3565b915091509250929050565b6000610f4d8361140e565b8210610fb15760405162461bcd60e51b815260206004820152602d60248201527f455243373231415570677261646561626c653a206f776e657220696e6465782060448201526c6f7574206f6620626f756e647360981b60648201526084016108d4565b6000610fbc60a25490565b905060008060005b83811015611054576000818152606860209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561101657805192505b876001600160a01b0316836001600160a01b0316141561104b5786841415611044575093506108a792505050565b6001909301925b50600101610fc4565b5060405162461bcd60e51b815260206004820152603960248201527f455243373231415570677261646561626c653a20756e61626c6520746f20676560448201527f7420746f6b656e206f66206f776e657220627920696e6465780000000000000060648201526084016108d4565b3373460fd5059e7301680fa53e63bbbf7272e643e89c146111185760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064016108d4565b60a955565b478061115a5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2062616c616e636560a01b60448201526064016108d4565b60006103e88260a95461116d91906136c7565b61117791906136b3565b905061119773460fd5059e7301680fa53e63bbbf7272e643e89c826124c6565b6111bb6111ac606c546001600160a01b031690565b6111b683856136e6565b6124c6565b5050565b610e2e8383836040518060200160405280600081525061199d565b60006111e560a25490565b821061124a5760405162461bcd60e51b815260206004820152602e60248201527f455243373231415570677261646561626c653a20676c6f62616c20696e64657860448201526d206f7574206f6620626f756e647360901b60648201526084016108d4565b5090565b606c546001600160a01b031633146112785760405162461bcd60e51b81526004016108d4906134ba565b341561129c5761129c73460fd5059e7301680fa53e63bbbf7272e643e89c346124c6565b6112cb6112b1606c546001600160a01b031690565b6112b9610bc1565b60a2546112c691906136e6565b6120eb565b565b60006112d8826125df565b5192915050565b606c546001600160a01b031633146113095760405162461bcd60e51b81526004016108d4906134ba565b805182511461131757600080fd5b60005b8151811015610e2e5760a254828281518110611338576113386137bf565b6020026020010151611348610bc1565b611352919061369b565b11156113705760405162461bcd60e51b81526004016108d49061348e565b6113ac838281518110611385576113856137bf565b602002602001015183838151811061139f5761139f6137bf565b60200260200101516120eb565b806113b681613764565b91505061131a565b606c546001600160a01b031633146113e85760405162461bcd60e51b81526004016108d4906134ba565b60a480546001600160a01b0319166001600160a01b03939093169290921790915560a555565b60006001600160a01b0382166114855760405162461bcd60e51b815260206004820152603660248201527f455243373231415570677261646561626c653a2062616c616e636520717565726044820152757920666f7220746865207a65726f206164647265737360501b60648201526084016108d4565b506001600160a01b03166000908152606960205260409020546001600160801b031690565b606c546001600160a01b031633146114d45760405162461bcd60e51b81526004016108d4906134ba565b6112cb60006126be565b606c546001600160a01b031633146115085760405162461bcd60e51b81526004016108d4906134ba565b609f805460ff60481b1916600160481b8415159081029190911790915561153e57805161153c9060a6906020840190612c8c565b505b600182151514156111bb57600060a3805461155890613729565b80601f016020809104026020016040519081016040528092919081815260200182805461158490613729565b80156115d15780601f106115a6576101008083540402835291602001916115d1565b820191906000526020600020905b8154815290600101906020018083116115b457829003601f168201915b50505050509050805160001415610e2e578151610bbb9060a3906020850190612c8c565b606060678054610be690613729565b80600081116116255760405162461bcd60e51b81526004016108d49061361c565b609f5463ffffffff1681111561164d5760405162461bcd60e51b81526004016108d4906135f1565b60a25461165b90600161369b565b81611664610bc1565b61166e919061369b565b111561168c5760405162461bcd60e51b81526004016108d49061348e565b609f54640100000000900463ffffffff16816116a73361202b565b6116b1919061369b565b11156116cf5760405162461bcd60e51b81526004016108d49061354c565b80609e546116dd91906136c7565b3410156116fc5760405162461bcd60e51b81526004016108d4906135c7565b60a1546001600160a01b0316156117ac5760a1546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b15801561175557600080fd5b505afa158015611769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178d919061322f565b116117aa5760405162461bcd60e51b81526004016108d49061345e565b505b609f54600160401b900460ff1615156001146117fa5760405162461bcd60e51b815260206004820152600d60248201526c26b4b73a103737ba1037b832b760991b60448201526064016108d4565b6111bb33836120eb565b6001600160a01b03821633141561186b5760405162461bcd60e51b815260206004820152602560248201527f455243373231415570677261646561626c653a20617070726f766520746f206360448201526430b63632b960d91b60648201526084016108d4565b336000818152606b602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600054610100900460ff166118f25760005460ff16156118f6565b303b155b6119595760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108d4565b600054610100900460ff1615801561197b576000805461ffff19166101011790555b611986848484612710565b8015610bbb576000805461ff001916905550505050565b6119a88484846121c4565b6119b484848484612762565b610bbb5760405162461bcd60e51b81526004016108d4906134ef565b60606119db82612105565b611a185760405162461bcd60e51b815260206004820152600e60248201526d111bd95cc81b9bdd08195e1a5cdd60921b60448201526064016108d4565b609f54600160481b900460ff16611a5b5760a6611a3483612870565b604051602001611a45929190613353565b6040516020818303038152906040529050919050565b60a3611a3483612870565b600054610100900460ff16611a8d5760405162461bcd60e51b81526004016108d49061357c565b8151611aa0906066906020850190612c8c565b508051611ab4906067906020840190612c8c565b506001606555611ac261296d565b6111bb61296d565b606c546001600160a01b03163314611af45760405162461bcd60e51b81526004016108d4906134ba565b609f8054921515600160501b0260ff60501b199093169290921790915560a755565b8163ffffffff1660008111611b3d5760405162461bcd60e51b81526004016108d49061361c565b609f5463ffffffff16811115611b655760405162461bcd60e51b81526004016108d4906135f1565b60a254611b7390600161369b565b81611b7c610bc1565b611b86919061369b565b1115611ba45760405162461bcd60e51b81526004016108d49061348e565b609f54640100000000900463ffffffff1681611bbf3361202b565b611bc9919061369b565b1115611be75760405162461bcd60e51b81526004016108d49061354c565b80609e54611bf591906136c7565b341015611c145760405162461bcd60e51b81526004016108d4906135c7565b60a1546001600160a01b031615611cc45760a1546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b158015611c6d57600080fd5b505afa158015611c81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca5919061322f565b11611cc25760405162461bcd60e51b81526004016108d49061345e565b505b609f54600160581b900460ff161515600114611d175760405162461bcd60e51b81526020600482015260126024820152712932b332b93930b639903737ba1037b832b760711b60448201526064016108d4565b609f54600160401b900460ff161515600114611d655760405162461bcd60e51b815260206004820152600d60248201526c26b4b73a103737ba1037b832b760991b60448201526064016108d4565b600060a05411611dac5760405162461bcd60e51b81526020600482015260126024820152714361702069732073657420746f207a65726f60701b60448201526064016108d4565b6000611db78361202b565b11611e045760405162461bcd60e51b815260206004820152601760248201527f526566657272657220686173206e6f74206d696e74656400000000000000000060448201526064016108d4565b336001600160a01b0383161415611e555760405162461bcd60e51b815260206004820152601560248201527421b0b73737ba103932b332b9103cb7bab939b2b63360591b60448201526064016108d4565b611e65338463ffffffff166120eb565b6001600160a01b038216600090815260a860205260408120805460019290611e8e90849061369b565b909155505060a0546001600160a01b038316600090815260a86020526040902054611eb9919061377f565b610e2e5760a254611ec8610bc1565b1015610e2e57610e2e8260016120eb565b606c546001600160a01b03163314611f035760405162461bcd60e51b81526004016108d4906134ba565b6001600160a01b038116611f685760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108d4565b611f71816126be565b50565b606c546001600160a01b03163314611f9e5760405162461bcd60e51b81526004016108d4906134ba565b609f8054921515600160581b0260ff60581b199093169290921790915560a055565b60006001600160e01b031982166380ac58cd60e01b1480611ff157506001600160e01b03198216635b5e139f60e01b145b8061200c57506001600160e01b0319821663780e9d6360e01b145b806108a757506301ffc9a760e01b6001600160e01b03198316146108a7565b60006001600160a01b0382166120a95760405162461bcd60e51b815260206004820152603c60248201527f455243373231415570677261646561626c653a206e756d626572206d696e746560448201527f6420717565727920666f7220746865207a65726f20616464726573730000000060648201526084016108d4565b506001600160a01b0316600090815260696020526040902054600160801b90046001600160801b031690565b6000826120e28584612994565b14949350505050565b6111bb828260405180602001604052806000815250612a40565b60008082116121605760405162461bcd60e51b815260206004820152602160248201527f4552433732314d657461646174613a206e6f6e6578697374656e7420746f6b656044820152603760f91b60648201526084016108d4565b506065541190565b6000828152606a602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006121cf826125df565b80519091506000906001600160a01b0316336001600160a01b031614806122065750336121fb84610c69565b6001600160a01b0316145b806122185750815161221890336107ca565b90508061228d5760405162461bcd60e51b815260206004820152603d60248201527f455243373231415570677261646561626c653a207472616e736665722063616c60448201527f6c6572206973206e6f74206f776e6572206e6f7220617070726f76656400000060648201526084016108d4565b846001600160a01b031682600001516001600160a01b03161461230c5760405162461bcd60e51b815260206004820152603160248201527f455243373231415570677261646561626c653a207472616e736665722066726f604482015270369034b731b7b93932b1ba1037bbb732b960791b60648201526084016108d4565b6001600160a01b03841661237b5760405162461bcd60e51b815260206004820152603060248201527f455243373231415570677261646561626c653a207472616e7366657220746f2060448201526f746865207a65726f206164647265737360801b60648201526084016108d4565b61238b6000848460000151612168565b6001600160a01b03858116600090815260696020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552606890935281842080546001600160e01b031916909117600160a01b426001600160401b03160217905590860180835291205490911661247c5761243081612105565b1561247c57825160008281526068602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b804710156125165760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016108d4565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612563576040519150601f19603f3d011682016040523d82523d6000602084013e612568565b606091505b5050905080610e2e5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016108d4565b60408051808201909152600080825260208201526125fc82612105565b6126665760405162461bcd60e51b815260206004820152603560248201527f455243373231415570677261646561626c653a206f776e6572207175657279206044820152743337b9103737b732bc34b9ba32b73a103a37b5b2b760591b60648201526084016108d4565b815b6000818152606860209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b031691830191909152156126b4579392505050565b5060001901612668565b606c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166127375760405162461bcd60e51b81526004016108d49061357c565b6127418383611a66565b612749612a4d565b60a2555050603160a955609f805460ff60481b19169055565b60006001600160a01b0384163b1561286457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906127a690339089908890889060040161340e565b602060405180830381600087803b1580156127c057600080fd5b505af19250505080156127f0575060408051601f3d908101601f191682019092526127ed91810190613134565b60015b61284a573d80801561281e576040519150601f19603f3d011682016040523d82523d6000602084013e612823565b606091505b5080516128425760405162461bcd60e51b81526004016108d4906134ef565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612868565b5060015b949350505050565b6060816128945750506040805180820190915260018152600360fc1b602082015290565b8160005b81156128be57806128a881613764565b91506128b79050600a836136b3565b9150612898565b6000816001600160401b038111156128d8576128d86137d5565b6040519080825280601f01601f191660200182016040528015612902576020820181803683370190505b5090505b8415612868576129176001836136e6565b9150612924600a8661377f565b61292f90603061369b565b60f81b818381518110612944576129446137bf565b60200101906001600160f81b031916908160001a905350612966600a866136b3565b9450612906565b600054610100900460ff166112cb5760405162461bcd60e51b81526004016108d49061357c565b600081815b8451811015612a385760008582815181106129b6576129b66137bf565b602002602001015190508083116129f8576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612a25565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612a3081613764565b915050612999565b509392505050565b610e2e8383836001612a84565b600054610100900460ff16612a745760405162461bcd60e51b81526004016108d49061357c565b612a7c61296d565b6112cb612c5c565b6065546001600160a01b038516612af25760405162461bcd60e51b815260206004820152602c60248201527f455243373231415570677261646561626c653a206d696e7420746f207468652060448201526b7a65726f206164647265737360a01b60648201526084016108d4565b83612b5b5760405162461bcd60e51b815260206004820152603360248201527f455243373231415570677261646561626c653a207175616e74697479206d75736044820152720742062652067726561746572207468616e203606c1b60648201526084016108d4565b6001600160a01b03851660008181526069602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526068909152812080546001600160e01b031916909217600160a01b426001600160401b0316021790915581905b85811015612c535760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315612c4757612c2b6000888488612762565b612c475760405162461bcd60e51b81526004016108d4906134ef565b60019182019101612bd8565b506065556124bf565b600054610100900460ff16612c835760405162461bcd60e51b81526004016108d49061357c565b6112cb336126be565b828054612c9890613729565b90600052602060002090601f016020900481019282612cba5760008555612d00565b82601f10612cd357805160ff1916838001178555612d00565b82800160010185558215612d00579182015b82811115612d00578251825591602001919060010190612ce5565b5061124a9291505b8082111561124a5760008155600101612d08565b60006001600160401b03831115612d3557612d356137d5565b612d48601f8401601f1916602001613648565b9050828152838383011115612d5c57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612d8a57600080fd5b919050565b600082601f830112612da057600080fd5b81356020612db5612db083613678565b613648565b80838252828201915082860187848660051b8901011115612dd557600080fd5b60005b85811015612df457813584529284019290840190600101612dd8565b5090979650505050505050565b80358015158114612d8a57600080fd5b600082601f830112612e2257600080fd5b612e3183833560208501612d1c565b9392505050565b803563ffffffff81168114612d8a57600080fd5b600060208284031215612e5e57600080fd5b612e3182612d73565b60008060408385031215612e7a57600080fd5b612e8383612d73565b9150612e9160208401612d73565b90509250929050565b600080600060608486031215612eaf57600080fd5b612eb884612d73565b9250612ec660208501612d73565b9150604084013590509250925092565b60008060008060808587031215612eec57600080fd5b612ef585612d73565b9350612f0360208601612d73565b92506040850135915060608501356001600160401b03811115612f2557600080fd5b8501601f81018713612f3657600080fd5b612f4587823560208401612d1c565b91505092959194509250565b60008060408385031215612f6457600080fd5b612f6d83612d73565b9150612e9160208401612e01565b60008060408385031215612f8e57600080fd5b612f9783612d73565b946020939093013593505050565b60008060408385031215612fb857600080fd5b82356001600160401b0380821115612fcf57600080fd5b818501915085601f830112612fe357600080fd5b81356020612ff3612db083613678565b8083825282820191508286018a848660051b890101111561301357600080fd5b600096505b8487101561303d5761302981612d73565b835260019690960195918301918301613018565b509650508601359250508082111561305457600080fd5b5061306185828601612d8f565b9150509250929050565b6000806040838503121561307e57600080fd5b612f9783612e01565b6000806040838503121561309a57600080fd5b6130a383612e01565b915060208301356001600160401b038111156130be57600080fd5b61306185828601612e11565b600080600080608085870312156130e057600080fd5b6130e985612e01565b9350602085013592506130fe60408601612e38565b915061310c60608601612e38565b905092959194509250565b60006020828403121561312957600080fd5b8135612e31816137eb565b60006020828403121561314657600080fd5b8151612e31816137eb565b6000806040838503121561316457600080fd5b82356001600160401b038082111561317b57600080fd5b61318786838701612e11565b9350602085013591508082111561319d57600080fd5b5061306185828601612e11565b6000806000606084860312156131bf57600080fd5b83356001600160401b03808211156131d657600080fd5b6131e287838801612e11565b945060208601359150808211156131f857600080fd5b5061320586828701612e11565b925050604084013590509250925092565b60006020828403121561322857600080fd5b5035919050565b60006020828403121561324157600080fd5b5051919050565b6000806040838503121561325b57600080fd5b50508035926020909101359150565b6000806040838503121561327d57600080fd5b612e8383612e38565b60008060006040848603121561329b57600080fd5b6132a484612e38565b925060208401356001600160401b03808211156132c057600080fd5b818601915086601f8301126132d457600080fd5b8135818111156132e357600080fd5b8760208260051b85010111156132f857600080fd5b6020830194508093505050509250925092565b600081518084526133238160208601602086016136fd565b601f01601f19169290920160200192915050565b600081516133498185602086016136fd565b9290920192915050565b600080845481600182811c91508083168061336f57607f831692505b602080841082141561338f57634e487b7160e01b86526022600452602486fd5b8180156133a357600181146133b4576133e1565b60ff198616895284890196506133e1565b60008b81526020902060005b868110156133d95781548b8201529085019083016133c0565b505084890196505b5050505050506134056133f48286613337565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906134419083018461330b565b9695505050505050565b602081526000612e31602083018461330b565b6020808252601690820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b604082015260600190565b60208082526012908201527172656163686564206d617820737570706c7960701b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252603e908201527f455243373231415570677261646561626c653a207472616e7366657220746f2060408201527f6e6f6e20455243373231526563656976657220696d706c656d656e7465720000606082015260800190565b60208082526016908201527563616e206e6f74206d696e742074686973206d616e7960501b604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526010908201526f2737ba1032b737bab3b410333ab7321760811b604082015260600190565b60208082526011908201527026b0bc1036b4b73a103932b0b1b432b21760791b604082015260600190565b60208082526012908201527126b4b73a1030ba103632b0b9ba1037b7329760711b604082015260600190565b604051601f8201601f191681016001600160401b0381118282101715613670576136706137d5565b604052919050565b60006001600160401b03821115613691576136916137d5565b5060051b60200190565b600082198211156136ae576136ae613793565b500190565b6000826136c2576136c26137a9565b500490565b60008160001904831182151516156136e1576136e1613793565b500290565b6000828210156136f8576136f8613793565b500390565b60005b83811015613718578181015183820152602001613700565b83811115610bbb5750506000910152565b600181811c9082168061373d57607f821691505b6020821081141561375e57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561377857613778613793565b5060010190565b60008261378e5761378e6137a9565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611f7157600080fdfea26469706673582212200cdd927525e95d310d7e2502906214fdd31ec9709d595ec702c5deeec1c8b63e64736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102885760003560e01c8063672434821161015a578063c7d12610116100c1578063e985e9c51161007a578063e985e9c5146107af578063f179dca1146107f8578063f2fde38b1461080b578063fccc28131461082b578063fcfff16f14610841578063fe25219a1461086257600080fd5b8063c7d12610146106e3578063c87b56dd14610703578063d2f01f1914610723578063d6c5b41414610743578063db31882b14610779578063dfdd9b9a1461079957600080fd5b806395d89b411161011357806395d89b411461063a578063a0712d681461064f578063a22cb46514610662578063b119490e14610682578063b88d4fde146106a2578063bee6348a146106c257600080fd5b806367243482146105875780636c2f5acd146105a757806370a08231146105c7578063715018a6146105e7578063828c12ce146105fc5780638da5cb5b1461061c57600080fd5b80632a55205a116101fe5780634f6ccce7116101b75780634f6ccce7146104e0578063507e094f14610500578063518302271461051d578063595882b31461053e5780636352211e1461054657806364bb10611461056657600080fd5b80632a55205a146103ff5780632f745c591461043e578063355e6b431461045e5780633ccfd60b1461047e57806342842e0e14610486578063453c2310146104a657600080fd5b8063095ea7b311610250578063095ea7b3146103545780631012c3301461037457806313faede61461039457806318160ddd146103aa5780631d02161d146103bf57806323b872dd146103df57600080fd5b806301ffc9a71461028d5780630364d22a146102c2578063047fc9aa146102d757806306fdde03146102fa578063081812fc1461031c575b600080fd5b34801561029957600080fd5b506102ad6102a8366004613117565b610882565b60405190151581526020015b60405180910390f35b6102d56102d0366004613286565b6108ad565b005b3480156102e357600080fd5b506102ec610bc1565b6040519081526020016102b9565b34801561030657600080fd5b5061030f610bd7565b6040516102b9919061344b565b34801561032857600080fd5b5061033c610337366004613216565b610c69565b6040516001600160a01b0390911681526020016102b9565b34801561036057600080fd5b506102d561036f366004612f7b565b610d02565b34801561038057600080fd5b506102d561038f366004612e4c565b610e33565b3480156103a057600080fd5b506102ec609e5481565b3480156103b657600080fd5b5060a2546102ec565b3480156103cb57600080fd5b506102d56103da3660046130ca565b610e7f565b3480156103eb57600080fd5b506102d56103fa366004612e9a565b610efd565b34801561040b57600080fd5b5061041f61041a366004613248565b610f08565b604080516001600160a01b0390931683526020830191909152016102b9565b34801561044a57600080fd5b506102ec610459366004612f7b565b610f42565b34801561046a57600080fd5b506102d5610479366004613216565b6110c3565b6102d561111d565b34801561049257600080fd5b506102d56104a1366004612e9a565b6111bf565b3480156104b257600080fd5b50609f546104cb90640100000000900463ffffffff1681565b60405163ffffffff90911681526020016102b9565b3480156104ec57600080fd5b506102ec6104fb366004613216565b6111da565b34801561050c57600080fd5b50609f546104cb9063ffffffff1681565b34801561052957600080fd5b50609f546102ad90600160481b900460ff1681565b6102d561124e565b34801561055257600080fd5b5061033c610561366004613216565b6112cd565b34801561057257600080fd5b50609f546102ad90600160581b900460ff1681565b34801561059357600080fd5b506102d56105a2366004612fa5565b6112df565b3480156105b357600080fd5b506102d56105c2366004612f7b565b6113be565b3480156105d357600080fd5b506102ec6105e2366004612e4c565b61140e565b3480156105f357600080fd5b506102d56114aa565b34801561060857600080fd5b506102d5610617366004613087565b6114de565b34801561062857600080fd5b50606c546001600160a01b031661033c565b34801561064657600080fd5b5061030f6115f5565b6102d561065d366004613216565b611604565b34801561066e57600080fd5b506102d561067d366004612f51565b611804565b34801561068e57600080fd5b506102d561069d3660046131aa565b6118d7565b3480156106ae57600080fd5b506102d56106bd366004612ed6565b61199d565b3480156106ce57600080fd5b50609f546102ad90600160501b900460ff1681565b3480156106ef57600080fd5b5060a15461033c906001600160a01b031681565b34801561070f57600080fd5b5061030f61071e366004613216565b6119d0565b34801561072f57600080fd5b506102d561073e366004613151565b611a66565b34801561074f57600080fd5b506102ec61075e366004612e4c565b6001600160a01b0316600090815260a8602052604090205490565b34801561078557600080fd5b506102d561079436600461306b565b611aca565b3480156107a557600080fd5b506102ec60a05481565b3480156107bb57600080fd5b506102ad6107ca366004612e67565b6001600160a01b039182166000908152606b6020908152604080832093909416825291909152205460ff1690565b6102d561080636600461326a565b611b16565b34801561081757600080fd5b506102d5610826366004612e4c565b611ed9565b34801561083757600080fd5b5061033c61dead81565b34801561084d57600080fd5b50609f546102ad90600160401b900460ff1681565b34801561086e57600080fd5b506102d561087d36600461306b565b611f74565b60006001600160e01b0319821663152a902d60e11b14806108a757506108a782611fc0565b92915050565b8263ffffffff16600081116108dd5760405162461bcd60e51b81526004016108d49061361c565b60405180910390fd5b609f5463ffffffff168111156109055760405162461bcd60e51b81526004016108d4906135f1565b60a25461091390600161369b565b8161091c610bc1565b610926919061369b565b11156109445760405162461bcd60e51b81526004016108d49061348e565b609f54640100000000900463ffffffff168161095f3361202b565b610969919061369b565b11156109875760405162461bcd60e51b81526004016108d49061354c565b80609e5461099591906136c7565b3410156109b45760405162461bcd60e51b81526004016108d4906135c7565b60a1546001600160a01b031615610a645760a1546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b158015610a0d57600080fd5b505afa158015610a21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a45919061322f565b11610a625760405162461bcd60e51b81526004016108d49061345e565b505b609f54600160501b900460ff16610ab05760405162461bcd60e51b815260206004820152601060248201526f283932b9b0b632903737ba1037b832b760811b60448201526064016108d4565b60a754610af35760405162461bcd60e51b815260206004820152601160248201527050726573616c65206e6f7420726561647960781b60448201526064016108d4565b610b688383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060a7546040516bffffffffffffffffffffffff193360601b1660208201529092506034019050604051602081830303815290604052805190602001206120d5565b610bab5760405162461bcd60e51b81526020600482015260146024820152732737ba103090383932b9b0b6329036b2b6b132b960611b60448201526064016108d4565b610bbb338563ffffffff166120eb565b50505050565b60006001606554610bd291906136e6565b905090565b606060668054610be690613729565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1290613729565b8015610c5f5780601f10610c3457610100808354040283529160200191610c5f565b820191906000526020600020905b815481529060010190602001808311610c4257829003601f168201915b5050505050905090565b6000610c7482612105565b610ce65760405162461bcd60e51b815260206004820152603860248201527f455243373231415570677261646561626c653a20617070726f7665642071756560448201527f727920666f72206e6f6e6578697374656e7420746f6b656e000000000000000060648201526084016108d4565b506000908152606a60205260409020546001600160a01b031690565b6000610d0d826112cd565b9050806001600160a01b0316836001600160a01b03161415610d875760405162461bcd60e51b815260206004820152602d60248201527f455243373231415570677261646561626c653a20617070726f76616c20746f2060448201526c31bab93932b73a1037bbb732b960991b60648201526084016108d4565b336001600160a01b0382161480610da35750610da381336107ca565b610e235760405162461bcd60e51b8152602060048201526044602482018190527f455243373231415570677261646561626c653a20617070726f76652063616c6c908201527f6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7260648201526308185b1b60e21b608482015260a4016108d4565b610e2e838383612168565b505050565b606c546001600160a01b03163314610e5d5760405162461bcd60e51b81526004016108d4906134ba565b60a180546001600160a01b0319166001600160a01b0392909216919091179055565b606c546001600160a01b03163314610ea95760405162461bcd60e51b81526004016108d4906134ba565b609f8054609e9490945568ffffffffff0000000019909316600160401b9415159490940267ffffffff0000000019169390931764010000000063ffffffff928316021763ffffffff19169216919091179055565b610e2e8383836121c4565b60a45460a55460009182916001600160a01b03909116906103e890610f2d90866136c7565b610f3791906136b3565b915091509250929050565b6000610f4d8361140e565b8210610fb15760405162461bcd60e51b815260206004820152602d60248201527f455243373231415570677261646561626c653a206f776e657220696e6465782060448201526c6f7574206f6620626f756e647360981b60648201526084016108d4565b6000610fbc60a25490565b905060008060005b83811015611054576000818152606860209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561101657805192505b876001600160a01b0316836001600160a01b0316141561104b5786841415611044575093506108a792505050565b6001909301925b50600101610fc4565b5060405162461bcd60e51b815260206004820152603960248201527f455243373231415570677261646561626c653a20756e61626c6520746f20676560448201527f7420746f6b656e206f66206f776e657220627920696e6465780000000000000060648201526084016108d4565b3373460fd5059e7301680fa53e63bbbf7272e643e89c146111185760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064016108d4565b60a955565b478061115a5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2062616c616e636560a01b60448201526064016108d4565b60006103e88260a95461116d91906136c7565b61117791906136b3565b905061119773460fd5059e7301680fa53e63bbbf7272e643e89c826124c6565b6111bb6111ac606c546001600160a01b031690565b6111b683856136e6565b6124c6565b5050565b610e2e8383836040518060200160405280600081525061199d565b60006111e560a25490565b821061124a5760405162461bcd60e51b815260206004820152602e60248201527f455243373231415570677261646561626c653a20676c6f62616c20696e64657860448201526d206f7574206f6620626f756e647360901b60648201526084016108d4565b5090565b606c546001600160a01b031633146112785760405162461bcd60e51b81526004016108d4906134ba565b341561129c5761129c73460fd5059e7301680fa53e63bbbf7272e643e89c346124c6565b6112cb6112b1606c546001600160a01b031690565b6112b9610bc1565b60a2546112c691906136e6565b6120eb565b565b60006112d8826125df565b5192915050565b606c546001600160a01b031633146113095760405162461bcd60e51b81526004016108d4906134ba565b805182511461131757600080fd5b60005b8151811015610e2e5760a254828281518110611338576113386137bf565b6020026020010151611348610bc1565b611352919061369b565b11156113705760405162461bcd60e51b81526004016108d49061348e565b6113ac838281518110611385576113856137bf565b602002602001015183838151811061139f5761139f6137bf565b60200260200101516120eb565b806113b681613764565b91505061131a565b606c546001600160a01b031633146113e85760405162461bcd60e51b81526004016108d4906134ba565b60a480546001600160a01b0319166001600160a01b03939093169290921790915560a555565b60006001600160a01b0382166114855760405162461bcd60e51b815260206004820152603660248201527f455243373231415570677261646561626c653a2062616c616e636520717565726044820152757920666f7220746865207a65726f206164647265737360501b60648201526084016108d4565b506001600160a01b03166000908152606960205260409020546001600160801b031690565b606c546001600160a01b031633146114d45760405162461bcd60e51b81526004016108d4906134ba565b6112cb60006126be565b606c546001600160a01b031633146115085760405162461bcd60e51b81526004016108d4906134ba565b609f805460ff60481b1916600160481b8415159081029190911790915561153e57805161153c9060a6906020840190612c8c565b505b600182151514156111bb57600060a3805461155890613729565b80601f016020809104026020016040519081016040528092919081815260200182805461158490613729565b80156115d15780601f106115a6576101008083540402835291602001916115d1565b820191906000526020600020905b8154815290600101906020018083116115b457829003601f168201915b50505050509050805160001415610e2e578151610bbb9060a3906020850190612c8c565b606060678054610be690613729565b80600081116116255760405162461bcd60e51b81526004016108d49061361c565b609f5463ffffffff1681111561164d5760405162461bcd60e51b81526004016108d4906135f1565b60a25461165b90600161369b565b81611664610bc1565b61166e919061369b565b111561168c5760405162461bcd60e51b81526004016108d49061348e565b609f54640100000000900463ffffffff16816116a73361202b565b6116b1919061369b565b11156116cf5760405162461bcd60e51b81526004016108d49061354c565b80609e546116dd91906136c7565b3410156116fc5760405162461bcd60e51b81526004016108d4906135c7565b60a1546001600160a01b0316156117ac5760a1546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b15801561175557600080fd5b505afa158015611769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178d919061322f565b116117aa5760405162461bcd60e51b81526004016108d49061345e565b505b609f54600160401b900460ff1615156001146117fa5760405162461bcd60e51b815260206004820152600d60248201526c26b4b73a103737ba1037b832b760991b60448201526064016108d4565b6111bb33836120eb565b6001600160a01b03821633141561186b5760405162461bcd60e51b815260206004820152602560248201527f455243373231415570677261646561626c653a20617070726f766520746f206360448201526430b63632b960d91b60648201526084016108d4565b336000818152606b602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600054610100900460ff166118f25760005460ff16156118f6565b303b155b6119595760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108d4565b600054610100900460ff1615801561197b576000805461ffff19166101011790555b611986848484612710565b8015610bbb576000805461ff001916905550505050565b6119a88484846121c4565b6119b484848484612762565b610bbb5760405162461bcd60e51b81526004016108d4906134ef565b60606119db82612105565b611a185760405162461bcd60e51b815260206004820152600e60248201526d111bd95cc81b9bdd08195e1a5cdd60921b60448201526064016108d4565b609f54600160481b900460ff16611a5b5760a6611a3483612870565b604051602001611a45929190613353565b6040516020818303038152906040529050919050565b60a3611a3483612870565b600054610100900460ff16611a8d5760405162461bcd60e51b81526004016108d49061357c565b8151611aa0906066906020850190612c8c565b508051611ab4906067906020840190612c8c565b506001606555611ac261296d565b6111bb61296d565b606c546001600160a01b03163314611af45760405162461bcd60e51b81526004016108d4906134ba565b609f8054921515600160501b0260ff60501b199093169290921790915560a755565b8163ffffffff1660008111611b3d5760405162461bcd60e51b81526004016108d49061361c565b609f5463ffffffff16811115611b655760405162461bcd60e51b81526004016108d4906135f1565b60a254611b7390600161369b565b81611b7c610bc1565b611b86919061369b565b1115611ba45760405162461bcd60e51b81526004016108d49061348e565b609f54640100000000900463ffffffff1681611bbf3361202b565b611bc9919061369b565b1115611be75760405162461bcd60e51b81526004016108d49061354c565b80609e54611bf591906136c7565b341015611c145760405162461bcd60e51b81526004016108d4906135c7565b60a1546001600160a01b031615611cc45760a1546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b158015611c6d57600080fd5b505afa158015611c81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca5919061322f565b11611cc25760405162461bcd60e51b81526004016108d49061345e565b505b609f54600160581b900460ff161515600114611d175760405162461bcd60e51b81526020600482015260126024820152712932b332b93930b639903737ba1037b832b760711b60448201526064016108d4565b609f54600160401b900460ff161515600114611d655760405162461bcd60e51b815260206004820152600d60248201526c26b4b73a103737ba1037b832b760991b60448201526064016108d4565b600060a05411611dac5760405162461bcd60e51b81526020600482015260126024820152714361702069732073657420746f207a65726f60701b60448201526064016108d4565b6000611db78361202b565b11611e045760405162461bcd60e51b815260206004820152601760248201527f526566657272657220686173206e6f74206d696e74656400000000000000000060448201526064016108d4565b336001600160a01b0383161415611e555760405162461bcd60e51b815260206004820152601560248201527421b0b73737ba103932b332b9103cb7bab939b2b63360591b60448201526064016108d4565b611e65338463ffffffff166120eb565b6001600160a01b038216600090815260a860205260408120805460019290611e8e90849061369b565b909155505060a0546001600160a01b038316600090815260a86020526040902054611eb9919061377f565b610e2e5760a254611ec8610bc1565b1015610e2e57610e2e8260016120eb565b606c546001600160a01b03163314611f035760405162461bcd60e51b81526004016108d4906134ba565b6001600160a01b038116611f685760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108d4565b611f71816126be565b50565b606c546001600160a01b03163314611f9e5760405162461bcd60e51b81526004016108d4906134ba565b609f8054921515600160581b0260ff60581b199093169290921790915560a055565b60006001600160e01b031982166380ac58cd60e01b1480611ff157506001600160e01b03198216635b5e139f60e01b145b8061200c57506001600160e01b0319821663780e9d6360e01b145b806108a757506301ffc9a760e01b6001600160e01b03198316146108a7565b60006001600160a01b0382166120a95760405162461bcd60e51b815260206004820152603c60248201527f455243373231415570677261646561626c653a206e756d626572206d696e746560448201527f6420717565727920666f7220746865207a65726f20616464726573730000000060648201526084016108d4565b506001600160a01b0316600090815260696020526040902054600160801b90046001600160801b031690565b6000826120e28584612994565b14949350505050565b6111bb828260405180602001604052806000815250612a40565b60008082116121605760405162461bcd60e51b815260206004820152602160248201527f4552433732314d657461646174613a206e6f6e6578697374656e7420746f6b656044820152603760f91b60648201526084016108d4565b506065541190565b6000828152606a602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006121cf826125df565b80519091506000906001600160a01b0316336001600160a01b031614806122065750336121fb84610c69565b6001600160a01b0316145b806122185750815161221890336107ca565b90508061228d5760405162461bcd60e51b815260206004820152603d60248201527f455243373231415570677261646561626c653a207472616e736665722063616c60448201527f6c6572206973206e6f74206f776e6572206e6f7220617070726f76656400000060648201526084016108d4565b846001600160a01b031682600001516001600160a01b03161461230c5760405162461bcd60e51b815260206004820152603160248201527f455243373231415570677261646561626c653a207472616e736665722066726f604482015270369034b731b7b93932b1ba1037bbb732b960791b60648201526084016108d4565b6001600160a01b03841661237b5760405162461bcd60e51b815260206004820152603060248201527f455243373231415570677261646561626c653a207472616e7366657220746f2060448201526f746865207a65726f206164647265737360801b60648201526084016108d4565b61238b6000848460000151612168565b6001600160a01b03858116600090815260696020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552606890935281842080546001600160e01b031916909117600160a01b426001600160401b03160217905590860180835291205490911661247c5761243081612105565b1561247c57825160008281526068602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b804710156125165760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016108d4565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612563576040519150601f19603f3d011682016040523d82523d6000602084013e612568565b606091505b5050905080610e2e5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016108d4565b60408051808201909152600080825260208201526125fc82612105565b6126665760405162461bcd60e51b815260206004820152603560248201527f455243373231415570677261646561626c653a206f776e6572207175657279206044820152743337b9103737b732bc34b9ba32b73a103a37b5b2b760591b60648201526084016108d4565b815b6000818152606860209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b031691830191909152156126b4579392505050565b5060001901612668565b606c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166127375760405162461bcd60e51b81526004016108d49061357c565b6127418383611a66565b612749612a4d565b60a2555050603160a955609f805460ff60481b19169055565b60006001600160a01b0384163b1561286457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906127a690339089908890889060040161340e565b602060405180830381600087803b1580156127c057600080fd5b505af19250505080156127f0575060408051601f3d908101601f191682019092526127ed91810190613134565b60015b61284a573d80801561281e576040519150601f19603f3d011682016040523d82523d6000602084013e612823565b606091505b5080516128425760405162461bcd60e51b81526004016108d4906134ef565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612868565b5060015b949350505050565b6060816128945750506040805180820190915260018152600360fc1b602082015290565b8160005b81156128be57806128a881613764565b91506128b79050600a836136b3565b9150612898565b6000816001600160401b038111156128d8576128d86137d5565b6040519080825280601f01601f191660200182016040528015612902576020820181803683370190505b5090505b8415612868576129176001836136e6565b9150612924600a8661377f565b61292f90603061369b565b60f81b818381518110612944576129446137bf565b60200101906001600160f81b031916908160001a905350612966600a866136b3565b9450612906565b600054610100900460ff166112cb5760405162461bcd60e51b81526004016108d49061357c565b600081815b8451811015612a385760008582815181106129b6576129b66137bf565b602002602001015190508083116129f8576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612a25565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612a3081613764565b915050612999565b509392505050565b610e2e8383836001612a84565b600054610100900460ff16612a745760405162461bcd60e51b81526004016108d49061357c565b612a7c61296d565b6112cb612c5c565b6065546001600160a01b038516612af25760405162461bcd60e51b815260206004820152602c60248201527f455243373231415570677261646561626c653a206d696e7420746f207468652060448201526b7a65726f206164647265737360a01b60648201526084016108d4565b83612b5b5760405162461bcd60e51b815260206004820152603360248201527f455243373231415570677261646561626c653a207175616e74697479206d75736044820152720742062652067726561746572207468616e203606c1b60648201526084016108d4565b6001600160a01b03851660008181526069602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526068909152812080546001600160e01b031916909217600160a01b426001600160401b0316021790915581905b85811015612c535760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315612c4757612c2b6000888488612762565b612c475760405162461bcd60e51b81526004016108d4906134ef565b60019182019101612bd8565b506065556124bf565b600054610100900460ff16612c835760405162461bcd60e51b81526004016108d49061357c565b6112cb336126be565b828054612c9890613729565b90600052602060002090601f016020900481019282612cba5760008555612d00565b82601f10612cd357805160ff1916838001178555612d00565b82800160010185558215612d00579182015b82811115612d00578251825591602001919060010190612ce5565b5061124a9291505b8082111561124a5760008155600101612d08565b60006001600160401b03831115612d3557612d356137d5565b612d48601f8401601f1916602001613648565b9050828152838383011115612d5c57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612d8a57600080fd5b919050565b600082601f830112612da057600080fd5b81356020612db5612db083613678565b613648565b80838252828201915082860187848660051b8901011115612dd557600080fd5b60005b85811015612df457813584529284019290840190600101612dd8565b5090979650505050505050565b80358015158114612d8a57600080fd5b600082601f830112612e2257600080fd5b612e3183833560208501612d1c565b9392505050565b803563ffffffff81168114612d8a57600080fd5b600060208284031215612e5e57600080fd5b612e3182612d73565b60008060408385031215612e7a57600080fd5b612e8383612d73565b9150612e9160208401612d73565b90509250929050565b600080600060608486031215612eaf57600080fd5b612eb884612d73565b9250612ec660208501612d73565b9150604084013590509250925092565b60008060008060808587031215612eec57600080fd5b612ef585612d73565b9350612f0360208601612d73565b92506040850135915060608501356001600160401b03811115612f2557600080fd5b8501601f81018713612f3657600080fd5b612f4587823560208401612d1c565b91505092959194509250565b60008060408385031215612f6457600080fd5b612f6d83612d73565b9150612e9160208401612e01565b60008060408385031215612f8e57600080fd5b612f9783612d73565b946020939093013593505050565b60008060408385031215612fb857600080fd5b82356001600160401b0380821115612fcf57600080fd5b818501915085601f830112612fe357600080fd5b81356020612ff3612db083613678565b8083825282820191508286018a848660051b890101111561301357600080fd5b600096505b8487101561303d5761302981612d73565b835260019690960195918301918301613018565b509650508601359250508082111561305457600080fd5b5061306185828601612d8f565b9150509250929050565b6000806040838503121561307e57600080fd5b612f9783612e01565b6000806040838503121561309a57600080fd5b6130a383612e01565b915060208301356001600160401b038111156130be57600080fd5b61306185828601612e11565b600080600080608085870312156130e057600080fd5b6130e985612e01565b9350602085013592506130fe60408601612e38565b915061310c60608601612e38565b905092959194509250565b60006020828403121561312957600080fd5b8135612e31816137eb565b60006020828403121561314657600080fd5b8151612e31816137eb565b6000806040838503121561316457600080fd5b82356001600160401b038082111561317b57600080fd5b61318786838701612e11565b9350602085013591508082111561319d57600080fd5b5061306185828601612e11565b6000806000606084860312156131bf57600080fd5b83356001600160401b03808211156131d657600080fd5b6131e287838801612e11565b945060208601359150808211156131f857600080fd5b5061320586828701612e11565b925050604084013590509250925092565b60006020828403121561322857600080fd5b5035919050565b60006020828403121561324157600080fd5b5051919050565b6000806040838503121561325b57600080fd5b50508035926020909101359150565b6000806040838503121561327d57600080fd5b612e8383612e38565b60008060006040848603121561329b57600080fd5b6132a484612e38565b925060208401356001600160401b03808211156132c057600080fd5b818601915086601f8301126132d457600080fd5b8135818111156132e357600080fd5b8760208260051b85010111156132f857600080fd5b6020830194508093505050509250925092565b600081518084526133238160208601602086016136fd565b601f01601f19169290920160200192915050565b600081516133498185602086016136fd565b9290920192915050565b600080845481600182811c91508083168061336f57607f831692505b602080841082141561338f57634e487b7160e01b86526022600452602486fd5b8180156133a357600181146133b4576133e1565b60ff198616895284890196506133e1565b60008b81526020902060005b868110156133d95781548b8201529085019083016133c0565b505084890196505b5050505050506134056133f48286613337565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906134419083018461330b565b9695505050505050565b602081526000612e31602083018461330b565b6020808252601690820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b604082015260600190565b60208082526012908201527172656163686564206d617820737570706c7960701b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252603e908201527f455243373231415570677261646561626c653a207472616e7366657220746f2060408201527f6e6f6e20455243373231526563656976657220696d706c656d656e7465720000606082015260800190565b60208082526016908201527563616e206e6f74206d696e742074686973206d616e7960501b604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526010908201526f2737ba1032b737bab3b410333ab7321760811b604082015260600190565b60208082526011908201527026b0bc1036b4b73a103932b0b1b432b21760791b604082015260600190565b60208082526012908201527126b4b73a1030ba103632b0b9ba1037b7329760711b604082015260600190565b604051601f8201601f191681016001600160401b0381118282101715613670576136706137d5565b604052919050565b60006001600160401b03821115613691576136916137d5565b5060051b60200190565b600082198211156136ae576136ae613793565b500190565b6000826136c2576136c26137a9565b500490565b60008160001904831182151516156136e1576136e1613793565b500290565b6000828210156136f8576136f8613793565b500390565b60005b83811015613718578181015183820152602001613700565b83811115610bbb5750506000910152565b600181811c9082168061373d57607f821691505b6020821081141561375e57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561377857613778613793565b5060010190565b60008261378e5761378e6137a9565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611f7157600080fdfea26469706673582212200cdd927525e95d310d7e2502906214fdd31ec9709d595ec702c5deeec1c8b63e64736f6c63430008070033
Deployed Bytecode Sourcemap
87584:242:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85763:250;;;;;;;;;;-1:-1:-1;85763:250:0;;;;;:::i;:::-;;:::i;:::-;;;13246:14:1;;13239:22;13221:41;;13209:2;13194:18;85763:250:0;;;;;;;;84485:435;;;;;;:::i;:::-;;:::i;:::-;;85575:85;;;;;;;;;;;;;:::i;:::-;;;29525:25:1;;;29513:2;29498:18;85575:85:0;29379:177:1;69571:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;71165:225::-;;;;;;;;;;-1:-1:-1;71165:225:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;12265:32:1;;;12247:51;;12235:2;12220:18;71165:225:0;12101:203:1;70653:446:0;;;;;;;;;;-1:-1:-1;70653:446:0;;;;;:::i;:::-;;:::i;82574:91::-;;;;;;;;;;-1:-1:-1;82574:91:0;;;;;:::i;:::-;;:::i;81265:19::-;;;;;;;;;;;;;;;;85666:91;;;;;;;;;;-1:-1:-1;85742:9:0;;85666:91;;82355:213;;;;;;;;;;-1:-1:-1;82355:213:0;;;;;:::i;:::-;;:::i;72063:162::-;;;;;;;;;;-1:-1:-1;72063:162:0;;;;;:::i;:::-;;:::i;86019:222::-;;;;;;;;;;-1:-1:-1;86019:222:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;12994:32:1;;;12976:51;;13058:2;13043:18;;13036:34;;;;12949:18;86019:222:0;12802:274:1;66609:1046:0;;;;;;;;;;-1:-1:-1;66609:1046:0;;;;;:::i;:::-;;:::i;82183:133::-;;;;;;;;;;-1:-1:-1;82183:133:0;;;;;:::i;:::-;;:::i;83400:332::-;;;:::i;72296:177::-;;;;;;;;;;-1:-1:-1;72296:177:0;;;;;:::i;:::-;;:::i;81318:26::-;;;;;;;;;;-1:-1:-1;81318:26:0;;;;;;;;;;;;;;29735:10:1;29723:23;;;29705:42;;29693:2;29678:18;81318:26:0;29561:192:1;66111:198:0;;;;;;;;;;-1:-1:-1;66111:198:0;;;;;:::i;:::-;;:::i;81289:24::-;;;;;;;;;;-1:-1:-1;81289:24:0;;;;;;;;81370:20;;;;;;;;;;-1:-1:-1;81370:20:0;;;;-1:-1:-1;;;81370:20:0;;;;;;84275:204;;;:::i;69380:124::-;;;;;;;;;;-1:-1:-1;69380:124:0;;;;;:::i;:::-;;:::i;81423:24::-;;;;;;;;;;-1:-1:-1;81423:24:0;;;;-1:-1:-1;;;81423:24:0;;;;;;83764:346;;;;;;;;;;-1:-1:-1;83764:346:0;;;;;:::i;:::-;;:::i;83257:137::-;;;;;;;;;;-1:-1:-1;83257:137:0;;;;;:::i;:::-;;:::i;68268:232::-;;;;;;;;;;-1:-1:-1;68268:232:0;;;;;:::i;:::-;;:::i;13636:103::-;;;;;;;;;;;;;:::i;82799:321::-;;;;;;;;;;-1:-1:-1;82799:321:0;;;;;:::i;:::-;;:::i;12985:87::-;;;;;;;;;;-1:-1:-1;13058:6:0;;-1:-1:-1;;;;;13058:6:0;12985:87;;69740:104;;;;;;;;;;;;;:::i;84116:153::-;;;;;;:::i;:::-;;:::i;71462:299::-;;;;;;;;;;-1:-1:-1;71462:299:0;;;;;:::i;:::-;;:::i;87643:180::-;;;;;;;;;;-1:-1:-1;87643:180:0;;;;;:::i;:::-;;:::i;72544:366::-;;;;;;;;;;-1:-1:-1;72544:366:0;;;;;:::i;:::-;;:::i;81395:23::-;;;;;;;;;;-1:-1:-1;81395:23:0;;;;-1:-1:-1;;;81395:23:0;;;;;;81483;;;;;;;;;;-1:-1:-1;81483:23:0;;;;-1:-1:-1;;;;;81483:23:0;;;86366:551;;;;;;;;;;-1:-1:-1;86366:551:0;;;;;:::i;:::-;;:::i;65586:263::-;;;;;;;;;;-1:-1:-1;65586:263:0;;;;;:::i;:::-;;:::i;86247:113::-;;;;;;;;;;-1:-1:-1;86247:113:0;;;;;:::i;:::-;-1:-1:-1;;;;;86336:18:0;86313:7;86336:18;;;:11;:18;;;;;;;86247:113;82671:122;;;;;;;;;;-1:-1:-1;82671:122:0;;;;;:::i;:::-;;:::i;81452:26::-;;;;;;;;;;;;;;;;71832:164;;;;;;;;;;-1:-1:-1;71832:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;71953:25:0;;;71929:4;71953:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;71832:164;84926:618;;;;;;:::i;:::-;;:::i;13894:201::-;;;;;;;;;;-1:-1:-1;13894:201:0;;;;;:::i;:::-;;:::i;64914:81::-;;;;;;;;;;;;64953:42;64914:81;;81349:16;;;;;;;;;;-1:-1:-1;81349:16:0;;;;-1:-1:-1;;;81349:16:0;;;;;;83126:125;;;;;;;;;;-1:-1:-1;83126:125:0;;;;;:::i;:::-;;:::i;85763:250::-;85889:4;-1:-1:-1;;;;;;85919:41:0;;-1:-1:-1;;;85919:41:0;;:88;;;85971:36;85995:11;85971:23;:36::i;:::-;85905:102;85763:250;-1:-1:-1;;85763:250:0:o;84485:435::-;84592:5;86955:574;;87016:1;87008:5;:9;87000:40;;;;-1:-1:-1;;;87000:40:0;;;;;;;:::i;:::-;;;;;;;;;87064:10;;;;87055:19;;;87047:49;;;;-1:-1:-1;;;87047:49:0;;;;;;;:::i;:::-;85742:9;;87131:17;;87147:1;87131:17;:::i;:::-;87122:5;87111:8;:6;:8::i;:::-;:16;;;;:::i;:::-;:37;;87103:68;;;;-1:-1:-1;;;87103:68:0;;;;;;;:::i;:::-;87231:12;;;;;;;87222:5;87194:25;87208:10;87194:13;:25::i;:::-;:33;;;;:::i;:::-;:49;;87178:105;;;;-1:-1:-1;;;87178:105:0;;;;;;;:::i;:::-;87318:5;87311:4;;:12;;;;:::i;:::-;87298:9;:25;;87290:54;;;;-1:-1:-1;;;87290:54:0;;;;;;;:::i;:::-;87355:8;;-1:-1:-1;;;;;87355:8:0;:22;87351:163;;87416:8;;87442:33;;-1:-1:-1;;;87442:33:0;;87464:10;87442:33;;;12247:51:1;-1:-1:-1;;;;;87416:8:0;;;;87388:18;;87416:8;;87442:21;;12220:18:1;;87442:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;87434:72;;;;-1:-1:-1;;;87434:72:0;;;;;;;:::i;:::-;87379:135;87351:163;84617:11:::1;::::0;-1:-1:-1;;;84617:11:0;::::1;;;84609:40;;;::::0;-1:-1:-1;;;84609:40:0;;24568:2:1;84609:40:0::1;::::0;::::1;24550:21:1::0;24607:2;24587:18;;;24580:30;-1:-1:-1;;;24626:18:1;;;24619:46;24682:18;;84609:40:0::1;24366:340:1::0;84609:40:0::1;84664:10;::::0;84656:46:::1;;;::::0;-1:-1:-1;;;84656:46:0;;14122:2:1;84656:46:0::1;::::0;::::1;14104:21:1::0;14161:2;14141:18;;;14134:30;-1:-1:-1;;;14180:18:1;;;14173:47;14237:18;;84656:46:0::1;13920:341:1::0;84656:46:0::1;84725:114;84754:5;;84725:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;84770:10:0::1;::::0;84801:28:::1;::::0;-1:-1:-1;;84818:10:0::1;10248:2:1::0;10244:15;10240:53;84801:28:0::1;::::0;::::1;10228:66:1::0;84770:10:0;;-1:-1:-1;10310:12:1;;;-1:-1:-1;84801:28:0::1;;;;;;;;;;;;84791:39;;;;;;84725:18;:114::i;:::-;84709:168;;;::::0;-1:-1:-1;;;84709:168:0;;15569:2:1;84709:168:0::1;::::0;::::1;15551:21:1::0;15608:2;15588:18;;;15581:30;-1:-1:-1;;;15627:18:1;;;15620:50;15687:18;;84709:168:0::1;15367:344:1::0;84709:168:0::1;84886:28;84896:10;84908:5;84886:28;;:9;:28::i;:::-;84485:435:::0;;;;:::o;85575:85::-;85614:7;85653:1;85637:13;;:17;;;;:::i;:::-;85630:24;;85575:85;:::o;69571:100::-;69625:13;69658:5;69651:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69571:100;:::o;71165:225::-;71233:7;71261:16;71269:7;71261;:16::i;:::-;71253:85;;;;-1:-1:-1;;;71253:85:0;;19147:2:1;71253:85:0;;;19129:21:1;19186:2;19166:18;;;19159:30;19225:34;19205:18;;;19198:62;19296:26;19276:18;;;19269:54;19340:19;;71253:85:0;18945:420:1;71253:85:0;-1:-1:-1;71358:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;71358:24:0;;71165:225::o;70653:446::-;70726:13;70742:35;70769:7;70742:26;:35::i;:::-;70726:51;;70802:5;-1:-1:-1;;;;;70796:11:0;:2;-1:-1:-1;;;;;70796:11:0;;;70788:69;;;;-1:-1:-1;;;70788:69:0;;20866:2:1;70788:69:0;;;20848:21:1;20905:2;20885:18;;;20878:30;20944:34;20924:18;;;20917:62;-1:-1:-1;;;20995:18:1;;;20988:43;21048:19;;70788:69:0;20664:409:1;70788:69:0;11501:10;-1:-1:-1;;;;;70892:21:0;;;;:62;;-1:-1:-1;70917:37:0;70934:5;11501:10;71832:164;:::i;70917:37::-;70870:180;;;;-1:-1:-1;;;70870:180:0;;20389:2:1;70870:180:0;;;20371:21:1;20428:2;20408:18;;;20401:30;;;20467:34;20447:18;;;20440:62;20538:34;20518:18;;;20511:62;-1:-1:-1;;;20589:19:1;;;20582:35;20634:19;;70870:180:0;20187:472:1;70870:180:0;71063:28;71072:2;71076:7;71085:5;71063:8;:28::i;:::-;70715:384;70653:446;;:::o;82574:91::-;13058:6;;-1:-1:-1;;;;;13058:6:0;11501:10;13205:23;13197:68;;;;-1:-1:-1;;;13197:68:0;;;;;;;:::i;:::-;82640:8:::1;:19:::0;;-1:-1:-1;;;;;;82640:19:0::1;-1:-1:-1::0;;;;;82640:19:0;;;::::1;::::0;;;::::1;::::0;;82574:91::o;82355:213::-;13058:6;;-1:-1:-1;;;;;13058:6:0;11501:10;13205:23;13197:68;;;;-1:-1:-1;;;13197:68:0;;;;;;;:::i;:::-;82479:4:::1;:12:::0;;82498:4:::1;:12:::0;;;;-1:-1:-1;;82517:20:0;;;-1:-1:-1;;;82479:12:0;::::1;;::::0;;;::::1;-1:-1:-1::0;;82517:20:0;;;;;;::::1;::::0;;::::1;;;-1:-1:-1::0;;82544:18:0::1;::::0;::::1;::::0;;;::::1;::::0;;82355:213::o;72063:162::-;72189:28;72199:4;72205:2;72209:7;72189:9;:28::i;86019:222::-;86189:9;;86214:12;;86130:16;;;;-1:-1:-1;;;;;86189:9:0;;;;86230:4;;86201:25;;:10;:25;:::i;:::-;86200:34;;;;:::i;:::-;86181:54;;;;86019:222;;;;;:::o;66609:1046::-;66698:7;66734:16;66744:5;66734:9;:16::i;:::-;66726:5;:24;66718:82;;;;-1:-1:-1;;;66718:82:0;;23469:2:1;66718:82:0;;;23451:21:1;23508:2;23488:18;;;23481:30;23547:34;23527:18;;;23520:62;-1:-1:-1;;;23598:18:1;;;23591:43;23651:19;;66718:82:0;23267:409:1;66718:82:0;66811:22;66836:13;85742:9;;;85666:91;66836:13;66811:38;;66860:19;66894:25;67096:9;67091:466;67111:14;67107:1;:18;67091:466;;;67151:31;67185:14;;;:11;:14;;;;;;;;;67151:48;;;;;;;;;-1:-1:-1;;;;;67151:48:0;;;;;-1:-1:-1;;;67151:48:0;;;-1:-1:-1;;;;;67151:48:0;;;;;;;;67222:28;67218:111;;67295:14;;;-1:-1:-1;67218:111:0;67372:5;-1:-1:-1;;;;;67351:26:0;:17;-1:-1:-1;;;;;67351:26:0;;67347:195;;;67421:5;67406:11;:20;67402:85;;;-1:-1:-1;67462:1:0;-1:-1:-1;67455:8:0;;-1:-1:-1;;;67455:8:0;67402:85;67509:13;;;;;67347:195;-1:-1:-1;67127:3:0;;67091:466;;;-1:-1:-1;67580:67:0;;-1:-1:-1;;;67580:67:0;;24913:2:1;67580:67:0;;;24895:21:1;24952:2;24932:18;;;24925:30;24991:34;24971:18;;;24964:62;25062:27;25042:18;;;25035:55;25107:19;;67580:67:0;24711:421:1;82183:133:0;82243:10;81820:42;82243:21;82235:49;;;;-1:-1:-1;;;82235:49:0;;14468:2:1;82235:49:0;;;14450:21:1;14507:2;14487:18;;;14480:30;-1:-1:-1;;;14526:18:1;;;14519:45;14581:18;;82235:49:0;14266:339:1;82235:49:0;82291:11;:19;82183:133::o;83400:332::-;83460:21;83496:11;83488:36;;;;-1:-1:-1;;;83488:36:0;;26102:2:1;83488:36:0;;;26084:21:1;26141:2;26121:18;;;26114:30;-1:-1:-1;;;26160:18:1;;;26153:42;26212:18;;83488:36:0;25900:336:1;83488:36:0;83533:18;83581:4;83570:7;83556:11;;:21;;;;:::i;:::-;83555:30;;;;:::i;:::-;83533:53;;83593:58;81820:42;83640:10;83593:28;:58::i;:::-;83658:68;83695:7;13058:6;;-1:-1:-1;;;;;13058:6:0;;12985:87;83695:7;83705:20;83715:10;83705:7;:20;:::i;:::-;83658:28;:68::i;:::-;83435:297;;83400:332::o;72296:177::-;72426:39;72443:4;72449:2;72453:7;72426:39;;;;;;;;;;;;:16;:39::i;66111:198::-;66178:7;66214:13;85742:9;;;85666:91;66214:13;66206:5;:21;66198:80;;;;-1:-1:-1;;;66198:80:0;;17535:2:1;66198:80:0;;;17517:21:1;17574:2;17554:18;;;17547:30;17613:34;17593:18;;;17586:62;-1:-1:-1;;;17664:18:1;;;17657:44;17718:19;;66198:80:0;17333:410:1;66198:80:0;-1:-1:-1;66296:5:0;66111:198::o;84275:204::-;13058:6;;-1:-1:-1;;;;;13058:6:0;11501:10;13205:23;13197:68;;;;-1:-1:-1;;;13197:68:0;;;;;;;:::i;:::-;84332:9:::1;:13:::0;84328:93:::1;;84356:57;81820:42;84403:9;84356:28;:57::i;:::-;84429:44;84439:7;13058:6:::0;;-1:-1:-1;;;;;13058:6:0;;12985:87;84439:7:::1;84464:8;:6;:8::i;:::-;85742:9:::0;;84448:24:::1;;;;:::i;:::-;84429:9;:44::i;:::-;84275:204::o:0;69380:124::-;69444:7;69471:20;69483:7;69471:11;:20::i;:::-;:25;;69380:124;-1:-1:-1;;69380:124:0:o;83764:346::-;13058:6;;-1:-1:-1;;;;;13058:6:0;11501:10;13205:23;13197:68;;;;-1:-1:-1;;;13197:68:0;;;;;;;:::i;:::-;83904:7:::1;:14;83882:11;:18;:36;83874:45;;;::::0;::::1;;83933:9;83928:177;83952:7;:14;83948:1;:18;83928:177;;;85742:9:::0;;84001:7:::1;84009:1;84001:10;;;;;;;;:::i;:::-;;;;;;;83990:8;:6;:8::i;:::-;:21;;;;:::i;:::-;:38;;83982:69;;;;-1:-1:-1::0;;;83982:69:0::1;;;;;;;:::i;:::-;84060:37;84070:11;84082:1;84070:14;;;;;;;;:::i;:::-;;;;;;;84086:7;84094:1;84086:10;;;;;;;;:::i;:::-;;;;;;;84060:9;:37::i;:::-;83968:3:::0;::::1;::::0;::::1;:::i;:::-;;;;83928:177;;83257:137:::0;13058:6;;-1:-1:-1;;;;;13058:6:0;11501:10;13205:23;13197:68;;;;-1:-1:-1;;;13197:68:0;;;;;;;:::i;:::-;83340:9:::1;:22:::0;;-1:-1:-1;;;;;;83340:22:0::1;-1:-1:-1::0;;;;;83340:22:0;;;::::1;::::0;;;::::1;::::0;;;83369:12:::1;:19:::0;83257:137::o;68268:232::-;68332:7;-1:-1:-1;;;;;68360:19:0;;68352:86;;;;-1:-1:-1;;;68352:86:0;;13699:2:1;68352:86:0;;;13681:21:1;13738:2;13718:18;;;13711:30;13777:34;13757:18;;;13750:62;-1:-1:-1;;;13828:18:1;;;13821:52;13890:19;;68352:86:0;13497:418:1;68352:86:0;-1:-1:-1;;;;;;68464:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;68464:27:0;;68268:232::o;13636:103::-;13058:6;;-1:-1:-1;;;;;13058:6:0;11501:10;13205:23;13197:68;;;;-1:-1:-1;;;13197:68:0;;;;;;;:::i;:::-;13701:30:::1;13728:1;13701:18;:30::i;82799:321::-:0;13058:6;;-1:-1:-1;;;;;13058:6:0;11501:10;13205:23;13197:68;;;;-1:-1:-1;;;13197:68:0;;;;;;;:::i;:::-;82881:8:::1;:20:::0;;-1:-1:-1;;;;82881:20:0::1;-1:-1:-1::0;;;82881:20:0;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;82910:62:::1;;82943:21:::0;;::::1;::::0;:14:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;82910:62;82997:4;82984:17:::0;::::1;;;82980:135;;;83012:15;83036:7;83012:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83057:2;:9;83070:1;83057:14;83053:55;;;83084:14:::0;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;69740:104::-:0;69796:13;69829:7;69822:14;;;;;:::i;84116:153::-;84176:5;87016:1;87008:5;:9;87000:40;;;;-1:-1:-1;;;87000:40:0;;;;;;;:::i;:::-;87064:10;;;;87055:19;;;87047:49;;;;-1:-1:-1;;;87047:49:0;;;;;;;:::i;:::-;85742:9;;87131:17;;87147:1;87131:17;:::i;:::-;87122:5;87111:8;:6;:8::i;:::-;:16;;;;:::i;:::-;:37;;87103:68;;;;-1:-1:-1;;;87103:68:0;;;;;;;:::i;:::-;87231:12;;;;;;;87222:5;87194:25;87208:10;87194:13;:25::i;:::-;:33;;;;:::i;:::-;:49;;87178:105;;;;-1:-1:-1;;;87178:105:0;;;;;;;:::i;:::-;87318:5;87311:4;;:12;;;;:::i;:::-;87298:9;:25;;87290:54;;;;-1:-1:-1;;;87290:54:0;;;;;;;:::i;:::-;87355:8;;-1:-1:-1;;;;;87355:8:0;:22;87351:163;;87416:8;;87442:33;;-1:-1:-1;;;87442:33:0;;87464:10;87442:33;;;12247:51:1;-1:-1:-1;;;;;87416:8:0;;;;87388:18;;87416:8;;87442:21;;12220:18:1;;87442:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;87434:72;;;;-1:-1:-1;;;87434:72:0;;;;;;;:::i;:::-;87379:135;87351:163;84198:4:::1;::::0;-1:-1:-1;;;84198:4:0;::::1;;;:12;;84206:4;84198:12;84190:38;;;::::0;-1:-1:-1;;;84190:38:0;;24226:2:1;84190:38:0::1;::::0;::::1;24208:21:1::0;24265:2;24245:18;;;24238:30;-1:-1:-1;;;24284:18:1;;;24277:43;24337:18;;84190:38:0::1;24024:337:1::0;84190:38:0::1;84235:28;84245:10;84257:5;84235:9;:28::i;71462:299::-:0;-1:-1:-1;;;;;71557:24:0;;11501:10;71557:24;;71549:74;;;;-1:-1:-1;;;71549:74:0;;28755:2:1;71549:74:0;;;28737:21:1;28794:2;28774:18;;;28767:30;28833:34;28813:18;;;28806:62;-1:-1:-1;;;28884:18:1;;;28877:35;28929:19;;71549:74:0;28553:401:1;71549:74:0;11501:10;71636:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;71636:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;71636:53:0;;;;;;;;;;71705:48;;13221:41:1;;;71636:42:0;;11501:10;71705:48;;13194:18:1;71705:48:0;;;;;;;71462:299;;:::o;87643:180::-;9680:13;;;;;;;:48;;9716:12;;;;9715:13;9680:48;;;10483:4;1245:20;1293:8;9696:16;9672:107;;;;-1:-1:-1;;;9672:107:0;;19974:2:1;9672:107:0;;;19956:21:1;20013:2;19993:18;;;19986:30;20052:34;20032:18;;;20025:62;-1:-1:-1;;;20103:18:1;;;20096:44;20157:19;;9672:107:0;19772:410:1;9672:107:0;9792:19;9815:13;;;;;;9814:14;9839:101;;;;9874:13;:20;;-1:-1:-1;;9909:19:0;;;;;9839:101;87773:44:::1;87790:5;87797:7;87806:10;87773:16;:44::i;:::-;9970:14:::0;9966:68;;;10017:5;10001:21;;-1:-1:-1;;10001:21:0;;;9387:654;87643:180;;;:::o;72544:366::-;72703:28;72713:4;72719:2;72723:7;72703:9;:28::i;:::-;72764:48;72787:4;72793:2;72797:7;72806:5;72764:22;:48::i;:::-;72742:160;;;;-1:-1:-1;;;72742:160:0;;;;;;;:::i;86366:551::-;86452:13;86485:17;86493:8;86485:7;:17::i;:::-;86477:44;;;;-1:-1:-1;;;86477:44:0;;23883:2:1;86477:44:0;;;23865:21:1;23922:2;23902:18;;;23895:30;-1:-1:-1;;;23941:18:1;;;23934:44;23995:18;;86477:44:0;23681:338:1;86477:44:0;86532:8;;-1:-1:-1;;;86532:8:0;;;;86528:218;;86626:14;86655:37;86683:8;86655:27;:37::i;:::-;86595:132;;;;;;;;;:::i;:::-;;;;;;;;;;;;;86560:178;;86366:551;;;:::o;86528:218::-;86814:7;86834:37;86862:8;86834:27;:37::i;65586:263::-;10283:13;;;;;;;10275:69;;;;-1:-1:-1;;;10275:69:0;;;;;;;:::i;:::-;65697:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;65721:17:0;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;65765:1:0::1;65749:13;:17:::0;65779:25:::1;:23;:25::i;:::-;65815:26;:24;:26::i;82671:122::-:0;13058:6;;-1:-1:-1;;;;;13058:6:0;11501:10;13205:23;13197:68;;;;-1:-1:-1;;;13197:68:0;;;;;;;:::i;:::-;82744:11:::1;:19:::0;;;::::1;;-1:-1:-1::0;;;82744:19:0::1;-1:-1:-1::0;;;;82744:19:0;;::::1;::::0;;;::::1;::::0;;;82770:10:::1;:17:::0;82671:122::o;84926:618::-;85026:5;86955:574;;87016:1;87008:5;:9;87000:40;;;;-1:-1:-1;;;87000:40:0;;;;;;;:::i;:::-;87064:10;;;;87055:19;;;87047:49;;;;-1:-1:-1;;;87047:49:0;;;;;;;:::i;:::-;85742:9;;87131:17;;87147:1;87131:17;:::i;:::-;87122:5;87111:8;:6;:8::i;:::-;:16;;;;:::i;:::-;:37;;87103:68;;;;-1:-1:-1;;;87103:68:0;;;;;;;:::i;:::-;87231:12;;;;;;;87222:5;87194:25;87208:10;87194:13;:25::i;:::-;:33;;;;:::i;:::-;:49;;87178:105;;;;-1:-1:-1;;;87178:105:0;;;;;;;:::i;:::-;87318:5;87311:4;;:12;;;;:::i;:::-;87298:9;:25;;87290:54;;;;-1:-1:-1;;;87290:54:0;;;;;;;:::i;:::-;87355:8;;-1:-1:-1;;;;;87355:8:0;:22;87351:163;;87416:8;;87442:33;;-1:-1:-1;;;87442:33:0;;87464:10;87442:33;;;12247:51:1;-1:-1:-1;;;;;87416:8:0;;;;87388:18;;87416:8;;87442:21;;12220:18:1;;87442:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;87434:72;;;;-1:-1:-1;;;87434:72:0;;;;;;;:::i;:::-;87379:135;87351:163;85051:12:::1;::::0;-1:-1:-1;;;85051:12:0;::::1;;;:20;;85067:4;85051:20;85043:51;;;::::0;-1:-1:-1;;;85043:51:0;;16348:2:1;85043:51:0::1;::::0;::::1;16330:21:1::0;16387:2;16367:18;;;16360:30;-1:-1:-1;;;16406:18:1;;;16399:48;16464:18;;85043:51:0::1;16146:342:1::0;85043:51:0::1;85109:4;::::0;-1:-1:-1;;;85109:4:0;::::1;;;:12;;85117:4;85109:12;85101:38;;;::::0;-1:-1:-1;;;85101:38:0;;24226:2:1;85101:38:0::1;::::0;::::1;24208:21:1::0;24265:2;24245:18;;;24238:30;-1:-1:-1;;;24284:18:1;;;24277:43;24337:18;;85101:38:0::1;24024:337:1::0;85101:38:0::1;85168:1;85154:11;;:15;85146:46;;;::::0;-1:-1:-1;;;85146:46:0;;21978:2:1;85146:46:0::1;::::0;::::1;21960:21:1::0;22017:2;21997:18;;;21990:30;-1:-1:-1;;;22036:18:1;;;22029:48;22094:18;;85146:46:0::1;21776:342:1::0;85146:46:0::1;85233:1;85207:23;85221:8;85207:13;:23::i;:::-;:27;85199:63;;;::::0;-1:-1:-1;;;85199:63:0;;22325:2:1;85199:63:0::1;::::0;::::1;22307:21:1::0;22364:2;22344:18;;;22337:30;22403:25;22383:18;;;22376:53;22446:18;;85199:63:0::1;22123:347:1::0;85199:63:0::1;85277:10;-1:-1:-1::0;;;;;85277:22:0;::::1;;;85269:56;;;::::0;-1:-1:-1;;;85269:56:0;;14812:2:1;85269:56:0::1;::::0;::::1;14794:21:1::0;14851:2;14831:18;;;14824:30;-1:-1:-1;;;14870:18:1;;;14863:51;14931:18;;85269:56:0::1;14610:345:1::0;85269:56:0::1;85334:28;85344:10;85356:5;85334:28;;:9;:28::i;:::-;-1:-1:-1::0;;;;;85371:21:0;::::1;;::::0;;;:11:::1;:21;::::0;;;;:26;;85396:1:::1;::::0;85371:21;:26:::1;::::0;85396:1;;85371:26:::1;:::i;:::-;::::0;;;-1:-1:-1;;85432:11:0::1;::::0;-1:-1:-1;;;;;85408:21:0;::::1;;::::0;;;:11:::1;:21;::::0;;;;;:35:::1;::::0;85432:11;85408:35:::1;:::i;:::-;85404:135;;85742:9:::0;;85463:8:::1;:6;:8::i;:::-;:24;85459:73;;;85500:22;85510:8;85520:1;85500:9;:22::i;13894:201::-:0;13058:6;;-1:-1:-1;;;;;13058:6:0;11501:10;13205:23;13197:68;;;;-1:-1:-1;;;13197:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13983:22:0;::::1;13975:73;;;::::0;-1:-1:-1;;;13975:73:0;;15162:2:1;13975:73:0::1;::::0;::::1;15144:21:1::0;15201:2;15181:18;;;15174:30;15240:34;15220:18;;;15213:62;-1:-1:-1;;;15291:18:1;;;15284:36;15337:19;;13975:73:0::1;14960:402:1::0;13975:73:0::1;14059:28;14078:8;14059:18;:28::i;:::-;13894:201:::0;:::o;83126:125::-;13058:6;;-1:-1:-1;;;;;13058:6:0;11501:10;13205:23;13197:68;;;;-1:-1:-1;;;13197:68:0;;;;;;;:::i;:::-;83200:12:::1;:20:::0;;;::::1;;-1:-1:-1::0;;;83200:20:0::1;-1:-1:-1::0;;;;83200:20:0;;::::1;::::0;;;::::1;::::0;;;83227:11:::1;:18:::0;83126:125::o;67727:477::-;67896:4;-1:-1:-1;;;;;;67938:51:0;;-1:-1:-1;;;67938:51:0;;:127;;-1:-1:-1;;;;;;;68006:59:0;;-1:-1:-1;;;68006:59:0;67938:127;:205;;;-1:-1:-1;;;;;;;68082:61:0;;-1:-1:-1;;;68082:61:0;67938:205;:258;;;-1:-1:-1;;;;;;;;;;63638:51:0;;;68160:36;63529:168;68508:243;68570:7;-1:-1:-1;;;;;68598:20:0;;68590:93;;;;-1:-1:-1;;;68590:93:0;;27979:2:1;68590:93:0;;;27961:21:1;28018:2;27998:18;;;27991:30;28057:34;28037:18;;;28030:62;28128:30;28108:18;;;28101:58;28176:19;;68590:93:0;27777:424:1;68590:93:0;-1:-1:-1;;;;;;68709:20:0;;;;;:12;:20;;;;;:33;-1:-1:-1;;;68709:33:0;;-1:-1:-1;;;;;68709:33:0;;68508:243::o;17563:190::-;17688:4;17741;17712:25;17725:5;17732:4;17712:12;:25::i;:::-;:33;;17563:190;-1:-1:-1;;;;17563:190:0:o;73353:104::-;73422:27;73432:2;73436:8;73422:27;;;;;;;;;;;;:9;:27::i;73165:180::-;73222:4;73257:1;73247:7;:11;73239:57;;;;-1:-1:-1;;;73239:57:0;;19572:2:1;73239:57:0;;;19554:21:1;19611:2;19591:18;;;19584:30;19650:34;19630:18;;;19623:62;-1:-1:-1;;;19701:18:1;;;19694:31;19742:19;;73239:57:0;19370:397:1;73239:57:0;-1:-1:-1;73324:13:0;;-1:-1:-1;73314:23:0;73165:180::o;78074:196::-;78189:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;78189:29:0;-1:-1:-1;;;;;78189:29:0;;;;;;;;;78234:28;;78189:24;;78234:28;;;;;;;78074:196;;;:::o;75921:2035::-;76036:35;76074:20;76086:7;76074:11;:20::i;:::-;76149:18;;76036:58;;-1:-1:-1;76107:22:0;;-1:-1:-1;;;;;76133:34:0;11501:10;-1:-1:-1;;;;;76133:34:0;;:87;;;-1:-1:-1;11501:10:0;76184:20;76196:7;76184:11;:20::i;:::-;-1:-1:-1;;;;;76184:36:0;;76133:87;:154;;;-1:-1:-1;76254:18:0;;76237:50;;11501:10;71832:164;:::i;76237:50::-;76107:181;;76309:17;76301:91;;;;-1:-1:-1;;;76301:91:0;;15918:2:1;76301:91:0;;;15900:21:1;15957:2;15937:18;;;15930:30;15996:34;15976:18;;;15969:62;16067:31;16047:18;;;16040:59;16116:19;;76301:91:0;15716:425:1;76301:91:0;76435:4;-1:-1:-1;;;;;76413:26:0;:13;:18;;;-1:-1:-1;;;;;76413:26:0;;76405:88;;;;-1:-1:-1;;;76405:88:0;;27561:2:1;76405:88:0;;;27543:21:1;27600:2;27580:18;;;27573:30;27639:34;27619:18;;;27612:62;-1:-1:-1;;;27690:18:1;;;27683:47;27747:19;;76405:88:0;27359:413:1;76405:88:0;-1:-1:-1;;;;;76512:16:0;;76504:77;;;;-1:-1:-1;;;76504:77:0;;18308:2:1;76504:77:0;;;18290:21:1;18347:2;18327:18;;;18320:30;18386:34;18366:18;;;18359:62;-1:-1:-1;;;18437:18:1;;;18430:46;18493:19;;76504:77:0;18106:412:1;76504:77:0;76702:49;76719:1;76723:7;76732:13;:18;;;76702:8;:49::i;:::-;-1:-1:-1;;;;;77047:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;;;;;77047:31:0;;;-1:-1:-1;;;;;77047:31:0;;;-1:-1:-1;;77047:31:0;;;;;;;77093:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;77093:29:0;;;;;;;;;;;;;77139:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;77184:61:0;;;;-1:-1:-1;;;77229:15:0;-1:-1:-1;;;;;77184:61:0;;;;;77519:11;;;77549:24;;;;;:29;77519:11;;77549:29;77545:295;;77617:20;77625:11;77617:7;:20::i;:::-;77613:212;;;77694:18;;;77662:24;;;:11;:24;;;;;;;;:50;;77777:28;;;;-1:-1:-1;;;;;77735:70:0;-1:-1:-1;;;77735:70:0;-1:-1:-1;;;;;;77735:70:0;;;-1:-1:-1;;;;;77662:50:0;;;77735:70;;;;;;;77613:212;77022:829;77887:7;77883:2;-1:-1:-1;;;;;77868:27:0;77877:4;-1:-1:-1;;;;;77868:27:0;;;;;;;;;;;77906:42;76025:1931;;75921:2035;;;:::o;2244:317::-;2359:6;2334:21;:31;;2326:73;;;;-1:-1:-1;;;2326:73:0;;17950:2:1;2326:73:0;;;17932:21:1;17989:2;17969:18;;;17962:30;18028:31;18008:18;;;18001:59;18077:18;;2326:73:0;17748:353:1;2326:73:0;2413:12;2431:9;-1:-1:-1;;;;;2431:14:0;2453:6;2431:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2412:52;;;2483:7;2475:78;;;;-1:-1:-1;;;2475:78:0;;16695:2:1;2475:78:0;;;16677:21:1;16734:2;16714:18;;;16707:30;16773:34;16753:18;;;16746:62;16844:28;16824:18;;;16817:56;16890:19;;2475:78:0;16493:422:1;68759:559:0;-1:-1:-1;;;;;;;;;;;;;;;;;68862:16:0;68870:7;68862;:16::i;:::-;68854:82;;;;-1:-1:-1;;;68854:82:0;;18725:2:1;68854:82:0;;;18707:21:1;18764:2;18744:18;;;18737:30;18803:34;18783:18;;;18776:62;-1:-1:-1;;;18854:18:1;;;18847:51;18915:19;;68854:82:0;18523:417:1;68854:82:0;68994:7;68974:245;69041:31;69075:17;;;:11;:17;;;;;;;;;69041:51;;;;;;;;;-1:-1:-1;;;;;69041:51:0;;;;;-1:-1:-1;;;69041:51:0;;;-1:-1:-1;;;;;69041:51:0;;;;;;;;69115:28;69111:93;;69175:9;68759:559;-1:-1:-1;;;68759:559:0:o;69111:93::-;-1:-1:-1;;;69014:6:0;68974:245;;14255:191;14348:6;;;-1:-1:-1;;;;;14365:17:0;;;-1:-1:-1;;;;;;14365:17:0;;;;;;;14398:40;;14348:6;;;14365:17;14348:6;;14398:40;;14329:16;;14398:40;14318:128;14255:191;:::o;81869:277::-;10283:13;;;;;;;10275:69;;;;-1:-1:-1;;;10275:69:0;;;;;;;:::i;:::-;82012:30:::1;82027:5;82034:7;82012:14;:30::i;:::-;82049:16;:14;:16::i;:::-;82072:9;:22:::0;-1:-1:-1;;82115:2:0::1;82101:11;:16:::0;82124:8:::1;:16:::0;;-1:-1:-1;;;;82124:16:0::1;::::0;;81869:277::o;78835:869::-;78990:4;-1:-1:-1;;;;;79011:13:0;;1245:20;1293:8;79007:690;;79047:83;;-1:-1:-1;;;79047:83:0;;-1:-1:-1;;;;;79047:47:0;;;;;:83;;11501:10;;79109:4;;79115:7;;79124:5;;79047:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;79047:83:0;;;;;;;;-1:-1:-1;;79047:83:0;;;;;;;;;;;;:::i;:::-;;;79043:599;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;79347:13:0;;79343:284;;79390:72;;-1:-1:-1;;;79390:72:0;;;;;;;:::i;79343:284::-;79577:6;79571:13;79562:6;79558:2;79554:15;79547:38;79043:599;-1:-1:-1;;;;;;79213:66:0;-1:-1:-1;;;79213:66:0;;-1:-1:-1;79206:73:0;;79007:690;-1:-1:-1;79681:4:0;79007:690;78835:869;;;;;;:::o;14890:723::-;14946:13;15167:10;15163:53;;-1:-1:-1;;15194:10:0;;;;;;;;;;;;-1:-1:-1;;;15194:10:0;;;;;14890:723::o;15163:53::-;15241:5;15226:12;15282:78;15289:9;;15282:78;;15315:8;;;;:::i;:::-;;-1:-1:-1;15338:10:0;;-1:-1:-1;15346:2:0;15338:10;;:::i;:::-;;;15282:78;;;15370:19;15402:6;-1:-1:-1;;;;;15392:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15392:17:0;;15370:39;;15420:154;15427:10;;15420:154;;15454:11;15464:1;15454:11;;:::i;:::-;;-1:-1:-1;15523:10:0;15531:2;15523:5;:10;:::i;:::-;15510:24;;:2;:24;:::i;:::-;15497:39;;15480:6;15487;15480:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;15480:56:0;;;;;;;;-1:-1:-1;15551:11:0;15560:2;15551:11;;:::i;:::-;;;15420:154;;63390:69;10283:13;;;;;;;10275:69;;;;-1:-1:-1;;;10275:69:0;;;;;;;:::i;18115:701::-;18198:7;18241:4;18198:7;18256:523;18280:5;:12;18276:1;:16;18256:523;;;18314:20;18337:5;18343:1;18337:8;;;;;;;;:::i;:::-;;;;;;;18314:31;;18380:12;18364;:28;18360:408;;18517:44;;;;;;10490:19:1;;;10525:12;;;10518:28;;;10562:12;;18517:44:0;;;;;;;;;;;;18507:55;;;;;;18492:70;;18360:408;;;18707:44;;;;;;10490:19:1;;;10525:12;;;10518:28;;;10562:12;;18707:44:0;;;;;;;;;;;;18697:55;;;;;;18682:70;;18360:408;-1:-1:-1;18294:3:0;;;;:::i;:::-;;;;18256:523;;;-1:-1:-1;18796:12:0;18115:701;-1:-1:-1;;;18115:701:0:o;73671:163::-;73794:32;73800:2;73804:8;73814:5;73821:4;73794:5;:32::i;12649:134::-;10283:13;;;;;;;10275:69;;;;-1:-1:-1;;;10275:69:0;;;;;;;:::i;:::-;12712:26:::1;:24;:26::i;:::-;12749;:24;:26::i;74093:1574::-:0;74255:13;;-1:-1:-1;;;;;74287:16:0;;74279:73;;;;-1:-1:-1;;;74279:73:0;;17122:2:1;74279:73:0;;;17104:21:1;17161:2;17141:18;;;17134:30;17200:34;17180:18;;;17173:62;-1:-1:-1;;;17251:18:1;;;17244:42;17303:19;;74279:73:0;16920:408:1;74279:73:0;74371:13;74363:77;;;;-1:-1:-1;;;74363:77:0;;29161:2:1;74363:77:0;;;29143:21:1;29200:2;29180:18;;;29173:30;29239:34;29219:18;;;29212:62;-1:-1:-1;;;29290:18:1;;;29283:49;29349:19;;74363:77:0;28959:415:1;74363:77:0;-1:-1:-1;;;;;74793:16:0;;;;;;:12;:16;;;;;;;;:45;;-1:-1:-1;;;;;;;;;74793:45:0;;-1:-1:-1;;;;;74793:45:0;;;;;;;;;;74853:50;;;;;;;;;;;;;;74920:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;74970:66:0;;;;-1:-1:-1;;;75020:15:0;-1:-1:-1;;;;;74970:66:0;;;;;;74920:25;;75105:426;75125:8;75121:1;:12;75105:426;;;75164:38;;75189:12;;-1:-1:-1;;;;;75164:38:0;;;75181:1;;75164:38;;75181:1;;75164:38;75225:4;75221:260;;;75288:59;75319:1;75323:2;75327:12;75341:5;75288:22;:59::i;:::-;75254:207;;;;-1:-1:-1;;;75254:207:0;;;;;;;:::i;:::-;75501:14;;;;;75135:3;75105:426;;;-1:-1:-1;75547:13:0;:28;75599:60;84485:435;12791:113;10283:13;;;;;;;10275:69;;;;-1:-1:-1;;;10275:69:0;;;;;;;:::i;:::-;12864:32:::1;11501:10:::0;12864:18:::1;:32::i;-1:-1:-1:-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:673::-;657:5;710:3;703:4;695:6;691:17;687:27;677:55;;728:1;725;718:12;677:55;764:6;751:20;790:4;814:60;830:43;870:2;830:43;:::i;:::-;814:60;:::i;:::-;896:3;920:2;915:3;908:15;948:2;943:3;939:12;932:19;;983:2;975:6;971:15;1035:3;1030:2;1024;1021:1;1017:10;1009:6;1005:23;1001:32;998:41;995:61;;;1052:1;1049;1042:12;995:61;1074:1;1084:163;1098:2;1095:1;1092:9;1084:163;;;1155:17;;1143:30;;1193:12;;;;1225;;;;1116:1;1109:9;1084:163;;;-1:-1:-1;1265:5:1;;603:673;-1:-1:-1;;;;;;;603:673:1:o;1281:160::-;1346:20;;1402:13;;1395:21;1385:32;;1375:60;;1431:1;1428;1421:12;1446:221;1489:5;1542:3;1535:4;1527:6;1523:17;1519:27;1509:55;;1560:1;1557;1550:12;1509:55;1582:79;1657:3;1648:6;1635:20;1628:4;1620:6;1616:17;1582:79;:::i;:::-;1573:88;1446:221;-1:-1:-1;;;1446:221:1:o;1672:163::-;1739:20;;1799:10;1788:22;;1778:33;;1768:61;;1825:1;1822;1815:12;1840:186;1899:6;1952:2;1940:9;1931:7;1927:23;1923:32;1920:52;;;1968:1;1965;1958:12;1920:52;1991:29;2010:9;1991:29;:::i;2031:260::-;2099:6;2107;2160:2;2148:9;2139:7;2135:23;2131:32;2128:52;;;2176:1;2173;2166:12;2128:52;2199:29;2218:9;2199:29;:::i;:::-;2189:39;;2247:38;2281:2;2270:9;2266:18;2247:38;:::i;:::-;2237:48;;2031:260;;;;;:::o;2296:328::-;2373:6;2381;2389;2442:2;2430:9;2421:7;2417:23;2413:32;2410:52;;;2458:1;2455;2448:12;2410:52;2481:29;2500:9;2481:29;:::i;:::-;2471:39;;2529:38;2563:2;2552:9;2548:18;2529:38;:::i;:::-;2519:48;;2614:2;2603:9;2599:18;2586:32;2576:42;;2296:328;;;;;:::o;2629:666::-;2724:6;2732;2740;2748;2801:3;2789:9;2780:7;2776:23;2772:33;2769:53;;;2818:1;2815;2808:12;2769:53;2841:29;2860:9;2841:29;:::i;:::-;2831:39;;2889:38;2923:2;2912:9;2908:18;2889:38;:::i;:::-;2879:48;;2974:2;2963:9;2959:18;2946:32;2936:42;;3029:2;3018:9;3014:18;3001:32;-1:-1:-1;;;;;3048:6:1;3045:30;3042:50;;;3088:1;3085;3078:12;3042:50;3111:22;;3164:4;3156:13;;3152:27;-1:-1:-1;3142:55:1;;3193:1;3190;3183:12;3142:55;3216:73;3281:7;3276:2;3263:16;3258:2;3254;3250:11;3216:73;:::i;:::-;3206:83;;;2629:666;;;;;;;:::o;3300:254::-;3365:6;3373;3426:2;3414:9;3405:7;3401:23;3397:32;3394:52;;;3442:1;3439;3432:12;3394:52;3465:29;3484:9;3465:29;:::i;:::-;3455:39;;3513:35;3544:2;3533:9;3529:18;3513:35;:::i;3559:254::-;3627:6;3635;3688:2;3676:9;3667:7;3663:23;3659:32;3656:52;;;3704:1;3701;3694:12;3656:52;3727:29;3746:9;3727:29;:::i;:::-;3717:39;3803:2;3788:18;;;;3775:32;;-1:-1:-1;;;3559:254:1:o;3818:1157::-;3936:6;3944;3997:2;3985:9;3976:7;3972:23;3968:32;3965:52;;;4013:1;4010;4003:12;3965:52;4053:9;4040:23;-1:-1:-1;;;;;4123:2:1;4115:6;4112:14;4109:34;;;4139:1;4136;4129:12;4109:34;4177:6;4166:9;4162:22;4152:32;;4222:7;4215:4;4211:2;4207:13;4203:27;4193:55;;4244:1;4241;4234:12;4193:55;4280:2;4267:16;4302:4;4326:60;4342:43;4382:2;4342:43;:::i;4326:60::-;4408:3;4432:2;4427:3;4420:15;4460:2;4455:3;4451:12;4444:19;;4491:2;4487;4483:11;4539:7;4534:2;4528;4525:1;4521:10;4517:2;4513:19;4509:28;4506:41;4503:61;;;4560:1;4557;4550:12;4503:61;4582:1;4573:10;;4592:169;4606:2;4603:1;4600:9;4592:169;;;4663:23;4682:3;4663:23;:::i;:::-;4651:36;;4624:1;4617:9;;;;;4707:12;;;;4739;;4592:169;;;-1:-1:-1;4780:5:1;-1:-1:-1;;4823:18:1;;4810:32;;-1:-1:-1;;4854:16:1;;;4851:36;;;4883:1;4880;4873:12;4851:36;;4906:63;4961:7;4950:8;4939:9;4935:24;4906:63;:::i;:::-;4896:73;;;3818:1157;;;;;:::o;4980:248::-;5045:6;5053;5106:2;5094:9;5085:7;5081:23;5077:32;5074:52;;;5122:1;5119;5112:12;5074:52;5145:26;5161:9;5145:26;:::i;5233:390::-;5308:6;5316;5369:2;5357:9;5348:7;5344:23;5340:32;5337:52;;;5385:1;5382;5375:12;5337:52;5408:26;5424:9;5408:26;:::i;:::-;5398:36;;5485:2;5474:9;5470:18;5457:32;-1:-1:-1;;;;;5504:6:1;5501:30;5498:50;;;5544:1;5541;5534:12;5498:50;5567;5609:7;5600:6;5589:9;5585:22;5567:50;:::i;5881:393::-;5962:6;5970;5978;5986;6039:3;6027:9;6018:7;6014:23;6010:33;6007:53;;;6056:1;6053;6046:12;6007:53;6079:26;6095:9;6079:26;:::i;:::-;6069:36;;6152:2;6141:9;6137:18;6124:32;6114:42;;6175:37;6208:2;6197:9;6193:18;6175:37;:::i;:::-;6165:47;;6231:37;6264:2;6253:9;6249:18;6231:37;:::i;:::-;6221:47;;5881:393;;;;;;;:::o;6279:245::-;6337:6;6390:2;6378:9;6369:7;6365:23;6361:32;6358:52;;;6406:1;6403;6396:12;6358:52;6445:9;6432:23;6464:30;6488:5;6464:30;:::i;6529:249::-;6598:6;6651:2;6639:9;6630:7;6626:23;6622:32;6619:52;;;6667:1;6664;6657:12;6619:52;6699:9;6693:16;6718:30;6742:5;6718:30;:::i;6783:543::-;6871:6;6879;6932:2;6920:9;6911:7;6907:23;6903:32;6900:52;;;6948:1;6945;6938:12;6900:52;6988:9;6975:23;-1:-1:-1;;;;;7058:2:1;7050:6;7047:14;7044:34;;;7074:1;7071;7064:12;7044:34;7097:50;7139:7;7130:6;7119:9;7115:22;7097:50;:::i;:::-;7087:60;;7200:2;7189:9;7185:18;7172:32;7156:48;;7229:2;7219:8;7216:16;7213:36;;;7245:1;7242;7235:12;7213:36;;7268:52;7312:7;7301:8;7290:9;7286:24;7268:52;:::i;7331:611::-;7428:6;7436;7444;7497:2;7485:9;7476:7;7472:23;7468:32;7465:52;;;7513:1;7510;7503:12;7465:52;7553:9;7540:23;-1:-1:-1;;;;;7623:2:1;7615:6;7612:14;7609:34;;;7639:1;7636;7629:12;7609:34;7662:50;7704:7;7695:6;7684:9;7680:22;7662:50;:::i;:::-;7652:60;;7765:2;7754:9;7750:18;7737:32;7721:48;;7794:2;7784:8;7781:16;7778:36;;;7810:1;7807;7800:12;7778:36;;7833:52;7877:7;7866:8;7855:9;7851:24;7833:52;:::i;:::-;7823:62;;;7932:2;7921:9;7917:18;7904:32;7894:42;;7331:611;;;;;:::o;7947:180::-;8006:6;8059:2;8047:9;8038:7;8034:23;8030:32;8027:52;;;8075:1;8072;8065:12;8027:52;-1:-1:-1;8098:23:1;;7947:180;-1:-1:-1;7947:180:1:o;8132:184::-;8202:6;8255:2;8243:9;8234:7;8230:23;8226:32;8223:52;;;8271:1;8268;8261:12;8223:52;-1:-1:-1;8294:16:1;;8132:184;-1:-1:-1;8132:184:1:o;8321:248::-;8389:6;8397;8450:2;8438:9;8429:7;8425:23;8421:32;8418:52;;;8466:1;8463;8456:12;8418:52;-1:-1:-1;;8489:23:1;;;8559:2;8544:18;;;8531:32;;-1:-1:-1;8321:248:1:o;8574:258::-;8641:6;8649;8702:2;8690:9;8681:7;8677:23;8673:32;8670:52;;;8718:1;8715;8708:12;8670:52;8741:28;8759:9;8741:28;:::i;8837:687::-;8931:6;8939;8947;9000:2;8988:9;8979:7;8975:23;8971:32;8968:52;;;9016:1;9013;9006:12;8968:52;9039:28;9057:9;9039:28;:::i;:::-;9029:38;;9118:2;9107:9;9103:18;9090:32;-1:-1:-1;;;;;9182:2:1;9174:6;9171:14;9168:34;;;9198:1;9195;9188:12;9168:34;9236:6;9225:9;9221:22;9211:32;;9281:7;9274:4;9270:2;9266:13;9262:27;9252:55;;9303:1;9300;9293:12;9252:55;9343:2;9330:16;9369:2;9361:6;9358:14;9355:34;;;9385:1;9382;9375:12;9355:34;9438:7;9433:2;9423:6;9420:1;9416:14;9412:2;9408:23;9404:32;9401:45;9398:65;;;9459:1;9456;9449:12;9398:65;9490:2;9486;9482:11;9472:21;;9512:6;9502:16;;;;;8837:687;;;;;:::o;9529:257::-;9570:3;9608:5;9602:12;9635:6;9630:3;9623:19;9651:63;9707:6;9700:4;9695:3;9691:14;9684:4;9677:5;9673:16;9651:63;:::i;:::-;9768:2;9747:15;-1:-1:-1;;9743:29:1;9734:39;;;;9775:4;9730:50;;9529:257;-1:-1:-1;;9529:257:1:o;9791:185::-;9833:3;9871:5;9865:12;9886:52;9931:6;9926:3;9919:4;9912:5;9908:16;9886:52;:::i;:::-;9954:16;;;;;9791:185;-1:-1:-1;;9791:185:1:o;10585:1301::-;10862:3;10891:1;10924:6;10918:13;10954:3;10976:1;11004:9;11000:2;10996:18;10986:28;;11064:2;11053:9;11049:18;11086;11076:61;;11130:4;11122:6;11118:17;11108:27;;11076:61;11156:2;11204;11196:6;11193:14;11173:18;11170:38;11167:165;;;-1:-1:-1;;;11231:33:1;;11287:4;11284:1;11277:15;11317:4;11238:3;11305:17;11167:165;11348:18;11375:104;;;;11493:1;11488:320;;;;11341:467;;11375:104;-1:-1:-1;;11408:24:1;;11396:37;;11453:16;;;;-1:-1:-1;11375:104:1;;11488:320;30299:1;30292:14;;;30336:4;30323:18;;11583:1;11597:165;11611:6;11608:1;11605:13;11597:165;;;11689:14;;11676:11;;;11669:35;11732:16;;;;11626:10;;11597:165;;;11601:3;;11791:6;11786:3;11782:16;11775:23;;11341:467;;;;;;;11824:56;11849:30;11875:3;11867:6;11849:30;:::i;:::-;-1:-1:-1;;;10041:20:1;;10086:1;10077:11;;9981:113;11824:56;11817:63;10585:1301;-1:-1:-1;;;;;10585:1301:1:o;12309:488::-;-1:-1:-1;;;;;12578:15:1;;;12560:34;;12630:15;;12625:2;12610:18;;12603:43;12677:2;12662:18;;12655:34;;;12725:3;12720:2;12705:18;;12698:31;;;12503:4;;12746:45;;12771:19;;12763:6;12746:45;:::i;:::-;12738:53;12309:488;-1:-1:-1;;;;;;12309:488:1:o;13273:219::-;13422:2;13411:9;13404:21;13385:4;13442:44;13482:2;13471:9;13467:18;13459:6;13442:44;:::i;21078:346::-;21280:2;21262:21;;;21319:2;21299:18;;;21292:30;-1:-1:-1;;;21353:2:1;21338:18;;21331:52;21415:2;21400:18;;21078:346::o;21429:342::-;21631:2;21613:21;;;21670:2;21650:18;;;21643:30;-1:-1:-1;;;21704:2:1;21689:18;;21682:48;21762:2;21747:18;;21429:342::o;22475:356::-;22677:2;22659:21;;;22696:18;;;22689:30;22755:34;22750:2;22735:18;;22728:62;22822:2;22807:18;;22475:356::o;22836:426::-;23038:2;23020:21;;;23077:2;23057:18;;;23050:30;23116:34;23111:2;23096:18;;23089:62;23187:32;23182:2;23167:18;;23160:60;23252:3;23237:19;;22836:426::o;25137:346::-;25339:2;25321:21;;;25378:2;25358:18;;;25351:30;-1:-1:-1;;;25412:2:1;25397:18;;25390:52;25474:2;25459:18;;25137:346::o;25488:407::-;25690:2;25672:21;;;25729:2;25709:18;;;25702:30;25768:34;25763:2;25748:18;;25741:62;-1:-1:-1;;;25834:2:1;25819:18;;25812:41;25885:3;25870:19;;25488:407::o;26241:340::-;26443:2;26425:21;;;26482:2;26462:18;;;26455:30;-1:-1:-1;;;26516:2:1;26501:18;;26494:46;26572:2;26557:18;;26241:340::o;27013:341::-;27215:2;27197:21;;;27254:2;27234:18;;;27227:30;-1:-1:-1;;;27288:2:1;27273:18;;27266:47;27345:2;27330:18;;27013:341::o;28206:342::-;28408:2;28390:21;;;28447:2;28427:18;;;28420:30;-1:-1:-1;;;28481:2:1;28466:18;;28459:48;28539:2;28524:18;;28206:342::o;29758:275::-;29829:2;29823:9;29894:2;29875:13;;-1:-1:-1;;29871:27:1;29859:40;;-1:-1:-1;;;;;29914:34:1;;29950:22;;;29911:62;29908:88;;;29976:18;;:::i;:::-;30012:2;30005:22;29758:275;;-1:-1:-1;29758:275:1:o;30038:183::-;30098:4;-1:-1:-1;;;;;30123:6:1;30120:30;30117:56;;;30153:18;;:::i;:::-;-1:-1:-1;30198:1:1;30194:14;30210:4;30190:25;;30038:183::o;30352:128::-;30392:3;30423:1;30419:6;30416:1;30413:13;30410:39;;;30429:18;;:::i;:::-;-1:-1:-1;30465:9:1;;30352:128::o;30485:120::-;30525:1;30551;30541:35;;30556:18;;:::i;:::-;-1:-1:-1;30590:9:1;;30485:120::o;30610:168::-;30650:7;30716:1;30712;30708:6;30704:14;30701:1;30698:21;30693:1;30686:9;30679:17;30675:45;30672:71;;;30723:18;;:::i;:::-;-1:-1:-1;30763:9:1;;30610:168::o;30783:125::-;30823:4;30851:1;30848;30845:8;30842:34;;;30856:18;;:::i;:::-;-1:-1:-1;30893:9:1;;30783:125::o;30913:258::-;30985:1;30995:113;31009:6;31006:1;31003:13;30995:113;;;31085:11;;;31079:18;31066:11;;;31059:39;31031:2;31024:10;30995:113;;;31126:6;31123:1;31120:13;31117:48;;;-1:-1:-1;;31161:1:1;31143:16;;31136:27;30913:258::o;31176:380::-;31255:1;31251:12;;;;31298;;;31319:61;;31373:4;31365:6;31361:17;31351:27;;31319:61;31426:2;31418:6;31415:14;31395:18;31392:38;31389:161;;;31472:10;31467:3;31463:20;31460:1;31453:31;31507:4;31504:1;31497:15;31535:4;31532:1;31525:15;31389:161;;31176:380;;;:::o;31561:135::-;31600:3;-1:-1:-1;;31621:17:1;;31618:43;;;31641:18;;:::i;:::-;-1:-1:-1;31688:1:1;31677:13;;31561:135::o;31701:112::-;31733:1;31759;31749:35;;31764:18;;:::i;:::-;-1:-1:-1;31798:9:1;;31701:112::o;31818:127::-;31879:10;31874:3;31870:20;31867:1;31860:31;31910:4;31907:1;31900:15;31934:4;31931:1;31924:15;31950:127;32011:10;32006:3;32002:20;31999:1;31992:31;32042:4;32039:1;32032:15;32066:4;32063:1;32056:15;32082:127;32143:10;32138:3;32134:20;32131:1;32124:31;32174:4;32171:1;32164:15;32198:4;32195:1;32188:15;32214:127;32275:10;32270:3;32266:20;32263:1;32256:31;32306:4;32303:1;32296:15;32330:4;32327:1;32320:15;32346:131;-1:-1:-1;;;;;;32420:32:1;;32410:43;;32400:71;;32467:1;32464;32457:12
Swarm Source
ipfs://0cdd927525e95d310d7e2502906214fdd31ec9709d595ec702c5deeec1c8b63e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.