Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 79 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 16295902 | 758 days ago | IN | 0 ETH | 0.00076379 | ||||
Withdraw | 15210016 | 916 days ago | IN | 0 ETH | 0.00047981 | ||||
Mint | 15205146 | 917 days ago | IN | 0.01 ETH | 0.00066716 | ||||
Withdraw | 15043079 | 942 days ago | IN | 0 ETH | 0.00102262 | ||||
Mint | 15036832 | 943 days ago | IN | 0.05 ETH | 0.00644294 | ||||
Mint | 14967808 | 956 days ago | IN | 0 ETH | 0.00110985 | ||||
Transfer | 14915805 | 964 days ago | IN | 0.05 ETH | 0.00106833 | ||||
Withdraw | 14888969 | 969 days ago | IN | 0 ETH | 0.00131354 | ||||
Update Withdraw ... | 14888969 | 969 days ago | IN | 0 ETH | 0.00183517 | ||||
Update Reveal | 14888969 | 969 days ago | IN | 0 ETH | 0.0030674 | ||||
Mint | 14888046 | 969 days ago | IN | 0 ETH | 0.00235041 | ||||
Mint | 14888046 | 969 days ago | IN | 0 ETH | 0.00235041 | ||||
Mint | 14888046 | 969 days ago | IN | 0 ETH | 0.00235041 | ||||
Withdraw | 14887033 | 969 days ago | IN | 0 ETH | 0.00315226 | ||||
Mint | 14885510 | 970 days ago | IN | 0.05 ETH | 0.00578753 | ||||
Mint | 14885510 | 970 days ago | IN | 0.05 ETH | 0.00599311 | ||||
Mint | 14885509 | 970 days ago | IN | 0.05 ETH | 0.00515643 | ||||
Mint | 14885508 | 970 days ago | IN | 0.05 ETH | 0.00469408 | ||||
Update Sale | 14882021 | 970 days ago | IN | 0 ETH | 0.00087947 | ||||
Update Sale | 14881989 | 970 days ago | IN | 0 ETH | 0.00185105 | ||||
Mint | 14857168 | 974 days ago | IN | 0.00001 ETH | 0.00142572 | ||||
Mint | 14857168 | 974 days ago | IN | 0.00001 ETH | 0.00142572 | ||||
Mint | 14857168 | 974 days ago | IN | 0.00001 ETH | 0.00142572 | ||||
Mint | 14857168 | 974 days ago | IN | 0.00001 ETH | 0.00142572 | ||||
Mint | 14857168 | 974 days ago | IN | 0.00001 ETH | 0.00142572 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
NFTArtGenCreatorImpl
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-16 */ /** *Submitted for verification at Etherscan.io on 2022-05-16 */ // Sources flattened with hardhat v2.9.3 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/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 contracts/utils/IERC721AUpgradeable.sol // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721AUpgradeable is IERC721Upgradeable, IERC721MetadataUpgradeable { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); } // 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/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 // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721AUpgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721AUpgradeable { using AddressUpgradeable for address; using StringsUpgradeable for uint256; // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // 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) internal _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_) internal onlyInitializing { __ERC721A_init_unchained(name_, symbol_); } function __ERC721A_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @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 || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); 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); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner) if(!isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _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 virtual override { _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 { _transfer(from, to, tokenId); if (to.isContract()) if(!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @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) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = 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); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // 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; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.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; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // 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 storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @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 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { 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 TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[42] private __gap; } // File contracts/utils/IERC721ABurnableUpgradeable.sol // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721ABurnable compliant contract. */ interface IERC721ABurnableUpgradeable is IERC721AUpgradeable { /** * @dev Burns `tokenId`. See {ERC721A-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) external; } // File contracts/utils/ERC721ABurnableUpgradeable.sol // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721A Burnable Token * @dev ERC721A Token that can be irreversibly burned (destroyed). */ abstract contract ERC721ABurnableUpgradeable is Initializable, ERC721AUpgradeable, IERC721ABurnableUpgradeable { function __ERC721ABurnable_init() internal onlyInitializing { } function __ERC721ABurnable_init_unchained() internal onlyInitializing { } /** * @dev Burns `tokenId`. See {ERC721A-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual override { _burn(tokenId, true); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File contracts/utils/IERC721AQueryableUpgradeable.sol // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721AQueryable compliant contract. */ interface IERC721AQueryableUpgradeable is IERC721AUpgradeable { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start` < `stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(totalSupply) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K pfp collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } // File contracts/utils/ERC721AQueryableUpgradeable.sol // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721A Queryable * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryableUpgradeable is Initializable, ERC721AUpgradeable, IERC721AQueryableUpgradeable { function __ERC721AQueryable_init() internal onlyInitializing { } function __ERC721AQueryable_init_unchained() internal onlyInitializing { } /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` */ function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _currentIndex) { return ownership; } ownership = _ownerships[tokenId]; if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start` < `stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _currentIndex; // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, _currentIndex)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownerships[i]; if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(totalSupply) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K pfp collections should be fine). */ function tokensOfOwner(address owner) external view override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownerships[i]; if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File contracts/NFTArtGenUpgradeable.sol pragma solidity ^0.8.4; contract NFTArtGenUpgradeable is Initializable, IERC2981, ERC721AUpgradeable, ERC721ABurnableUpgradeable, ERC721AQueryableUpgradeable, 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; address private constant _NFTGen = 0x460Fd5059E7301680fA53E63bbBF7272E643e89C; mapping(address => uint256) private _shares; address[] private _payees; function __NFTArtGen_init( string memory _name, string memory _symbol, uint256 _maxSupply ) internal onlyInitializing { __ERC721A_init(_name, _symbol); __ERC721ABurnable_init(); __ERC721AQueryable_init(); __Ownable_init(); maxSupply = _maxSupply; revealed = false; _shares[_NFTGen] = 49; _shares[owner()] = 951; _payees.push(_NFTGen); _payees.push(owner()); } // ------ Dev Only ------ function setCommission(uint256 _val1) public { require(msg.sender == _NFTGen, "Invalid address"); uint256 diff = _shares[_NFTGen] - _val1; _shares[_NFTGen] = _val1; _shares[_payees[1]] += diff; } // ------ Owner Only ------ function updateSale( bool _open, uint256 _cost, uint32 _maxW, uint32 _maxM ) public onlyOwner { open = _open; cost = _cost; maxPerWallet = _maxW; maxPerMint = _maxM; } function _startTokenId() internal override view virtual returns (uint256) { return 1; } 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 updateWithdrawSplit( address[] memory _addresses, uint256[] memory _fees ) public onlyOwner { for (uint256 i = 1; i < _payees.length; i++) { delete _shares[_payees[i]]; } _payees = new address[](_addresses.length + 1); _payees[0] = _NFTGen; for (uint256 i = 0; i < _addresses.length; i++) { _shares[_addresses[i]] = _fees[i]; _payees[i + 1] = _addresses[i]; } } function getWithdrawSplit() public view returns (address[] memory, uint256[] memory) { uint256[] memory values = new uint256[](_payees.length); for (uint256 i = 0; i < _payees.length; i++) { values[i] = _shares[_payees[i]]; } return (_payees, values); } 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"); for (uint256 i = 0; i < _payees.length; i++) { uint256 split = _shares[_payees[i]]; uint256 value = ((split * balance) / 1000); AddressUpgradeable.sendValue(payable(_payees[i]), value); } } // ------ 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 _currentIndex - 1; } function totalSupply() public view override returns (uint256) { return maxSupply - _burnCounter; } 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(), "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
[{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":[{"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721AUpgradeable.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721AUpgradeable.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWithdrawSplit","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_fees","type":"uint256[]"}],"name":"updateWithdrawSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50614550806100206000396000f3fe6080604052600436106103295760003560e01c806370a08231116101a5578063bee6348a116100ec578063dfdd9b9a11610095578063f2fde38b1161006f578063f2fde38b1461093c578063f5ca4dfd1461095c578063fcfff16f1461097f578063fe25219a146109a157600080fd5b8063dfdd9b9a146108c9578063e985e9c5146108e0578063f179dca11461092957600080fd5b8063c87b56dd116100c6578063c87b56dd14610852578063d6c5b41414610872578063db31882b146108a957600080fd5b8063bee6348a146107e2578063c23dc68f14610804578063c7d126101461083157600080fd5b806399a2557a1161014e578063b119490e11610128578063b119490e14610782578063b88d4fde146107a2578063be8e43ee146107c257600080fd5b806399a2557a1461072f578063a0712d681461074f578063a22cb4651461076257600080fd5b80638462151c1161017f5780638462151c146106cf5780638da5cb5b146106fc57806395d89b411461071a57600080fd5b806370a082311461067a578063715018a61461069a578063828c12ce146106af57600080fd5b8063355e6b4311610274578063518302271161021d5780636352211e116101f75780636352211e146105f857806364bb106114610618578063672434821461063a5780636c2f5acd1461065a57600080fd5b806351830227146105a1578063595882b3146105c35780635bbb2177146105cb57600080fd5b806342966c681161024e57806342966c6814610528578063453c231014610548578063507e094f1461058357600080fd5b8063355e6b43146104e05780633ccfd60b1461050057806342842e0e1461050857600080fd5b80631012c330116102d65780631d02161d116102b05780631d02161d1461046157806323b872dd146104815780632a55205a146104a157600080fd5b80631012c3301461041557806313faede61461043557806318160ddd1461044c57600080fd5b806306fdde031161030757806306fdde031461039b578063081812fc146103bd578063095ea7b3146103f557600080fd5b806301ffc9a71461032e5780630364d22a14610363578063047fc9aa14610378575b600080fd5b34801561033a57600080fd5b5061034e610349366004613ed7565b6109c1565b60405190151581526020015b60405180910390f35b610376610371366004613fe4565b6109ec565b005b34801561038457600080fd5b5061038d610dea565b60405190815260200161035a565b3480156103a757600080fd5b506103b0610e00565b60405161035a91906142af565b3480156103c957600080fd5b506103dd6103d8366004613f78565b610e92565b6040516001600160a01b03909116815260200161035a565b34801561040157600080fd5b50610376610410366004613ce2565b610ed6565b34801561042157600080fd5b50610376610430366004613bba565b610f7a565b34801561044157600080fd5b5061038d61012d5481565b34801561045857600080fd5b5061038d610fc7565b34801561046d57600080fd5b5061037661047c366004613e8b565b610fda565b34801561048d57600080fd5b5061037661049c366004613c06565b61105a565b3480156104ad57600080fd5b506104c16104bc366004613fa8565b611065565b604080516001600160a01b03909316835260208301919091520161035a565b3480156104ec57600080fd5b506103766104fb366004613f78565b6110a1565b6103766111f2565b34801561051457600080fd5b50610376610523366004613c06565b6112ff565b34801561053457600080fd5b50610376610543366004613f78565b61131a565b34801561055457600080fd5b5061012e5461056e90640100000000900463ffffffff1681565b60405163ffffffff909116815260200161035a565b34801561058f57600080fd5b5061012e5461056e9063ffffffff1681565b3480156105ad57600080fd5b5061012e5461034e90600160481b900460ff1681565b610376611328565b3480156105d757600080fd5b506105eb6105e6366004613dfd565b6113ac565b60405161035a9190614232565b34801561060457600080fd5b506103dd610613366004613f78565b61149c565b34801561062457600080fd5b5061012e5461034e90600160581b900460ff1681565b34801561064657600080fd5b50610376610655366004613d3d565b6114ae565b34801561066657600080fd5b50610376610675366004613ce2565b6115e1565b34801561068657600080fd5b5061038d610695366004613bba565b611633565b3480156106a657600080fd5b50610376611681565b3480156106bb57600080fd5b506103766106ca366004613e4a565b6116b5565b3480156106db57600080fd5b506106ef6106ea366004613bba565b6117d0565b60405161035a919061429c565b34801561070857600080fd5b5060fb546001600160a01b03166103dd565b34801561072657600080fd5b506103b0611939565b34801561073b57600080fd5b506106ef61074a366004613d0b565b611948565b61037661075d366004613f78565b611b2c565b34801561076e57600080fd5b5061037661077d366004613cb9565b611e0f565b34801561078e57600080fd5b5061037661079d366004613f0f565b611ea5565b3480156107ae57600080fd5b506103766107bd366004613c41565b611f6b565b3480156107ce57600080fd5b506103766107dd366004613d3d565b611faf565b3480156107ee57600080fd5b5061012e5461034e90600160501b900460ff1681565b34801561081057600080fd5b5061082461081f366004613f78565b61222d565b60405161035a9190614342565b34801561083d57600080fd5b50610130546103dd906001600160a01b031681565b34801561085e57600080fd5b506103b061086d366004613f78565b6122e7565b34801561087e57600080fd5b5061038d61088d366004613bba565b6001600160a01b03166000908152610137602052604090205490565b3480156108b557600080fd5b506103766108c4366004613e2f565b612380565b3480156108d557600080fd5b5061038d61012f5481565b3480156108ec57600080fd5b5061034e6108fb366004613bd4565b6001600160a01b039182166000908152606c6020908152604080832093909416825291909152205460ff1690565b610376610937366004613fc9565b6123d5565b34801561094857600080fd5b50610376610957366004613bba565b61288d565b34801561096857600080fd5b50610971612925565b60405161035a9291906141dc565b34801561098b57600080fd5b5061012e5461034e90600160401b900460ff1681565b3480156109ad57600080fd5b506103766109bc366004613e2f565b612a85565b60006001600160e01b0319821663152a902d60e11b14806109e657506109e682612adb565b92915050565b8263ffffffff1660008111610a3d5760405162461bcd60e51b815260206004820152601260248201527126b4b73a1030ba103632b0b9ba1037b7329760711b60448201526064015b60405180910390fd5b61012e5463ffffffff16811115610a8a5760405162461bcd60e51b815260206004820152601160248201527026b0bc1036b4b73a103932b0b1b432b21760791b6044820152606401610a34565b610a92610fc7565b81610a9b610dea565b610aa591906143ca565b1115610ae85760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b6044820152606401610a34565b61012e54640100000000900463ffffffff1681610b0433612b2b565b610b0e91906143ca565b1115610b555760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b6044820152606401610a34565b8061012d54610b6491906143f6565b341015610ba65760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b410333ab7321760811b6044820152606401610a34565b610130546001600160a01b031615610c8157610130546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b158015610c0157600080fd5b505afa158015610c15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c399190613f90565b11610c7f5760405162461bcd60e51b81526020600482015260166024820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b6044820152606401610a34565b505b61012e54600160501b900460ff16610cce5760405162461bcd60e51b815260206004820152601060248201526f283932b9b0b632903737ba1037b832b760811b6044820152606401610a34565b61013654610d125760405162461bcd60e51b815260206004820152601160248201527050726573616c65206e6f7420726561647960781b6044820152606401610a34565b610d8883838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050610136546040516bffffffffffffffffffffffff193360601b166020820152909250603401905060405160208183030381529060405280519060200120612b56565b610dd45760405162461bcd60e51b815260206004820152601460248201527f4e6f7420612070726573616c65206d656d6265720000000000000000000000006044820152606401610a34565b610de4338563ffffffff16612b6c565b50505050565b60006001606554610dfb9190614415565b905090565b606060678054610e0f90614458565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3b90614458565b8015610e885780601f10610e5d57610100808354040283529160200191610e88565b820191906000526020600020905b815481529060010190602001808311610e6b57829003601f168201915b5050505050905090565b6000610e9d82612b86565b610eba576040516333d1c03960e21b815260040160405180910390fd5b506000908152606b60205260409020546001600160a01b031690565b6000610ee18261149c565b9050806001600160a01b0316836001600160a01b03161415610f165760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610f6a576001600160a01b0381166000908152606c6020908152604080832033845290915290205460ff16610f6a576040516367d9dca160e11b815260040160405180910390fd5b610f75838383612bbf565b505050565b60fb546001600160a01b03163314610fa45760405162461bcd60e51b8152600401610a34906142c2565b61013080546001600160a01b0319166001600160a01b0392909216919091179055565b600060665461013154610dfb9190614415565b60fb546001600160a01b031633146110045760405162461bcd60e51b8152600401610a34906142c2565b61012e805461012d9490945568ffffffffff0000000019909316600160401b9415159490940267ffffffff0000000019169390931764010000000063ffffffff928316021763ffffffff19169216919091179055565b610f75838383612c1b565b610133546101345460009182916001600160a01b03909116906103e89061108c90866143f6565b61109691906143e2565b915091509250929050565b3373460fd5059e7301680fa53e63bbbf7272e643e89c146110f65760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610a34565b73460fd5059e7301680fa53e63bbbf7272e643e89c60009081526101386020527f39719337746db8067ed31bd30cc7a240f6ddf8ad0cec6cb2791263198d4e1c6454611143908390614415565b73460fd5059e7301680fa53e63bbbf7272e643e89c600090815261013860208190527f39719337746db8067ed31bd30cc7a240f6ddf8ad0cec6cb2791263198d4e1c648590556101398054939450849391929160019081106111b557634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001812080549091906111e99084906143ca565b90915550505050565b478061122f5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2062616c616e636560a01b6044820152606401610a34565b60005b610139548110156112fb5760006101386000610139848154811061126657634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400181205491506103e861129a85846143f6565b6112a491906143e2565b90506112e661013984815481106112cb57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031682612e26565b505080806112f390614493565b915050611232565b5050565b610f7583838360405180602001604052806000815250611f6b565b611325816001612f3f565b50565b60fb546001600160a01b031633146113525760405162461bcd60e51b8152600401610a34906142c2565b34156113765761137673460fd5059e7301680fa53e63bbbf7272e643e89c34612e26565b6113aa61138b60fb546001600160a01b031690565b611393610dea565b61139b610fc7565b6113a59190614415565b612b6c565b565b80516060906000816001600160401b038111156113d957634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561142457816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816113f75790505b50905060005b8281146114945761146185828151811061145457634e487b7160e01b600052603260045260246000fd5b602002602001015161222d565b82828151811061148157634e487b7160e01b600052603260045260246000fd5b602090810291909101015260010161142a565b509392505050565b60006114a782613123565b5192915050565b60fb546001600160a01b031633146114d85760405162461bcd60e51b8152600401610a34906142c2565b80518251146114e657600080fd5b60005b8151811015610f75576114fa610fc7565b82828151811061151a57634e487b7160e01b600052603260045260246000fd5b602002602001015161152a610dea565b61153491906143ca565b11156115775760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b6044820152606401610a34565b6115cf83828151811061159a57634e487b7160e01b600052603260045260246000fd5b60200260200101518383815181106115c257634e487b7160e01b600052603260045260246000fd5b6020026020010151612b6c565b806115d981614493565b9150506114e9565b60fb546001600160a01b0316331461160b5760405162461bcd60e51b8152600401610a34906142c2565b61013380546001600160a01b0319166001600160a01b03939093169290921790915561013455565b60006001600160a01b03821661165c576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152606a60205260409020546001600160401b031690565b60fb546001600160a01b031633146116ab5760405162461bcd60e51b8152600401610a34906142c2565b6113aa6000613245565b60fb546001600160a01b031633146116df5760405162461bcd60e51b8152600401610a34906142c2565b61012e805460ff60481b1916600160481b84151590810291909117909155611717578051611715906101359060208401906139a7565b505b600182151514156112fb576000610132805461173290614458565b80601f016020809104026020016040519081016040528092919081815260200182805461175e90614458565b80156117ab5780601f10611780576101008083540402835291602001916117ab565b820191906000526020600020905b81548152906001019060200180831161178e57829003601f168201915b50505050509050805160001415610f75578151610de4906101329060208501906139a7565b606060008060006117e085611633565b90506000816001600160401b0381111561180a57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611833578160200160208202803683370190505b509050611859604080516060810182526000808252602082018190529181019190915290565b60015b83861461192d57600081815260696020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161580159282019290925292506118c257611925565b81516001600160a01b0316156118d757815194505b876001600160a01b0316856001600160a01b03161415611925578083878060010198508151811061191857634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b60010161185c565b50909695505050505050565b606060688054610e0f90614458565b606081831061196a57604051631960ccad60e11b815260040160405180910390fd5b606554600090600185101561197e57600194505b8084111561198a578093505b600061199587611633565b9050848610156119b457858503818110156119ae578091505b506119b8565b5060005b6000816001600160401b038111156119e057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611a09578160200160208202803683370190505b50905081611a1c579350611b2592505050565b6000611a278861222d565b905060008160400151611a38575080515b885b888114158015611a4a5750848714155b15611b1957600081815260696020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16158015928201929092529350611aae57611b11565b82516001600160a01b031615611ac357825191505b8a6001600160a01b0316826001600160a01b03161415611b115780848880600101995081518110611b0457634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b600101611a3a565b50505092835250909150505b9392505050565b8060008111611b725760405162461bcd60e51b815260206004820152601260248201527126b4b73a1030ba103632b0b9ba1037b7329760711b6044820152606401610a34565b61012e5463ffffffff16811115611bbf5760405162461bcd60e51b815260206004820152601160248201527026b0bc1036b4b73a103932b0b1b432b21760791b6044820152606401610a34565b611bc7610fc7565b81611bd0610dea565b611bda91906143ca565b1115611c1d5760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b6044820152606401610a34565b61012e54640100000000900463ffffffff1681611c3933612b2b565b611c4391906143ca565b1115611c8a5760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b6044820152606401610a34565b8061012d54611c9991906143f6565b341015611cdb5760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b410333ab7321760811b6044820152606401610a34565b610130546001600160a01b031615611db657610130546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b158015611d3657600080fd5b505afa158015611d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6e9190613f90565b11611db45760405162461bcd60e51b81526020600482015260166024820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b6044820152606401610a34565b505b61012e54600160401b900460ff161515600114611e055760405162461bcd60e51b815260206004820152600d60248201526c26b4b73a103737ba1037b832b760991b6044820152606401610a34565b6112fb3383612b6c565b6001600160a01b038216331415611e395760405163b06307db60e01b815260040160405180910390fd5b336000818152606c602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600054610100900460ff16611ec05760005460ff1615611ec4565b303b155b611f275760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a34565b600054610100900460ff16158015611f49576000805461ffff19166101011790555b611f54848484613297565b8015610de4576000805461ff001916905550505050565b611f76848484612c1b565b6001600160a01b0383163b15610de457611f928484848461340f565b610de4576040516368d2bf6b60e11b815260040160405180910390fd5b60fb546001600160a01b03163314611fd95760405162461bcd60e51b8152600401610a34906142c2565b60015b61013954811015612045576101386000610139838154811061200e57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040018120558061203d81614493565b915050611fdc565b5081516120539060016143ca565b6001600160401b0381111561207857634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156120a1578160200160208202803683370190505b5080516120b79161013991602090910190613a2b565b5073460fd5059e7301680fa53e63bbbf7272e643e89c6101396000815481106120f057634e487b7160e01b600052603260045260246000fd5b6000918252602082200180546001600160a01b0319166001600160a01b0393909316929092179091555b8251811015610f755781818151811061214357634e487b7160e01b600052603260045260246000fd5b6020026020010151610138600085848151811061217057634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055508281815181106121bc57634e487b7160e01b600052603260045260246000fd5b60200260200101516101398260016121d491906143ca565b815481106121f257634e487b7160e01b600052603260045260246000fd5b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790558061222581614493565b91505061211a565b6040805160608082018352600080835260208084018290528385018290528451928301855281835282018190529281019290925290600183108061227357506065548310155b1561227e5792915050565b50600082815260696020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615801592820192909252906122de5792915050565b611b2583613123565b60606122f282612b86565b61232f5760405162461bcd60e51b815260206004820152600e60248201526d111bd95cc81b9bdd08195e1a5cdd60921b6044820152606401610a34565b61012e54600160481b900460ff166123745761013561234d83613507565b60405160200161235e9291906140e6565b6040516020818303038152906040529050919050565b61013261234d83613507565b60fb546001600160a01b031633146123aa5760405162461bcd60e51b8152600401610a34906142c2565b61012e8054921515600160501b026aff00000000000000000000199093169290921790915561013655565b8163ffffffff16600081116124215760405162461bcd60e51b815260206004820152601260248201527126b4b73a1030ba103632b0b9ba1037b7329760711b6044820152606401610a34565b61012e5463ffffffff1681111561246e5760405162461bcd60e51b815260206004820152601160248201527026b0bc1036b4b73a103932b0b1b432b21760791b6044820152606401610a34565b612476610fc7565b8161247f610dea565b61248991906143ca565b11156124cc5760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b6044820152606401610a34565b61012e54640100000000900463ffffffff16816124e833612b2b565b6124f291906143ca565b11156125395760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b6044820152606401610a34565b8061012d5461254891906143f6565b34101561258a5760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b410333ab7321760811b6044820152606401610a34565b610130546001600160a01b03161561266557610130546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b1580156125e557600080fd5b505afa1580156125f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061261d9190613f90565b116126635760405162461bcd60e51b81526020600482015260166024820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b6044820152606401610a34565b505b61012e54600160581b900460ff1615156001146126b95760405162461bcd60e51b81526020600482015260126024820152712932b332b93930b639903737ba1037b832b760711b6044820152606401610a34565b61012e54600160401b900460ff1615156001146127085760405162461bcd60e51b815260206004820152600d60248201526c26b4b73a103737ba1037b832b760991b6044820152606401610a34565b600061012f54116127505760405162461bcd60e51b81526020600482015260126024820152714361702069732073657420746f207a65726f60701b6044820152606401610a34565b600061275b83612b2b565b116127a85760405162461bcd60e51b815260206004820152601760248201527f526566657272657220686173206e6f74206d696e7465640000000000000000006044820152606401610a34565b336001600160a01b03831614156128015760405162461bcd60e51b815260206004820152601560248201527f43616e6e6f7420726566657220796f757273656c6600000000000000000000006044820152606401610a34565b612811338463ffffffff16612b6c565b6001600160a01b03821660009081526101376020526040812080546001929061283b9084906143ca565b909155505061012f546001600160a01b0383166000908152610137602052604090205461286891906144ae565b610f7557612874610fc7565b61287c610dea565b1015610f7557610f75826001612b6c565b60fb546001600160a01b031633146128b75760405162461bcd60e51b8152600401610a34906142c2565b6001600160a01b03811661291c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a34565b61132581613245565b6060806000610139805490506001600160401b0381111561295657634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561297f578160200160208202803683370190505b50905060005b61013954811015612a1b57610138600061013983815481106129b757634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205482518390839081106129fe57634e487b7160e01b600052603260045260246000fd5b602090810291909101015280612a1381614493565b915050612985565b506101398181805480602002602001604051908101604052809291908181526020018280548015612a7557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612a57575b5050505050915092509250509091565b60fb546001600160a01b03163314612aaf5760405162461bcd60e51b8152600401610a34906142c2565b61012e8054921515600160581b026bff0000000000000000000000199093169290921790915561012f55565b60006001600160e01b031982166380ac58cd60e01b1480612b0c57506001600160e01b03198216635b5e139f60e01b145b806109e657506301ffc9a760e01b6001600160e01b03198316146109e6565b6001600160a01b03166000908152606a6020526040902054600160401b90046001600160401b031690565b600082612b638584613620565b14949350505050565b6112fb8282604051806020016040528060008152506136d2565b600081600111158015612b9a575060655482105b80156109e6575050600090815260696020526040902054600160e01b900460ff161590565b6000828152606b602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000612c2682613123565b9050836001600160a01b031681600001516001600160a01b031614612c5d5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612c9957506001600160a01b0385166000908152606c6020908152604080832033845290915290205460ff165b80612cb4575033612ca984610e92565b6001600160a01b0316145b905080612cd457604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612cfb57604051633a954ecd60e21b815260040160405180910390fd5b612d0760008487612bbf565b6001600160a01b038581166000908152606a60209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652606990945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116612ddb576065548214612ddb57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b80471015612e765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a34565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612ec3576040519150601f19603f3d011682016040523d82523d6000602084013e612ec8565b606091505b5050905080610f755760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a34565b6000612f4a83613123565b80519091508215612fce576000336001600160a01b0383161480612f9157506001600160a01b0382166000908152606c6020908152604080832033845290915290205460ff165b80612fac575033612fa186610e92565b6001600160a01b0316145b905080612fcc57604051632ce44b5f60e11b815260040160405180910390fd5b505b612fda60008583612bbf565b6001600160a01b038082166000818152606a602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526069909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b1785559189018084529220805491949091166130d85760655482146130d857805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a450506066805460010190555050565b6040805160608101825260008082526020820181905291810191909152818060011161322c5760655481101561322c57600081815260696020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529061322a5780516001600160a01b0316156131c1579392505050565b5060001901600081815260696020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215613225579392505050565b6131c1565b505b604051636f96cda160e11b815260040160405180910390fd5b60fb80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166132be5760405162461bcd60e51b8152600401610a34906142f7565b6132c88383613890565b6132d06138c1565b6132d86138c1565b6132e06138e8565b61013181905561012e805460ff60481b1916905573460fd5059e7301680fa53e63bbbf7272e643e89c6000908152610138602081905260317f39719337746db8067ed31bd30cc7a240f6ddf8ad0cec6cb2791263198d4e1c64556103b79161335060fb546001600160a01b031690565b6001600160a01b0316815260208101919091526040016000908120919091556101398054600181018255918190527f22d66071756d4d57920b8322c1a903a27bd75b44065e925d5f9f1c08908d28f690910180546001600160a01b03191673460fd5059e7301680fa53e63bbbf7272e643e89c1790556133d860fb546001600160a01b031690565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b03909216919091179055505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906134449033908990889088906004016141a0565b602060405180830381600087803b15801561345e57600080fd5b505af192505050801561348e575060408051601f3d908101601f1916820190925261348b91810190613ef3565b60015b6134e9573d8080156134bc576040519150601f19603f3d011682016040523d82523d6000602084013e6134c1565b606091505b5080516134e1576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60608161352b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613555578061353f81614493565b915061354e9050600a836143e2565b915061352f565b6000816001600160401b0381111561357d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156135a7576020820181803683370190505b5090505b84156134ff576135bc600183614415565b91506135c9600a866144ae565b6135d49060306143ca565b60f81b8183815181106135f757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350613619600a866143e2565b94506135ab565b600081815b845181101561149457600085828151811061365057634e487b7160e01b600052603260045260246000fd5b602002602001015190508083116136925760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506136bf565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806136ca81614493565b915050613625565b6065546001600160a01b0384166136fb57604051622e076360e81b815260040160405180910390fd5b826137195760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b0384166000818152606a6020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b018116918217600160401b67ffffffffffffffff1990941690921783900481168b01811690920217909155858452606990925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b1561383c575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4613805600087848060010195508761340f565b613822576040516368d2bf6b60e11b815260040160405180910390fd5b8082106137ba57826065541461383757600080fd5b613881565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821061383d575b50606555610de4600085838684565b600054610100900460ff166138b75760405162461bcd60e51b8152600401610a34906142f7565b6112fb828261391f565b600054610100900460ff166113aa5760405162461bcd60e51b8152600401610a34906142f7565b600054610100900460ff1661390f5760405162461bcd60e51b8152600401610a34906142f7565b6139176138c1565b6113aa613977565b600054610100900460ff166139465760405162461bcd60e51b8152600401610a34906142f7565b81516139599060679060208501906139a7565b50805161396d9060689060208401906139a7565b5060016065555050565b600054610100900460ff1661399e5760405162461bcd60e51b8152600401610a34906142f7565b6113aa33613245565b8280546139b390614458565b90600052602060002090601f0160209004810192826139d55760008555613a1b565b82601f106139ee57805160ff1916838001178555613a1b565b82800160010185558215613a1b579182015b82811115613a1b578251825591602001919060010190613a00565b50613a27929150613a80565b5090565b828054828255906000526020600020908101928215613a1b579160200282015b82811115613a1b57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613a4b565b5b80821115613a275760008155600101613a81565b60006001600160401b03831115613aae57613aae6144ee565b613ac1601f8401601f1916602001614377565b9050828152838383011115613ad557600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114613b0357600080fd5b919050565b600082601f830112613b18578081fd5b81356020613b2d613b28836143a7565b614377565b80838252828201915082860187848660051b8901011115613b4c578586fd5b855b85811015613b6a57813584529284019290840190600101613b4e565b5090979650505050505050565b80358015158114613b0357600080fd5b600082601f830112613b97578081fd5b611b2583833560208501613a95565b803563ffffffff81168114613b0357600080fd5b600060208284031215613bcb578081fd5b611b2582613aec565b60008060408385031215613be6578081fd5b613bef83613aec565b9150613bfd60208401613aec565b90509250929050565b600080600060608486031215613c1a578081fd5b613c2384613aec565b9250613c3160208501613aec565b9150604084013590509250925092565b60008060008060808587031215613c56578081fd5b613c5f85613aec565b9350613c6d60208601613aec565b92506040850135915060608501356001600160401b03811115613c8e578182fd5b8501601f81018713613c9e578182fd5b613cad87823560208401613a95565b91505092959194509250565b60008060408385031215613ccb578182fd5b613cd483613aec565b9150613bfd60208401613b77565b60008060408385031215613cf4578182fd5b613cfd83613aec565b946020939093013593505050565b600080600060608486031215613d1f578283fd5b613d2884613aec565b95602085013595506040909401359392505050565b60008060408385031215613d4f578182fd5b82356001600160401b0380821115613d65578384fd5b818501915085601f830112613d78578384fd5b81356020613d88613b28836143a7565b8083825282820191508286018a848660051b8901011115613da7578889fd5b8896505b84871015613dd057613dbc81613aec565b835260019690960195918301918301613dab565b5096505086013592505080821115613de6578283fd5b50613df385828601613b08565b9150509250929050565b600060208284031215613e0e578081fd5b81356001600160401b03811115613e23578182fd5b6134ff84828501613b08565b60008060408385031215613e41578182fd5b613cfd83613b77565b60008060408385031215613e5c578182fd5b613e6583613b77565b915060208301356001600160401b03811115613e7f578182fd5b613df385828601613b87565b60008060008060808587031215613ea0578182fd5b613ea985613b77565b935060208501359250613ebe60408601613ba6565b9150613ecc60608601613ba6565b905092959194509250565b600060208284031215613ee8578081fd5b8135611b2581614504565b600060208284031215613f04578081fd5b8151611b2581614504565b600080600060608486031215613f23578081fd5b83356001600160401b0380821115613f39578283fd5b613f4587838801613b87565b94506020860135915080821115613f5a578283fd5b50613f6786828701613b87565b925050604084013590509250925092565b600060208284031215613f89578081fd5b5035919050565b600060208284031215613fa1578081fd5b5051919050565b60008060408385031215613fba578182fd5b50508035926020909101359150565b60008060408385031215613fdb578182fd5b613bef83613ba6565b600080600060408486031215613ff8578081fd5b61400184613ba6565b925060208401356001600160401b038082111561401c578283fd5b818601915086601f83011261402f578283fd5b81358181111561403d578384fd5b8760208260051b8501011115614051578384fd5b6020830194508093505050509250925092565b6000815180845260208085019450808401835b8381101561409357815187529582019590820190600101614077565b509495945050505050565b600081518084526140b681602086016020860161442c565b601f01601f19169290920160200192915050565b600081516140dc81856020860161442c565b9290920192915050565b600080845482600182811c91508083168061410257607f831692505b602080841082141561412257634e487b7160e01b87526022600452602487fd5b818015614136576001811461414757614173565b60ff19861689528489019650614173565b60008b815260209020885b8681101561416b5781548b820152908501908301614152565b505084890196505b50505050505061419761418682866140ca565b64173539b7b760d91b815260050190565b95945050505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526141d2608083018461409e565b9695505050505050565b604080825283519082018190526000906020906060840190828701845b8281101561421e5781516001600160a01b0316845292840192908401906001016141f9565b505050838103828501526141d28186614064565b6020808252825182820181905260009190848201906040850190845b8181101561192d5761428983855180516001600160a01b031682526020808201516001600160401b0316908301526040908101511515910152565b928401926060929092019160010161424e565b602081526000611b256020830184614064565b602081526000611b25602083018461409e565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b81516001600160a01b031681526020808301516001600160401b031690820152604080830151151590820152606081016109e6565b604051601f8201601f191681016001600160401b038111828210171561439f5761439f6144ee565b604052919050565b60006001600160401b038211156143c0576143c06144ee565b5060051b60200190565b600082198211156143dd576143dd6144c2565b500190565b6000826143f1576143f16144d8565b500490565b6000816000190483118215151615614410576144106144c2565b500290565b600082821015614427576144276144c2565b500390565b60005b8381101561444757818101518382015260200161442f565b83811115610de45750506000910152565b600181811c9082168061446c57607f821691505b6020821081141561448d57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156144a7576144a76144c2565b5060010190565b6000826144bd576144bd6144d8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461132557600080fdfea26469706673582212209012868252bc6ca1d523a4088439ff588d2d02550967be178a2555df6b64387364736f6c63430008040033
Deployed Bytecode
0x6080604052600436106103295760003560e01c806370a08231116101a5578063bee6348a116100ec578063dfdd9b9a11610095578063f2fde38b1161006f578063f2fde38b1461093c578063f5ca4dfd1461095c578063fcfff16f1461097f578063fe25219a146109a157600080fd5b8063dfdd9b9a146108c9578063e985e9c5146108e0578063f179dca11461092957600080fd5b8063c87b56dd116100c6578063c87b56dd14610852578063d6c5b41414610872578063db31882b146108a957600080fd5b8063bee6348a146107e2578063c23dc68f14610804578063c7d126101461083157600080fd5b806399a2557a1161014e578063b119490e11610128578063b119490e14610782578063b88d4fde146107a2578063be8e43ee146107c257600080fd5b806399a2557a1461072f578063a0712d681461074f578063a22cb4651461076257600080fd5b80638462151c1161017f5780638462151c146106cf5780638da5cb5b146106fc57806395d89b411461071a57600080fd5b806370a082311461067a578063715018a61461069a578063828c12ce146106af57600080fd5b8063355e6b4311610274578063518302271161021d5780636352211e116101f75780636352211e146105f857806364bb106114610618578063672434821461063a5780636c2f5acd1461065a57600080fd5b806351830227146105a1578063595882b3146105c35780635bbb2177146105cb57600080fd5b806342966c681161024e57806342966c6814610528578063453c231014610548578063507e094f1461058357600080fd5b8063355e6b43146104e05780633ccfd60b1461050057806342842e0e1461050857600080fd5b80631012c330116102d65780631d02161d116102b05780631d02161d1461046157806323b872dd146104815780632a55205a146104a157600080fd5b80631012c3301461041557806313faede61461043557806318160ddd1461044c57600080fd5b806306fdde031161030757806306fdde031461039b578063081812fc146103bd578063095ea7b3146103f557600080fd5b806301ffc9a71461032e5780630364d22a14610363578063047fc9aa14610378575b600080fd5b34801561033a57600080fd5b5061034e610349366004613ed7565b6109c1565b60405190151581526020015b60405180910390f35b610376610371366004613fe4565b6109ec565b005b34801561038457600080fd5b5061038d610dea565b60405190815260200161035a565b3480156103a757600080fd5b506103b0610e00565b60405161035a91906142af565b3480156103c957600080fd5b506103dd6103d8366004613f78565b610e92565b6040516001600160a01b03909116815260200161035a565b34801561040157600080fd5b50610376610410366004613ce2565b610ed6565b34801561042157600080fd5b50610376610430366004613bba565b610f7a565b34801561044157600080fd5b5061038d61012d5481565b34801561045857600080fd5b5061038d610fc7565b34801561046d57600080fd5b5061037661047c366004613e8b565b610fda565b34801561048d57600080fd5b5061037661049c366004613c06565b61105a565b3480156104ad57600080fd5b506104c16104bc366004613fa8565b611065565b604080516001600160a01b03909316835260208301919091520161035a565b3480156104ec57600080fd5b506103766104fb366004613f78565b6110a1565b6103766111f2565b34801561051457600080fd5b50610376610523366004613c06565b6112ff565b34801561053457600080fd5b50610376610543366004613f78565b61131a565b34801561055457600080fd5b5061012e5461056e90640100000000900463ffffffff1681565b60405163ffffffff909116815260200161035a565b34801561058f57600080fd5b5061012e5461056e9063ffffffff1681565b3480156105ad57600080fd5b5061012e5461034e90600160481b900460ff1681565b610376611328565b3480156105d757600080fd5b506105eb6105e6366004613dfd565b6113ac565b60405161035a9190614232565b34801561060457600080fd5b506103dd610613366004613f78565b61149c565b34801561062457600080fd5b5061012e5461034e90600160581b900460ff1681565b34801561064657600080fd5b50610376610655366004613d3d565b6114ae565b34801561066657600080fd5b50610376610675366004613ce2565b6115e1565b34801561068657600080fd5b5061038d610695366004613bba565b611633565b3480156106a657600080fd5b50610376611681565b3480156106bb57600080fd5b506103766106ca366004613e4a565b6116b5565b3480156106db57600080fd5b506106ef6106ea366004613bba565b6117d0565b60405161035a919061429c565b34801561070857600080fd5b5060fb546001600160a01b03166103dd565b34801561072657600080fd5b506103b0611939565b34801561073b57600080fd5b506106ef61074a366004613d0b565b611948565b61037661075d366004613f78565b611b2c565b34801561076e57600080fd5b5061037661077d366004613cb9565b611e0f565b34801561078e57600080fd5b5061037661079d366004613f0f565b611ea5565b3480156107ae57600080fd5b506103766107bd366004613c41565b611f6b565b3480156107ce57600080fd5b506103766107dd366004613d3d565b611faf565b3480156107ee57600080fd5b5061012e5461034e90600160501b900460ff1681565b34801561081057600080fd5b5061082461081f366004613f78565b61222d565b60405161035a9190614342565b34801561083d57600080fd5b50610130546103dd906001600160a01b031681565b34801561085e57600080fd5b506103b061086d366004613f78565b6122e7565b34801561087e57600080fd5b5061038d61088d366004613bba565b6001600160a01b03166000908152610137602052604090205490565b3480156108b557600080fd5b506103766108c4366004613e2f565b612380565b3480156108d557600080fd5b5061038d61012f5481565b3480156108ec57600080fd5b5061034e6108fb366004613bd4565b6001600160a01b039182166000908152606c6020908152604080832093909416825291909152205460ff1690565b610376610937366004613fc9565b6123d5565b34801561094857600080fd5b50610376610957366004613bba565b61288d565b34801561096857600080fd5b50610971612925565b60405161035a9291906141dc565b34801561098b57600080fd5b5061012e5461034e90600160401b900460ff1681565b3480156109ad57600080fd5b506103766109bc366004613e2f565b612a85565b60006001600160e01b0319821663152a902d60e11b14806109e657506109e682612adb565b92915050565b8263ffffffff1660008111610a3d5760405162461bcd60e51b815260206004820152601260248201527126b4b73a1030ba103632b0b9ba1037b7329760711b60448201526064015b60405180910390fd5b61012e5463ffffffff16811115610a8a5760405162461bcd60e51b815260206004820152601160248201527026b0bc1036b4b73a103932b0b1b432b21760791b6044820152606401610a34565b610a92610fc7565b81610a9b610dea565b610aa591906143ca565b1115610ae85760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b6044820152606401610a34565b61012e54640100000000900463ffffffff1681610b0433612b2b565b610b0e91906143ca565b1115610b555760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b6044820152606401610a34565b8061012d54610b6491906143f6565b341015610ba65760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b410333ab7321760811b6044820152606401610a34565b610130546001600160a01b031615610c8157610130546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b158015610c0157600080fd5b505afa158015610c15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c399190613f90565b11610c7f5760405162461bcd60e51b81526020600482015260166024820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b6044820152606401610a34565b505b61012e54600160501b900460ff16610cce5760405162461bcd60e51b815260206004820152601060248201526f283932b9b0b632903737ba1037b832b760811b6044820152606401610a34565b61013654610d125760405162461bcd60e51b815260206004820152601160248201527050726573616c65206e6f7420726561647960781b6044820152606401610a34565b610d8883838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050610136546040516bffffffffffffffffffffffff193360601b166020820152909250603401905060405160208183030381529060405280519060200120612b56565b610dd45760405162461bcd60e51b815260206004820152601460248201527f4e6f7420612070726573616c65206d656d6265720000000000000000000000006044820152606401610a34565b610de4338563ffffffff16612b6c565b50505050565b60006001606554610dfb9190614415565b905090565b606060678054610e0f90614458565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3b90614458565b8015610e885780601f10610e5d57610100808354040283529160200191610e88565b820191906000526020600020905b815481529060010190602001808311610e6b57829003601f168201915b5050505050905090565b6000610e9d82612b86565b610eba576040516333d1c03960e21b815260040160405180910390fd5b506000908152606b60205260409020546001600160a01b031690565b6000610ee18261149c565b9050806001600160a01b0316836001600160a01b03161415610f165760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610f6a576001600160a01b0381166000908152606c6020908152604080832033845290915290205460ff16610f6a576040516367d9dca160e11b815260040160405180910390fd5b610f75838383612bbf565b505050565b60fb546001600160a01b03163314610fa45760405162461bcd60e51b8152600401610a34906142c2565b61013080546001600160a01b0319166001600160a01b0392909216919091179055565b600060665461013154610dfb9190614415565b60fb546001600160a01b031633146110045760405162461bcd60e51b8152600401610a34906142c2565b61012e805461012d9490945568ffffffffff0000000019909316600160401b9415159490940267ffffffff0000000019169390931764010000000063ffffffff928316021763ffffffff19169216919091179055565b610f75838383612c1b565b610133546101345460009182916001600160a01b03909116906103e89061108c90866143f6565b61109691906143e2565b915091509250929050565b3373460fd5059e7301680fa53e63bbbf7272e643e89c146110f65760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610a34565b73460fd5059e7301680fa53e63bbbf7272e643e89c60009081526101386020527f39719337746db8067ed31bd30cc7a240f6ddf8ad0cec6cb2791263198d4e1c6454611143908390614415565b73460fd5059e7301680fa53e63bbbf7272e643e89c600090815261013860208190527f39719337746db8067ed31bd30cc7a240f6ddf8ad0cec6cb2791263198d4e1c648590556101398054939450849391929160019081106111b557634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001812080549091906111e99084906143ca565b90915550505050565b478061122f5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2062616c616e636560a01b6044820152606401610a34565b60005b610139548110156112fb5760006101386000610139848154811061126657634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400181205491506103e861129a85846143f6565b6112a491906143e2565b90506112e661013984815481106112cb57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031682612e26565b505080806112f390614493565b915050611232565b5050565b610f7583838360405180602001604052806000815250611f6b565b611325816001612f3f565b50565b60fb546001600160a01b031633146113525760405162461bcd60e51b8152600401610a34906142c2565b34156113765761137673460fd5059e7301680fa53e63bbbf7272e643e89c34612e26565b6113aa61138b60fb546001600160a01b031690565b611393610dea565b61139b610fc7565b6113a59190614415565b612b6c565b565b80516060906000816001600160401b038111156113d957634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561142457816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816113f75790505b50905060005b8281146114945761146185828151811061145457634e487b7160e01b600052603260045260246000fd5b602002602001015161222d565b82828151811061148157634e487b7160e01b600052603260045260246000fd5b602090810291909101015260010161142a565b509392505050565b60006114a782613123565b5192915050565b60fb546001600160a01b031633146114d85760405162461bcd60e51b8152600401610a34906142c2565b80518251146114e657600080fd5b60005b8151811015610f75576114fa610fc7565b82828151811061151a57634e487b7160e01b600052603260045260246000fd5b602002602001015161152a610dea565b61153491906143ca565b11156115775760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b6044820152606401610a34565b6115cf83828151811061159a57634e487b7160e01b600052603260045260246000fd5b60200260200101518383815181106115c257634e487b7160e01b600052603260045260246000fd5b6020026020010151612b6c565b806115d981614493565b9150506114e9565b60fb546001600160a01b0316331461160b5760405162461bcd60e51b8152600401610a34906142c2565b61013380546001600160a01b0319166001600160a01b03939093169290921790915561013455565b60006001600160a01b03821661165c576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152606a60205260409020546001600160401b031690565b60fb546001600160a01b031633146116ab5760405162461bcd60e51b8152600401610a34906142c2565b6113aa6000613245565b60fb546001600160a01b031633146116df5760405162461bcd60e51b8152600401610a34906142c2565b61012e805460ff60481b1916600160481b84151590810291909117909155611717578051611715906101359060208401906139a7565b505b600182151514156112fb576000610132805461173290614458565b80601f016020809104026020016040519081016040528092919081815260200182805461175e90614458565b80156117ab5780601f10611780576101008083540402835291602001916117ab565b820191906000526020600020905b81548152906001019060200180831161178e57829003601f168201915b50505050509050805160001415610f75578151610de4906101329060208501906139a7565b606060008060006117e085611633565b90506000816001600160401b0381111561180a57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611833578160200160208202803683370190505b509050611859604080516060810182526000808252602082018190529181019190915290565b60015b83861461192d57600081815260696020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161580159282019290925292506118c257611925565b81516001600160a01b0316156118d757815194505b876001600160a01b0316856001600160a01b03161415611925578083878060010198508151811061191857634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b60010161185c565b50909695505050505050565b606060688054610e0f90614458565b606081831061196a57604051631960ccad60e11b815260040160405180910390fd5b606554600090600185101561197e57600194505b8084111561198a578093505b600061199587611633565b9050848610156119b457858503818110156119ae578091505b506119b8565b5060005b6000816001600160401b038111156119e057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611a09578160200160208202803683370190505b50905081611a1c579350611b2592505050565b6000611a278861222d565b905060008160400151611a38575080515b885b888114158015611a4a5750848714155b15611b1957600081815260696020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16158015928201929092529350611aae57611b11565b82516001600160a01b031615611ac357825191505b8a6001600160a01b0316826001600160a01b03161415611b115780848880600101995081518110611b0457634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b600101611a3a565b50505092835250909150505b9392505050565b8060008111611b725760405162461bcd60e51b815260206004820152601260248201527126b4b73a1030ba103632b0b9ba1037b7329760711b6044820152606401610a34565b61012e5463ffffffff16811115611bbf5760405162461bcd60e51b815260206004820152601160248201527026b0bc1036b4b73a103932b0b1b432b21760791b6044820152606401610a34565b611bc7610fc7565b81611bd0610dea565b611bda91906143ca565b1115611c1d5760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b6044820152606401610a34565b61012e54640100000000900463ffffffff1681611c3933612b2b565b611c4391906143ca565b1115611c8a5760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b6044820152606401610a34565b8061012d54611c9991906143f6565b341015611cdb5760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b410333ab7321760811b6044820152606401610a34565b610130546001600160a01b031615611db657610130546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b158015611d3657600080fd5b505afa158015611d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6e9190613f90565b11611db45760405162461bcd60e51b81526020600482015260166024820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b6044820152606401610a34565b505b61012e54600160401b900460ff161515600114611e055760405162461bcd60e51b815260206004820152600d60248201526c26b4b73a103737ba1037b832b760991b6044820152606401610a34565b6112fb3383612b6c565b6001600160a01b038216331415611e395760405163b06307db60e01b815260040160405180910390fd5b336000818152606c602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600054610100900460ff16611ec05760005460ff1615611ec4565b303b155b611f275760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a34565b600054610100900460ff16158015611f49576000805461ffff19166101011790555b611f54848484613297565b8015610de4576000805461ff001916905550505050565b611f76848484612c1b565b6001600160a01b0383163b15610de457611f928484848461340f565b610de4576040516368d2bf6b60e11b815260040160405180910390fd5b60fb546001600160a01b03163314611fd95760405162461bcd60e51b8152600401610a34906142c2565b60015b61013954811015612045576101386000610139838154811061200e57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040018120558061203d81614493565b915050611fdc565b5081516120539060016143ca565b6001600160401b0381111561207857634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156120a1578160200160208202803683370190505b5080516120b79161013991602090910190613a2b565b5073460fd5059e7301680fa53e63bbbf7272e643e89c6101396000815481106120f057634e487b7160e01b600052603260045260246000fd5b6000918252602082200180546001600160a01b0319166001600160a01b0393909316929092179091555b8251811015610f755781818151811061214357634e487b7160e01b600052603260045260246000fd5b6020026020010151610138600085848151811061217057634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055508281815181106121bc57634e487b7160e01b600052603260045260246000fd5b60200260200101516101398260016121d491906143ca565b815481106121f257634e487b7160e01b600052603260045260246000fd5b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790558061222581614493565b91505061211a565b6040805160608082018352600080835260208084018290528385018290528451928301855281835282018190529281019290925290600183108061227357506065548310155b1561227e5792915050565b50600082815260696020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615801592820192909252906122de5792915050565b611b2583613123565b60606122f282612b86565b61232f5760405162461bcd60e51b815260206004820152600e60248201526d111bd95cc81b9bdd08195e1a5cdd60921b6044820152606401610a34565b61012e54600160481b900460ff166123745761013561234d83613507565b60405160200161235e9291906140e6565b6040516020818303038152906040529050919050565b61013261234d83613507565b60fb546001600160a01b031633146123aa5760405162461bcd60e51b8152600401610a34906142c2565b61012e8054921515600160501b026aff00000000000000000000199093169290921790915561013655565b8163ffffffff16600081116124215760405162461bcd60e51b815260206004820152601260248201527126b4b73a1030ba103632b0b9ba1037b7329760711b6044820152606401610a34565b61012e5463ffffffff1681111561246e5760405162461bcd60e51b815260206004820152601160248201527026b0bc1036b4b73a103932b0b1b432b21760791b6044820152606401610a34565b612476610fc7565b8161247f610dea565b61248991906143ca565b11156124cc5760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b6044820152606401610a34565b61012e54640100000000900463ffffffff16816124e833612b2b565b6124f291906143ca565b11156125395760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b6044820152606401610a34565b8061012d5461254891906143f6565b34101561258a5760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b410333ab7321760811b6044820152606401610a34565b610130546001600160a01b03161561266557610130546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b1580156125e557600080fd5b505afa1580156125f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061261d9190613f90565b116126635760405162461bcd60e51b81526020600482015260166024820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b6044820152606401610a34565b505b61012e54600160581b900460ff1615156001146126b95760405162461bcd60e51b81526020600482015260126024820152712932b332b93930b639903737ba1037b832b760711b6044820152606401610a34565b61012e54600160401b900460ff1615156001146127085760405162461bcd60e51b815260206004820152600d60248201526c26b4b73a103737ba1037b832b760991b6044820152606401610a34565b600061012f54116127505760405162461bcd60e51b81526020600482015260126024820152714361702069732073657420746f207a65726f60701b6044820152606401610a34565b600061275b83612b2b565b116127a85760405162461bcd60e51b815260206004820152601760248201527f526566657272657220686173206e6f74206d696e7465640000000000000000006044820152606401610a34565b336001600160a01b03831614156128015760405162461bcd60e51b815260206004820152601560248201527f43616e6e6f7420726566657220796f757273656c6600000000000000000000006044820152606401610a34565b612811338463ffffffff16612b6c565b6001600160a01b03821660009081526101376020526040812080546001929061283b9084906143ca565b909155505061012f546001600160a01b0383166000908152610137602052604090205461286891906144ae565b610f7557612874610fc7565b61287c610dea565b1015610f7557610f75826001612b6c565b60fb546001600160a01b031633146128b75760405162461bcd60e51b8152600401610a34906142c2565b6001600160a01b03811661291c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a34565b61132581613245565b6060806000610139805490506001600160401b0381111561295657634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561297f578160200160208202803683370190505b50905060005b61013954811015612a1b57610138600061013983815481106129b757634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205482518390839081106129fe57634e487b7160e01b600052603260045260246000fd5b602090810291909101015280612a1381614493565b915050612985565b506101398181805480602002602001604051908101604052809291908181526020018280548015612a7557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612a57575b5050505050915092509250509091565b60fb546001600160a01b03163314612aaf5760405162461bcd60e51b8152600401610a34906142c2565b61012e8054921515600160581b026bff0000000000000000000000199093169290921790915561012f55565b60006001600160e01b031982166380ac58cd60e01b1480612b0c57506001600160e01b03198216635b5e139f60e01b145b806109e657506301ffc9a760e01b6001600160e01b03198316146109e6565b6001600160a01b03166000908152606a6020526040902054600160401b90046001600160401b031690565b600082612b638584613620565b14949350505050565b6112fb8282604051806020016040528060008152506136d2565b600081600111158015612b9a575060655482105b80156109e6575050600090815260696020526040902054600160e01b900460ff161590565b6000828152606b602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000612c2682613123565b9050836001600160a01b031681600001516001600160a01b031614612c5d5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612c9957506001600160a01b0385166000908152606c6020908152604080832033845290915290205460ff165b80612cb4575033612ca984610e92565b6001600160a01b0316145b905080612cd457604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612cfb57604051633a954ecd60e21b815260040160405180910390fd5b612d0760008487612bbf565b6001600160a01b038581166000908152606a60209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652606990945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116612ddb576065548214612ddb57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b80471015612e765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a34565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612ec3576040519150601f19603f3d011682016040523d82523d6000602084013e612ec8565b606091505b5050905080610f755760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a34565b6000612f4a83613123565b80519091508215612fce576000336001600160a01b0383161480612f9157506001600160a01b0382166000908152606c6020908152604080832033845290915290205460ff165b80612fac575033612fa186610e92565b6001600160a01b0316145b905080612fcc57604051632ce44b5f60e11b815260040160405180910390fd5b505b612fda60008583612bbf565b6001600160a01b038082166000818152606a602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526069909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b1785559189018084529220805491949091166130d85760655482146130d857805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a450506066805460010190555050565b6040805160608101825260008082526020820181905291810191909152818060011161322c5760655481101561322c57600081815260696020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529061322a5780516001600160a01b0316156131c1579392505050565b5060001901600081815260696020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215613225579392505050565b6131c1565b505b604051636f96cda160e11b815260040160405180910390fd5b60fb80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166132be5760405162461bcd60e51b8152600401610a34906142f7565b6132c88383613890565b6132d06138c1565b6132d86138c1565b6132e06138e8565b61013181905561012e805460ff60481b1916905573460fd5059e7301680fa53e63bbbf7272e643e89c6000908152610138602081905260317f39719337746db8067ed31bd30cc7a240f6ddf8ad0cec6cb2791263198d4e1c64556103b79161335060fb546001600160a01b031690565b6001600160a01b0316815260208101919091526040016000908120919091556101398054600181018255918190527f22d66071756d4d57920b8322c1a903a27bd75b44065e925d5f9f1c08908d28f690910180546001600160a01b03191673460fd5059e7301680fa53e63bbbf7272e643e89c1790556133d860fb546001600160a01b031690565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b03909216919091179055505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906134449033908990889088906004016141a0565b602060405180830381600087803b15801561345e57600080fd5b505af192505050801561348e575060408051601f3d908101601f1916820190925261348b91810190613ef3565b60015b6134e9573d8080156134bc576040519150601f19603f3d011682016040523d82523d6000602084013e6134c1565b606091505b5080516134e1576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60608161352b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613555578061353f81614493565b915061354e9050600a836143e2565b915061352f565b6000816001600160401b0381111561357d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156135a7576020820181803683370190505b5090505b84156134ff576135bc600183614415565b91506135c9600a866144ae565b6135d49060306143ca565b60f81b8183815181106135f757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350613619600a866143e2565b94506135ab565b600081815b845181101561149457600085828151811061365057634e487b7160e01b600052603260045260246000fd5b602002602001015190508083116136925760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506136bf565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806136ca81614493565b915050613625565b6065546001600160a01b0384166136fb57604051622e076360e81b815260040160405180910390fd5b826137195760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b0384166000818152606a6020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b018116918217600160401b67ffffffffffffffff1990941690921783900481168b01811690920217909155858452606990925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b1561383c575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4613805600087848060010195508761340f565b613822576040516368d2bf6b60e11b815260040160405180910390fd5b8082106137ba57826065541461383757600080fd5b613881565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821061383d575b50606555610de4600085838684565b600054610100900460ff166138b75760405162461bcd60e51b8152600401610a34906142f7565b6112fb828261391f565b600054610100900460ff166113aa5760405162461bcd60e51b8152600401610a34906142f7565b600054610100900460ff1661390f5760405162461bcd60e51b8152600401610a34906142f7565b6139176138c1565b6113aa613977565b600054610100900460ff166139465760405162461bcd60e51b8152600401610a34906142f7565b81516139599060679060208501906139a7565b50805161396d9060689060208401906139a7565b5060016065555050565b600054610100900460ff1661399e5760405162461bcd60e51b8152600401610a34906142f7565b6113aa33613245565b8280546139b390614458565b90600052602060002090601f0160209004810192826139d55760008555613a1b565b82601f106139ee57805160ff1916838001178555613a1b565b82800160010185558215613a1b579182015b82811115613a1b578251825591602001919060010190613a00565b50613a27929150613a80565b5090565b828054828255906000526020600020908101928215613a1b579160200282015b82811115613a1b57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613a4b565b5b80821115613a275760008155600101613a81565b60006001600160401b03831115613aae57613aae6144ee565b613ac1601f8401601f1916602001614377565b9050828152838383011115613ad557600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114613b0357600080fd5b919050565b600082601f830112613b18578081fd5b81356020613b2d613b28836143a7565b614377565b80838252828201915082860187848660051b8901011115613b4c578586fd5b855b85811015613b6a57813584529284019290840190600101613b4e565b5090979650505050505050565b80358015158114613b0357600080fd5b600082601f830112613b97578081fd5b611b2583833560208501613a95565b803563ffffffff81168114613b0357600080fd5b600060208284031215613bcb578081fd5b611b2582613aec565b60008060408385031215613be6578081fd5b613bef83613aec565b9150613bfd60208401613aec565b90509250929050565b600080600060608486031215613c1a578081fd5b613c2384613aec565b9250613c3160208501613aec565b9150604084013590509250925092565b60008060008060808587031215613c56578081fd5b613c5f85613aec565b9350613c6d60208601613aec565b92506040850135915060608501356001600160401b03811115613c8e578182fd5b8501601f81018713613c9e578182fd5b613cad87823560208401613a95565b91505092959194509250565b60008060408385031215613ccb578182fd5b613cd483613aec565b9150613bfd60208401613b77565b60008060408385031215613cf4578182fd5b613cfd83613aec565b946020939093013593505050565b600080600060608486031215613d1f578283fd5b613d2884613aec565b95602085013595506040909401359392505050565b60008060408385031215613d4f578182fd5b82356001600160401b0380821115613d65578384fd5b818501915085601f830112613d78578384fd5b81356020613d88613b28836143a7565b8083825282820191508286018a848660051b8901011115613da7578889fd5b8896505b84871015613dd057613dbc81613aec565b835260019690960195918301918301613dab565b5096505086013592505080821115613de6578283fd5b50613df385828601613b08565b9150509250929050565b600060208284031215613e0e578081fd5b81356001600160401b03811115613e23578182fd5b6134ff84828501613b08565b60008060408385031215613e41578182fd5b613cfd83613b77565b60008060408385031215613e5c578182fd5b613e6583613b77565b915060208301356001600160401b03811115613e7f578182fd5b613df385828601613b87565b60008060008060808587031215613ea0578182fd5b613ea985613b77565b935060208501359250613ebe60408601613ba6565b9150613ecc60608601613ba6565b905092959194509250565b600060208284031215613ee8578081fd5b8135611b2581614504565b600060208284031215613f04578081fd5b8151611b2581614504565b600080600060608486031215613f23578081fd5b83356001600160401b0380821115613f39578283fd5b613f4587838801613b87565b94506020860135915080821115613f5a578283fd5b50613f6786828701613b87565b925050604084013590509250925092565b600060208284031215613f89578081fd5b5035919050565b600060208284031215613fa1578081fd5b5051919050565b60008060408385031215613fba578182fd5b50508035926020909101359150565b60008060408385031215613fdb578182fd5b613bef83613ba6565b600080600060408486031215613ff8578081fd5b61400184613ba6565b925060208401356001600160401b038082111561401c578283fd5b818601915086601f83011261402f578283fd5b81358181111561403d578384fd5b8760208260051b8501011115614051578384fd5b6020830194508093505050509250925092565b6000815180845260208085019450808401835b8381101561409357815187529582019590820190600101614077565b509495945050505050565b600081518084526140b681602086016020860161442c565b601f01601f19169290920160200192915050565b600081516140dc81856020860161442c565b9290920192915050565b600080845482600182811c91508083168061410257607f831692505b602080841082141561412257634e487b7160e01b87526022600452602487fd5b818015614136576001811461414757614173565b60ff19861689528489019650614173565b60008b815260209020885b8681101561416b5781548b820152908501908301614152565b505084890196505b50505050505061419761418682866140ca565b64173539b7b760d91b815260050190565b95945050505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526141d2608083018461409e565b9695505050505050565b604080825283519082018190526000906020906060840190828701845b8281101561421e5781516001600160a01b0316845292840192908401906001016141f9565b505050838103828501526141d28186614064565b6020808252825182820181905260009190848201906040850190845b8181101561192d5761428983855180516001600160a01b031682526020808201516001600160401b0316908301526040908101511515910152565b928401926060929092019160010161424e565b602081526000611b256020830184614064565b602081526000611b25602083018461409e565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b81516001600160a01b031681526020808301516001600160401b031690820152604080830151151590820152606081016109e6565b604051601f8201601f191681016001600160401b038111828210171561439f5761439f6144ee565b604052919050565b60006001600160401b038211156143c0576143c06144ee565b5060051b60200190565b600082198211156143dd576143dd6144c2565b500190565b6000826143f1576143f16144d8565b500490565b6000816000190483118215151615614410576144106144c2565b500290565b600082821015614427576144276144c2565b500390565b60005b8381101561444757818101518382015260200161442f565b83811115610de45750506000910152565b600181811c9082168061446c57607f821691505b6020821081141561448d57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156144a7576144a76144c2565b5060010190565b6000826144bd576144bd6144d8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461132557600080fdfea26469706673582212209012868252bc6ca1d523a4088439ff588d2d02550967be178a2555df6b64387364736f6c63430008040033
Deployed Bytecode Sourcemap
107761:242:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;105585:286;;;;;;;;;;-1:-1:-1;105585:286:0;;;;;:::i;:::-;;:::i;:::-;;;16466:14:1;;16459:22;16441:41;;16429:2;16414:18;105585:286:0;;;;;;;;104120:513;;;;;;:::i;:::-;;:::i;:::-;;105366:91;;;;;;;;;;;;;:::i;:::-;;;25408:25:1;;;25396:2;25381:18;105366:91:0;25363:76:1;71994:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;73509:204::-;;;;;;;;;;-1:-1:-1;73509:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;13555:55:1;;;13537:74;;13525:2;13510:18;73509:204:0;13492:125:1;73060:383:0;;;;;;;;;;-1:-1:-1;73060:383:0;;;;;:::i;:::-;;:::i;101054:97::-;;;;;;;;;;-1:-1:-1;101054:97:0;;;;;:::i;:::-;;:::i;99183:19::-;;;;;;;;;;;;;;;;105465:112;;;;;;;;;;;;;:::i;100688:249::-;;;;;;;;;;-1:-1:-1;100688:249:0;;;;;:::i;:::-;;:::i;74374:170::-;;;;;;;;;;-1:-1:-1;74374:170:0;;;;;:::i;:::-;;:::i;105879:246::-;;;;;;;;;;-1:-1:-1;105879:246:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;14330:55:1;;;14312:74;;14417:2;14402:18;;14395:34;;;;14285:18;105879:246:0;14267:168:1;100409:236:0;;;;;;;;;;-1:-1:-1;100409:236:0;;;;;:::i;:::-;;:::i;102855:387::-;;;:::i;74615:185::-;;;;;;;;;;-1:-1:-1;74615:185:0;;;;;:::i;:::-;;:::i;89239:94::-;;;;;;;;;;-1:-1:-1;89239:94:0;;;;;:::i;:::-;;:::i;99240:26::-;;;;;;;;;;-1:-1:-1;99240:26:0;;;;;;;;;;;;;;25618:10:1;25606:23;;;25588:42;;25576:2;25561:18;99240:26:0;25543:93:1;99209:24:0;;;;;;;;;;-1:-1:-1;99209:24:0;;;;;;;;99296:20;;;;;;;;;;-1:-1:-1;99296:20:0;;;;-1:-1:-1;;;99296:20:0;;;;;;103888:224;;;:::i;93798:468::-;;;;;;;;;;-1:-1:-1;93798:468:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;71802:125::-;;;;;;;;;;-1:-1:-1;71802:125:0;;;;;:::i;:::-;;:::i;99353:24::-;;;;;;;;;;-1:-1:-1;99353:24:0;;;;-1:-1:-1;;;99353:24:0;;;;;;103278:431;;;;;;;;;;-1:-1:-1;103278:431:0;;;;;:::i;:::-;;:::i;102677:170::-;;;;;;;;;;-1:-1:-1;102677:170:0;;;;;:::i;:::-;;:::i;69248:206::-;;;;;;;;;;-1:-1:-1;69248:206:0;;;;;:::i;:::-;;:::i;13707:103::-;;;;;;;;;;;;;:::i;101299:375::-;;;;;;;;;;-1:-1:-1;101299:375:0;;;;;:::i;:::-;;:::i;97612:891::-;;;;;;;;;;-1:-1:-1;97612:891:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;13056:87::-;;;;;;;;;;-1:-1:-1;13129:6:0;;-1:-1:-1;;;;;13129:6:0;13056:87;;72163:104;;;;;;;;;;;;;:::i;94656:2507::-;;;;;;;;;;-1:-1:-1;94656:2507:0;;;;;:::i;:::-;;:::i;103717:163::-;;;;;;:::i;:::-;;:::i;73785:287::-;;;;;;;;;;-1:-1:-1;73785:287:0;;;;;:::i;:::-;;:::i;107820:180::-;;;;;;;;;;-1:-1:-1;107820:180:0;;;;;:::i;:::-;;:::i;74871:370::-;;;;;;;;;;-1:-1:-1;74871:370:0;;;;;:::i;:::-;;:::i;101682:493::-;;;;;;;;;;-1:-1:-1;101682:493:0;;;;;:::i;:::-;;:::i;99323:23::-;;;;;;;;;;-1:-1:-1;99323:23:0;;;;-1:-1:-1;;;99323:23:0;;;;;;93221:418;;;;;;;;;;-1:-1:-1;93221:418:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;99417:23::-;;;;;;;;;;-1:-1:-1;99417:23:0;;;;-1:-1:-1;;;;;99417:23:0;;;106260:723;;;;;;;;;;-1:-1:-1;106260:723:0;;;;;:::i;:::-;;:::i;106133:119::-;;;;;;;;;;-1:-1:-1;106133:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;106226:18:0;106199:7;106226:18;;;:11;:18;;;;;;;106133:119;101159:132;;;;;;;;;;-1:-1:-1;101159:132:0;;;;;:::i;:::-;;:::i;99384:26::-;;;;;;;;;;;;;;;;74143:164;;;;;;;;;;-1:-1:-1;74143:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;74264:25:0;;;74240:4;74264:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;74143:164;104641:690;;;;;;:::i;:::-;;:::i;13965:201::-;;;;;;;;;;-1:-1:-1;13965:201:0;;;;;:::i;:::-;;:::i;102183:343::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;99273:16::-;;;;;;;;;;-1:-1:-1;99273:16:0;;;;-1:-1:-1;;;99273:16:0;;;;;;102534:135;;;;;;;;;;-1:-1:-1;102534:135:0;;;;;:::i;:::-;;:::i;105585:286::-;105727:4;-1:-1:-1;;;;;;105769:41:0;;-1:-1:-1;;;105769:41:0;;:94;;;105827:36;105851:11;105827:23;:36::i;:::-;105749:114;105585:286;-1:-1:-1;;105585:286:0:o;104120:513::-;104239:5;107025:681;;107090:1;107082:5;:9;107074:40;;;;-1:-1:-1;;;107074:40:0;;24845:2:1;107074:40:0;;;24827:21:1;24884:2;24864:18;;;24857:30;-1:-1:-1;;;24903:18:1;;;24896:48;24961:18;;107074:40:0;;;;;;;;;107142:10;;;;107133:19;;;107125:49;;;;-1:-1:-1;;;107125:49:0;;24499:2:1;107125:49:0;;;24481:21:1;24538:2;24518:18;;;24511:30;-1:-1:-1;;;24557:18:1;;;24550:47;24614:18;;107125:49:0;24471:167:1;107125:49:0;107213:13;:11;:13::i;:::-;107204:5;107193:8;:6;:8::i;:::-;:16;;;;:::i;:::-;:33;;107185:64;;;;-1:-1:-1;;;107185:64:0;;20613:2:1;107185:64:0;;;20595:21:1;20652:2;20632:18;;;20625:30;-1:-1:-1;;;20671:18:1;;;20664:48;20729:18;;107185:64:0;20585:168:1;107185:64:0;107319:12;;;;;;;107310:5;107282:25;107296:10;107282:13;:25::i;:::-;:33;;;;:::i;:::-;:49;;107260:121;;;;-1:-1:-1;;;107260:121:0;;23050:2:1;107260:121:0;;;23032:21:1;23089:2;23069:18;;;23062:30;-1:-1:-1;;;23108:18:1;;;23101:52;23170:18;;107260:121:0;23022:172:1;107260:121:0;107420:5;107413:4;;:12;;;;:::i;:::-;107400:9;:25;;107392:54;;;;-1:-1:-1;;;107392:54:0;;24154:2:1;107392:54:0;;;24136:21:1;24193:2;24173:18;;;24166:30;-1:-1:-1;;;24212:18:1;;;24205:46;24268:18;;107392:54:0;24126:166:1;107392:54:0;107461:8;;-1:-1:-1;;;;;107461:8:0;:22;107457:228;;107528:8;;107578:33;;-1:-1:-1;;;107578:33:0;;107600:10;107578:33;;;13537:74:1;-1:-1:-1;;;;;107528:8:0;;;;107500:18;;107528:8;;107578:21;;13510:18:1;;107578:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;107552:121;;;;-1:-1:-1;;;107552:121:0;;20262:2:1;107552:121:0;;;20244:21:1;20301:2;20281:18;;;20274:30;-1:-1:-1;;;20320:18:1;;;20313:52;20382:18;;107552:121:0;20234:172:1;107552:121:0;107457:228;;104270:11:::1;::::0;-1:-1:-1;;;104270:11:0;::::1;;;104262:40;;;::::0;-1:-1:-1;;;104262:40:0;;22705:2:1;104262:40:0::1;::::0;::::1;22687:21:1::0;22744:2;22724:18;;;22717:30;-1:-1:-1;;;22763:18:1;;;22756:46;22819:18;;104262:40:0::1;22677:166:1::0;104262:40:0::1;104321:10;::::0;104313:46:::1;;;::::0;-1:-1:-1;;;104313:46:0;;16919:2:1;104313:46:0::1;::::0;::::1;16901:21:1::0;16958:2;16938:18;;;16931:30;-1:-1:-1;;;16977:18:1;;;16970:47;17034:18;;104313:46:0::1;16891:167:1::0;104313:46:0::1;104392:144;104429:5;;104392:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;104453:10:0::1;::::0;104492:28:::1;::::0;-1:-1:-1;;104509:10:0::1;11534:2:1::0;11530:15;11526:53;104492:28:0::1;::::0;::::1;11514:66:1::0;104453:10:0;;-1:-1:-1;11596:12:1;;;-1:-1:-1;104492:28:0::1;;;;;;;;;;;;104482:39;;;;;;104392:18;:144::i;:::-;104370:214;;;::::0;-1:-1:-1;;;104370:214:0;;18366:2:1;104370:214:0::1;::::0;::::1;18348:21:1::0;18405:2;18385:18;;;18378:30;18444:22;18424:18;;;18417:50;18484:18;;104370:214:0::1;18338:170:1::0;104370:214:0::1;104597:28;104607:10;104619:5;104597:28;;:9;:28::i;:::-;104120:513:::0;;;;:::o;105366:91::-;105405:7;105448:1;105432:13;;:17;;;;:::i;:::-;105425:24;;105366:91;:::o;71994:100::-;72048:13;72081:5;72074:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71994:100;:::o;73509:204::-;73577:7;73602:16;73610:7;73602;:16::i;:::-;73597:64;;73627:34;;-1:-1:-1;;;73627:34:0;;;;;;;;;;;73597:64;-1:-1:-1;73681:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;73681:24:0;;73509:204::o;73060:383::-;73133:13;73149:35;73176:7;73149:26;:35::i;:::-;73133:51;;73205:5;-1:-1:-1;;;;;73199:11:0;:2;-1:-1:-1;;;;;73199:11:0;;73195:48;;;73219:24;;-1:-1:-1;;;73219:24:0;;;;;;;;;;;73195:48;11572:10;-1:-1:-1;;;;;73260:21:0;;;73256:139;;-1:-1:-1;;;;;74264:25:0;;74240:4;74264:25;;;:18;:25;;;;;;;;11572:10;74264:35;;;;;;;;;;73283:112;;73348:35;;-1:-1:-1;;;73348:35:0;;;;;;;;;;;73283:112;73407:28;73416:2;73420:7;73429:5;73407:8;:28::i;:::-;73060:383;;;:::o;101054:97::-;13129:6;;-1:-1:-1;;;;;13129:6:0;11572:10;13276:23;13268:68;;;;-1:-1:-1;;;13268:68:0;;;;;;;:::i;:::-;101124:8:::1;:19:::0;;-1:-1:-1;;;;;;101124:19:0::1;-1:-1:-1::0;;;;;101124:19:0;;;::::1;::::0;;;::::1;::::0;;101054:97::o;105465:112::-;105518:7;105557:12;;105545:9;;:24;;;;:::i;100688:249::-;13129:6;;-1:-1:-1;;;;;13129:6:0;11572:10;13276:23;13268:68;;;;-1:-1:-1;;;13268:68:0;;;;;;;:::i;:::-;100834:4:::1;:12:::0;;100857:4:::1;:12:::0;;;;-1:-1:-1;;100880:20:0;;;-1:-1:-1;;;100834:12:0;::::1;;::::0;;;::::1;-1:-1:-1::0;;100880:20:0;;;;;;::::1;::::0;;::::1;;;-1:-1:-1::0;;100911:18:0::1;::::0;::::1;::::0;;;::::1;::::0;;100688:249::o;74374:170::-;74508:28;74518:4;74524:2;74528:7;74508:9;:28::i;105879:246::-;106071:9;;106096:12;;106006:16;;;;-1:-1:-1;;;;;106071:9:0;;;;106112:4;;106083:25;;:10;:25;:::i;:::-;106082:34;;;;:::i;:::-;106063:54;;;;105879:246;;;;;:::o;100409:236::-;100473:10;99747:42;100473:21;100465:49;;;;-1:-1:-1;;;100465:49:0;;17265:2:1;100465:49:0;;;17247:21:1;17304:2;17284:18;;;17277:30;-1:-1:-1;;;17323:18:1;;;17316:45;17378:18;;100465:49:0;17237:165:1;100465:49:0;99747:42;100525:12;100540:16;;;:7;:16;;;;:24;;100559:5;;100540:24;:::i;:::-;99747:42;100575:16;;;;:7;:16;;;;;:24;;;100618:7;:10;;100525:39;;-1:-1:-1;100525:39:0;;100575:7;;:16;100626:1;;100618:10;;;;-1:-1:-1;;;100618:10:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;100618:10:0;100610:19;;;;;;;;;;;;:27;;:19;;100618:10;100610:27;;;;;:::i;:::-;;;;-1:-1:-1;;;;100409:236:0:o;102855:387::-;102919:21;102959:11;102951:36;;;;-1:-1:-1;;;102951:36:0;;23813:2:1;102951:36:0;;;23795:21:1;23852:2;23832:18;;;23825:30;-1:-1:-1;;;23871:18:1;;;23864:42;23923:18;;102951:36:0;23785:162:1;102951:36:0;103005:9;103000:235;103024:7;:14;103020:18;;103000:235;;;103060:13;103076:7;:19;103084:7;103092:1;103084:10;;;;;;-1:-1:-1;;;103084:10:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;103084:10:0;103076:19;;;;;;;;;;;;;;-1:-1:-1;103147:4:0;103128:15;103136:7;103076:19;103128:15;:::i;:::-;103127:24;;;;:::i;:::-;103110:42;;103167:56;103204:7;103212:1;103204:10;;;;;;-1:-1:-1;;;103204:10:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;103204:10:0;103217:5;103167:28;:56::i;:::-;103000:235;;103040:3;;;;;:::i;:::-;;;;103000:235;;;;102855:387;:::o;74615:185::-;74753:39;74770:4;74776:2;74780:7;74753:39;;;;;;;;;;;;:16;:39::i;89239:94::-;89305:20;89311:7;89320:4;89305:5;:20::i;:::-;89239:94;:::o;103888:224::-;13129:6;;-1:-1:-1;;;;;13129:6:0;11572:10;13276:23;13268:68;;;;-1:-1:-1;;;13268:68:0;;;;;;;:::i;:::-;103949:9:::1;:13:::0;103945:103:::1;;103979:57;99747:42;104026:9;103979:28;:57::i;:::-;104060:44;104070:7;13129:6:::0;;-1:-1:-1;;;;;13129:6:0;;13056:87;104070:7:::1;104095:8;:6;:8::i;:::-;104079:13;:11;:13::i;:::-;:24;;;;:::i;:::-;104060:9;:44::i;:::-;103888:224::o:0;93798:468::-;93973:15;;93887:23;;93948:22;93973:15;-1:-1:-1;;;;;94040:36:0;;;;;-1:-1:-1;;;94040:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;94040:36:0;;-1:-1:-1;;94040:36:0;;;;;;;;;;;;94003:73;;94096:9;94091:125;94112:14;94107:1;:19;94091:125;;94168:32;94188:8;94197:1;94188:11;;;;;;-1:-1:-1;;;94188:11:0;;;;;;;;;;;;;;;94168:19;:32::i;:::-;94152:10;94163:1;94152:13;;;;;;-1:-1:-1;;;94152:13:0;;;;;;;;;;;;;;;;;;:48;94128:3;;94091:125;;;-1:-1:-1;94237:10:0;93798:468;-1:-1:-1;;;93798:468:0:o;71802:125::-;71866:7;71893:21;71906:7;71893:12;:21::i;:::-;:26;;71802:125;-1:-1:-1;;71802:125:0:o;103278:431::-;13129:6;;-1:-1:-1;;;;;13129:6:0;11572:10;13276:23;13268:68;;;;-1:-1:-1;;;13268:68:0;;;;;;;:::i;:::-;103432:7:::1;:14;103410:11;:18;:36;103402:45;;;::::0;::::1;;103465:9;103460:242;103484:7;:14;103480:1;:18;103460:242;;;103571:13;:11;:13::i;:::-;103557:7;103565:1;103557:10;;;;;;-1:-1:-1::0;;;103557:10:0::1;;;;;;;;;;;;;;;103546:8;:6;:8::i;:::-;:21;;;;:::i;:::-;:38;;103520:118;;;::::0;-1:-1:-1;;;103520:118:0;;20613:2:1;103520:118:0::1;::::0;::::1;20595:21:1::0;20652:2;20632:18;;;20625:30;-1:-1:-1;;;20671:18:1;;;20664:48;20729:18;;103520:118:0::1;20585:168:1::0;103520:118:0::1;103653:37;103663:11;103675:1;103663:14;;;;;;-1:-1:-1::0;;;103663:14:0::1;;;;;;;;;;;;;;;103679:7;103687:1;103679:10;;;;;;-1:-1:-1::0;;;103679:10:0::1;;;;;;;;;;;;;;;103653:9;:37::i;:::-;103500:3:::0;::::1;::::0;::::1;:::i;:::-;;;;103460:242;;102677:170:::0;13129:6;;-1:-1:-1;;;;;13129:6:0;11572:10;13276:23;13268:68;;;;-1:-1:-1;;;13268:68:0;;;;;;;:::i;:::-;102787:9:::1;:22:::0;;-1:-1:-1;;;;;;102787:22:0::1;-1:-1:-1::0;;;;;102787:22:0;;;::::1;::::0;;;::::1;::::0;;;102820:12:::1;:19:::0;102677:170::o;69248:206::-;69312:7;-1:-1:-1;;;;;69336:19:0;;69332:60;;69364:28;;-1:-1:-1;;;69364:28:0;;;;;;;;;;;69332:60;-1:-1:-1;;;;;;69418:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;69418:27:0;;69248:206::o;13707:103::-;13129:6;;-1:-1:-1;;;;;13129:6:0;11572:10;13276:23;13268:68;;;;-1:-1:-1;;;13268:68:0;;;;;;;:::i;:::-;13772:30:::1;13799:1;13772:18;:30::i;101299:375::-:0;13129:6;;-1:-1:-1;;;;;13129:6:0;11572:10;13276:23;13268:68;;;;-1:-1:-1;;;13268:68:0;;;;;;;:::i;:::-;101385:8:::1;:20:::0;;-1:-1:-1;;;;101385:20:0::1;-1:-1:-1::0;;;101385:20:0;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;101418:72:::1;;101457:21:::0;;::::1;::::0;:14:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;101418:72;101519:4;101506:17:::0;::::1;;;101502:165;;;101540:15;101564:7;101540:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101591:2;:9;101604:1;101591:14;101587:69;;;101626:14:::0;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;97612:891::-:0;97682:16;97736:19;97770:25;97810:22;97835:16;97845:5;97835:9;:16::i;:::-;97810:41;;97866:25;97908:14;-1:-1:-1;;;;;97894:29:0;;;;;-1:-1:-1;;;97894:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;97894:29:0;;97866:57;;97938:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;97938:31:0;101037:1;97984:471;98033:14;98018:11;:29;97984:471;;98085:14;;;;:11;:14;;;;;;;;;98073:26;;;;;;;;;-1:-1:-1;;;;;98073:26:0;;;;-1:-1:-1;;;98073:26:0;;-1:-1:-1;;;;;98073:26:0;;;;;;;;-1:-1:-1;;;98073:26:0;;;;;;;;;;;;;;;;-1:-1:-1;98118:73:0;;98163:8;;98118:73;98213:14;;-1:-1:-1;;;;;98213:28:0;;98209:111;;98286:14;;;-1:-1:-1;98209:111:0;98363:5;-1:-1:-1;;;;;98342:26:0;:17;-1:-1:-1;;;;;98342:26:0;;98338:102;;;98419:1;98393:8;98402:13;;;;;;98393:23;;;;;;-1:-1:-1;;;98393:23:0;;;;;;;;;;;;;;:27;;;;;98338:102;98049:3;;97984:471;;;-1:-1:-1;98476:8:0;;97612:891;-1:-1:-1;;;;;;97612:891:0:o;72163:104::-;72219:13;72252:7;72245:14;;;;;:::i;94656:2507::-;94791:16;94858:4;94849:5;:13;94845:45;;94871:19;;-1:-1:-1;;;94871:19:0;;;;;;;;;;;94845:45;94959:13;;94905:19;;101037:1;95050:5;:23;95046:87;;;101037:1;95094:23;;95046:87;95213:9;95206:4;:16;95202:73;;;95250:9;95243:16;;95202:73;95289:25;95317:16;95327:5;95317:9;:16::i;:::-;95289:44;;95511:4;95503:5;:12;95499:278;;;95558:12;;;95593:31;;;95589:111;;;95669:11;95649:31;;95589:111;95499:278;;;;-1:-1:-1;95760:1:0;95499:278;95791:25;95833:17;-1:-1:-1;;;;;95819:32:0;;;;;-1:-1:-1;;;95819:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;95819:32:0;-1:-1:-1;95791:60:0;-1:-1:-1;95870:22:0;95866:78;;95920:8;-1:-1:-1;95913:15:0;;-1:-1:-1;;;95913:15:0;95866:78;96088:31;96122:26;96142:5;96122:19;:26::i;:::-;96088:60;;96163:25;96408:9;:16;;;96403:92;;-1:-1:-1;96465:14:0;;96403:92;96526:5;96509:477;96538:4;96533:1;:9;;:45;;;;;96561:17;96546:11;:32;;96533:45;96509:477;;;96616:14;;;;:11;:14;;;;;;;;;96604:26;;;;;;;;;-1:-1:-1;;;;;96604:26:0;;;;-1:-1:-1;;;96604:26:0;;-1:-1:-1;;;;;96604:26:0;;;;;;;;-1:-1:-1;;;96604:26:0;;;;;;;;;;;;;;;;-1:-1:-1;96649:73:0;;96694:8;;96649:73;96744:14;;-1:-1:-1;;;;;96744:28:0;;96740:111;;96817:14;;;-1:-1:-1;96740:111:0;96894:5;-1:-1:-1;;;;;96873:26:0;:17;-1:-1:-1;;;;;96873:26:0;;96869:102;;;96950:1;96924:8;96933:13;;;;;;96924:23;;;;;;-1:-1:-1;;;96924:23:0;;;;;;;;;;;;;;:27;;;;;96869:102;96580:3;;96509:477;;;-1:-1:-1;;;97071:29:0;;;-1:-1:-1;97078:8:0;;-1:-1:-1;;94656:2507:0;;;;;;:::o;103717:163::-;103777:5;107090:1;107082:5;:9;107074:40;;;;-1:-1:-1;;;107074:40:0;;24845:2:1;107074:40:0;;;24827:21:1;24884:2;24864:18;;;24857:30;-1:-1:-1;;;24903:18:1;;;24896:48;24961:18;;107074:40:0;24817:168:1;107074:40:0;107142:10;;;;107133:19;;;107125:49;;;;-1:-1:-1;;;107125:49:0;;24499:2:1;107125:49:0;;;24481:21:1;24538:2;24518:18;;;24511:30;-1:-1:-1;;;24557:18:1;;;24550:47;24614:18;;107125:49:0;24471:167:1;107125:49:0;107213:13;:11;:13::i;:::-;107204:5;107193:8;:6;:8::i;:::-;:16;;;;:::i;:::-;:33;;107185:64;;;;-1:-1:-1;;;107185:64:0;;20613:2:1;107185:64:0;;;20595:21:1;20652:2;20632:18;;;20625:30;-1:-1:-1;;;20671:18:1;;;20664:48;20729:18;;107185:64:0;20585:168:1;107185:64:0;107319:12;;;;;;;107310:5;107282:25;107296:10;107282:13;:25::i;:::-;:33;;;;:::i;:::-;:49;;107260:121;;;;-1:-1:-1;;;107260:121:0;;23050:2:1;107260:121:0;;;23032:21:1;23089:2;23069:18;;;23062:30;-1:-1:-1;;;23108:18:1;;;23101:52;23170:18;;107260:121:0;23022:172:1;107260:121:0;107420:5;107413:4;;:12;;;;:::i;:::-;107400:9;:25;;107392:54;;;;-1:-1:-1;;;107392:54:0;;24154:2:1;107392:54:0;;;24136:21:1;24193:2;24173:18;;;24166:30;-1:-1:-1;;;24212:18:1;;;24205:46;24268:18;;107392:54:0;24126:166:1;107392:54:0;107461:8;;-1:-1:-1;;;;;107461:8:0;:22;107457:228;;107528:8;;107578:33;;-1:-1:-1;;;107578:33:0;;107600:10;107578:33;;;13537:74:1;-1:-1:-1;;;;;107528:8:0;;;;107500:18;;107528:8;;107578:21;;13510:18:1;;107578:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;107552:121;;;;-1:-1:-1;;;107552:121:0;;20262:2:1;107552:121:0;;;20244:21:1;20301:2;20281:18;;;20274:30;-1:-1:-1;;;20320:18:1;;;20313:52;20382:18;;107552:121:0;20234:172:1;107552:121:0;107457:228;;103803:4:::1;::::0;-1:-1:-1;;;103803:4:0;::::1;;;:12;;103811:4;103803:12;103795:38;;;::::0;-1:-1:-1;;;103795:38:0;;22363:2:1;103795:38:0::1;::::0;::::1;22345:21:1::0;22402:2;22382:18;;;22375:30;-1:-1:-1;;;22421:18:1;;;22414:43;22474:18;;103795:38:0::1;22335:163:1::0;103795:38:0::1;103844:28;103854:10;103866:5;103844:9;:28::i;73785:287::-:0;-1:-1:-1;;;;;73884:24:0;;11572:10;73884:24;73880:54;;;73917:17;;-1:-1:-1;;;73917:17:0;;;;;;;;;;;73880:54;11572:10;73947:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;73947:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;73947:53:0;;;;;;;;;;74016:48;;16441:41:1;;;73947:42:0;;11572:10;74016:48;;16414:18:1;74016:48:0;;;;;;;73785:287;;:::o;107820:180::-;9751:13;;;;;;;:48;;9787:12;;;;9786:13;9751:48;;;10554:4;1316:20;1364:8;9767:16;9743:107;;;;-1:-1:-1;;;9743:107:0;;19847:2:1;9743:107:0;;;19829:21:1;19886:2;19866:18;;;19859:30;19925:34;19905:18;;;19898:62;-1:-1:-1;;;19976:18:1;;;19969:44;20030:19;;9743:107:0;19819:236:1;9743:107:0;9863:19;9886:13;;;;;;9885:14;9910:101;;;;9945:13;:20;;-1:-1:-1;;9980:19:0;;;;;9910:101;107950:44:::1;107967:5;107974:7;107983:10;107950:16;:44::i;:::-;10041:14:::0;10037:68;;;10088:5;10072:21;;-1:-1:-1;;10072:21:0;;;107820:180;;;;:::o;74871:370::-;75038:28;75048:4;75054:2;75058:7;75038:9;:28::i;:::-;-1:-1:-1;;;;;75081:13:0;;1316:20;1364:8;75077:157;;75102:56;75133:4;75139:2;75143:7;75152:5;75102:30;:56::i;:::-;75098:136;;75182:40;;-1:-1:-1;;;75182:40:0;;;;;;;;;;;101682:493;13129:6;;-1:-1:-1;;;;;13129:6:0;11572:10;13276:23;13268:68;;;;-1:-1:-1;;;13268:68:0;;;;;;;:::i;:::-;101834:1:::1;101817:98;101841:7;:14:::0;101837:18;::::1;101817:98;;;101884:7;:19;101892:7;101900:1;101892:10;;;;;;-1:-1:-1::0;;;101892:10:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;101892:10:0::1;101884:19:::0;;;::::1;::::0;;;;;;;;101877:26;101857:3;::::1;::::0;::::1;:::i;:::-;;;;101817:98;;;-1:-1:-1::0;101949:17:0;;:21:::1;::::0;101969:1:::1;101949:21;:::i;:::-;-1:-1:-1::0;;;;;101935:36:0::1;;;;;-1:-1:-1::0;;;101935:36:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;101935:36:0::1;-1:-1:-1::0;101925:46:0;;::::1;::::0;:7:::1;::::0;:46:::1;::::0;;::::1;::::0;::::1;:::i;:::-;;99747:42;101982:7;101990:1;101982:10;;;;;;-1:-1:-1::0;;;101982:10:0::1;;;;;;;;;;::::0;;;::::1;::::0;;::::1;:20:::0;;-1:-1:-1;;;;;;101982:20:0::1;-1:-1:-1::0;;;;;101982:20:0;;;::::1;::::0;;;::::1;::::0;;;102015:153:::1;102039:10;:17;102035:1;:21;102015:153;;;102103:5;102109:1;102103:8;;;;;;-1:-1:-1::0;;;102103:8:0::1;;;;;;;;;;;;;;;102078:7;:22;102086:10;102097:1;102086:13;;;;;;-1:-1:-1::0;;;102086:13:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;102078:22:0::1;-1:-1:-1::0;;;;;102078:22:0::1;;;;;;;;;;;;:33;;;;102143:10;102154:1;102143:13;;;;;;-1:-1:-1::0;;;102143:13:0::1;;;;;;;;;;;;;;;102126:7;102134:1;102138;102134:5;;;;:::i;:::-;102126:14;;;;;;-1:-1:-1::0;;;102126:14:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;:30:::0;;-1:-1:-1;;;;;;102126:30:0::1;-1:-1:-1::0;;;;;102126:30:0;;;::::1;::::0;;;::::1;::::0;;102058:3;::::1;::::0;::::1;:::i;:::-;;;;102015:153;;93221:418:::0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101037:1:0;93377:25;;;:53;;;93417:13;;93406:7;:24;;93377:53;93373:102;;;93454:9;93221:418;-1:-1:-1;;93221:418:0:o;93373:102::-;-1:-1:-1;93497:20:0;;;;:11;:20;;;;;;;;;93485:32;;;;;;;;;-1:-1:-1;;;;;93485:32:0;;;;-1:-1:-1;;;93485:32:0;;-1:-1:-1;;;;;93485:32:0;;;;;;;;-1:-1:-1;;;93485:32:0;;;;;;;;;;;;;;;;93528:65;;93572:9;93221:418;-1:-1:-1;;93221:418:0:o;93528:65::-;93610:21;93623:7;93610:12;:21::i;106260:723::-;106362:13;106401:17;106409:8;106401:7;:17::i;:::-;106393:44;;;;-1:-1:-1;;;106393:44:0;;22020:2:1;106393:44:0;;;22002:21:1;22059:2;22039:18;;;22032:30;-1:-1:-1;;;22078:18:1;;;22071:44;22132:18;;106393:44:0;21992:164:1;106393:44:0;106452:8;;-1:-1:-1;;;106452:8:0;;;;106448:300;;106582:14;106623:37;106651:8;106623:27;:37::i;:::-;106539:178;;;;;;;;;:::i;:::-;;;;;;;;;;;;;106486:250;;106260:723;;;:::o;106448:300::-;106844:7;106874:37;106902:8;106874:27;:37::i;101159:132::-;13129:6;;-1:-1:-1;;;;;13129:6:0;11572:10;13276:23;13268:68;;;;-1:-1:-1;;;13268:68:0;;;;;;;:::i;:::-;101236:11:::1;:19:::0;;;::::1;;-1:-1:-1::0;;;101236:19:0::1;-1:-1:-1::0;;101236:19:0;;::::1;::::0;;;::::1;::::0;;;101266:10:::1;:17:::0;101159:132::o;104641:690::-;104753:5;107025:681;;107090:1;107082:5;:9;107074:40;;;;-1:-1:-1;;;107074:40:0;;24845:2:1;107074:40:0;;;24827:21:1;24884:2;24864:18;;;24857:30;-1:-1:-1;;;24903:18:1;;;24896:48;24961:18;;107074:40:0;24817:168:1;107074:40:0;107142:10;;;;107133:19;;;107125:49;;;;-1:-1:-1;;;107125:49:0;;24499:2:1;107125:49:0;;;24481:21:1;24538:2;24518:18;;;24511:30;-1:-1:-1;;;24557:18:1;;;24550:47;24614:18;;107125:49:0;24471:167:1;107125:49:0;107213:13;:11;:13::i;:::-;107204:5;107193:8;:6;:8::i;:::-;:16;;;;:::i;:::-;:33;;107185:64;;;;-1:-1:-1;;;107185:64:0;;20613:2:1;107185:64:0;;;20595:21:1;20652:2;20632:18;;;20625:30;-1:-1:-1;;;20671:18:1;;;20664:48;20729:18;;107185:64:0;20585:168:1;107185:64:0;107319:12;;;;;;;107310:5;107282:25;107296:10;107282:13;:25::i;:::-;:33;;;;:::i;:::-;:49;;107260:121;;;;-1:-1:-1;;;107260:121:0;;23050:2:1;107260:121:0;;;23032:21:1;23089:2;23069:18;;;23062:30;-1:-1:-1;;;23108:18:1;;;23101:52;23170:18;;107260:121:0;23022:172:1;107260:121:0;107420:5;107413:4;;:12;;;;:::i;:::-;107400:9;:25;;107392:54;;;;-1:-1:-1;;;107392:54:0;;24154:2:1;107392:54:0;;;24136:21:1;24193:2;24173:18;;;24166:30;-1:-1:-1;;;24212:18:1;;;24205:46;24268:18;;107392:54:0;24126:166:1;107392:54:0;107461:8;;-1:-1:-1;;;;;107461:8:0;:22;107457:228;;107528:8;;107578:33;;-1:-1:-1;;;107578:33:0;;107600:10;107578:33;;;13537:74:1;-1:-1:-1;;;;;107528:8:0;;;;107500:18;;107528:8;;107578:21;;13510:18:1;;107578:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;107552:121;;;;-1:-1:-1;;;107552:121:0;;20262:2:1;107552:121:0;;;20244:21:1;20301:2;20281:18;;;20274:30;-1:-1:-1;;;20320:18:1;;;20313:52;20382:18;;107552:121:0;20234:172:1;107552:121:0;107457:228;;104784:12:::1;::::0;-1:-1:-1;;;104784:12:0;::::1;;;:20;;104800:4;104784:20;104776:51;;;::::0;-1:-1:-1;;;104776:51:0;;18715:2:1;104776:51:0::1;::::0;::::1;18697:21:1::0;18754:2;18734:18;;;18727:30;-1:-1:-1;;;18773:18:1;;;18766:48;18831:18;;104776:51:0::1;18687:168:1::0;104776:51:0::1;104846:4;::::0;-1:-1:-1;;;104846:4:0;::::1;;;:12;;104854:4;104846:12;104838:38;;;::::0;-1:-1:-1;;;104838:38:0;;22363:2:1;104838:38:0::1;::::0;::::1;22345:21:1::0;22402:2;22382:18;;;22375:30;-1:-1:-1;;;22421:18:1;;;22414:43;22474:18;;104838:38:0::1;22335:163:1::0;104838:38:0::1;104909:1;104895:11;;:15;104887:46;;;::::0;-1:-1:-1;;;104887:46:0;;20960:2:1;104887:46:0::1;::::0;::::1;20942:21:1::0;20999:2;20979:18;;;20972:30;-1:-1:-1;;;21018:18:1;;;21011:48;21076:18;;104887:46:0::1;20932:168:1::0;104887:46:0::1;104978:1;104952:23;104966:8;104952:13;:23::i;:::-;:27;104944:63;;;::::0;-1:-1:-1;;;104944:63:0;;21307:2:1;104944:63:0::1;::::0;::::1;21289:21:1::0;21346:2;21326:18;;;21319:30;21385:25;21365:18;;;21358:53;21428:18;;104944:63:0::1;21279:173:1::0;104944:63:0::1;105026:10;-1:-1:-1::0;;;;;105026:22:0;::::1;;;105018:56;;;::::0;-1:-1:-1;;;105018:56:0;;17609:2:1;105018:56:0::1;::::0;::::1;17591:21:1::0;17648:2;17628:18;;;17621:30;17687:23;17667:18;;;17660:51;17728:18;;105018:56:0::1;17581:171:1::0;105018:56:0::1;105087:28;105097:10;105109:5;105087:28;;:9;:28::i;:::-;-1:-1:-1::0;;;;;105128:21:0;::::1;;::::0;;;:11:::1;:21;::::0;;;;:26;;105153:1:::1;::::0;105128:21;:26:::1;::::0;105153:1;;105128:26:::1;:::i;:::-;::::0;;;-1:-1:-1;;105193:11:0::1;::::0;-1:-1:-1;;;;;105169:21:0;::::1;;::::0;;;:11:::1;:21;::::0;;;;;:35:::1;::::0;105193:11;105169:35:::1;:::i;:::-;105165:159;;105241:13;:11;:13::i;:::-;105230:8;:6;:8::i;:::-;:24;105226:87;;;105275:22;105285:8;105295:1;105275:9;:22::i;13965:201::-:0;13129:6;;-1:-1:-1;;;;;13129:6:0;11572:10;13276:23;13268:68;;;;-1:-1:-1;;;13268:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14054:22:0;::::1;14046:73;;;::::0;-1:-1:-1;;;14046:73:0;;17959:2:1;14046:73:0::1;::::0;::::1;17941:21:1::0;17998:2;17978:18;;;17971:30;18037:34;18017:18;;;18010:62;-1:-1:-1;;;18088:18:1;;;18081:36;18134:19;;14046:73:0::1;17931:228:1::0;14046:73:0::1;14130:28;14149:8;14130:18;:28::i;102183:343::-:0;102259:16;102277;102311:23;102351:7;:14;;;;-1:-1:-1;;;;;102337:29:0;;;;;-1:-1:-1;;;102337:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;102337:29:0;;102311:55;;102384:9;102379:103;102403:7;:14;102399:18;;102379:103;;;102451:7;:19;102459:7;102467:1;102459:10;;;;;;-1:-1:-1;;;102459:10:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;102459:10:0;102451:19;;;;;;;;;;;;;102439:9;;:6;;102446:1;;102439:9;;;;-1:-1:-1;;;102439:9:0;;;;;;;;;;;;;;;;;;:31;102419:3;;;;:::i;:::-;;;;102379:103;;;;102502:7;102511:6;102494:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;102494:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;102183:343;;:::o;102534:135::-;13129:6;;-1:-1:-1;;;;;13129:6:0;11572:10;13276:23;13268:68;;;;-1:-1:-1;;;13268:68:0;;;;;;;:::i;:::-;102612:12:::1;:20:::0;;;::::1;;-1:-1:-1::0;;;102612:20:0::1;-1:-1:-1::0;;102612:20:0;;::::1;::::0;;;::::1;::::0;;;102643:11:::1;:18:::0;102534:135::o;68835:349::-;68959:4;-1:-1:-1;;;;;;68996:51:0;;-1:-1:-1;;;68996:51:0;;:127;;-1:-1:-1;;;;;;;69064:59:0;;-1:-1:-1;;;69064:59:0;68996:127;:180;;;-1:-1:-1;;;;;;;;;;65582:51:0;;;69140:36;65473:168;69536:137;-1:-1:-1;;;;;69632:19:0;69597:7;69632:19;;;:12;:19;;;;;:32;-1:-1:-1;;;69632:32:0;;-1:-1:-1;;;;;69632:32:0;;69536:137::o;17634:190::-;17759:4;17812;17783:25;17796:5;17803:4;17783:12;:25::i;:::-;:33;;17634:190;-1:-1:-1;;;;17634:190:0:o;75754:104::-;75823:27;75833:2;75837:8;75823:27;;;;;;;;;;;;:9;:27::i;75496:174::-;75553:4;75596:7;101037:1;75577:26;;:53;;;;;75617:13;;75607:7;:23;75577:53;:85;;;;-1:-1:-1;;75635:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;75635:27:0;;;;75634:28;;75496:174::o;84718:196::-;84833:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;84833:29:0;-1:-1:-1;;;;;84833:29:0;;;;;;;;;84878:28;;84833:24;;84878:28;;;;;;;84718:196;;;:::o;79666:2130::-;79781:35;79819:21;79832:7;79819:12;:21::i;:::-;79781:59;;79879:4;-1:-1:-1;;;;;79857:26:0;:13;:18;;;-1:-1:-1;;;;;79857:26:0;;79853:67;;79892:28;;-1:-1:-1;;;79892:28:0;;;;;;;;;;;79853:67;79933:22;11572:10;-1:-1:-1;;;;;79959:20:0;;;;:73;;-1:-1:-1;;;;;;74264:25:0;;74240:4;74264:25;;;:18;:25;;;;;;;;11572:10;74264:35;;;;;;;;;;79996:36;79959:126;;;-1:-1:-1;11572:10:0;80049:20;80061:7;80049:11;:20::i;:::-;-1:-1:-1;;;;;80049:36:0;;79959:126;79933:153;;80104:17;80099:66;;80130:35;;-1:-1:-1;;;80130:35:0;;;;;;;;;;;80099:66;-1:-1:-1;;;;;80180:16:0;;80176:52;;80205:23;;-1:-1:-1;;;80205:23:0;;;;;;;;;;;80176:52;80349:35;80366:1;80370:7;80379:4;80349:8;:35::i;:::-;-1:-1:-1;;;;;80680:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;80680:31:0;;;-1:-1:-1;;;;;80680:31:0;;;-1:-1:-1;;80680:31:0;;;;;;;80726:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;80726:29:0;;;;;;;;;;;80806:20;;;:11;:20;;;;;;80841:18;;-1:-1:-1;;;;;;80874:49:0;;;;-1:-1:-1;;;80907:15:0;80874:49;;;;;;;;;;81197:11;;81257:24;;;;;81300:13;;80806:20;;81257:24;;81300:13;81296:384;;81510:13;;81495:11;:28;81491:174;;81548:20;;81617:28;;;;-1:-1:-1;;;;;81591:54:0;-1:-1:-1;;;81591:54:0;-1:-1:-1;;;;;;81591:54:0;;;-1:-1:-1;;;;;81548:20:0;;81591:54;;;;81491:174;79666:2130;;;81727:7;81723:2;-1:-1:-1;;;;;81708:27:0;81717:4;-1:-1:-1;;;;;81708:27:0;;;;;;;;;;;79666:2130;;;;;:::o;2315:317::-;2430:6;2405:21;:31;;2397:73;;;;-1:-1:-1;;;2397:73:0;;19489:2:1;2397:73:0;;;19471:21:1;19528:2;19508:18;;;19501:30;19567:31;19547:18;;;19540:59;19616:18;;2397:73:0;19461:179:1;2397:73:0;2484:12;2502:9;-1:-1:-1;;;;;2502:14:0;2524:6;2502:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2483:52;;;2554:7;2546:78;;;;-1:-1:-1;;;2546:78:0;;19062:2:1;2546:78:0;;;19044:21:1;19101:2;19081:18;;;19074:30;19140:34;19120:18;;;19113:62;19211:28;19191:18;;;19184:56;19257:19;;2546:78:0;19034:248:1;82192:2408:0;82272:35;82310:21;82323:7;82310:12;:21::i;:::-;82359:18;;82272:59;;-1:-1:-1;82390:290:0;;;;82424:22;11572:10;-1:-1:-1;;;;;82450:20:0;;;;:77;;-1:-1:-1;;;;;;74264:25:0;;74240:4;74264:25;;;:18;:25;;;;;;;;11572:10;74264:35;;;;;;;;;;82491:36;82450:134;;;-1:-1:-1;11572:10:0;82548:20;82560:7;82548:11;:20::i;:::-;-1:-1:-1;;;;;82548:36:0;;82450:134;82424:161;;82607:17;82602:66;;82633:35;;-1:-1:-1;;;82633:35:0;;;;;;;;;;;82602:66;82390:290;;82808:35;82825:1;82829:7;82838:4;82808:8;:35::i;:::-;-1:-1:-1;;;;;83173:18:0;;;83139:31;83173:18;;;:12;:18;;;;;;;;83206:24;;-1:-1:-1;;;;;;;;;;83206:24:0;;;;;;;;;-1:-1:-1;;83206:24:0;;;;83245:29;;;;;83229:1;83245:29;;;;;;;;-1:-1:-1;;83245:29:0;;;;;;;;;;83407:20;;;:11;:20;;;;;;83442;;-1:-1:-1;;;;83510:15:0;83477:49;;;-1:-1:-1;;;83477:49:0;-1:-1:-1;;;;;;83477:49:0;;;;;;;;;;83541:22;-1:-1:-1;;;83541:22:0;;;83833:11;;;83893:24;;;;;83936:13;;83173:18;;83893:24;;83936:13;83932:384;;84146:13;;84131:11;:28;84127:174;;84184:20;;84253:28;;;;-1:-1:-1;;;;;84227:54:0;-1:-1:-1;;;84227:54:0;-1:-1:-1;;;;;;84227:54:0;;;-1:-1:-1;;;;;84184:20:0;;84227:54;;;;84127:174;-1:-1:-1;;84344:35:0;;84371:7;;-1:-1:-1;84367:1:0;;-1:-1:-1;;;;;;84344:35:0;;;;;84367:1;;84344:35;-1:-1:-1;;84567:12:0;:14;;;;;;-1:-1:-1;;82192:2408:0:o;70629:1111::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;70740:7:0;;101037:1;70789:23;70785:888;;70825:13;;70818:4;:20;70814:859;;;70859:31;70893:17;;;:11;:17;;;;;;;;;70859:51;;;;;;;;;-1:-1:-1;;;;;70859:51:0;;;;-1:-1:-1;;;70859:51:0;;-1:-1:-1;;;;;70859:51:0;;;;;;;;-1:-1:-1;;;70859:51:0;;;;;;;;;;;;;;70929:729;;70979:14;;-1:-1:-1;;;;;70979:28:0;;70975:101;;71043:9;70629:1111;-1:-1:-1;;;70629:1111:0:o;70975:101::-;-1:-1:-1;;;71418:6:0;71463:17;;;;:11;:17;;;;;;;;;71451:29;;;;;;;;;-1:-1:-1;;;;;71451:29:0;;;;;-1:-1:-1;;;71451:29:0;;-1:-1:-1;;;;;71451:29:0;;;;;;;;-1:-1:-1;;;71451:29:0;;;;;;;;;;;;;71511:28;71507:109;;71579:9;70629:1111;-1:-1:-1;;;70629:1111:0:o;71507:109::-;71378:261;;;70814:859;;71701:31;;-1:-1:-1;;;71701:31:0;;;;;;;;;;;14326:191;14419:6;;;-1:-1:-1;;;;;14436:17:0;;;-1:-1:-1;;;;;;14436:17:0;;;;;;;14469:40;;14419:6;;;14436:17;14419:6;;14469:40;;14400:16;;14469:40;14326:191;;:::o;99880:488::-;10354:13;;;;;;;10346:69;;;;-1:-1:-1;;;10346:69:0;;;;;;;:::i;:::-;100041:30:::1;100056:5;100063:7;100041:14;:30::i;:::-;100082:24;:22;:24::i;:::-;100117:25;:23;:25::i;:::-;100153:16;:14;:16::i;:::-;100180:9;:22:::0;;;100213:8:::1;:16:::0;;-1:-1:-1;;;;100213:16:0::1;::::0;;99747:42:::1;100224:5;100242:16:::0;;;:7:::1;:16;::::0;;;100261:2:::1;100242:16:::0;:21;100293:3:::1;::::0;100282:7:::1;13129:6:::0;;-1:-1:-1;;;;;13129:6:0;;13056:87;100282:7:::1;-1:-1:-1::0;;;;;100274:16:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;100274:16:0;;;:22;;;;100307:7:::1;:21:::0;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;100307:21:0::1;99747:42;100307:21;::::0;;100352:7:::1;13129:6:::0;;-1:-1:-1;;;;;13129:6:0;;13056:87;100352:7:::1;100339:21:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;100339:21:0;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;100339:21:0::1;-1:-1:-1::0;;;;;100339:21:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;99880:488:0:o;85406:689::-;85590:83;;-1:-1:-1;;;85590:83:0;;85569:4;;-1:-1:-1;;;;;85590:47:0;;;;;:83;;11572:10;;85652:4;;85658:7;;85667:5;;85590:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;85590:83:0;;;;;;;;-1:-1:-1;;85590:83:0;;;;;;;;;;;;:::i;:::-;;;85586:502;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;85846:13:0;;85842:235;;85892:40;;-1:-1:-1;;;85892:40:0;;;;;;;;;;;85842:235;86035:6;86029:13;86020:6;86016:2;86012:15;86005:38;85586:502;-1:-1:-1;;;;;;85720:66:0;-1:-1:-1;;;85720:66:0;;-1:-1:-1;85586:502:0;85406:689;;;;;;:::o;14961:723::-;15017:13;15238:10;15234:53;;-1:-1:-1;;15265:10:0;;;;;;;;;;;;-1:-1:-1;;;15265:10:0;;;;;14961:723::o;15234:53::-;15312:5;15297:12;15353:78;15360:9;;15353:78;;15386:8;;;;:::i;:::-;;-1:-1:-1;15409:10:0;;-1:-1:-1;15417:2:0;15409:10;;:::i;:::-;;;15353:78;;;15441:19;15473:6;-1:-1:-1;;;;;15463:17:0;;;;;-1:-1:-1;;;15463:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15463:17:0;;15441:39;;15491:154;15498:10;;15491:154;;15525:11;15535:1;15525:11;;:::i;:::-;;-1:-1:-1;15594:10:0;15602:2;15594:5;:10;:::i;:::-;15581:24;;:2;:24;:::i;:::-;15568:39;;15551:6;15558;15551:14;;;;;;-1:-1:-1;;;15551:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;15551:56:0;;;;;;;;-1:-1:-1;15622:11:0;15631:2;15622:11;;:::i;:::-;;;15491:154;;18186:701;18269:7;18312:4;18269:7;18327:523;18351:5;:12;18347:1;:16;18327:523;;;18385:20;18408:5;18414:1;18408:8;;;;;;-1:-1:-1;;;18408:8:0;;;;;;;;;;;;;;;18385:31;;18451:12;18435;:28;18431:408;;18588:44;;;;;;11776:19:1;;;11811:12;;;11804:28;;;11848:12;;18588:44:0;;;;;;;;;;;;18578:55;;;;;;18563:70;;18431:408;;;18778:44;;;;;;11776:19:1;;;11811:12;;;11804:28;;;11848:12;;18778:44:0;;;;;;;;;;;;18768:55;;;;;;18753:70;;18431:408;-1:-1:-1;18365:3:0;;;;:::i;:::-;;;;18327:523;;76231:1749;76377:13;;-1:-1:-1;;;;;76405:16:0;;76401:48;;76430:19;;-1:-1:-1;;;76430:19:0;;;;;;;;;;;76401:48;76464:13;76460:44;;76486:18;;-1:-1:-1;;;76486:18:0;;;;;;;;;;;76460:44;-1:-1:-1;;;;;76855:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;76914:49:0;;-1:-1:-1;;;;;76855:44:0;;;;;;;76914:49;;;-1:-1:-1;;;;;76855:44:0;;;;;;76914:49;;;;;;;;;;;;;;;;76980:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;77030:66:0;;;-1:-1:-1;;;77080:15:0;77030:66;;;;;;;;;;;;;76980:25;;77177:23;;;;1316:20;1364:8;77217:631;;77257:313;77288:38;;77313:12;;-1:-1:-1;;;;;77288:38:0;;;77305:1;;77288:38;;77305:1;;77288:38;77354:69;77393:1;77397:2;77401:14;;;;;;77417:5;77354:30;:69::i;:::-;77349:174;;77459:40;;-1:-1:-1;;;77459:40:0;;;;;;;;;;;77349:174;77565:3;77550:12;:18;77257:313;;77651:12;77634:13;;:29;77630:43;;77665:8;;;77630:43;77217:631;;;77714:119;77745:40;;77770:14;;;;;-1:-1:-1;;;;;77745:40:0;;;77762:1;;77745:40;;77762:1;;77745:40;77828:3;77813:12;:18;77714:119;;77217:631;-1:-1:-1;77862:13:0;:28;77912:60;77941:1;77945:2;77949:12;77963:8;77912:60;:::i;67377:153::-;10354:13;;;;;;;10346:69;;;;-1:-1:-1;;;10346:69:0;;;;;;;:::i;:::-;67482:40:::1;67507:5;67514:7;67482:24;:40::i;88904:68::-:0;10354:13;;;;;;;10346:69;;;;-1:-1:-1;;;10346:69:0;;;;;;;:::i;12720:134::-;10354:13;;;;;;;10346:69;;;;-1:-1:-1;;;10346:69:0;;;;;;;:::i;:::-;12783:26:::1;:24;:26::i;:::-;12820;:24;:26::i;67538:206::-:0;10354:13;;;;;;;10346:69;;;;-1:-1:-1;;;10346:69:0;;;;;;;:::i;:::-;67653:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;67677:17:0;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;101037:1:0;67705:13:::1;:31:::0;-1:-1:-1;;67538:206:0:o;12862:113::-;10354:13;;;;;;;10346:69;;;;-1:-1:-1;;;10346:69:0;;;;;;;:::i;:::-;12935:32:::1;11572:10:::0;12935:18:::1;:32::i;-1:-1:-1:-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:2;;;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:2;;;309:1;306;299:12;268:2;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;88:332;;;;;:::o;425:196::-;493:20;;-1:-1:-1;;;;;542:54:1;;532:65;;522:2;;611:1;608;601:12;522:2;474:147;;;:::o;626:693::-;680:5;733:3;726:4;718:6;714:17;710:27;700:2;;755:5;748;741:20;700:2;795:6;782:20;821:4;845:60;861:43;901:2;861:43;:::i;:::-;845:60;:::i;:::-;927:3;951:2;946:3;939:15;979:2;974:3;970:12;963:19;;1014:2;1006:6;1002:15;1066:3;1061:2;1055;1052:1;1048:10;1040:6;1036:23;1032:32;1029:41;1026:2;;;1087:5;1080;1073:20;1026:2;1113:5;1127:163;1141:2;1138:1;1135:9;1127:163;;;1198:17;;1186:30;;1236:12;;;;1268;;;;1159:1;1152:9;1127:163;;;-1:-1:-1;1308:5:1;;690:629;-1:-1:-1;;;;;;;690:629:1:o;1324:160::-;1389:20;;1445:13;;1438:21;1428:32;;1418:2;;1474:1;1471;1464:12;1489:229;1532:5;1585:3;1578:4;1570:6;1566:17;1562:27;1552:2;;1607:5;1600;1593:20;1552:2;1633:79;1708:3;1699:6;1686:20;1679:4;1671:6;1667:17;1633:79;:::i;1723:163::-;1790:20;;1850:10;1839:22;;1829:33;;1819:2;;1876:1;1873;1866:12;1891:196;1950:6;2003:2;1991:9;1982:7;1978:23;1974:32;1971:2;;;2024:6;2016;2009:22;1971:2;2052:29;2071:9;2052:29;:::i;2092:270::-;2160:6;2168;2221:2;2209:9;2200:7;2196:23;2192:32;2189:2;;;2242:6;2234;2227:22;2189:2;2270:29;2289:9;2270:29;:::i;:::-;2260:39;;2318:38;2352:2;2341:9;2337:18;2318:38;:::i;:::-;2308:48;;2179:183;;;;;:::o;2367:338::-;2444:6;2452;2460;2513:2;2501:9;2492:7;2488:23;2484:32;2481:2;;;2534:6;2526;2519:22;2481:2;2562:29;2581:9;2562:29;:::i;:::-;2552:39;;2610:38;2644:2;2633:9;2629:18;2610:38;:::i;:::-;2600:48;;2695:2;2684:9;2680:18;2667:32;2657:42;;2471:234;;;;;:::o;2710:696::-;2805:6;2813;2821;2829;2882:3;2870:9;2861:7;2857:23;2853:33;2850:2;;;2904:6;2896;2889:22;2850:2;2932:29;2951:9;2932:29;:::i;:::-;2922:39;;2980:38;3014:2;3003:9;2999:18;2980:38;:::i;:::-;2970:48;;3065:2;3054:9;3050:18;3037:32;3027:42;;3120:2;3109:9;3105:18;3092:32;-1:-1:-1;;;;;3139:6:1;3136:30;3133:2;;;3184:6;3176;3169:22;3133:2;3212:22;;3265:4;3257:13;;3253:27;-1:-1:-1;3243:2:1;;3299:6;3291;3284:22;3243:2;3327:73;3392:7;3387:2;3374:16;3369:2;3365;3361:11;3327:73;:::i;:::-;3317:83;;;2840:566;;;;;;;:::o;3411:264::-;3476:6;3484;3537:2;3525:9;3516:7;3512:23;3508:32;3505:2;;;3558:6;3550;3543:22;3505:2;3586:29;3605:9;3586:29;:::i;:::-;3576:39;;3634:35;3665:2;3654:9;3650:18;3634:35;:::i;3680:264::-;3748:6;3756;3809:2;3797:9;3788:7;3784:23;3780:32;3777:2;;;3830:6;3822;3815:22;3777:2;3858:29;3877:9;3858:29;:::i;:::-;3848:39;3934:2;3919:18;;;;3906:32;;-1:-1:-1;;;3767:177:1:o;3949:332::-;4026:6;4034;4042;4095:2;4083:9;4074:7;4070:23;4066:32;4063:2;;;4116:6;4108;4101:22;4063:2;4144:29;4163:9;4144:29;:::i;:::-;4134:39;4220:2;4205:18;;4192:32;;-1:-1:-1;4271:2:1;4256:18;;;4243:32;;4053:228;-1:-1:-1;;;4053:228:1:o;4286:1212::-;4404:6;4412;4465:2;4453:9;4444:7;4440:23;4436:32;4433:2;;;4486:6;4478;4471:22;4433:2;4531:9;4518:23;-1:-1:-1;;;;;4601:2:1;4593:6;4590:14;4587:2;;;4622:6;4614;4607:22;4587:2;4665:6;4654:9;4650:22;4640:32;;4710:7;4703:4;4699:2;4695:13;4691:27;4681:2;;4737:6;4729;4722:22;4681:2;4778;4765:16;4800:4;4824:60;4840:43;4880:2;4840:43;:::i;4824:60::-;4906:3;4930:2;4925:3;4918:15;4958:2;4953:3;4949:12;4942:19;;4989:2;4985;4981:11;5037:7;5032:2;5026;5023:1;5019:10;5015:2;5011:19;5007:28;5004:41;5001:2;;;5063:6;5055;5048:22;5001:2;5090:6;5081:15;;5105:169;5119:2;5116:1;5113:9;5105:169;;;5176:23;5195:3;5176:23;:::i;:::-;5164:36;;5137:1;5130:9;;;;;5220:12;;;;5252;;5105:169;;;-1:-1:-1;5293:5:1;-1:-1:-1;;5336:18:1;;5323:32;;-1:-1:-1;;5367:16:1;;;5364:2;;;5401:6;5393;5386:22;5364:2;;5429:63;5484:7;5473:8;5462:9;5458:24;5429:63;:::i;:::-;5419:73;;;4423:1075;;;;;:::o;5503:368::-;5587:6;5640:2;5628:9;5619:7;5615:23;5611:32;5608:2;;;5661:6;5653;5646:22;5608:2;5706:9;5693:23;-1:-1:-1;;;;;5731:6:1;5728:30;5725:2;;;5776:6;5768;5761:22;5725:2;5804:61;5857:7;5848:6;5837:9;5833:22;5804:61;:::i;5876:258::-;5941:6;5949;6002:2;5990:9;5981:7;5977:23;5973:32;5970:2;;;6023:6;6015;6008:22;5970:2;6051:26;6067:9;6051:26;:::i;6139:410::-;6214:6;6222;6275:2;6263:9;6254:7;6250:23;6246:32;6243:2;;;6296:6;6288;6281:22;6243:2;6324:26;6340:9;6324:26;:::i;:::-;6314:36;;6401:2;6390:9;6386:18;6373:32;-1:-1:-1;;;;;6420:6:1;6417:30;6414:2;;;6465:6;6457;6450:22;6414:2;6493:50;6535:7;6526:6;6515:9;6511:22;6493:50;:::i;6817:403::-;6898:6;6906;6914;6922;6975:3;6963:9;6954:7;6950:23;6946:33;6943:2;;;6997:6;6989;6982:22;6943:2;7025:26;7041:9;7025:26;:::i;:::-;7015:36;;7098:2;7087:9;7083:18;7070:32;7060:42;;7121:37;7154:2;7143:9;7139:18;7121:37;:::i;:::-;7111:47;;7177:37;7210:2;7199:9;7195:18;7177:37;:::i;:::-;7167:47;;6933:287;;;;;;;:::o;7225:255::-;7283:6;7336:2;7324:9;7315:7;7311:23;7307:32;7304:2;;;7357:6;7349;7342:22;7304:2;7401:9;7388:23;7420:30;7444:5;7420:30;:::i;7485:259::-;7554:6;7607:2;7595:9;7586:7;7582:23;7578:32;7575:2;;;7628:6;7620;7613:22;7575:2;7665:9;7659:16;7684:30;7708:5;7684:30;:::i;7749:641::-;7846:6;7854;7862;7915:2;7903:9;7894:7;7890:23;7886:32;7883:2;;;7936:6;7928;7921:22;7883:2;7981:9;7968:23;-1:-1:-1;;;;;8051:2:1;8043:6;8040:14;8037:2;;;8072:6;8064;8057:22;8037:2;8100:50;8142:7;8133:6;8122:9;8118:22;8100:50;:::i;:::-;8090:60;;8203:2;8192:9;8188:18;8175:32;8159:48;;8232:2;8222:8;8219:16;8216:2;;;8253:6;8245;8238:22;8216:2;;8281:52;8325:7;8314:8;8303:9;8299:24;8281:52;:::i;:::-;8271:62;;;8380:2;8369:9;8365:18;8352:32;8342:42;;7873:517;;;;;:::o;8395:190::-;8454:6;8507:2;8495:9;8486:7;8482:23;8478:32;8475:2;;;8528:6;8520;8513:22;8475:2;-1:-1:-1;8556:23:1;;8465:120;-1:-1:-1;8465:120:1:o;8590:194::-;8660:6;8713:2;8701:9;8692:7;8688:23;8684:32;8681:2;;;8734:6;8726;8719:22;8681:2;-1:-1:-1;8762:16:1;;8671:113;-1:-1:-1;8671:113:1:o;8789:258::-;8857:6;8865;8918:2;8906:9;8897:7;8893:23;8889:32;8886:2;;;8939:6;8931;8924:22;8886:2;-1:-1:-1;;8967:23:1;;;9037:2;9022:18;;;9009:32;;-1:-1:-1;8876:171:1:o;9052:268::-;9119:6;9127;9180:2;9168:9;9159:7;9155:23;9151:32;9148:2;;;9201:6;9193;9186:22;9148:2;9229:28;9247:9;9229:28;:::i;9325:737::-;9419:6;9427;9435;9488:2;9476:9;9467:7;9463:23;9459:32;9456:2;;;9509:6;9501;9494:22;9456:2;9537:28;9555:9;9537:28;:::i;:::-;9527:38;;9616:2;9605:9;9601:18;9588:32;-1:-1:-1;;;;;9680:2:1;9672:6;9669:14;9666:2;;;9701:6;9693;9686:22;9666:2;9744:6;9733:9;9729:22;9719:32;;9789:7;9782:4;9778:2;9774:13;9770:27;9760:2;;9816:6;9808;9801:22;9760:2;9861;9848:16;9887:2;9879:6;9876:14;9873:2;;;9908:6;9900;9893:22;9873:2;9966:7;9961:2;9951:6;9948:1;9944:14;9940:2;9936:23;9932:32;9929:45;9926:2;;;9992:6;9984;9977:22;9926:2;10028;10024;10020:11;10010:21;;10050:6;10040:16;;;;;9446:616;;;;;:::o;10067:437::-;10120:3;10158:5;10152:12;10185:6;10180:3;10173:19;10211:4;10240:2;10235:3;10231:12;10224:19;;10277:2;10270:5;10266:14;10298:3;10310:169;10324:6;10321:1;10318:13;10310:169;;;10385:13;;10373:26;;10419:12;;;;10454:15;;;;10346:1;10339:9;10310:169;;;-1:-1:-1;10495:3:1;;10128:376;-1:-1:-1;;;;;10128:376:1:o;10509:257::-;10550:3;10588:5;10582:12;10615:6;10610:3;10603:19;10631:63;10687:6;10680:4;10675:3;10671:14;10664:4;10657:5;10653:16;10631:63;:::i;:::-;10748:2;10727:15;-1:-1:-1;;10723:29:1;10714:39;;;;10755:4;10710:50;;10558:208;-1:-1:-1;;10558:208:1:o;10771:185::-;10813:3;10851:5;10845:12;10866:52;10911:6;10906:3;10899:4;10892:5;10888:16;10866:52;:::i;:::-;10934:16;;;;;10821:135;-1:-1:-1;;10821:135:1:o;11871:1305::-;12148:3;12177;12212:6;12206:13;12242:3;12264:1;12292:9;12288:2;12284:18;12274:28;;12352:2;12341:9;12337:18;12374;12364:2;;12418:4;12410:6;12406:17;12396:27;;12364:2;12444;12492;12484:6;12481:14;12461:18;12458:38;12455:2;;;-1:-1:-1;;;12519:33:1;;12575:4;12572:1;12565:15;12605:4;12526:3;12593:17;12455:2;12636:18;12663:104;;;;12781:1;12776:322;;;;12629:469;;12663:104;-1:-1:-1;;12696:24:1;;12684:37;;12741:16;;;;-1:-1:-1;12663:104:1;;12776:322;26156:4;26175:17;;;26225:4;26209:21;;12871:3;12887:165;12901:6;12898:1;12895:13;12887:165;;;12979:14;;12966:11;;;12959:35;13022:16;;;;12916:10;;12887:165;;;12891:3;;13081:6;13076:3;13072:16;13065:23;;12629:469;;;;;;;13114:56;13139:30;13165:3;13157:6;13139:30;:::i;:::-;-1:-1:-1;;;11021:20:1;;11066:1;11057:11;;11011:63;13114:56;13107:63;12156:1020;-1:-1:-1;;;;;12156:1020:1:o;13622:511::-;13816:4;-1:-1:-1;;;;;13926:2:1;13918:6;13914:15;13903:9;13896:34;13978:2;13970:6;13966:15;13961:2;13950:9;13946:18;13939:43;;14018:6;14013:2;14002:9;13998:18;13991:34;14061:3;14056:2;14045:9;14041:18;14034:31;14082:45;14122:3;14111:9;14107:19;14099:6;14082:45;:::i;:::-;14074:53;13825:308;-1:-1:-1;;;;;;13825:308:1:o;14440:858::-;14708:2;14720:21;;;14790:13;;14693:18;;;14812:22;;;14660:4;;14887;;14865:2;14850:18;;;14914:15;;;14660:4;14960:218;14974:6;14971:1;14968:13;14960:218;;;15039:13;;-1:-1:-1;;;;;15035:62:1;15023:75;;15118:12;;;;15153:15;;;;14996:1;14989:9;14960:218;;;14964:3;;;15223:9;15218:3;15214:19;15209:2;15198:9;15194:18;15187:47;15251:41;15288:3;15280:6;15251:41;:::i;15303:727::-;15538:2;15590:21;;;15660:13;;15563:18;;;15682:22;;;15509:4;;15538:2;15761:15;;;;15735:2;15720:18;;;15509:4;15807:197;15821:6;15818:1;15815:13;15807:197;;;15870:52;15918:3;15909:6;15903:13;11163:12;;-1:-1:-1;;;;;11159:61:1;11147:74;;11274:4;11263:16;;;11257:23;-1:-1:-1;;;;;11253:48:1;11237:14;;;11230:72;11365:4;11354:16;;;11348:23;11341:31;11334:39;11318:14;;11311:63;11137:243;15870:52;15979:15;;;;15951:4;15942:14;;;;;15843:1;15836:9;15807:197;;16035:261;16214:2;16203:9;16196:21;16177:4;16234:56;16286:2;16275:9;16271:18;16263:6;16234:56;:::i;16493:219::-;16642:2;16631:9;16624:21;16605:4;16662:44;16702:2;16691:9;16687:18;16679:6;16662:44;:::i;21457:356::-;21659:2;21641:21;;;21678:18;;;21671:30;21737:34;21732:2;21717:18;;21710:62;21804:2;21789:18;;21631:182::o;23199:407::-;23401:2;23383:21;;;23440:2;23420:18;;;23413:30;23479:34;23474:2;23459:18;;23452:62;-1:-1:-1;;;23545:2:1;23530:18;;23523:41;23596:3;23581:19;;23373:233::o;24990:267::-;11163:12;;-1:-1:-1;;;;;11159:61:1;11147:74;;11274:4;11263:16;;;11257:23;-1:-1:-1;;;;;11253:48:1;11237:14;;;11230:72;11365:4;11354:16;;;11348:23;11341:31;11334:39;11318:14;;;11311:63;25188:2;25173:18;;25200:51;11137:243;25641:275;25712:2;25706:9;25777:2;25758:13;;-1:-1:-1;;25754:27:1;25742:40;;-1:-1:-1;;;;;25797:34:1;;25833:22;;;25794:62;25791:2;;;25859:18;;:::i;:::-;25895:2;25888:22;25686:230;;-1:-1:-1;25686:230:1:o;25921:183::-;25981:4;-1:-1:-1;;;;;26006:6:1;26003:30;26000:2;;;26036:18;;:::i;:::-;-1:-1:-1;26081:1:1;26077:14;26093:4;26073:25;;25990:114::o;26241:128::-;26281:3;26312:1;26308:6;26305:1;26302:13;26299:2;;;26318:18;;:::i;:::-;-1:-1:-1;26354:9:1;;26289:80::o;26374:120::-;26414:1;26440;26430:2;;26445:18;;:::i;:::-;-1:-1:-1;26479:9:1;;26420:74::o;26499:168::-;26539:7;26605:1;26601;26597:6;26593:14;26590:1;26587:21;26582:1;26575:9;26568:17;26564:45;26561:2;;;26612:18;;:::i;:::-;-1:-1:-1;26652:9:1;;26551:116::o;26672:125::-;26712:4;26740:1;26737;26734:8;26731:2;;;26745:18;;:::i;:::-;-1:-1:-1;26782:9:1;;26721:76::o;26802:258::-;26874:1;26884:113;26898:6;26895:1;26892:13;26884:113;;;26974:11;;;26968:18;26955:11;;;26948:39;26920:2;26913:10;26884:113;;;27015:6;27012:1;27009:13;27006:2;;;-1:-1:-1;;27050:1:1;27032:16;;27025:27;26855:205::o;27065:380::-;27144:1;27140:12;;;;27187;;;27208:2;;27262:4;27254:6;27250:17;27240:27;;27208:2;27315;27307:6;27304:14;27284:18;27281:38;27278:2;;;27361:10;27356:3;27352:20;27349:1;27342:31;27396:4;27393:1;27386:15;27424:4;27421:1;27414:15;27278:2;;27120:325;;;:::o;27450:135::-;27489:3;-1:-1:-1;;27510:17:1;;27507:2;;;27530:18;;:::i;:::-;-1:-1:-1;27577:1:1;27566:13;;27497:88::o;27590:112::-;27622:1;27648;27638:2;;27653:18;;:::i;:::-;-1:-1:-1;27687:9:1;;27628:74::o;27707:127::-;27768:10;27763:3;27759:20;27756:1;27749:31;27799:4;27796:1;27789:15;27823:4;27820:1;27813:15;27839:127;27900:10;27895:3;27891:20;27888:1;27881:31;27931:4;27928:1;27921:15;27955:4;27952:1;27945:15;27971:127;28032:10;28027:3;28023:20;28020:1;28013:31;28063:4;28060:1;28053:15;28087:4;28084:1;28077:15;28103:131;-1:-1:-1;;;;;;28177:32:1;;28167:43;;28157:2;;28224:1;28221;28214:12
Swarm Source
ipfs://9012868252bc6ca1d523a4088439ff588d2d02550967be178a2555df6b643873
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.