Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
XANALand
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-13 */ /** *Submitted for verification at BscScan.com on 2022-10-11 */ // File: contracts/ProxyBaseStorage.sol pragma solidity ^0.8.14; contract ProxyBaseStorage { //////////////////////////////////////////// VARS ///////////////////////////////////////////// // maps functions to the delegate contracts that execute the functions. // funcId => delegate contract mapping(bytes4 => address) public delegates; // array of function signatures supported by the contract. bytes[] public funcSignatures; // maps each function signature to its position in the funcSignatures array. // signature => index+1 mapping(bytes => uint256) internal funcSignatureToIndex; // proxy address of itself, can be used for cross-delegate calls but also safety checking. address proxy; /////////////////////////////////////////////////////////////////////////////////////////////// } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions 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); } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: 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 Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // 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/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // 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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // 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: contracts/ERC721A.sol pragma solidity ^0.8.14; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @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). */ abstract contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // 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; } // 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) internal _addressData; // Mapping from token ID to approved address mapping(uint256 => address) internal _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) internal _operatorApprovals; mapping(uint256 => uint256) public _nftLockup; mapping(address => bool) public isTransferAllowed; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } modifier onlyTransferAllowed(address from) { require(isTransferAllowed[from],"ERC721: transfer not allowed"); _; } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 1; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view 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(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 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 && 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) onlyTransferAllowed(to) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !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) onlyTransferAllowed(operator) 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 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 returns(uint256, uint256) { return _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 returns(uint256, uint256) { 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 MintWithTokenURI(address(this), updatedIndex, to, ""); emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); return(startTokenId,_currentIndex-1); } /** * @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 MintWithTokenURI(address(this), updatedIndex, to, ""); emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } //erc721A transfer functions function transferFrom( address from, address to, uint256 tokenId ) public virtual { require(_nftLockup[tokenId] <= block.timestamp || _nftLockup[tokenId] == 0 , "XanaLand: NFT lockup not expired yet"); _transfer(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual { require(_nftLockup[tokenId] <= block.timestamp || _nftLockup[tokenId] == 0 , "XanaLand: NFT lockup not expired yet"); safeTransferFrom(from, to, tokenId, ''); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual { require(_nftLockup[tokenId] <= block.timestamp || _nftLockup[tokenId] == 0 , "XanaLand: NFT lockup not expired yet"); _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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 ) onlyTransferAllowed(msg.sender) internal { 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 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 _transferAdmin( address from, address to, uint256 tokenId ) internal { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); 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 ) internal returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(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 {} event MintWithTokenURI(address indexed collection, uint256 indexed tokenId, address minter, string tokenURI); } // File: contracts/ERC721AQueryable.sol pragma solidity ^0.8.4; error InvalidQueryRange(); /** * @title ERC721A Queryable * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A { /** * @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 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 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 returns (uint256[] memory) { unchecked { if (start > stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _currentIndex + 1; // 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 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; } } } // File: contracts/MerkleProof.sol pragma solidity ^0.8.14; library MerkleProof { function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } 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 = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: contracts/Storage.sol pragma solidity ^0.8.14; abstract contract Storage { string public baseURI; // settings struct whitelist{ uint256 startTime; uint256 endTime; uint256 supply; uint256 sold; bytes32 root; } mapping(uint256 => whitelist) public whitelistRoot; mapping(uint256 => mapping(string => bool)) public isWhitelistFor; uint256 public maxMint = 0; uint256 public status = 0; struct rate { uint256 cost; uint256 total; uint256 sold; bool valid; } mapping (uint256 => mapping (string => rate)) public rates; uint256 public discount; uint256 public perTransactionLimit; mapping(uint256 => mapping(address => uint256)) public _userBought; event _mintCommon(address userAddress, string rarity, uint size,uint256 start, uint256 end, uint amount, uint price, bool isDiscount); event _mintLand(address userAddress, string rarity, uint size, uint256 start, uint256 end, uint amount, uint price, bool isDiscount); //modifiers modifier checkSupply(uint256 _mintAmount, uint256 _size, string memory rarity) { uint256 s = rates[_size][rarity].sold; //Check Validity of land as per size require(rates[_size][rarity].valid, "XanaLand: Plot size not valid" ); //To check if contract has started sale on not require(status != 0, "XanaLand: Sale not started yet." ); require(_mintAmount > 0, "XanaLand: Amount is Zero" ); require(_mintAmount <= maxMint, "XanaLand: Amount exceeded in params" ); require(s + _mintAmount <= rates[_size][rarity].total, "XanaLand: Max Limit Reached for Common" ); require(_mintAmount <= perTransactionLimit, "XanaLand: Per transaction limit exceed" ); delete s; _; } } // File: contracts/Land.sol pragma solidity ^0.8.14; contract XANALand is ProxyBaseStorage, ERC721AQueryable, Ownable, ReentrancyGuard, Storage { using Strings for uint256; using Address for address; constructor( string memory _name, string memory _symbol ) ERC721A(_name, _symbol){} function mintNFT(address to,uint256 _mintAmount, string memory rarity, uint256 _size, bool isDiscount) internal { //Minting Land NFTs as per sent amount above (uint256 start, uint256 end) =_safeMint(to,_mintAmount); rates[_size][rarity].sold+=_mintAmount; emit _mintLand(to, rarity, _size, start, end, _mintAmount,msg.value,isDiscount); } function calculateDiscount(uint256 _size, string memory rarity) public view returns(uint256) { return SafeMath.sub(rates[_size][rarity].cost, SafeMath.div(SafeMath.mul(rates[_size][rarity].cost,discount), 100)); } //Discounted Mint Function function mintDiscountCommon(uint256 _mintAmount, bytes32[] calldata proof) checkSupply(_mintAmount,4, "Common") external payable { string memory rarity = "Common"; uint256 _size=1; //Check user buy limit merkle tree require(checkWhiteList(_mintAmount, proof, 4, true), "XanaLand: Not whitelisted"); _userBought[4][msg.sender] += _mintAmount; //check user purchase amount require(msg.value >= SafeMath.mul(calculateDiscount(_size,rarity),_mintAmount), "XanaLand: Paid amount insufficient"); mintNFT(msg.sender,_mintAmount, rarity, _size, true); } function checkWhiteList( uint256 _mintAmount, bytes32[] calldata proof, uint256 whitelistType, bool isLimit) nonReentrant internal returns (bool){ require(whitelistRoot[whitelistType].startTime <= block.timestamp, "Xanaland: not open"); require(whitelistRoot[whitelistType].endTime >= block.timestamp, "Xanaland: sale ended"); // require(whitelistRoot[whitelistType].supply >= whitelistRoot[whitelistType].sold + _mintAmount, "Xanaland: whitelist sold out"); uint256 userBuyCount = isLimit ? _userBought[whitelistType][msg.sender] + _mintAmount : 0; whitelistRoot[whitelistType].sold += _mintAmount; return status != 1 || isWhitelisted(msg.sender, proof, userBuyCount, whitelistType); } //Mint Common Category function mintLand(string memory rarity,uint256 _mintAmount, uint256 _size, bytes32[] calldata proof, bool isLimit, uint256 whitelistType) checkSupply(_mintAmount,_size, rarity) external payable { require(rates[_size][rarity].valid, "XanaLand: Plot size not valid" ); require(isWhitelistFor[whitelistType][rarity], "XanaLand: Invalid"); if(status == 2) require(whitelistType == 0, "XanaLand: only public sale"); else require(whitelistType != 0, "XanaLand: "); require(checkWhiteList(_mintAmount, proof, whitelistType, isLimit), "XanaLand: Not whitelisted"); //Check user buy limit merkle t _userBought[whitelistType][msg.sender] += _mintAmount; //check user purchase amount require(msg.value >= SafeMath.mul(rates[_size][rarity].cost,_mintAmount), "XanaLand: Paid amount insufficient"); //Minting Land NFTs as per sent amount above mintNFT(msg.sender,_mintAmount, rarity, _size, false); } //Only for staking Users function freeMint(uint256 _mintAmount, bytes32[] calldata proof) checkSupply(_mintAmount, 5, "Common") external{ string memory rarity = "Common"; uint256 _size=1; //To check allowed buy amount from staking per user require(checkWhiteList(_mintAmount, proof, 5, true), "XanaLand: Not whitelisted"); _userBought[5][msg.sender] += _mintAmount; //Minting Land NFTs as per sent amount above mintNFT(msg.sender,_mintAmount, rarity, _size, false); } // internal function _baseURI() internal override view virtual returns (string memory) { return baseURI; } function tokenURI(uint256 tokenId) public override view virtual returns (string memory) { require(_exists(tokenId), "ERC721Metadata: Nonexistent token"); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString())) : ""; } //Merkle tree whitelist methods function isWhitelisted(address account, bytes32[] calldata proof, uint256 quantity, uint256 typeWhitelist) public view returns (bool) { return _verify(_leaf(account, quantity), proof, whitelistRoot[typeWhitelist].root); } function _leaf(address account, uint256 quantity) public pure returns (bytes32) { return keccak256(abi.encode(account, quantity)); } function _verify(bytes32 leaf,bytes32[] memory proof,bytes32 root) internal pure returns (bool) { return MerkleProof.verify(proof, root, leaf); } //only owner methods //set whitelist function setWhitelistRoot(bytes32 newWhitelistroot, uint256 typeWhitelist, uint256 startTime, uint256 endTime, uint256 supply, string[] memory rarties) public onlyOwner { whitelistRoot[typeWhitelist] = whitelist(startTime, endTime, supply, whitelistRoot[typeWhitelist].sold, newWhitelistroot); for(uint256 index =0; index < rarties.length; index++){ isWhitelistFor[typeWhitelist][rarties[index]] = true; } } function removeWhiteList(uint256 typeWhitelist, string memory rarity) public onlyOwner { isWhitelistFor[typeWhitelist][rarity] = false; } //Set max supply of land ( = 75330 ) function setMaxMintAmount(uint256 _newMaxMintAmount) public onlyOwner { maxMint = _newMaxMintAmount; } //OffCHain metaData uri settings function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } //Set discount percentage function setDiscount(uint256 percentage) public onlyOwner { discount = percentage; } //0 = Sale not started //1 = Only whitelisted/Staking //2 = Public Sale function setSaleStatus(uint256 _status) public onlyOwner { status = _status; } function setPerTransactionLimit(uint256 limit) public onlyOwner { perTransactionLimit = limit; } //Set max supply, cost per category and size. function setRate(uint256 _size, uint256 _cost, uint256 _total, string memory _rarity) public onlyOwner { rates[_size][_rarity].cost = _cost; rates[_size][_rarity].total = _total; rates[_size][_rarity].valid = true; } function setLockUp(uint256[] memory _nftIds,uint256[] memory _timestamps) public onlyOwner{ for(uint256 i=0;i< _nftIds.length;i++){ _nftLockup[_nftIds[i]] = _timestamps[i]; } } function setTransferAllowed(address _add, bool status) onlyOwner public { require(isTransferAllowed[_add] != status, "Xanaland: status already set"); isTransferAllowed[_add] = status; } //to withdraw funds function withdraw() public onlyOwner { (bool success, ) = payable(msg.sender).call{value: address(this).balance}(""); require(success); } function mintAdmin(address to_, uint256 countNFTs_, uint256 _size, string memory rarity) checkSupply(countNFTs_,_size, rarity) public onlyOwner { mintNFT(to_,countNFTs_, rarity, _size, false); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"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"},{"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":"collection","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"string","name":"tokenURI","type":"string"}],"name":"MintWithTokenURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"string","name":"rarity","type":"string"},{"indexed":false,"internalType":"uint256","name":"size","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isDiscount","type":"bool"}],"name":"_mintCommon","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"string","name":"rarity","type":"string"},{"indexed":false,"internalType":"uint256","name":"size","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isDiscount","type":"bool"}],"name":"_mintLand","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"_leaf","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_nftLockup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"_userBought","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_size","type":"uint256"},{"internalType":"string","name":"rarity","type":"string"}],"name":"calculateDiscount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"discount","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 ERC721A.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 ERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"funcSignatures","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isTransferAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"string","name":"","type":"string"}],"name":"isWhitelistFor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"typeWhitelist","type":"uint256"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"countNFTs_","type":"uint256"},{"internalType":"uint256","name":"_size","type":"uint256"},{"internalType":"string","name":"rarity","type":"string"}],"name":"mintAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintDiscountCommon","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"rarity","type":"string"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"uint256","name":"_size","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bool","name":"isLimit","type":"bool"},{"internalType":"uint256","name":"whitelistType","type":"uint256"}],"name":"mintLand","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"perTransactionLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"string","name":"","type":"string"}],"name":"rates","outputs":[{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"sold","type":"uint256"},{"internalType":"bool","name":"valid","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeWhitelist","type":"uint256"},{"internalType":"string","name":"rarity","type":"string"}],"name":"removeWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"setDiscount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_nftIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_timestamps","type":"uint256[]"}],"name":"setLockUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setPerTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_size","type":"uint256"},{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint256","name":"_total","type":"uint256"},{"internalType":"string","name":"_rarity","type":"string"}],"name":"setRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_status","type":"uint256"}],"name":"setSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setTransferAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newWhitelistroot","type":"bytes32"},{"internalType":"uint256","name":"typeWhitelist","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"string[]","name":"rarties","type":"string[]"}],"name":"setWhitelistRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","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":"uint256","name":"","type":"uint256"}],"name":"whitelistRoot","outputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"sold","type":"uint256"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600060135560006014553480156200001b57600080fd5b50604051620040b8380380620040b88339810160408190526200003e9162000252565b81518290829062000057906006906020850190620000df565b5080516200006d906007906020840190620000df565b505060016004555062000080336200008d565b50506001600f55620002f8565b600e80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620000ed90620002bc565b90600052602060002090601f0160209004810192826200011157600085556200015c565b82601f106200012c57805160ff19168380011785556200015c565b828001600101855582156200015c579182015b828111156200015c5782518255916020019190600101906200013f565b506200016a9291506200016e565b5090565b5b808211156200016a57600081556001016200016f565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001ad57600080fd5b81516001600160401b0380821115620001ca57620001ca62000185565b604051601f8301601f19908116603f01168101908282118183101715620001f557620001f562000185565b816040528381526020925086838588010111156200021257600080fd5b600091505b8382101562000236578582018301518183018401529082019062000217565b83821115620002485760008385830101525b9695505050505050565b600080604083850312156200026657600080fd5b82516001600160401b03808211156200027e57600080fd5b6200028c868387016200019b565b93506020850151915080821115620002a357600080fd5b50620002b2858286016200019b565b9150509250929050565b600181811c90821680620002d157607f821691505b602082108103620002f257634e487b7160e01b600052602260045260246000fd5b50919050565b613db080620003086000396000f3fe6080604052600436106102ff5760003560e01c80636b6f4a9d11610190578063a22cb465116100dc578063cdb6751a11610095578063e2f36dce1161006f578063e2f36dce14610a23578063e985e9c514610a43578063f29f15af14610a8c578063f2fde38b14610aac57600080fd5b8063cdb6751a146109d0578063d3e0fbd4146109f0578063dabd271914610a0357600080fd5b8063a22cb46514610903578063a8b8042814610923578063b61d0c6314610943578063b88d4fde14610963578063c23dc68f14610983578063c87b56dd146109b057600080fd5b80638462151c116101495780638da5cb5b116101235780638da5cb5b1461087a57806395d89b411461089857806399a2557a146108ad578063a0a2daf0146108cd57600080fd5b80638462151c1461079a5780638822048e146107c75780638acdad75146107f757600080fd5b80636b6f4a9d146107045780636c0360eb1461071a57806370a082311461072f578063715018a61461074f57806374f32b3e146107645780637501f7411461078457600080fd5b806327a8c9361161024f578063456904a5116102085780635bbb2177116101e25780635bbb217714610674578063621fb96c146106a1578063631e4b85146106ce5780636352211e146106e457600080fd5b8063456904a5146105e857806350572df21461060857806355f804b31461065457600080fd5b806327a8c936146104ee5780633277f29b1461050e578063331f319c146105805780633ccfd60b146105a057806341e54ade146105b557806342842e0e146105c857600080fd5b8063095ea7b3116102bc57806322c64f2f1161029657806322c64f2f1461046e57806323b872dd1461048e5780632529590e146104ae57806326a6860a146104ce57600080fd5b8063095ea7b31461041b57806318160ddd1461043b578063200d2ed21461045857600080fd5b806301c162601461030457806301ffc9a71461032657806306fdde031461035b578063081812fc1461037d578063088a4ed0146103b55780630935ef10146103d5575b600080fd5b34801561031057600080fd5b5061032461031f36600461312d565b610acc565b005b34801561033257600080fd5b506103466103413660046131a6565b610b42565b60405190151581526020015b60405180910390f35b34801561036757600080fd5b50610370610b94565b604051610352919061321b565b34801561038957600080fd5b5061039d61039836600461322e565b610c26565b6040516001600160a01b039091168152602001610352565b3480156103c157600080fd5b506103246103d036600461322e565b610c6a565b3480156103e157600080fd5b5061040d6103f0366004613263565b601860209081526000928352604080842090915290825290205481565b604051908152602001610352565b34801561042757600080fd5b5061032461043636600461328f565b610c77565b34801561044757600080fd5b50600554600454036000190161040d565b34801561046457600080fd5b5061040d60145481565b34801561047a57600080fd5b50610324610489366004613330565b610d48565b34801561049a57600080fd5b506103246104a9366004613390565b610ed2565b3480156104ba57600080fd5b5061040d6104c93660046133cc565b610f22565b3480156104da57600080fd5b506103706104e936600461322e565b610fa7565b3480156104fa57600080fd5b5061032461050936600461322e565b611053565b34801561051a57600080fd5b5061055861052936600461322e565b601160205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a001610352565b34801561058c57600080fd5b5061032461059b366004613408565b611060565b3480156105ac57600080fd5b50610324611113565b6103246105c336600461348d565b611173565b3480156105d457600080fd5b506103246105e3366004613390565b6113d9565b3480156105f457600080fd5b506103246106033660046133cc565b611439565b34801561061457600080fd5b506103466106233660046133cc565b6012602090815260009283526040909220815180830184018051928152908401929093019190912091525460ff1681565b34801561066057600080fd5b5061032461066f3660046134d8565b611481565b34801561068057600080fd5b5061069461068f36600461350c565b6114a0565b6040516103529190613540565b3480156106ad57600080fd5b5061040d6106bc36600461322e565b600c6020526000908152604090205481565b3480156106da57600080fd5b5061040d60175481565b3480156106f057600080fd5b5061039d6106ff36600461322e565b611566565b34801561071057600080fd5b5061040d60165481565b34801561072657600080fd5b50610370611578565b34801561073b57600080fd5b5061040d61074a3660046135aa565b611585565b34801561075b57600080fd5b506103246115d3565b34801561077057600080fd5b5061034661077f3660046135c5565b6115e7565b34801561079057600080fd5b5061040d60135481565b3480156107a657600080fd5b506107ba6107b53660046135aa565b611649565b6040516103529190613629565b3480156107d357600080fd5b506103466107e23660046135aa565b600d6020526000908152604090205460ff1681565b34801561080357600080fd5b506108586108123660046133cc565b6015602090815260009283526040909220815180830184018051928152908401929093019190912091528054600182015460028301546003909301549192909160ff1684565b6040805194855260208501939093529183015215156060820152608001610352565b34801561088657600080fd5b50600e546001600160a01b031661039d565b3480156108a457600080fd5b5061037061178e565b3480156108b957600080fd5b506107ba6108c8366004613661565b61179d565b3480156108d957600080fd5b5061039d6108e83660046131a6565b6000602081905290815260409020546001600160a01b031681565b34801561090f57600080fd5b5061032461091e3660046136a4565b611968565b34801561092f57600080fd5b5061032461093e3660046136a4565b611a38565b34801561094f57600080fd5b5061040d61095e36600461328f565b611adb565b34801561096f57600080fd5b5061032461097e3660046136ce565b611b18565b34801561098f57600080fd5b506109a361099e36600461322e565b611ba8565b604051610352919061373d565b3480156109bc57600080fd5b506103706109cb36600461322e565b611c62565b3480156109dc57600080fd5b506103246109eb366004613772565b611d1e565b6103246109fe366004613851565b611e09565b348015610a0f57600080fd5b50610324610a1e36600461322e565b612192565b348015610a2f57600080fd5b50610324610a3e36600461348d565b61219f565b348015610a4f57600080fd5b50610346610a5e3660046138e8565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205460ff1690565b348015610a9857600080fd5b50610324610aa736600461322e565b6123c8565b348015610ab857600080fd5b50610324610ac73660046135aa565b6123d5565b610ad461244b565b60005b8251811015610b3d57818181518110610af257610af2613912565b6020026020010151600c6000858481518110610b1057610b10613912565b60200260200101518152602001908152602001600020819055508080610b359061393e565b915050610ad7565b505050565b60006001600160e01b031982166380ac58cd60e01b1480610b7357506001600160e01b03198216635b5e139f60e01b145b80610b8e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060068054610ba390613957565b80601f0160208091040260200160405190810160405280929190818152602001828054610bcf90613957565b8015610c1c5780601f10610bf157610100808354040283529160200191610c1c565b820191906000526020600020905b815481529060010190602001808311610bff57829003601f168201915b5050505050905090565b6000610c31826124a5565b610c4e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600a60205260409020546001600160a01b031690565b610c7261244b565b601355565b6001600160a01b0382166000908152600d6020526040902054829060ff16610cba5760405162461bcd60e51b8152600401610cb190613991565b60405180910390fd5b6000610cc583611566565b9050806001600160a01b0316846001600160a01b031603610cf95760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610d195750610d178133610a5e565b155b15610d37576040516367d9dca160e11b815260040160405180910390fd5b610d428484836124de565b50505050565b6000828152601560205260408082209051859285928592610d6a9084906139c8565b90815260200160405180910390206002015490506015600084815260200190815260200160002082604051610d9f91906139c8565b9081526040519081900360200190206003015460ff16610dd15760405162461bcd60e51b8152600401610cb1906139e4565b601454600003610df35760405162461bcd60e51b8152600401610cb190613a1b565b60008411610e135760405162461bcd60e51b8152600401610cb190613a52565b601354841115610e355760405162461bcd60e51b8152600401610cb190613a89565b600083815260156020526040908190209051610e529084906139c8565b90815260405190819003602001902060010154610e6f8583613acc565b1115610e8d5760405162461bcd60e51b8152600401610cb190613ae4565b601754841115610eaf5760405162461bcd60e51b8152600401610cb190613b2a565b506000610eba61244b565b610ec888888789600061253a565b5050505050505050565b6000818152600c602052604090205442101580610efb57506000818152600c6020526040902054155b610f175760405162461bcd60e51b8152600401610cb190613b70565b610b3d8383836125e1565b6000828152601560205260408082209051610fa09190610f439085906139c8565b908152602001604051809103902060000154610f9b610f946015600088815260200190815260200160002086604051610f7c91906139c8565b908152604051908190036020019020546016546127fe565b606461280a565b612816565b9392505050565b60018181548110610fb757600080fd5b906000526020600020016000915090508054610fd290613957565b80601f0160208091040260200160405190810160405280929190818152602001828054610ffe90613957565b801561104b5780601f106110205761010080835404028352916020019161104b565b820191906000526020600020905b81548152906001019060200180831161102e57829003601f168201915b505050505081565b61105b61244b565b601755565b61106861244b565b82601560008681526020019081526020016000208260405161108a91906139c8565b90815260408051602092819003830181209390935560008781526015909252902083916110b89084906139c8565b9081526040805191829003602090810183206001908101949094556000888152601590915220906110ea9084906139c8565b908152604051908190036020019020600301805491151560ff1990921691909117905550505050565b61111b61244b565b604051600090339047908381818185875af1925050503d806000811461115d576040519150601f19603f3d011682016040523d82523d6000602084013e611162565b606091505b505090508061117057600080fd5b50565b8260046040518060400160405280600681526020016521b7b6b6b7b760d11b815250600060156000848152602001908152602001600020826040516111b891906139c8565b908152602001604051809103902060020154905060156000848152602001908152602001600020826040516111ed91906139c8565b9081526040519081900360200190206003015460ff1661121f5760405162461bcd60e51b8152600401610cb1906139e4565b6014546000036112415760405162461bcd60e51b8152600401610cb190613a1b565b600084116112615760405162461bcd60e51b8152600401610cb190613a52565b6013548411156112835760405162461bcd60e51b8152600401610cb190613a89565b6000838152601560205260409081902090516112a09084906139c8565b908152604051908190036020019020600101546112bd8583613acc565b11156112db5760405162461bcd60e51b8152600401610cb190613ae4565b6017548411156112fd5760405162461bcd60e51b8152600401610cb190613b2a565b5060408051808201909152600681526521b7b6b6b7b760d11b6020820152600090600161132e898989600485612822565b61134a5760405162461bcd60e51b8152600401610cb190613bb4565b3360009081527f5b650d93b25a5c652bc6f9215f522b521daf6d36977dcec1343c2a8310b869d66020526040812080548b9290611388908490613acc565b909155506113a1905061139b8284610f22565b8a6127fe565b3410156113c05760405162461bcd60e51b8152600401610cb190613beb565b6113ce338a8484600161253a565b505050505050505050565b6000818152600c60205260409020544210158061140257506000818152600c6020526040902054155b61141e5760405162461bcd60e51b8152600401610cb190613b70565b610b3d83838360405180602001604052806000815250611b18565b61144161244b565b600082815260126020526040808220905161145d9084906139c8565b908152604051908190036020019020805491151560ff199092169190911790555050565b61148961244b565b805161149c906010906020840190612fc0565b5050565b80516060906000816001600160401b038111156114bf576114bf613059565b60405190808252806020026020018201604052801561150a57816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816114dd5790505b50905060005b82811461155e5761153985828151811061152c5761152c613912565b6020026020010151611ba8565b82828151811061154b5761154b613912565b6020908102919091010152600101611510565b509392505050565b6000611571826129b0565b5192915050565b60108054610fd290613957565b60006001600160a01b0382166115ae576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600960205260409020546001600160401b031690565b6115db61244b565b6115e56000612ad7565b565b600061163f6115f68785611adb565b8686808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250888152601160205260409020600401549250612b29915050565b9695505050505050565b6060600080600061165985611585565b90506000816001600160401b0381111561167557611675613059565b60405190808252806020026020018201604052801561169e578160200160208202803683370190505b5090506116c4604080516060810182526000808252602082018190529181019190915290565b60015b83861161178257600081815260086020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052925061177a5781516001600160a01b03161561173b57815194505b876001600160a01b0316856001600160a01b03160361177a578083878060010198508151811061176d5761176d613912565b6020026020010181815250505b6001016116c7565b50909695505050505050565b606060078054610ba390613957565b6060818311156117c057604051631960ccad60e11b815260040160405180910390fd5b6004546000906001016117d1600190565b8510156117dd57600194505b808411156117e9578093505b60006117f487611585565b905084861015611813578585038181101561180d578091505b50611817565b5060005b6000816001600160401b0381111561183157611831613059565b60405190808252806020026020018201604052801561185a578160200160208202803683370190505b50905081600003611870579350610fa092505050565b600061187b88611ba8565b90506000816040015161188c575080515b885b88811415801561189e5750848714155b1561195757600081815260086020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052935061194f5782516001600160a01b03161561191057825191505b8a6001600160a01b0316826001600160a01b03160361194f578084888060010199508151811061194257611942613912565b6020026020010181815250505b60010161188e565b505050928352509095945050505050565b6001600160a01b0382166000908152600d6020526040902054829060ff166119a25760405162461bcd60e51b8152600401610cb190613991565b336001600160a01b038416036119cb5760405163b06307db60e01b815260040160405180910390fd5b336000818152600b602090815260408083206001600160a01b03881680855290835292819020805460ff191687151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611a4061244b565b6001600160a01b0382166000908152600d602052604090205481151560ff909116151503611ab05760405162461bcd60e51b815260206004820152601c60248201527f58616e616c616e643a2073746174757320616c726561647920736574000000006044820152606401610cb1565b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b604080516001600160a01b038416602082015290810182905260009060600160405160208183030381529060405280519060200120905092915050565b6000828152600c602052604090205442101580611b4157506000828152600c6020526040902054155b611b5d5760405162461bcd60e51b8152600401610cb190613b70565b611b688484846125e1565b6001600160a01b0383163b15158015611b8a5750611b8884848484612b3e565b155b15610d42576040516368d2bf6b60e11b815260040160405180910390fd5b60408051606080820183526000808352602080840182905283850182905284519283018552818352820181905292810192909252906001831080611bee57506004548310155b15611bf95792915050565b50600082815260086020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161580159282019290925290611c595792915050565b610fa0836129b0565b6060611c6d826124a5565b611cc35760405162461bcd60e51b815260206004820152602160248201527f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b656044820152603760f91b6064820152608401610cb1565b6000611ccd612c29565b90506000815111611ced5760405180602001604052806000815250610fa0565b80611cf784612c38565b604051602001611d08929190613c2d565b6040516020818303038152906040529392505050565b611d2661244b565b6040805160a081018252858152602080820186815282840186815260008a8152601180855295812060038101805460608801908152608088018f81528e855298909652955181559251600184015590516002830155915190925591516004909101555b8151811015611e0057600160126000888152602001908152602001600020838381518110611db957611db9613912565b6020026020010151604051611dce91906139c8565b908152604051908190036020019020805491151560ff1990921691909117905580611df88161393e565b915050611d89565b50505050505050565b6000858152601560205260408082209051889288928b92611e2b9084906139c8565b90815260200160405180910390206002015490506015600084815260200190815260200160002082604051611e6091906139c8565b9081526040519081900360200190206003015460ff16611e925760405162461bcd60e51b8152600401610cb1906139e4565b601454600003611eb45760405162461bcd60e51b8152600401610cb190613a1b565b60008411611ed45760405162461bcd60e51b8152600401610cb190613a52565b601354841115611ef65760405162461bcd60e51b8152600401610cb190613a89565b600083815260156020526040908190209051611f139084906139c8565b90815260405190819003602001902060010154611f308583613acc565b1115611f4e5760405162461bcd60e51b8152600401610cb190613ae4565b601754841115611f705760405162461bcd60e51b8152600401610cb190613b2a565b506000888152601560205260408082209051611f8d908d906139c8565b9081526040519081900360200190206003015460ff16611fbf5760405162461bcd60e51b8152600401610cb1906139e4565b600085815260126020526040908190209051611fdc908d906139c8565b9081526040519081900360200190205460ff1661202f5760405162461bcd60e51b815260206004820152601160248201527016185b9853185b990e88125b9d985b1a59607a1b6044820152606401610cb1565b60145460020361208c5784156120875760405162461bcd60e51b815260206004820152601a60248201527f58616e614c616e643a206f6e6c79207075626c69632073616c650000000000006044820152606401610cb1565b6120c9565b846000036120c95760405162461bcd60e51b815260206004820152600a60248201526902c30b730a630b7321d160b51b6044820152606401610cb1565b6120d68a8989888a612822565b6120f25760405162461bcd60e51b8152600401610cb190613bb4565b6000858152601860209081526040808320338452909152812080548c929061211b908490613acc565b90915550506000898152601560205260409081902090516121589190612142908e906139c8565b908152604051908190036020019020548b6127fe565b3410156121775760405162461bcd60e51b8152600401610cb190613beb565b612185338b8d8c600061253a565b5050505050505050505050565b61219a61244b565b601655565b8260056040518060400160405280600681526020016521b7b6b6b7b760d11b815250600060156000848152602001908152602001600020826040516121e491906139c8565b9081526020016040518091039020600201549050601560008481526020019081526020016000208260405161221991906139c8565b9081526040519081900360200190206003015460ff1661224b5760405162461bcd60e51b8152600401610cb1906139e4565b60145460000361226d5760405162461bcd60e51b8152600401610cb190613a1b565b6000841161228d5760405162461bcd60e51b8152600401610cb190613a52565b6013548411156122af5760405162461bcd60e51b8152600401610cb190613a89565b6000838152601560205260409081902090516122cc9084906139c8565b908152604051908190036020019020600101546122e98583613acc565b11156123075760405162461bcd60e51b8152600401610cb190613ae4565b6017548411156123295760405162461bcd60e51b8152600401610cb190613b2a565b5060408051808201909152600681526521b7b6b6b7b760d11b6020820152600090600161235a898989600585612822565b6123765760405162461bcd60e51b8152600401610cb190613bb4565b3360009081527f2288853b49db4f36075bf4a8cfdae4e5e3b39b7b03937d0a9148b051a6f64c5c6020526040812080548b92906123b4908490613acc565b909155506113ce9050338a8484600061253a565b6123d061244b565b601455565b6123dd61244b565b6001600160a01b0381166124425760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cb1565b61117081612ad7565b600e546001600160a01b031633146115e55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cb1565b6000816001111580156124b9575060045482105b8015610b8e575050600090815260086020526040902054600160e01b900460ff161590565b6000828152600a602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000806125478787612d38565b9150915085601560008681526020019081526020016000208660405161256d91906139c8565b9081526020016040518091039020600201600082825461258d9190613acc565b90915550506040517fc5e101581b86caaead7cd59d5856276f8289c3a689e5190e88cdf51a82b255b4906125d090899088908890879087908d9034908c90613c5c565b60405180910390a150505050505050565b336000818152600d602052604090205460ff166126105760405162461bcd60e51b8152600401610cb190613991565b600061261b836129b0565b9050846001600160a01b031681600001516001600160a01b0316146126525760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038716148061267057506126708633610a5e565b8061268b57503361268085610c26565b6001600160a01b0316145b9050806126ab57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166126d257604051633a954ecd60e21b815260040160405180910390fd5b6126de600085886124de565b6001600160a01b038681166000908152600960209081526040808320805467ffffffffffffffff198082166001600160401b03928316600019018316179092558a86168086528386208054938416938316600190810184169490941790558a8652600890945282852080546001600160e01b031916909417600160a01b429092169190910217835588018084529220805491939091166127b25760045482146127b257805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038b16171781555b50505083856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6000610fa08284613cb6565b6000610fa08284613ceb565b6000610fa08284613cff565b60006002600f54036128765760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610cb1565b6002600f556000838152601160205260409020544210156128ce5760405162461bcd60e51b81526020600482015260126024820152712c30b730b630b7321d103737ba1037b832b760711b6044820152606401610cb1565b6000838152601160205260409020600101544211156129265760405162461bcd60e51b815260206004820152601460248201527316185b985b185b990e881cd85b1948195b99195960621b6044820152606401610cb1565b600082612934576000612959565b6000848152601860209081526040808320338452909152902054612959908890613acc565b9050866011600086815260200190815260200160002060030160008282546129819190613acc565b909155505060145460011415806129a057506129a033878784886115e7565b6001600f55979650505050505050565b604080516060810182526000808252602082018190529181019190915281806001111580156129e0575060045481105b15612abe57600081815260086020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612abc5780516001600160a01b031615612a53579392505050565b5060001901600081815260086020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612ab7579392505050565b612a53565b505b604051636f96cda160e11b815260040160405180910390fd5b600e80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000612b36838386612d61565b949350505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612b73903390899088908890600401613d16565b6020604051808303816000875af1925050508015612bae575060408051601f3d908101601f19168201909252612bab91810190613d49565b60015b612c0c573d808015612bdc576040519150601f19603f3d011682016040523d82523d6000602084013e612be1565b606091505b508051600003612c04576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b606060108054610ba390613957565b606081600003612c5f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612c895780612c738161393e565b9150612c829050600a83613ceb565b9150612c63565b6000816001600160401b03811115612ca357612ca3613059565b6040519080825280601f01601f191660200182016040528015612ccd576020820181803683370190505b5090505b8415612b3657612ce2600183613cff565b9150612cef600a86613d66565b612cfa906030613acc565b60f81b818381518110612d0f57612d0f613912565b60200101906001600160f81b031916908160001a905350612d31600a86613ceb565b9450612cd1565b600080612d55848460405180602001604052806000815250612d77565b915091505b9250929050565b600082612d6e8584612f54565b14949350505050565b60045460009081906001600160a01b038616612da557604051622e076360e81b815260040160405180910390fd5b84600003612dc65760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038616600081815260096020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168d0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168d01811690920217909155858452600890925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818701903b15612eee575b60405182906001600160a01b038a16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612eb76000898480600101955089612b3e565b612ed4576040516368d2bf6b60e11b815260040160405180910390fd5b808203612e6c578260045414612ee957600080fd5b612f33565b5b6040516001830192906001600160a01b038a16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203612eef575b50600455806001600454612f479190613cff565b9250925050935093915050565b600081815b845181101561155e576000858281518110612f7657612f76613912565b60200260200101519050808311612f9c5760008381526020829052604090209250612fad565b600081815260208490526040902092505b5080612fb88161393e565b915050612f59565b828054612fcc90613957565b90600052602060002090601f016020900481019282612fee5760008555613034565b82601f1061300757805160ff1916838001178555613034565b82800160010185558215613034579182015b82811115613034578251825591602001919060010190613019565b50613040929150613044565b5090565b5b808211156130405760008155600101613045565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561309757613097613059565b604052919050565b60006001600160401b038211156130b8576130b8613059565b5060051b60200190565b600082601f8301126130d357600080fd5b813560206130e86130e38361309f565b61306f565b82815260059290921b8401810191818101908684111561310757600080fd5b8286015b84811015613122578035835291830191830161310b565b509695505050505050565b6000806040838503121561314057600080fd5b82356001600160401b038082111561315757600080fd5b613163868387016130c2565b9350602085013591508082111561317957600080fd5b50613186858286016130c2565b9150509250929050565b6001600160e01b03198116811461117057600080fd5b6000602082840312156131b857600080fd5b8135610fa081613190565b60005b838110156131de5781810151838201526020016131c6565b83811115610d425750506000910152565b600081518084526132078160208601602086016131c3565b601f01601f19169290920160200192915050565b602081526000610fa060208301846131ef565b60006020828403121561324057600080fd5b5035919050565b80356001600160a01b038116811461325e57600080fd5b919050565b6000806040838503121561327657600080fd5b8235915061328660208401613247565b90509250929050565b600080604083850312156132a257600080fd5b6132ab83613247565b946020939093013593505050565b60006001600160401b038311156132d2576132d2613059565b6132e5601f8401601f191660200161306f565b90508281528383830111156132f957600080fd5b828260208301376000602084830101529392505050565b600082601f83011261332157600080fd5b610fa0838335602085016132b9565b6000806000806080858703121561334657600080fd5b61334f85613247565b9350602085013592506040850135915060608501356001600160401b0381111561337857600080fd5b61338487828801613310565b91505092959194509250565b6000806000606084860312156133a557600080fd5b6133ae84613247565b92506133bc60208501613247565b9150604084013590509250925092565b600080604083850312156133df57600080fd5b8235915060208301356001600160401b038111156133fc57600080fd5b61318685828601613310565b6000806000806080858703121561341e57600080fd5b84359350602085013592506040850135915060608501356001600160401b0381111561337857600080fd5b60008083601f84011261345b57600080fd5b5081356001600160401b0381111561347257600080fd5b6020830191508360208260051b8501011115612d5a57600080fd5b6000806000604084860312156134a257600080fd5b8335925060208401356001600160401b038111156134bf57600080fd5b6134cb86828701613449565b9497909650939450505050565b6000602082840312156134ea57600080fd5b81356001600160401b0381111561350057600080fd5b612b3684828501613310565b60006020828403121561351e57600080fd5b81356001600160401b0381111561353457600080fd5b612b36848285016130c2565b6020808252825182820181905260009190848201906040850190845b818110156117825761359783855180516001600160a01b031682526020808201516001600160401b0316908301526040908101511515910152565b928401926060929092019160010161355c565b6000602082840312156135bc57600080fd5b610fa082613247565b6000806000806000608086880312156135dd57600080fd5b6135e686613247565b945060208601356001600160401b0381111561360157600080fd5b61360d88828901613449565b9699909850959660408101359660609091013595509350505050565b6020808252825182820181905260009190848201906040850190845b8181101561178257835183529284019291840191600101613645565b60008060006060848603121561367657600080fd5b61367f84613247565b95602085013595506040909401359392505050565b8035801515811461325e57600080fd5b600080604083850312156136b757600080fd5b6136c083613247565b915061328660208401613694565b600080600080608085870312156136e457600080fd5b6136ed85613247565b93506136fb60208601613247565b92506040850135915060608501356001600160401b0381111561371d57600080fd5b8501601f8101871361372e57600080fd5b613384878235602084016132b9565b81516001600160a01b031681526020808301516001600160401b03169082015260408083015115159082015260608101610b8e565b60008060008060008060c0878903121561378b57600080fd5b86359550602080880135955060408801359450606088013593506080880135925060a08801356001600160401b03808211156137c657600080fd5b818a0191508a601f8301126137da57600080fd5b81356137e86130e38261309f565b81815260059190911b8301840190848101908d83111561380757600080fd5b8585015b8381101561383d57848135111561382157600080fd5b6138308f888335890101613310565b835291860191860161380b565b508096505050505050509295509295509295565b600080600080600080600060c0888a03121561386c57600080fd5b87356001600160401b038082111561388357600080fd5b61388f8b838c01613310565b985060208a0135975060408a0135965060608a01359150808211156138b357600080fd5b506138c08a828b01613449565b90955093506138d3905060808901613694565b915060a0880135905092959891949750929550565b600080604083850312156138fb57600080fd5b61390483613247565b915061328660208401613247565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161395057613950613928565b5060010190565b600181811c9082168061396b57607f821691505b60208210810361398b57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601c908201527f4552433732313a207472616e73666572206e6f7420616c6c6f77656400000000604082015260600190565b600082516139da8184602087016131c3565b9190910192915050565b6020808252601d908201527f58616e614c616e643a20506c6f742073697a65206e6f742076616c6964000000604082015260600190565b6020808252601f908201527f58616e614c616e643a2053616c65206e6f742073746172746564207965742e00604082015260600190565b60208082526018908201527f58616e614c616e643a20416d6f756e74206973205a65726f0000000000000000604082015260600190565b60208082526023908201527f58616e614c616e643a20416d6f756e7420657863656564656420696e20706172604082015262616d7360e81b606082015260800190565b60008219821115613adf57613adf613928565b500190565b60208082526026908201527f58616e614c616e643a204d6178204c696d6974205265616368656420666f722060408201526521b7b6b6b7b760d11b606082015260800190565b60208082526026908201527f58616e614c616e643a20506572207472616e73616374696f6e206c696d697420604082015265195e18d9595960d21b606082015260800190565b60208082526024908201527f58616e614c616e643a204e4654206c6f636b7570206e6f742065787069726564604082015263081e595d60e21b606082015260800190565b60208082526019908201527f58616e614c616e643a204e6f742077686974656c697374656400000000000000604082015260600190565b60208082526022908201527f58616e614c616e643a205061696420616d6f756e7420696e73756666696369656040820152611b9d60f21b606082015260800190565b60008351613c3f8184602088016131c3565b835190830190613c538183602088016131c3565b01949350505050565b6001600160a01b038916815261010060208201819052600090613c818382018b6131ef565b604084019990995250506060810195909552608085019390935260a084019190915260c0830152151560e09091015292915050565b6000816000190483118215151615613cd057613cd0613928565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613cfa57613cfa613cd5565b500490565b600082821015613d1157613d11613928565b500390565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061163f908301846131ef565b600060208284031215613d5b57600080fd5b8151610fa081613190565b600082613d7557613d75613cd5565b50069056fea2646970667358221220bb0f1a3a6bf49701a3876cb96b3b9870b983f7661797a01709664176deff12bb64736f6c634300080e0033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004584142490000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045841424900000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102ff5760003560e01c80636b6f4a9d11610190578063a22cb465116100dc578063cdb6751a11610095578063e2f36dce1161006f578063e2f36dce14610a23578063e985e9c514610a43578063f29f15af14610a8c578063f2fde38b14610aac57600080fd5b8063cdb6751a146109d0578063d3e0fbd4146109f0578063dabd271914610a0357600080fd5b8063a22cb46514610903578063a8b8042814610923578063b61d0c6314610943578063b88d4fde14610963578063c23dc68f14610983578063c87b56dd146109b057600080fd5b80638462151c116101495780638da5cb5b116101235780638da5cb5b1461087a57806395d89b411461089857806399a2557a146108ad578063a0a2daf0146108cd57600080fd5b80638462151c1461079a5780638822048e146107c75780638acdad75146107f757600080fd5b80636b6f4a9d146107045780636c0360eb1461071a57806370a082311461072f578063715018a61461074f57806374f32b3e146107645780637501f7411461078457600080fd5b806327a8c9361161024f578063456904a5116102085780635bbb2177116101e25780635bbb217714610674578063621fb96c146106a1578063631e4b85146106ce5780636352211e146106e457600080fd5b8063456904a5146105e857806350572df21461060857806355f804b31461065457600080fd5b806327a8c936146104ee5780633277f29b1461050e578063331f319c146105805780633ccfd60b146105a057806341e54ade146105b557806342842e0e146105c857600080fd5b8063095ea7b3116102bc57806322c64f2f1161029657806322c64f2f1461046e57806323b872dd1461048e5780632529590e146104ae57806326a6860a146104ce57600080fd5b8063095ea7b31461041b57806318160ddd1461043b578063200d2ed21461045857600080fd5b806301c162601461030457806301ffc9a71461032657806306fdde031461035b578063081812fc1461037d578063088a4ed0146103b55780630935ef10146103d5575b600080fd5b34801561031057600080fd5b5061032461031f36600461312d565b610acc565b005b34801561033257600080fd5b506103466103413660046131a6565b610b42565b60405190151581526020015b60405180910390f35b34801561036757600080fd5b50610370610b94565b604051610352919061321b565b34801561038957600080fd5b5061039d61039836600461322e565b610c26565b6040516001600160a01b039091168152602001610352565b3480156103c157600080fd5b506103246103d036600461322e565b610c6a565b3480156103e157600080fd5b5061040d6103f0366004613263565b601860209081526000928352604080842090915290825290205481565b604051908152602001610352565b34801561042757600080fd5b5061032461043636600461328f565b610c77565b34801561044757600080fd5b50600554600454036000190161040d565b34801561046457600080fd5b5061040d60145481565b34801561047a57600080fd5b50610324610489366004613330565b610d48565b34801561049a57600080fd5b506103246104a9366004613390565b610ed2565b3480156104ba57600080fd5b5061040d6104c93660046133cc565b610f22565b3480156104da57600080fd5b506103706104e936600461322e565b610fa7565b3480156104fa57600080fd5b5061032461050936600461322e565b611053565b34801561051a57600080fd5b5061055861052936600461322e565b601160205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a001610352565b34801561058c57600080fd5b5061032461059b366004613408565b611060565b3480156105ac57600080fd5b50610324611113565b6103246105c336600461348d565b611173565b3480156105d457600080fd5b506103246105e3366004613390565b6113d9565b3480156105f457600080fd5b506103246106033660046133cc565b611439565b34801561061457600080fd5b506103466106233660046133cc565b6012602090815260009283526040909220815180830184018051928152908401929093019190912091525460ff1681565b34801561066057600080fd5b5061032461066f3660046134d8565b611481565b34801561068057600080fd5b5061069461068f36600461350c565b6114a0565b6040516103529190613540565b3480156106ad57600080fd5b5061040d6106bc36600461322e565b600c6020526000908152604090205481565b3480156106da57600080fd5b5061040d60175481565b3480156106f057600080fd5b5061039d6106ff36600461322e565b611566565b34801561071057600080fd5b5061040d60165481565b34801561072657600080fd5b50610370611578565b34801561073b57600080fd5b5061040d61074a3660046135aa565b611585565b34801561075b57600080fd5b506103246115d3565b34801561077057600080fd5b5061034661077f3660046135c5565b6115e7565b34801561079057600080fd5b5061040d60135481565b3480156107a657600080fd5b506107ba6107b53660046135aa565b611649565b6040516103529190613629565b3480156107d357600080fd5b506103466107e23660046135aa565b600d6020526000908152604090205460ff1681565b34801561080357600080fd5b506108586108123660046133cc565b6015602090815260009283526040909220815180830184018051928152908401929093019190912091528054600182015460028301546003909301549192909160ff1684565b6040805194855260208501939093529183015215156060820152608001610352565b34801561088657600080fd5b50600e546001600160a01b031661039d565b3480156108a457600080fd5b5061037061178e565b3480156108b957600080fd5b506107ba6108c8366004613661565b61179d565b3480156108d957600080fd5b5061039d6108e83660046131a6565b6000602081905290815260409020546001600160a01b031681565b34801561090f57600080fd5b5061032461091e3660046136a4565b611968565b34801561092f57600080fd5b5061032461093e3660046136a4565b611a38565b34801561094f57600080fd5b5061040d61095e36600461328f565b611adb565b34801561096f57600080fd5b5061032461097e3660046136ce565b611b18565b34801561098f57600080fd5b506109a361099e36600461322e565b611ba8565b604051610352919061373d565b3480156109bc57600080fd5b506103706109cb36600461322e565b611c62565b3480156109dc57600080fd5b506103246109eb366004613772565b611d1e565b6103246109fe366004613851565b611e09565b348015610a0f57600080fd5b50610324610a1e36600461322e565b612192565b348015610a2f57600080fd5b50610324610a3e36600461348d565b61219f565b348015610a4f57600080fd5b50610346610a5e3660046138e8565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205460ff1690565b348015610a9857600080fd5b50610324610aa736600461322e565b6123c8565b348015610ab857600080fd5b50610324610ac73660046135aa565b6123d5565b610ad461244b565b60005b8251811015610b3d57818181518110610af257610af2613912565b6020026020010151600c6000858481518110610b1057610b10613912565b60200260200101518152602001908152602001600020819055508080610b359061393e565b915050610ad7565b505050565b60006001600160e01b031982166380ac58cd60e01b1480610b7357506001600160e01b03198216635b5e139f60e01b145b80610b8e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060068054610ba390613957565b80601f0160208091040260200160405190810160405280929190818152602001828054610bcf90613957565b8015610c1c5780601f10610bf157610100808354040283529160200191610c1c565b820191906000526020600020905b815481529060010190602001808311610bff57829003601f168201915b5050505050905090565b6000610c31826124a5565b610c4e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600a60205260409020546001600160a01b031690565b610c7261244b565b601355565b6001600160a01b0382166000908152600d6020526040902054829060ff16610cba5760405162461bcd60e51b8152600401610cb190613991565b60405180910390fd5b6000610cc583611566565b9050806001600160a01b0316846001600160a01b031603610cf95760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610d195750610d178133610a5e565b155b15610d37576040516367d9dca160e11b815260040160405180910390fd5b610d428484836124de565b50505050565b6000828152601560205260408082209051859285928592610d6a9084906139c8565b90815260200160405180910390206002015490506015600084815260200190815260200160002082604051610d9f91906139c8565b9081526040519081900360200190206003015460ff16610dd15760405162461bcd60e51b8152600401610cb1906139e4565b601454600003610df35760405162461bcd60e51b8152600401610cb190613a1b565b60008411610e135760405162461bcd60e51b8152600401610cb190613a52565b601354841115610e355760405162461bcd60e51b8152600401610cb190613a89565b600083815260156020526040908190209051610e529084906139c8565b90815260405190819003602001902060010154610e6f8583613acc565b1115610e8d5760405162461bcd60e51b8152600401610cb190613ae4565b601754841115610eaf5760405162461bcd60e51b8152600401610cb190613b2a565b506000610eba61244b565b610ec888888789600061253a565b5050505050505050565b6000818152600c602052604090205442101580610efb57506000818152600c6020526040902054155b610f175760405162461bcd60e51b8152600401610cb190613b70565b610b3d8383836125e1565b6000828152601560205260408082209051610fa09190610f439085906139c8565b908152602001604051809103902060000154610f9b610f946015600088815260200190815260200160002086604051610f7c91906139c8565b908152604051908190036020019020546016546127fe565b606461280a565b612816565b9392505050565b60018181548110610fb757600080fd5b906000526020600020016000915090508054610fd290613957565b80601f0160208091040260200160405190810160405280929190818152602001828054610ffe90613957565b801561104b5780601f106110205761010080835404028352916020019161104b565b820191906000526020600020905b81548152906001019060200180831161102e57829003601f168201915b505050505081565b61105b61244b565b601755565b61106861244b565b82601560008681526020019081526020016000208260405161108a91906139c8565b90815260408051602092819003830181209390935560008781526015909252902083916110b89084906139c8565b9081526040805191829003602090810183206001908101949094556000888152601590915220906110ea9084906139c8565b908152604051908190036020019020600301805491151560ff1990921691909117905550505050565b61111b61244b565b604051600090339047908381818185875af1925050503d806000811461115d576040519150601f19603f3d011682016040523d82523d6000602084013e611162565b606091505b505090508061117057600080fd5b50565b8260046040518060400160405280600681526020016521b7b6b6b7b760d11b815250600060156000848152602001908152602001600020826040516111b891906139c8565b908152602001604051809103902060020154905060156000848152602001908152602001600020826040516111ed91906139c8565b9081526040519081900360200190206003015460ff1661121f5760405162461bcd60e51b8152600401610cb1906139e4565b6014546000036112415760405162461bcd60e51b8152600401610cb190613a1b565b600084116112615760405162461bcd60e51b8152600401610cb190613a52565b6013548411156112835760405162461bcd60e51b8152600401610cb190613a89565b6000838152601560205260409081902090516112a09084906139c8565b908152604051908190036020019020600101546112bd8583613acc565b11156112db5760405162461bcd60e51b8152600401610cb190613ae4565b6017548411156112fd5760405162461bcd60e51b8152600401610cb190613b2a565b5060408051808201909152600681526521b7b6b6b7b760d11b6020820152600090600161132e898989600485612822565b61134a5760405162461bcd60e51b8152600401610cb190613bb4565b3360009081527f5b650d93b25a5c652bc6f9215f522b521daf6d36977dcec1343c2a8310b869d66020526040812080548b9290611388908490613acc565b909155506113a1905061139b8284610f22565b8a6127fe565b3410156113c05760405162461bcd60e51b8152600401610cb190613beb565b6113ce338a8484600161253a565b505050505050505050565b6000818152600c60205260409020544210158061140257506000818152600c6020526040902054155b61141e5760405162461bcd60e51b8152600401610cb190613b70565b610b3d83838360405180602001604052806000815250611b18565b61144161244b565b600082815260126020526040808220905161145d9084906139c8565b908152604051908190036020019020805491151560ff199092169190911790555050565b61148961244b565b805161149c906010906020840190612fc0565b5050565b80516060906000816001600160401b038111156114bf576114bf613059565b60405190808252806020026020018201604052801561150a57816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816114dd5790505b50905060005b82811461155e5761153985828151811061152c5761152c613912565b6020026020010151611ba8565b82828151811061154b5761154b613912565b6020908102919091010152600101611510565b509392505050565b6000611571826129b0565b5192915050565b60108054610fd290613957565b60006001600160a01b0382166115ae576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600960205260409020546001600160401b031690565b6115db61244b565b6115e56000612ad7565b565b600061163f6115f68785611adb565b8686808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250888152601160205260409020600401549250612b29915050565b9695505050505050565b6060600080600061165985611585565b90506000816001600160401b0381111561167557611675613059565b60405190808252806020026020018201604052801561169e578160200160208202803683370190505b5090506116c4604080516060810182526000808252602082018190529181019190915290565b60015b83861161178257600081815260086020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052925061177a5781516001600160a01b03161561173b57815194505b876001600160a01b0316856001600160a01b03160361177a578083878060010198508151811061176d5761176d613912565b6020026020010181815250505b6001016116c7565b50909695505050505050565b606060078054610ba390613957565b6060818311156117c057604051631960ccad60e11b815260040160405180910390fd5b6004546000906001016117d1600190565b8510156117dd57600194505b808411156117e9578093505b60006117f487611585565b905084861015611813578585038181101561180d578091505b50611817565b5060005b6000816001600160401b0381111561183157611831613059565b60405190808252806020026020018201604052801561185a578160200160208202803683370190505b50905081600003611870579350610fa092505050565b600061187b88611ba8565b90506000816040015161188c575080515b885b88811415801561189e5750848714155b1561195757600081815260086020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052935061194f5782516001600160a01b03161561191057825191505b8a6001600160a01b0316826001600160a01b03160361194f578084888060010199508151811061194257611942613912565b6020026020010181815250505b60010161188e565b505050928352509095945050505050565b6001600160a01b0382166000908152600d6020526040902054829060ff166119a25760405162461bcd60e51b8152600401610cb190613991565b336001600160a01b038416036119cb5760405163b06307db60e01b815260040160405180910390fd5b336000818152600b602090815260408083206001600160a01b03881680855290835292819020805460ff191687151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611a4061244b565b6001600160a01b0382166000908152600d602052604090205481151560ff909116151503611ab05760405162461bcd60e51b815260206004820152601c60248201527f58616e616c616e643a2073746174757320616c726561647920736574000000006044820152606401610cb1565b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b604080516001600160a01b038416602082015290810182905260009060600160405160208183030381529060405280519060200120905092915050565b6000828152600c602052604090205442101580611b4157506000828152600c6020526040902054155b611b5d5760405162461bcd60e51b8152600401610cb190613b70565b611b688484846125e1565b6001600160a01b0383163b15158015611b8a5750611b8884848484612b3e565b155b15610d42576040516368d2bf6b60e11b815260040160405180910390fd5b60408051606080820183526000808352602080840182905283850182905284519283018552818352820181905292810192909252906001831080611bee57506004548310155b15611bf95792915050565b50600082815260086020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161580159282019290925290611c595792915050565b610fa0836129b0565b6060611c6d826124a5565b611cc35760405162461bcd60e51b815260206004820152602160248201527f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b656044820152603760f91b6064820152608401610cb1565b6000611ccd612c29565b90506000815111611ced5760405180602001604052806000815250610fa0565b80611cf784612c38565b604051602001611d08929190613c2d565b6040516020818303038152906040529392505050565b611d2661244b565b6040805160a081018252858152602080820186815282840186815260008a8152601180855295812060038101805460608801908152608088018f81528e855298909652955181559251600184015590516002830155915190925591516004909101555b8151811015611e0057600160126000888152602001908152602001600020838381518110611db957611db9613912565b6020026020010151604051611dce91906139c8565b908152604051908190036020019020805491151560ff1990921691909117905580611df88161393e565b915050611d89565b50505050505050565b6000858152601560205260408082209051889288928b92611e2b9084906139c8565b90815260200160405180910390206002015490506015600084815260200190815260200160002082604051611e6091906139c8565b9081526040519081900360200190206003015460ff16611e925760405162461bcd60e51b8152600401610cb1906139e4565b601454600003611eb45760405162461bcd60e51b8152600401610cb190613a1b565b60008411611ed45760405162461bcd60e51b8152600401610cb190613a52565b601354841115611ef65760405162461bcd60e51b8152600401610cb190613a89565b600083815260156020526040908190209051611f139084906139c8565b90815260405190819003602001902060010154611f308583613acc565b1115611f4e5760405162461bcd60e51b8152600401610cb190613ae4565b601754841115611f705760405162461bcd60e51b8152600401610cb190613b2a565b506000888152601560205260408082209051611f8d908d906139c8565b9081526040519081900360200190206003015460ff16611fbf5760405162461bcd60e51b8152600401610cb1906139e4565b600085815260126020526040908190209051611fdc908d906139c8565b9081526040519081900360200190205460ff1661202f5760405162461bcd60e51b815260206004820152601160248201527016185b9853185b990e88125b9d985b1a59607a1b6044820152606401610cb1565b60145460020361208c5784156120875760405162461bcd60e51b815260206004820152601a60248201527f58616e614c616e643a206f6e6c79207075626c69632073616c650000000000006044820152606401610cb1565b6120c9565b846000036120c95760405162461bcd60e51b815260206004820152600a60248201526902c30b730a630b7321d160b51b6044820152606401610cb1565b6120d68a8989888a612822565b6120f25760405162461bcd60e51b8152600401610cb190613bb4565b6000858152601860209081526040808320338452909152812080548c929061211b908490613acc565b90915550506000898152601560205260409081902090516121589190612142908e906139c8565b908152604051908190036020019020548b6127fe565b3410156121775760405162461bcd60e51b8152600401610cb190613beb565b612185338b8d8c600061253a565b5050505050505050505050565b61219a61244b565b601655565b8260056040518060400160405280600681526020016521b7b6b6b7b760d11b815250600060156000848152602001908152602001600020826040516121e491906139c8565b9081526020016040518091039020600201549050601560008481526020019081526020016000208260405161221991906139c8565b9081526040519081900360200190206003015460ff1661224b5760405162461bcd60e51b8152600401610cb1906139e4565b60145460000361226d5760405162461bcd60e51b8152600401610cb190613a1b565b6000841161228d5760405162461bcd60e51b8152600401610cb190613a52565b6013548411156122af5760405162461bcd60e51b8152600401610cb190613a89565b6000838152601560205260409081902090516122cc9084906139c8565b908152604051908190036020019020600101546122e98583613acc565b11156123075760405162461bcd60e51b8152600401610cb190613ae4565b6017548411156123295760405162461bcd60e51b8152600401610cb190613b2a565b5060408051808201909152600681526521b7b6b6b7b760d11b6020820152600090600161235a898989600585612822565b6123765760405162461bcd60e51b8152600401610cb190613bb4565b3360009081527f2288853b49db4f36075bf4a8cfdae4e5e3b39b7b03937d0a9148b051a6f64c5c6020526040812080548b92906123b4908490613acc565b909155506113ce9050338a8484600061253a565b6123d061244b565b601455565b6123dd61244b565b6001600160a01b0381166124425760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cb1565b61117081612ad7565b600e546001600160a01b031633146115e55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cb1565b6000816001111580156124b9575060045482105b8015610b8e575050600090815260086020526040902054600160e01b900460ff161590565b6000828152600a602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000806125478787612d38565b9150915085601560008681526020019081526020016000208660405161256d91906139c8565b9081526020016040518091039020600201600082825461258d9190613acc565b90915550506040517fc5e101581b86caaead7cd59d5856276f8289c3a689e5190e88cdf51a82b255b4906125d090899088908890879087908d9034908c90613c5c565b60405180910390a150505050505050565b336000818152600d602052604090205460ff166126105760405162461bcd60e51b8152600401610cb190613991565b600061261b836129b0565b9050846001600160a01b031681600001516001600160a01b0316146126525760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038716148061267057506126708633610a5e565b8061268b57503361268085610c26565b6001600160a01b0316145b9050806126ab57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166126d257604051633a954ecd60e21b815260040160405180910390fd5b6126de600085886124de565b6001600160a01b038681166000908152600960209081526040808320805467ffffffffffffffff198082166001600160401b03928316600019018316179092558a86168086528386208054938416938316600190810184169490941790558a8652600890945282852080546001600160e01b031916909417600160a01b429092169190910217835588018084529220805491939091166127b25760045482146127b257805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038b16171781555b50505083856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6000610fa08284613cb6565b6000610fa08284613ceb565b6000610fa08284613cff565b60006002600f54036128765760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610cb1565b6002600f556000838152601160205260409020544210156128ce5760405162461bcd60e51b81526020600482015260126024820152712c30b730b630b7321d103737ba1037b832b760711b6044820152606401610cb1565b6000838152601160205260409020600101544211156129265760405162461bcd60e51b815260206004820152601460248201527316185b985b185b990e881cd85b1948195b99195960621b6044820152606401610cb1565b600082612934576000612959565b6000848152601860209081526040808320338452909152902054612959908890613acc565b9050866011600086815260200190815260200160002060030160008282546129819190613acc565b909155505060145460011415806129a057506129a033878784886115e7565b6001600f55979650505050505050565b604080516060810182526000808252602082018190529181019190915281806001111580156129e0575060045481105b15612abe57600081815260086020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612abc5780516001600160a01b031615612a53579392505050565b5060001901600081815260086020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612ab7579392505050565b612a53565b505b604051636f96cda160e11b815260040160405180910390fd5b600e80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000612b36838386612d61565b949350505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612b73903390899088908890600401613d16565b6020604051808303816000875af1925050508015612bae575060408051601f3d908101601f19168201909252612bab91810190613d49565b60015b612c0c573d808015612bdc576040519150601f19603f3d011682016040523d82523d6000602084013e612be1565b606091505b508051600003612c04576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b606060108054610ba390613957565b606081600003612c5f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612c895780612c738161393e565b9150612c829050600a83613ceb565b9150612c63565b6000816001600160401b03811115612ca357612ca3613059565b6040519080825280601f01601f191660200182016040528015612ccd576020820181803683370190505b5090505b8415612b3657612ce2600183613cff565b9150612cef600a86613d66565b612cfa906030613acc565b60f81b818381518110612d0f57612d0f613912565b60200101906001600160f81b031916908160001a905350612d31600a86613ceb565b9450612cd1565b600080612d55848460405180602001604052806000815250612d77565b915091505b9250929050565b600082612d6e8584612f54565b14949350505050565b60045460009081906001600160a01b038616612da557604051622e076360e81b815260040160405180910390fd5b84600003612dc65760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038616600081815260096020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168d0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168d01811690920217909155858452600890925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818701903b15612eee575b60405182906001600160a01b038a16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612eb76000898480600101955089612b3e565b612ed4576040516368d2bf6b60e11b815260040160405180910390fd5b808203612e6c578260045414612ee957600080fd5b612f33565b5b6040516001830192906001600160a01b038a16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203612eef575b50600455806001600454612f479190613cff565b9250925050935093915050565b600081815b845181101561155e576000858281518110612f7657612f76613912565b60200260200101519050808311612f9c5760008381526020829052604090209250612fad565b600081815260208490526040902092505b5080612fb88161393e565b915050612f59565b828054612fcc90613957565b90600052602060002090601f016020900481019282612fee5760008555613034565b82601f1061300757805160ff1916838001178555613034565b82800160010185558215613034579182015b82811115613034578251825591602001919060010190613019565b50613040929150613044565b5090565b5b808211156130405760008155600101613045565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561309757613097613059565b604052919050565b60006001600160401b038211156130b8576130b8613059565b5060051b60200190565b600082601f8301126130d357600080fd5b813560206130e86130e38361309f565b61306f565b82815260059290921b8401810191818101908684111561310757600080fd5b8286015b84811015613122578035835291830191830161310b565b509695505050505050565b6000806040838503121561314057600080fd5b82356001600160401b038082111561315757600080fd5b613163868387016130c2565b9350602085013591508082111561317957600080fd5b50613186858286016130c2565b9150509250929050565b6001600160e01b03198116811461117057600080fd5b6000602082840312156131b857600080fd5b8135610fa081613190565b60005b838110156131de5781810151838201526020016131c6565b83811115610d425750506000910152565b600081518084526132078160208601602086016131c3565b601f01601f19169290920160200192915050565b602081526000610fa060208301846131ef565b60006020828403121561324057600080fd5b5035919050565b80356001600160a01b038116811461325e57600080fd5b919050565b6000806040838503121561327657600080fd5b8235915061328660208401613247565b90509250929050565b600080604083850312156132a257600080fd5b6132ab83613247565b946020939093013593505050565b60006001600160401b038311156132d2576132d2613059565b6132e5601f8401601f191660200161306f565b90508281528383830111156132f957600080fd5b828260208301376000602084830101529392505050565b600082601f83011261332157600080fd5b610fa0838335602085016132b9565b6000806000806080858703121561334657600080fd5b61334f85613247565b9350602085013592506040850135915060608501356001600160401b0381111561337857600080fd5b61338487828801613310565b91505092959194509250565b6000806000606084860312156133a557600080fd5b6133ae84613247565b92506133bc60208501613247565b9150604084013590509250925092565b600080604083850312156133df57600080fd5b8235915060208301356001600160401b038111156133fc57600080fd5b61318685828601613310565b6000806000806080858703121561341e57600080fd5b84359350602085013592506040850135915060608501356001600160401b0381111561337857600080fd5b60008083601f84011261345b57600080fd5b5081356001600160401b0381111561347257600080fd5b6020830191508360208260051b8501011115612d5a57600080fd5b6000806000604084860312156134a257600080fd5b8335925060208401356001600160401b038111156134bf57600080fd5b6134cb86828701613449565b9497909650939450505050565b6000602082840312156134ea57600080fd5b81356001600160401b0381111561350057600080fd5b612b3684828501613310565b60006020828403121561351e57600080fd5b81356001600160401b0381111561353457600080fd5b612b36848285016130c2565b6020808252825182820181905260009190848201906040850190845b818110156117825761359783855180516001600160a01b031682526020808201516001600160401b0316908301526040908101511515910152565b928401926060929092019160010161355c565b6000602082840312156135bc57600080fd5b610fa082613247565b6000806000806000608086880312156135dd57600080fd5b6135e686613247565b945060208601356001600160401b0381111561360157600080fd5b61360d88828901613449565b9699909850959660408101359660609091013595509350505050565b6020808252825182820181905260009190848201906040850190845b8181101561178257835183529284019291840191600101613645565b60008060006060848603121561367657600080fd5b61367f84613247565b95602085013595506040909401359392505050565b8035801515811461325e57600080fd5b600080604083850312156136b757600080fd5b6136c083613247565b915061328660208401613694565b600080600080608085870312156136e457600080fd5b6136ed85613247565b93506136fb60208601613247565b92506040850135915060608501356001600160401b0381111561371d57600080fd5b8501601f8101871361372e57600080fd5b613384878235602084016132b9565b81516001600160a01b031681526020808301516001600160401b03169082015260408083015115159082015260608101610b8e565b60008060008060008060c0878903121561378b57600080fd5b86359550602080880135955060408801359450606088013593506080880135925060a08801356001600160401b03808211156137c657600080fd5b818a0191508a601f8301126137da57600080fd5b81356137e86130e38261309f565b81815260059190911b8301840190848101908d83111561380757600080fd5b8585015b8381101561383d57848135111561382157600080fd5b6138308f888335890101613310565b835291860191860161380b565b508096505050505050509295509295509295565b600080600080600080600060c0888a03121561386c57600080fd5b87356001600160401b038082111561388357600080fd5b61388f8b838c01613310565b985060208a0135975060408a0135965060608a01359150808211156138b357600080fd5b506138c08a828b01613449565b90955093506138d3905060808901613694565b915060a0880135905092959891949750929550565b600080604083850312156138fb57600080fd5b61390483613247565b915061328660208401613247565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161395057613950613928565b5060010190565b600181811c9082168061396b57607f821691505b60208210810361398b57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601c908201527f4552433732313a207472616e73666572206e6f7420616c6c6f77656400000000604082015260600190565b600082516139da8184602087016131c3565b9190910192915050565b6020808252601d908201527f58616e614c616e643a20506c6f742073697a65206e6f742076616c6964000000604082015260600190565b6020808252601f908201527f58616e614c616e643a2053616c65206e6f742073746172746564207965742e00604082015260600190565b60208082526018908201527f58616e614c616e643a20416d6f756e74206973205a65726f0000000000000000604082015260600190565b60208082526023908201527f58616e614c616e643a20416d6f756e7420657863656564656420696e20706172604082015262616d7360e81b606082015260800190565b60008219821115613adf57613adf613928565b500190565b60208082526026908201527f58616e614c616e643a204d6178204c696d6974205265616368656420666f722060408201526521b7b6b6b7b760d11b606082015260800190565b60208082526026908201527f58616e614c616e643a20506572207472616e73616374696f6e206c696d697420604082015265195e18d9595960d21b606082015260800190565b60208082526024908201527f58616e614c616e643a204e4654206c6f636b7570206e6f742065787069726564604082015263081e595d60e21b606082015260800190565b60208082526019908201527f58616e614c616e643a204e6f742077686974656c697374656400000000000000604082015260600190565b60208082526022908201527f58616e614c616e643a205061696420616d6f756e7420696e73756666696369656040820152611b9d60f21b606082015260800190565b60008351613c3f8184602088016131c3565b835190830190613c538183602088016131c3565b01949350505050565b6001600160a01b038916815261010060208201819052600090613c818382018b6131ef565b604084019990995250506060810195909552608085019390935260a084019190915260c0830152151560e09091015292915050565b6000816000190483118215151615613cd057613cd0613928565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613cfa57613cfa613cd5565b500490565b600082821015613d1157613d11613928565b500390565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061163f908301846131ef565b600060208284031215613d5b57600080fd5b8151610fa081613190565b600082613d7557613d75613cd5565b50069056fea2646970667358221220bb0f1a3a6bf49701a3876cb96b3b9870b983f7661797a01709664176deff12bb64736f6c634300080e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004584142490000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045841424900000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): XABI
Arg [1] : _symbol (string): XABI
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [3] : 5841424900000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 5841424900000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
69527:7640:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76325:210;;;;;;;;;;-1:-1:-1;76325:210:0;;;;;:::i;:::-;;:::i;:::-;;38574:305;;;;;;;;;;-1:-1:-1;38574:305:0;;;;;:::i;:::-;;:::i;:::-;;;2432:14:1;;2425:22;2407:41;;2395:2;2380:18;38574:305:0;;;;;;;;41693:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43220:204::-;;;;;;;;;;-1:-1:-1;43220:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3559:32:1;;;3541:51;;3529:2;3514:18;43220:204:0;3395:203:1;75303:116:0;;;;;;;;;;-1:-1:-1;75303:116:0;;;;;:::i;:::-;;:::i;68283:66::-;;;;;;;;;;-1:-1:-1;68283:66:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;4186:25:1;;;4174:2;4159:18;68283:66:0;4040:177:1;42759:395:0;;;;;;;;;;-1:-1:-1;42759:395:0;;;;;:::i;:::-;;:::i;37823:303::-;;;;;;;;;;-1:-1:-1;38077:12:0;;38061:13;;:28;-1:-1:-1;;38061:46:0;37823:303;;67990:25;;;;;;;;;;;;;;;;76952:208;;;;;;;;;;-1:-1:-1;76952:208:0;;;;;:::i;:::-;;:::i;48563:291::-;;;;;;;;;;-1:-1:-1;48563:291:0;;;;;:::i;:::-;;:::i;70194:228::-;;;;;;;;;;-1:-1:-1;70194:228:0;;;;;:::i;:::-;;:::i;512:29::-;;;;;;;;;;-1:-1:-1;512:29:0;;;;;:::i;:::-;;:::i;75901:110::-;;;;;;;;;;-1:-1:-1;75901:110:0;;;;;:::i;:::-;;:::i;67830:50::-;;;;;;;;;;-1:-1:-1;67830:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6868:25:1;;;6924:2;6909:18;;6902:34;;;;6952:18;;;6945:34;;;;7010:2;6995:18;;6988:34;7053:3;7038:19;;7031:35;6855:3;6840:19;67830:50:0;6609:463:1;76068:249:0;;;;;;;;;;-1:-1:-1;76068:249:0;;;;;:::i;:::-;;:::i;76784:160::-;;;;;;;;;;;;;:::i;70466:646::-;;;;;;:::i;:::-;;:::i;48862:305::-;;;;;;;;;;-1:-1:-1;48862:305:0;;;;;:::i;:::-;;:::i;75104:151::-;;;;;;;;;;-1:-1:-1;75104:151:0;;;;;:::i;:::-;;:::i;67889:65::-;;;;;;;;;;-1:-1:-1;67889:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75471:104;;;;;;;;;;-1:-1:-1;75471:104:0;;;;;:::i;:::-;;:::i;61625:459::-;;;;;;;;;;-1:-1:-1;61625:459:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;37084:45::-;;;;;;;;;;-1:-1:-1;37084:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;68240:34;;;;;;;;;;;;;;;;41501:125;;;;;;;;;;-1:-1:-1;41501:125:0;;;;;:::i;:::-;;:::i;68208:23::-;;;;;;;;;;;;;;;;67629:21;;;;;;;;;;;;;:::i;38949:206::-;;;;;;;;;;-1:-1:-1;38949:206:0;;;;;:::i;:::-;;:::i;6480:103::-;;;;;;;;;;;;;:::i;74035:235::-;;;;;;;;;;-1:-1:-1;74035:235:0;;;;;:::i;:::-;;:::i;67960:26::-;;;;;;;;;;;;;;;;65424:882;;;;;;;;;;-1:-1:-1;65424:882:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;37138:49::-;;;;;;;;;;-1:-1:-1;37138:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;68141:58;;;;;;;;;;-1:-1:-1;68141:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11889:25:1;;;11945:2;11930:18;;11923:34;;;;11973:18;;;11966:34;12043:14;12036:22;12031:2;12016:18;;12009:50;11876:3;11861:19;68141:58:0;11664:401:1;5832:87:0;;;;;;;;;;-1:-1:-1;5905:6:0;;-1:-1:-1;;;;;5905:6:0;5832:87;;41862:104;;;;;;;;;;;;;:::i;62474:2501::-;;;;;;;;;;-1:-1:-1;62474:2501:0;;;;;:::i;:::-;;:::i;396:43::-;;;;;;;;;;-1:-1:-1;396:43:0;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;396:43:0;;;43496:317;;;;;;;;;;-1:-1:-1;43496:317:0;;;;;:::i;:::-;;:::i;76543:208::-;;;;;;;;;;-1:-1:-1;76543:208:0;;;;;:::i;:::-;;:::i;74276:146::-;;;;;;;;;;-1:-1:-1;74276:146:0;;;;;:::i;:::-;;:::i;49175:490::-;;;;;;;;;;-1:-1:-1;49175:490:0;;;;;:::i;:::-;;:::i;61057:409::-;;;;;;;;;;-1:-1:-1;61057:409:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;73665:327::-;;;;;;;;;;-1:-1:-1;73665:327:0;;;;;:::i;:::-;;:::i;74644:452::-;;;;;;;;;;-1:-1:-1;74644:452:0;;;;;:::i;:::-;;:::i;71920:1034::-;;;;;;:::i;:::-;;:::i;75612:98::-;;;;;;;;;;-1:-1:-1;75612:98:0;;;;;:::i;:::-;;:::i;72996:532::-;;;;;;;;;;-1:-1:-1;72996:532:0;;;;;:::i;:::-;;:::i;43884:164::-;;;;;;;;;;-1:-1:-1;43884:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;44005:25:0;;;43981:4;44005:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;43884:164;75803:92;;;;;;;;;;-1:-1:-1;75803:92:0;;;;;:::i;:::-;;:::i;6738:201::-;;;;;;;;;;-1:-1:-1;6738:201:0;;;;;:::i;:::-;;:::i;76325:210::-;5718:13;:11;:13::i;:::-;76430:9:::1;76426:102;76445:7;:14;76442:1;:17;76426:102;;;76500:11;76512:1;76500:14;;;;;;;;:::i;:::-;;;;;;;76475:10;:22;76486:7;76494:1;76486:10;;;;;;;;:::i;:::-;;;;;;;76475:22;;;;;;;;;;;:39;;;;76460:3;;;;;:::i;:::-;;;;76426:102;;;;76325:210:::0;;:::o;38574:305::-;38676:4;-1:-1:-1;;;;;;38713:40:0;;-1:-1:-1;;;38713:40:0;;:105;;-1:-1:-1;;;;;;;38770:48:0;;-1:-1:-1;;;38770:48:0;38713:105;:158;;;-1:-1:-1;;;;;;;;;;34014:40:0;;;38835:36;38693:178;38574:305;-1:-1:-1;;38574:305:0:o;41693:100::-;41747:13;41780:5;41773:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41693:100;:::o;43220:204::-;43288:7;43313:16;43321:7;43313;:16::i;:::-;43308:64;;43338:34;;-1:-1:-1;;;43338:34:0;;;;;;;;;;;43308:64;-1:-1:-1;43392:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;43392:24:0;;43220:204::o;75303:116::-;5718:13;:11;:13::i;:::-;75384:7:::1;:27:::0;75303:116::o;42759:395::-;-1:-1:-1;;;;;37425:23:0;;;;;;:17;:23;;;;;;42825:2;;37425:23;;37417:63;;;;-1:-1:-1;;;37417:63:0;;;;;;;:::i;:::-;;;;;;;;;42856:13:::1;42872:24;42888:7;42872:15;:24::i;:::-;42856:40;;42917:5;-1:-1:-1::0;;;;;42911:11:0::1;:2;-1:-1:-1::0;;;;;42911:11:0::1;::::0;42907:48:::1;;42931:24;;-1:-1:-1::0;;;42931:24:0::1;;;;;;;;;;;42907:48;4465:10:::0;-1:-1:-1;;;;;42972:21:0;::::1;;::::0;::::1;::::0;:63:::1;;-1:-1:-1::0;42998:37:0::1;43015:5:::0;4465:10;43884:164;:::i;42998:37::-:1;42997:38;42972:63;42968:138;;;43059:35;;-1:-1:-1::0;;;43059:35:0::1;;;;;;;;;;;42968:138;43118:28;43127:2;43131:7;43140:5;43118:8;:28::i;:::-;42845:309;42759:395:::0;;;:::o;76952:208::-;68757:9;68769:12;;;:5;:12;;;;;;:20;;77053:10;;77064:5;;77071:6;;68769:20;;77071:6;;68769:20;:::i;:::-;;;;;;;;;;;;;:25;;;68757:37;;68860:5;:12;68866:5;68860:12;;;;;;;;;;;68873:6;68860:20;;;;;;:::i;:::-;;;;;;;;;;;;;;:26;;;;;68852:69;;;;-1:-1:-1;;;68852:69:0;;;;;;;:::i;:::-;68999:6;;69009:1;68999:11;68991:56;;;;-1:-1:-1;;;68991:56:0;;;;;;;:::i;:::-;69080:1;69066:11;:15;69058:53;;;;-1:-1:-1;;;69058:53:0;;;;;;;:::i;:::-;69145:7;;69130:11;:22;;69122:71;;;;-1:-1:-1;;;69122:71:0;;;;;;;:::i;:::-;69231:12;;;;:5;:12;;;;;;;:20;;;;69244:6;;69231:20;:::i;:::-;;;;;;;;;;;;;;:26;;;69212:15;69216:11;69212:1;:15;:::i;:::-;:45;;69204:97;;;;-1:-1:-1;;;69204:97:0;;;;;;;:::i;:::-;69337:19;;69322:11;:34;;69314:87;;;;-1:-1:-1;;;69314:87:0;;;;;;;:::i;:::-;-1:-1:-1;69412:8:0;5718:13:::1;:11;:13::i;:::-;77107:45:::2;77115:3;77119:10;77131:6;77139:5;77146;77107:7;:45::i;:::-;68746:694:::0;76952:208;;;;;;;:::o;48563:291::-;48699:19;;;;:10;:19;;;;;;48722:15;-1:-1:-1;48699:38:0;;:66;;-1:-1:-1;48741:19:0;;;;:10;:19;;;;;;:24;48699:66;48691:116;;;;-1:-1:-1;;;48691:116:0;;;;;;;:::i;:::-;48818:28;48828:4;48834:2;48838:7;48818:9;:28::i;70194:228::-;70279:7;70319:12;;;:5;:12;;;;;;:20;;70306:108;;70319:12;:20;;70332:6;;70319:20;:::i;:::-;;;;;;;;;;;;;:25;;;70346:67;70359:48;70372:5;:12;70378:5;70372:12;;;;;;;;;;;70385:6;70372:20;;;;;;:::i;:::-;;;;;;;;;;;;;;:25;70398:8;;70359:12;:48::i;:::-;70409:3;70346:12;:67::i;:::-;70306:12;:108::i;:::-;70299:115;70194:228;-1:-1:-1;;;70194:228:0:o;512:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;75901:110::-;5718:13;:11;:13::i;:::-;75976:19:::1;:27:::0;75901:110::o;76068:249::-;5718:13;:11;:13::i;:::-;76212:5:::1;76183;:12;76189:5;76183:12;;;;;;;;;;;76196:7;76183:21;;;;;;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;:34;;;;:26:::1;76228:12:::0;;;:5:::1;:12:::0;;;;;76258:6;;76228:21:::1;::::0;76241:7;;76228:21:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;;::::1;::::0;;;;;:27:::1;::::0;;::::1;:36:::0;;;;76275:12:::1;::::0;;;:5:::1;:12:::0;;;;;:21:::1;::::0;76288:7;;76275:21:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:27:::1;;:34:::0;;;::::1;;-1:-1:-1::0;;76275:34:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;76068:249:0:o;76784:160::-;5718:13;:11;:13::i;:::-;76851:58:::1;::::0;76833:12:::1;::::0;76859:10:::1;::::0;76883:21:::1;::::0;76833:12;76851:58;76833:12;76851:58;76883:21;76859:10;76851:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76832:77;;;76928:7;76920:16;;;::::0;::::1;;76821:123;76784:160::o:0;70466:646::-;70554:11;70566:1;68667:773;;;;;;;;;;;;;-1:-1:-1;;;68667:773:0;;;68757:9;68769:5;:12;68775:5;68769:12;;;;;;;;;;;68782:6;68769:20;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;68757:37;;68860:5;:12;68866:5;68860:12;;;;;;;;;;;68873:6;68860:20;;;;;;:::i;:::-;;;;;;;;;;;;;;:26;;;;;68852:69;;;;-1:-1:-1;;;68852:69:0;;;;;;;:::i;:::-;68999:6;;69009:1;68999:11;68991:56;;;;-1:-1:-1;;;68991:56:0;;;;;;;:::i;:::-;69080:1;69066:11;:15;69058:53;;;;-1:-1:-1;;;69058:53:0;;;;;;;:::i;:::-;69145:7;;69130:11;:22;;69122:71;;;;-1:-1:-1;;;69122:71:0;;;;;;;:::i;:::-;69231:12;;;;:5;:12;;;;;;;:20;;;;69244:6;;69231:20;:::i;:::-;;;;;;;;;;;;;;:26;;;69212:15;69216:11;69212:1;:15;:::i;:::-;:45;;69204:97;;;;-1:-1:-1;;;69204:97:0;;;;;;;:::i;:::-;69337:19;;69322:11;:34;;69314:87;;;;-1:-1:-1;;;69314:87:0;;;;;;;:::i;:::-;-1:-1:-1;70607:31:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;70607:31:0::1;::::0;::::1;::::0;69412:8;;70663:1:::1;70728:43;70743:11:::0;70756:5;;70763:1:::1;70663::::0;70728:14:::1;:43::i;:::-;70720:81;;;;-1:-1:-1::0;;;70720:81:0::1;;;;;;;:::i;:::-;70839:10;70824:14;:26:::0;;;:14;::::1;:26:::0;:14;:26;;:41;;70854:11;;70824:14;:41:::1;::::0;70854:11;;70824:41:::1;:::i;:::-;::::0;;;-1:-1:-1;70935:57:0::1;::::0;-1:-1:-1;70948:31:0::1;70966:5:::0;70972:6;70948:17:::1;:31::i;:::-;70980:11;70935:12;:57::i;:::-;70922:9;:70;;70914:117;;;;-1:-1:-1::0;;;70914:117:0::1;;;;;;;:::i;:::-;71042:52;71050:10;71061:11;71074:6;71082:5;71089:4;71042:7;:52::i;:::-;70596:516;;68746:694:::0;70466:646;;;;;;:::o;48862:305::-;49001:19;;;;:10;:19;;;;;;49024:15;-1:-1:-1;49001:38:0;;:66;;-1:-1:-1;49043:19:0;;;;:10;:19;;;;;;:24;49001:66;48993:116;;;;-1:-1:-1;;;48993:116:0;;;;;;;:::i;:::-;49120:39;49137:4;49143:2;49147:7;49120:39;;;;;;;;;;;;:16;:39::i;75104:151::-;5718:13;:11;:13::i;:::-;75242:5:::1;75202:29:::0;;;:14:::1;:29;::::0;;;;;:37;;::::1;::::0;75232:6;;75202:37:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:45;;;::::1;;-1:-1:-1::0;;75202:45:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;75104:151:0:o;75471:104::-;5718:13;:11;:13::i;:::-;75546:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;75471:104:::0;:::o;61625:459::-;61791:15;;61705:23;;61766:22;61791:15;-1:-1:-1;;;;;61858:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;61858:36:0;;-1:-1:-1;;61858:36:0;;;;;;;;;;;;61821:73;;61914:9;61909:125;61930:14;61925:1;:19;61909:125;;61986:32;62006:8;62015:1;62006:11;;;;;;;;:::i;:::-;;;;;;;61986:19;:32::i;:::-;61970:10;61981:1;61970:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;61946:3;;61909:125;;;-1:-1:-1;62055:10:0;61625:459;-1:-1:-1;;;61625:459:0:o;41501:125::-;41565:7;41592:21;41605:7;41592:12;:21::i;:::-;:26;;41501:125;-1:-1:-1;;41501:125:0:o;67629:21::-;;;;;;;:::i;38949:206::-;39013:7;-1:-1:-1;;;;;39037:19:0;;39033:60;;39065:28;;-1:-1:-1;;;39065:28:0;;;;;;;;;;;39033:60;-1:-1:-1;;;;;;39119:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;39119:27:0;;38949:206::o;6480:103::-;5718:13;:11;:13::i;:::-;6545:30:::1;6572:1;6545:18;:30::i;:::-;6480:103::o:0;74035:235::-;74163:4;74187:75;74195:24;74201:7;74210:8;74195:5;:24::i;:::-;74221:5;;74187:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;74228:28:0;;;:13;:28;;;;;:33;;;;-1:-1:-1;74187:7:0;;-1:-1:-1;;74187:75:0:i;:::-;74180:82;74035:235;-1:-1:-1;;;;;;74035:235:0:o;65424:882::-;65485:16;65539:19;65573:25;65613:22;65638:16;65648:5;65638:9;:16::i;:::-;65613:41;;65669:25;65711:14;-1:-1:-1;;;;;65697:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65697:29:0;;65669:57;;65741:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;65741:31:0;37680:1;65787:471;65836:14;65821:11;:29;65787:471;;65888:14;;;;:11;:14;;;;;;;;;65876:26;;;;;;;;;-1:-1:-1;;;;;65876:26:0;;;;-1:-1:-1;;;65876:26:0;;-1:-1:-1;;;;;65876:26:0;;;;;;;;-1:-1:-1;;;65876:26:0;;;;;;;;;;;;;;-1:-1:-1;65966:8:0;65921:73;66016:14;;-1:-1:-1;;;;;66016:28:0;;66012:111;;66089:14;;;-1:-1:-1;66012:111:0;66166:5;-1:-1:-1;;;;;66145:26:0;:17;-1:-1:-1;;;;;66145:26:0;;66141:102;;66222:1;66196:8;66205:13;;;;;;66196:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;66141:102;65852:3;;65787:471;;;-1:-1:-1;66279:8:0;;65424:882;-1:-1:-1;;;;;;65424:882:0:o;41862:104::-;41918:13;41951:7;41944:14;;;;;:::i;62474:2501::-;62600:16;62666:4;62658:5;:12;62654:44;;;62679:19;;-1:-1:-1;;;62679:19:0;;;;;;;;;;;62654:44;62767:13;;62713:19;;62783:1;62767:17;62870:15;37680:1;;37597:92;62870:15;62862:5;:23;62858:87;;;37680:1;62906:23;;62858:87;63025:9;63018:4;:16;63014:73;;;63062:9;63055:16;;63014:73;63101:25;63129:16;63139:5;63129:9;:16::i;:::-;63101:44;;63323:4;63315:5;:12;63311:278;;;63370:12;;;63405:31;;;63401:111;;;63481:11;63461:31;;63401:111;63329:198;63311:278;;;-1:-1:-1;63572:1:0;63311:278;63603:25;63645:17;-1:-1:-1;;;;;63631:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63631:32:0;;63603:60;;63682:17;63703:1;63682:22;63678:78;;63732:8;-1:-1:-1;63725:15:0;;-1:-1:-1;;;63725:15:0;63678:78;63900:31;63934:26;63954:5;63934:19;:26::i;:::-;63900:60;;63975:25;64220:9;:16;;;64215:92;;-1:-1:-1;64277:14:0;;64215:92;64338:5;64321:477;64350:4;64345:1;:9;;:45;;;;;64373:17;64358:11;:32;;64345:45;64321:477;;;64428:14;;;;:11;:14;;;;;;;;;64416:26;;;;;;;;;-1:-1:-1;;;;;64416:26:0;;;;-1:-1:-1;;;64416:26:0;;-1:-1:-1;;;;;64416:26:0;;;;;;;;-1:-1:-1;;;64416:26:0;;;;;;;;;;;;;;-1:-1:-1;64506:8:0;64461:73;64556:14;;-1:-1:-1;;;;;64556:28:0;;64552:111;;64629:14;;;-1:-1:-1;64552:111:0;64706:5;-1:-1:-1;;;;;64685:26:0;:17;-1:-1:-1;;;;;64685:26:0;;64681:102;;64762:1;64736:8;64745:13;;;;;;64736:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;64681:102;64392:3;;64321:477;;;-1:-1:-1;;;64883:29:0;;;-1:-1:-1;64883:29:0;;62474:2501;-1:-1:-1;;;;;62474:2501:0:o;43496:317::-;-1:-1:-1;;;;;37425:23:0;;;;;;:17;:23;;;;;;43576:8;;37425:23;;37417:63;;;;-1:-1:-1;;;37417:63:0;;;;;;;:::i;:::-;4465:10;-1:-1:-1;;;;;43625:24:0;::::1;::::0;43621:54:::1;;43658:17;;-1:-1:-1::0;;;43658:17:0::1;;;;;;;;;;;43621:54;4465:10:::0;43688:32:::1;::::0;;;:18:::1;:32;::::0;;;;;;;-1:-1:-1;;;;;43688:42:0;::::1;::::0;;;;;;;;;;:53;;-1:-1:-1;;43688:53:0::1;::::0;::::1;;::::0;;::::1;::::0;;;43757:48;;2407:41:1;;;43688:42:0;;4465:10;43757:48:::1;::::0;2380:18:1;43757:48:0::1;;;;;;;43496:317:::0;;;:::o;76543:208::-;5718:13;:11;:13::i;:::-;-1:-1:-1;;;;;76634:23:0;::::1;;::::0;;;:17:::1;:23;::::0;;;;;:33;::::1;;:23;::::0;;::::1;:33;;::::0;76626:74:::1;;;::::0;-1:-1:-1;;;76626:74:0;;21947:2:1;76626:74:0::1;::::0;::::1;21929:21:1::0;21986:2;21966:18;;;21959:30;22025;22005:18;;;21998:58;22073:18;;76626:74:0::1;21745:352:1::0;76626:74:0::1;-1:-1:-1::0;;;;;76711:23:0;;;::::1;;::::0;;;:17:::1;:23;::::0;;;;:32;;-1:-1:-1;;76711:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;76543:208::o;74276:146::-;74384:29;;;-1:-1:-1;;;;;22294:32:1;;74384:29:0;;;22276:51:1;22343:18;;;22336:34;;;74347:7:0;;22249:18:1;;74384:29:0;;;;;;;;;;;;74374:40;;;;;;74367:47;;74276:146;;;;:::o;49175:490::-;49344:19;;;;:10;:19;;;;;;49367:15;-1:-1:-1;49344:38:0;;:66;;-1:-1:-1;49386:19:0;;;;:10;:19;;;;;;:24;49344:66;49336:116;;;;-1:-1:-1;;;49336:116:0;;;;;;;:::i;:::-;49463:28;49473:4;49479:2;49483:7;49463:9;:28::i;:::-;-1:-1:-1;;;;;49506:13:0;;23520:19;:23;;49506:76;;;;;49526:56;49557:4;49563:2;49567:7;49576:5;49526:30;:56::i;:::-;49525:57;49506:76;49502:156;;;49606:40;;-1:-1:-1;;;49606:40:0;;;;;;;;;;;61057:409;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37680:1:0;61204:25;;;:53;;;61244:13;;61233:7;:24;;61204:53;61200:102;;;61281:9;61057:409;-1:-1:-1;;61057:409:0:o;61200:102::-;-1:-1:-1;61324:20:0;;;;:11;:20;;;;;;;;;61312:32;;;;;;;;;-1:-1:-1;;;;;61312:32:0;;;;-1:-1:-1;;;61312:32:0;;-1:-1:-1;;;;;61312:32:0;;;;;;;;-1:-1:-1;;;61312:32:0;;;;;;;;;;;;;;;;61355:65;;61399:9;61057:409;-1:-1:-1;;61057:409:0:o;61355:65::-;61437:21;61450:7;61437:12;:21::i;73665:327::-;73738:13;73768:16;73776:7;73768;:16::i;:::-;73760:62;;;;-1:-1:-1;;;73760:62:0;;22583:2:1;73760:62:0;;;22565:21:1;22622:2;22602:18;;;22595:30;22661:34;22641:18;;;22634:62;-1:-1:-1;;;22712:18:1;;;22705:31;22753:19;;73760:62:0;22381:397:1;73760:62:0;73829:28;73860:10;:8;:10::i;:::-;73829:41;;73915:1;73890:14;73884:28;:32;:100;;;;;;;;;;;;;;;;;73943:14;73959:18;:7;:16;:18::i;:::-;73926:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;73877:107;73665:327;-1:-1:-1;;;73665:327:0:o;74644:452::-;5718:13;:11;:13::i;:::-;74855:90:::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;-1:-1:-1;74893:28:0;;;:13:::1;:28:::0;;;;;;:33:::1;::::0;::::1;::::0;;74855:90;;;;;;;;;;;;74824:28;;;;;;;:121;;;;;;::::1;::::0;::::1;::::0;;;-1:-1:-1;74824:121:0;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;74956:133:::1;74986:7;:14;74978:5;:22;74956:133;;;75073:4;75025:14;:29;75040:13;75025:29;;;;;;;;;;;75055:7;75063:5;75055:14;;;;;;;;:::i;:::-;;;;;;;75025:45;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:52;;;::::1;;-1:-1:-1::0;;75025:52:0;;::::1;::::0;;;::::1;::::0;;75002:7;::::1;::::0;::::1;:::i;:::-;;;;74956:133;;;;74644:452:::0;;;;;;:::o;71920:1034::-;68757:9;68769:12;;;:5;:12;;;;;;:20;;72070:11;;72082:5;;72089:6;;68769:20;;72089:6;;68769:20;:::i;:::-;;;;;;;;;;;;;:25;;;68757:37;;68860:5;:12;68866:5;68860:12;;;;;;;;;;;68873:6;68860:20;;;;;;:::i;:::-;;;;;;;;;;;;;;:26;;;;;68852:69;;;;-1:-1:-1;;;68852:69:0;;;;;;;:::i;:::-;68999:6;;69009:1;68999:11;68991:56;;;;-1:-1:-1;;;68991:56:0;;;;;;;:::i;:::-;69080:1;69066:11;:15;69058:53;;;;-1:-1:-1;;;69058:53:0;;;;;;;:::i;:::-;69145:7;;69130:11;:22;;69122:71;;;;-1:-1:-1;;;69122:71:0;;;;;;;:::i;:::-;69231:12;;;;:5;:12;;;;;;;:20;;;;69244:6;;69231:20;:::i;:::-;;;;;;;;;;;;;;:26;;;69212:15;69216:11;69212:1;:15;:::i;:::-;:45;;69204:97;;;;-1:-1:-1;;;69204:97:0;;;;;;;:::i;:::-;69337:19;;69322:11;:34;;69314:87;;;;-1:-1:-1;;;69314:87:0;;;;;;;:::i;:::-;-1:-1:-1;69412:8:0;72133:12;;;:5:::1;:12;::::0;;;;;:20;;::::1;::::0;72146:6;;72133:20:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:26:::1;;::::0;::::1;;72125:69;;;;-1:-1:-1::0;;;72125:69:0::1;;;;;;;:::i;:::-;72213:29;::::0;;;:14:::1;:29;::::0;;;;;;:37;;::::1;::::0;72243:6;;72213:37:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;72205:67;;;::::0;-1:-1:-1;;;72205:67:0;;23460:2:1;72205:67:0::1;::::0;::::1;23442:21:1::0;23499:2;23479:18;;;23472:30;-1:-1:-1;;;23518:18:1;;;23511:47;23575:18;;72205:67:0::1;23258:341:1::0;72205:67:0::1;72286:6;;72296:1;72286:11:::0;72283:130:::1;;72307:18:::0;;72299:57:::1;;;::::0;-1:-1:-1;;;72299:57:0;;23806:2:1;72299:57:0::1;::::0;::::1;23788:21:1::0;23845:2;23825:18;;;23818:30;23884:28;23864:18;;;23857:56;23930:18;;72299:57:0::1;23604:350:1::0;72299:57:0::1;72283:130;;;72380:13;72397:1;72380:18:::0;72372:41:::1;;;::::0;-1:-1:-1;;;72372:41:0;;24161:2:1;72372:41:0::1;::::0;::::1;24143:21:1::0;24200:2;24180:18;;;24173:30;-1:-1:-1;;;24219:18:1;;;24212:40;24269:18;;72372:41:0::1;23959:334:1::0;72372:41:0::1;72432:60;72447:11;72460:5;;72468:13;72484:7;72432:14;:60::i;:::-;72424:98;;;;-1:-1:-1::0;;;72424:98:0::1;;;;;;;:::i;:::-;72576:26;::::0;;;:11:::1;:26;::::0;;;;;;;72603:10:::1;72576:38:::0;;;;;;;:53;;72618:11;;72576:26;:53:::1;::::0;72618:11;;72576:53:::1;:::i;:::-;::::0;;;-1:-1:-1;;72742:12:0::1;::::0;;;:5:::1;:12;::::0;;;;;;:20;;72729:51:::1;::::0;72742:12;:20:::1;::::0;72755:6;;72742:20:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:25;72768:11;72729:12:::1;:51::i;:::-;72716:9;:64;;72708:111;;;;-1:-1:-1::0;;;72708:111:0::1;;;;;;;:::i;:::-;72884:53;72892:10;72903:11;72916:6;72924:5;72931;72884:7;:53::i;:::-;68746:694:::0;71920:1034;;;;;;;;;;:::o;75612:98::-;5718:13;:11;:13::i;:::-;75681:8:::1;:21:::0;75612:98::o;72996:532::-;73074:11;73087:1;68667:773;;;;;;;;;;;;;-1:-1:-1;;;68667:773:0;;;68757:9;68769:5;:12;68775:5;68769:12;;;;;;;;;;;68782:6;68769:20;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;68757:37;;68860:5;:12;68866:5;68860:12;;;;;;;;;;;68873:6;68860:20;;;;;;:::i;:::-;;;;;;;;;;;;;;:26;;;;;68852:69;;;;-1:-1:-1;;;68852:69:0;;;;;;;:::i;:::-;68999:6;;69009:1;68999:11;68991:56;;;;-1:-1:-1;;;68991:56:0;;;;;;;:::i;:::-;69080:1;69066:11;:15;69058:53;;;;-1:-1:-1;;;69058:53:0;;;;;;;:::i;:::-;69145:7;;69130:11;:22;;69122:71;;;;-1:-1:-1;;;69122:71:0;;;;;;;:::i;:::-;69231:12;;;;:5;:12;;;;;;;:20;;;;69244:6;;69231:20;:::i;:::-;;;;;;;;;;;;;;:26;;;69212:15;69216:11;69212:1;:15;:::i;:::-;:45;;69204:97;;;;-1:-1:-1;;;69204:97:0;;;;;;;:::i;:::-;69337:19;;69322:11;:34;;69314:87;;;;-1:-1:-1;;;69314:87:0;;;;;;;:::i;:::-;-1:-1:-1;73119:31:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;73119:31:0::1;::::0;::::1;::::0;69412:8;;73175:1:::1;73256:43;73271:11:::0;73284:5;;73291:1:::1;73175::::0;73256:14:::1;:43::i;:::-;73248:81;;;;-1:-1:-1::0;;;73248:81:0::1;;;;;;;:::i;:::-;73357:10;73342:14;:26:::0;;;:14;::::1;:26:::0;:14;:26;;:41;;73372:11;;73342:14;:41:::1;::::0;73372:11;;73342:41:::1;:::i;:::-;::::0;;;-1:-1:-1;73458:53:0::1;::::0;-1:-1:-1;73466:10:0::1;73477:11:::0;73490:6;73498:5;73505::::1;73458:7;:53::i;75803:92::-:0;5718:13;:11;:13::i;:::-;75871:6:::1;:16:::0;75803:92::o;6738:201::-;5718:13;:11;:13::i;:::-;-1:-1:-1;;;;;6827:22:0;::::1;6819:73;;;::::0;-1:-1:-1;;;6819:73:0;;24500:2:1;6819:73:0::1;::::0;::::1;24482:21:1::0;24539:2;24519:18;;;24512:30;24578:34;24558:18;;;24551:62;-1:-1:-1;;;24629:18:1;;;24622:36;24675:19;;6819:73:0::1;24298:402:1::0;6819:73:0::1;6903:28;6922:8;6903:18;:28::i;5997:132::-:0;5905:6;;-1:-1:-1;;;;;5905:6:0;4465:10;6061:23;6053:68;;;;-1:-1:-1;;;6053:68:0;;24907:2:1;6053:68:0;;;24889:21:1;;;24926:18;;;24919:30;24985:34;24965:18;;;24958:62;25037:18;;6053:68:0;24705:356:1;44305:174:0;44362:4;44405:7;37680:1;44386:26;;:53;;;;;44426:13;;44416:7;:23;44386:53;:85;;;;-1:-1:-1;;44444:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;44444:27:0;;;;44443:28;;44305:174::o;57076:196::-;57191:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;57191:29:0;-1:-1:-1;;;;;57191:29:0;;;;;;;;;57236:28;;57191:24;;57236:28;;;;;;;57076:196;;;:::o;69805:379::-;69983:13;69998:11;70012:25;70022:2;70025:11;70012:9;:25::i;:::-;69982:55;;;;70075:11;70048:5;:12;70054:5;70048:12;;;;;;;;;;;70061:6;70048:20;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;;70102:74:0;;;;;;70112:2;;70116:6;;70124:5;;70131;;70138:3;;70143:11;;70155:9;;70165:10;;70102:74;:::i;:::-;;;;;;;;69917:267;;69805:379;;;;;:::o;49919:2163::-;50035:10;37425:23;;;;:17;:23;;;;;;;;37417:63;;;;-1:-1:-1;;;37417:63:0;;;;;;;:::i;:::-;50067:35:::1;50105:21;50118:7;50105:12;:21::i;:::-;50067:59;;50165:4;-1:-1:-1::0;;;;;50143:26:0::1;:13;:18;;;-1:-1:-1::0;;;;;50143:26:0::1;;50139:67;;50178:28;;-1:-1:-1::0;;;50178:28:0::1;;;;;;;;;;;50139:67;50219:22;4465:10:::0;-1:-1:-1;;;;;50245:20:0;::::1;;::::0;:73:::1;;-1:-1:-1::0;50282:36:0::1;50299:4:::0;4465:10;43884:164;:::i;50282:36::-:1;50245:126;;;-1:-1:-1::0;4465:10:0;50335:20:::1;50347:7:::0;50335:11:::1;:20::i;:::-;-1:-1:-1::0;;;;;50335:36:0::1;;50245:126;50219:153;;50390:17;50385:66;;50416:35;;-1:-1:-1::0;;;50416:35:0::1;;;;;;;;;;;50385:66;-1:-1:-1::0;;;;;50466:16:0;::::1;50462:52;;50491:23;;-1:-1:-1::0;;;50491:23:0::1;;;;;;;;;;;50462:52;50635:35;50652:1;50656:7;50665:4;50635:8;:35::i;:::-;-1:-1:-1::0;;;;;50966:18:0;;::::1;;::::0;;;:12:::1;:18;::::0;;;;;;;:31;;-1:-1:-1;;50966:31:0;;::::1;-1:-1:-1::0;;;;;50966:31:0;;::::1;-1:-1:-1::0;;50966:31:0;;::::1;;::::0;;;51012:16;;::::1;::::0;;;;;;:29;;;;::::1;::::0;;::::1;-1:-1:-1::0;51012:29:0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;51092:20;;;:11:::1;:20:::0;;;;;;51127:18;;-1:-1:-1;;;;;;51160:49:0;;;;-1:-1:-1;;;51193:15:0::1;51160:49:::0;;::::1;::::0;;;::::1;;::::0;;51483:11;::::1;51543:24:::0;;;;;51586:13;;51092:20;;51543:24;;51586:13:::1;51582:384;;51796:13;;51781:11;:28;51777:174;;51834:20:::0;;51903:28:::1;::::0;::::1;::::0;-1:-1:-1;;;;;51877:54:0::1;-1:-1:-1::0;;;51877:54:0::1;-1:-1:-1::0;;;;;;51877:54:0;;;-1:-1:-1;;;;;51834:20:0;::::1;51877:54:::0;::::1;::::0;;51777:174:::1;50941:1036;;;52013:7;52009:2;-1:-1:-1::0;;;;;51994:27:0::1;52003:4;-1:-1:-1::0;;;;;51994:27:0::1;;;;;;;;;;;50056:2026;;49919:2163:::0;;;;:::o;10911:98::-;10969:7;10996:5;11000:1;10996;:5;:::i;11310:98::-;11368:7;11395:5;11399:1;11395;:5;:::i;10554:98::-;10612:7;10639:5;10643:1;10639;:5;:::i;71120:757::-;71260:4;2759:1;3357:7;;:19;3349:63;;;;-1:-1:-1;;;3349:63:0;;26612:2:1;3349:63:0;;;26594:21:1;26651:2;26631:18;;;26624:30;26690:33;26670:18;;;26663:61;26741:18;;3349:63:0;26410:355:1;3349:63:0;2759:1;3490:7;:18;71284:28:::1;::::0;;;:13:::1;:28;::::0;;;;:38;71326:15:::1;-1:-1:-1::0;71284:57:0::1;71276:88;;;::::0;-1:-1:-1;;;71276:88:0;;26972:2:1;71276:88:0::1;::::0;::::1;26954:21:1::0;27011:2;26991:18;;;26984:30;-1:-1:-1;;;27030:18:1;;;27023:48;27088:18;;71276:88:0::1;26770:342:1::0;71276:88:0::1;71383:28;::::0;;;:13:::1;:28;::::0;;;;:36:::1;;::::0;71423:15:::1;-1:-1:-1::0;71383:55:0::1;71375:88;;;::::0;-1:-1:-1;;;71375:88:0;;27319:2:1;71375:88:0::1;::::0;::::1;27301:21:1::0;27358:2;27338:18;;;27331:30;-1:-1:-1;;;27377:18:1;;;27370:50;27437:18;;71375:88:0::1;27117:344:1::0;71375:88:0::1;71615:20;71638:7;:67;;71704:1;71638:67;;;71649:26;::::0;;;:11:::1;:26;::::0;;;;;;;71676:10:::1;71649:38:::0;;;;;;;;:52:::1;::::0;71690:11;;71649:52:::1;:::i;:::-;71615:90;;71763:11;71726:13;:28;71740:13;71726:28;;;;;;;;;;;:33;;;:48;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;71792:6:0::1;::::0;71802:1:::1;71792:11;;::::0;:77:::1;;;71807:62;71821:10;71833:5;;71841:12;71855:13;71807;:62::i;:::-;2715:1:::0;3669:7;:22;71785:84;71120:757;-1:-1:-1;;;;;;;71120:757:0:o;40330:1109::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;40441:7:0;;37680:1;40490:23;;:47;;;;;40524:13;;40517:4;:20;40490:47;40486:886;;;40558:31;40592:17;;;:11;:17;;;;;;;;;40558:51;;;;;;;;;-1:-1:-1;;;;;40558:51:0;;;;-1:-1:-1;;;40558:51:0;;-1:-1:-1;;;;;40558:51:0;;;;;;;;-1:-1:-1;;;40558:51:0;;;;;;;;;;;;;;40628:729;;40678:14;;-1:-1:-1;;;;;40678:28:0;;40674:101;;40742:9;40330:1109;-1:-1:-1;;;40330:1109:0:o;40674:101::-;-1:-1:-1;;;41117:6:0;41162:17;;;;:11;:17;;;;;;;;;41150:29;;;;;;;;;-1:-1:-1;;;;;41150:29:0;;;;;-1:-1:-1;;;41150:29:0;;-1:-1:-1;;;;;41150:29:0;;;;;;;;-1:-1:-1;;;41150:29:0;;;;;;;;;;;;;41210:28;41206:109;;41278:9;40330:1109;-1:-1:-1;;;40330:1109:0:o;41206:109::-;41077:261;;;40539:833;40486:886;41400:31;;-1:-1:-1;;;41400:31:0;;;;;;;;;;;7099:191;7192:6;;;-1:-1:-1;;;;;7209:17:0;;;-1:-1:-1;;;;;;7209:17:0;;;;;;;7242:40;;7192:6;;;7209:17;7192:6;;7242:40;;7173:16;;7242:40;7162:128;7099:191;:::o;74428:159::-;74518:4;74542:37;74561:5;74568:4;74574;74542:18;:37::i;:::-;74535:44;74428:159;-1:-1:-1;;;;74428:159:0:o;57764:668::-;57949:72;;-1:-1:-1;;;57949:72:0;;57928:4;;-1:-1:-1;;;;;57949:36:0;;;;;:72;;4465:10;;58000:4;;58006:7;;58015:5;;57949:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57949:72:0;;;;;;;;-1:-1:-1;;57949:72:0;;;;;;;;;;;;:::i;:::-;;;57945:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58183:6;:13;58200:1;58183:18;58179:235;;58229:40;;-1:-1:-1;;;58229:40:0;;;;;;;;;;;58179:235;58372:6;58366:13;58357:6;58353:2;58349:15;58342:38;57945:480;-1:-1:-1;;;;;;58068:55:0;-1:-1:-1;;;58068:55:0;;-1:-1:-1;57764:668:0;;;;;;:::o;73555:104::-;73615:13;73644:7;73637:14;;;;;:::i;30975:723::-;31031:13;31252:5;31261:1;31252:10;31248:53;;-1:-1:-1;;31279:10:0;;;;;;;;;;;;-1:-1:-1;;;31279:10:0;;;;;30975:723::o;31248:53::-;31326:5;31311:12;31367:78;31374:9;;31367:78;;31400:8;;;;:::i;:::-;;-1:-1:-1;31423:10:0;;-1:-1:-1;31431:2:0;31423:10;;:::i;:::-;;;31367:78;;;31455:19;31487:6;-1:-1:-1;;;;;31477:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31477:17:0;;31455:39;;31505:154;31512:10;;31505:154;;31539:11;31549:1;31539:11;;:::i;:::-;;-1:-1:-1;31608:10:0;31616:2;31608:5;:10;:::i;:::-;31595:24;;:2;:24;:::i;:::-;31582:39;;31565:6;31572;31565:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;31565:56:0;;;;;;;;-1:-1:-1;31636:11:0;31645:2;31636:11;;:::i;:::-;;;31505:154;;44563:136;44629:7;44638;44664:27;44674:2;44678:8;44664:27;;;;;;;;;;;;:9;:27::i;:::-;44657:34;;;;44563:136;;;;;;:::o;66416:190::-;66541:4;66594;66565:25;66578:5;66585:4;66565:12;:25::i;:::-;:33;;66416:190;-1:-1:-1;;;;66416:190:0:o;45073:1906::-;45245:13;;45193:7;;;;-1:-1:-1;;;;;45273:16:0;;45269:48;;45298:19;;-1:-1:-1;;;45298:19:0;;;;;;;;;;;45269:48;45332:8;45344:1;45332:13;45328:44;;45354:18;;-1:-1:-1;;;45354:18:0;;;;;;;;;;;45328:44;-1:-1:-1;;;;;45723:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;45782:49:0;;-1:-1:-1;;;;;45723:44:0;;;;;;;45782:49;;;;-1:-1:-1;;45723:44:0;;;;;;45782:49;;;;;;;;;;;;;;;;45848:25;;;45782:29;45848:25;;;;;;:35;;-1:-1:-1;;;;;;45898:66:0;;;-1:-1:-1;;;45948:15:0;45898:66;;;;;;;;;;;;;45848:25;;46045:23;;;;23520:19;:23;46085:715;;46125:314;46156:38;;46181:12;;-1:-1:-1;;;;;46156:38:0;;;46173:1;;46156:38;;46173:1;;46156:38;46222:69;46261:1;46265:2;46269:14;;;;;;46285:5;46222:30;:69::i;:::-;46217:174;;46327:40;;-1:-1:-1;;;46327:40:0;;;;;;;;;;;46217:174;46434:3;46418:12;:19;46125:314;;46520:12;46503:13;;:29;46499:43;;46534:8;;;46499:43;46085:715;;;46583:202;46696:40;;46721:14;;;;;-1:-1:-1;;;;;46696:40:0;;;46713:1;;46696:40;;46713:1;;46696:40;46780:3;46764:12;:19;46583:202;;46085:715;-1:-1:-1;46814:13:0;:28;46942:12;46969:1;46955:13;;:15;;;;:::i;:::-;46935:36;;;;;45073:1906;;;;;;:::o;66614:675::-;66697:7;66740:4;66697:7;66755:497;66779:5;:12;66775:1;:16;66755:497;;;66813:20;66836:5;66842:1;66836:8;;;;;;;;:::i;:::-;;;;;;;66813:31;;66879:12;66863;:28;66859:382;;67365:13;67415:15;;;67451:4;67444:15;;;67498:4;67482:21;;66991:57;;66859:382;;;67365:13;67415:15;;;67451:4;67444:15;;;67498:4;67482:21;;67168:57;;66859:382;-1:-1:-1;66793:3:0;;;;:::i;:::-;;;;66755:497;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:127:1;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:275;217:2;211:9;282:2;263:13;;-1:-1:-1;;259:27:1;247:40;;-1:-1:-1;;;;;302:34:1;;338:22;;;299:62;296:88;;;364:18;;:::i;:::-;400:2;393:22;146:275;;-1:-1:-1;146:275:1:o;426:183::-;486:4;-1:-1:-1;;;;;511:6:1;508:30;505:56;;;541:18;;:::i;:::-;-1:-1:-1;586:1:1;582:14;598:4;578:25;;426:183::o;614:662::-;668:5;721:3;714:4;706:6;702:17;698:27;688:55;;739:1;736;729:12;688:55;775:6;762:20;801:4;825:60;841:43;881:2;841:43;:::i;:::-;825:60;:::i;:::-;919:15;;;1005:1;1001:10;;;;989:23;;985:32;;;950:12;;;;1029:15;;;1026:35;;;1057:1;1054;1047:12;1026:35;1093:2;1085:6;1081:15;1105:142;1121:6;1116:3;1113:15;1105:142;;;1187:17;;1175:30;;1225:12;;;;1138;;1105:142;;;-1:-1:-1;1265:5:1;614:662;-1:-1:-1;;;;;;614:662:1:o;1281:595::-;1399:6;1407;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;1516:9;1503:23;-1:-1:-1;;;;;1586:2:1;1578:6;1575:14;1572:34;;;1602:1;1599;1592:12;1572:34;1625:61;1678:7;1669:6;1658:9;1654:22;1625:61;:::i;:::-;1615:71;;1739:2;1728:9;1724:18;1711:32;1695:48;;1768:2;1758:8;1755:16;1752:36;;;1784:1;1781;1774:12;1752:36;;1807:63;1862:7;1851:8;1840:9;1836:24;1807:63;:::i;:::-;1797:73;;;1281:595;;;;;:::o;1881:131::-;-1:-1:-1;;;;;;1955:32:1;;1945:43;;1935:71;;2002:1;1999;1992:12;2017:245;2075:6;2128:2;2116:9;2107:7;2103:23;2099:32;2096:52;;;2144:1;2141;2134:12;2096:52;2183:9;2170:23;2202:30;2226:5;2202:30;:::i;2459:258::-;2531:1;2541:113;2555:6;2552:1;2549:13;2541:113;;;2631:11;;;2625:18;2612:11;;;2605:39;2577:2;2570:10;2541:113;;;2672:6;2669:1;2666:13;2663:48;;;-1:-1:-1;;2707:1:1;2689:16;;2682:27;2459:258::o;2722:::-;2764:3;2802:5;2796:12;2829:6;2824:3;2817:19;2845:63;2901:6;2894:4;2889:3;2885:14;2878:4;2871:5;2867:16;2845:63;:::i;:::-;2962:2;2941:15;-1:-1:-1;;2937:29:1;2928:39;;;;2969:4;2924:50;;2722:258;-1:-1:-1;;2722:258:1:o;2985:220::-;3134:2;3123:9;3116:21;3097:4;3154:45;3195:2;3184:9;3180:18;3172:6;3154:45;:::i;3210:180::-;3269:6;3322:2;3310:9;3301:7;3297:23;3293:32;3290:52;;;3338:1;3335;3328:12;3290:52;-1:-1:-1;3361:23:1;;3210:180;-1:-1:-1;3210:180:1:o;3603:173::-;3671:20;;-1:-1:-1;;;;;3720:31:1;;3710:42;;3700:70;;3766:1;3763;3756:12;3700:70;3603:173;;;:::o;3781:254::-;3849:6;3857;3910:2;3898:9;3889:7;3885:23;3881:32;3878:52;;;3926:1;3923;3916:12;3878:52;3962:9;3949:23;3939:33;;3991:38;4025:2;4014:9;4010:18;3991:38;:::i;:::-;3981:48;;3781:254;;;;;:::o;4222:::-;4290:6;4298;4351:2;4339:9;4330:7;4326:23;4322:32;4319:52;;;4367:1;4364;4357:12;4319:52;4390:29;4409:9;4390:29;:::i;:::-;4380:39;4466:2;4451:18;;;;4438:32;;-1:-1:-1;;;4222:254:1:o;4481:407::-;4546:5;-1:-1:-1;;;;;4572:6:1;4569:30;4566:56;;;4602:18;;:::i;:::-;4640:57;4685:2;4664:15;;-1:-1:-1;;4660:29:1;4691:4;4656:40;4640:57;:::i;:::-;4631:66;;4720:6;4713:5;4706:21;4760:3;4751:6;4746:3;4742:16;4739:25;4736:45;;;4777:1;4774;4767:12;4736:45;4826:6;4821:3;4814:4;4807:5;4803:16;4790:43;4880:1;4873:4;4864:6;4857:5;4853:18;4849:29;4842:40;4481:407;;;;;:::o;4893:222::-;4936:5;4989:3;4982:4;4974:6;4970:17;4966:27;4956:55;;5007:1;5004;4997:12;4956:55;5029:80;5105:3;5096:6;5083:20;5076:4;5068:6;5064:17;5029:80;:::i;5120:533::-;5216:6;5224;5232;5240;5293:3;5281:9;5272:7;5268:23;5264:33;5261:53;;;5310:1;5307;5300:12;5261:53;5333:29;5352:9;5333:29;:::i;:::-;5323:39;;5409:2;5398:9;5394:18;5381:32;5371:42;;5460:2;5449:9;5445:18;5432:32;5422:42;;5515:2;5504:9;5500:18;5487:32;-1:-1:-1;;;;;5534:6:1;5531:30;5528:50;;;5574:1;5571;5564:12;5528:50;5597;5639:7;5630:6;5619:9;5615:22;5597:50;:::i;:::-;5587:60;;;5120:533;;;;;;;:::o;5658:328::-;5735:6;5743;5751;5804:2;5792:9;5783:7;5779:23;5775:32;5772:52;;;5820:1;5817;5810:12;5772:52;5843:29;5862:9;5843:29;:::i;:::-;5833:39;;5891:38;5925:2;5914:9;5910:18;5891:38;:::i;:::-;5881:48;;5976:2;5965:9;5961:18;5948:32;5938:42;;5658:328;;;;;:::o;5991:390::-;6069:6;6077;6130:2;6118:9;6109:7;6105:23;6101:32;6098:52;;;6146:1;6143;6136:12;6098:52;6182:9;6169:23;6159:33;;6243:2;6232:9;6228:18;6215:32;-1:-1:-1;;;;;6262:6:1;6259:30;6256:50;;;6302:1;6299;6292:12;6256:50;6325;6367:7;6358:6;6347:9;6343:22;6325:50;:::i;7077:527::-;7173:6;7181;7189;7197;7250:3;7238:9;7229:7;7225:23;7221:33;7218:53;;;7267:1;7264;7257:12;7218:53;7303:9;7290:23;7280:33;;7360:2;7349:9;7345:18;7332:32;7322:42;;7411:2;7400:9;7396:18;7383:32;7373:42;;7466:2;7455:9;7451:18;7438:32;-1:-1:-1;;;;;7485:6:1;7482:30;7479:50;;;7525:1;7522;7515:12;7609:367;7672:8;7682:6;7736:3;7729:4;7721:6;7717:17;7713:27;7703:55;;7754:1;7751;7744:12;7703:55;-1:-1:-1;7777:20:1;;-1:-1:-1;;;;;7809:30:1;;7806:50;;;7852:1;7849;7842:12;7806:50;7889:4;7881:6;7877:17;7865:29;;7949:3;7942:4;7932:6;7929:1;7925:14;7917:6;7913:27;7909:38;7906:47;7903:67;;;7966:1;7963;7956:12;7981:505;8076:6;8084;8092;8145:2;8133:9;8124:7;8120:23;8116:32;8113:52;;;8161:1;8158;8151:12;8113:52;8197:9;8184:23;8174:33;;8258:2;8247:9;8243:18;8230:32;-1:-1:-1;;;;;8277:6:1;8274:30;8271:50;;;8317:1;8314;8307:12;8271:50;8356:70;8418:7;8409:6;8398:9;8394:22;8356:70;:::i;:::-;7981:505;;8445:8;;-1:-1:-1;8330:96:1;;-1:-1:-1;;;;7981:505:1:o;8491:322::-;8560:6;8613:2;8601:9;8592:7;8588:23;8584:32;8581:52;;;8629:1;8626;8619:12;8581:52;8669:9;8656:23;-1:-1:-1;;;;;8694:6:1;8691:30;8688:50;;;8734:1;8731;8724:12;8688:50;8757;8799:7;8790:6;8779:9;8775:22;8757:50;:::i;8818:348::-;8902:6;8955:2;8943:9;8934:7;8930:23;8926:32;8923:52;;;8971:1;8968;8961:12;8923:52;9011:9;8998:23;-1:-1:-1;;;;;9036:6:1;9033:30;9030:50;;;9076:1;9073;9066:12;9030:50;9099:61;9152:7;9143:6;9132:9;9128:22;9099:61;:::i;9454:724::-;9689:2;9741:21;;;9811:13;;9714:18;;;9833:22;;;9660:4;;9689:2;9912:15;;;;9886:2;9871:18;;;9660:4;9955:197;9969:6;9966:1;9963:13;9955:197;;;10018:52;10066:3;10057:6;10051:13;9255:12;;-1:-1:-1;;;;;9251:38:1;9239:51;;9343:4;9332:16;;;9326:23;-1:-1:-1;;;;;9322:48:1;9306:14;;;9299:72;9434:4;9423:16;;;9417:23;9410:31;9403:39;9387:14;;9380:63;9171:278;10018:52;10127:15;;;;10099:4;10090:14;;;;;9991:1;9984:9;9955:197;;10183:186;10242:6;10295:2;10283:9;10274:7;10270:23;10266:32;10263:52;;;10311:1;10308;10301:12;10263:52;10334:29;10353:9;10334:29;:::i;10374:648::-;10487:6;10495;10503;10511;10519;10572:3;10560:9;10551:7;10547:23;10543:33;10540:53;;;10589:1;10586;10579:12;10540:53;10612:29;10631:9;10612:29;:::i;:::-;10602:39;;10692:2;10681:9;10677:18;10664:32;-1:-1:-1;;;;;10711:6:1;10708:30;10705:50;;;10751:1;10748;10741:12;10705:50;10790:70;10852:7;10843:6;10832:9;10828:22;10790:70;:::i;:::-;10374:648;;10879:8;;-1:-1:-1;10764:96:1;;10961:2;10946:18;;10933:32;;11012:2;10997:18;;;10984:32;;-1:-1:-1;10374:648:1;-1:-1:-1;;;;10374:648:1:o;11027:632::-;11198:2;11250:21;;;11320:13;;11223:18;;;11342:22;;;11169:4;;11198:2;11421:15;;;;11395:2;11380:18;;;11169:4;11464:169;11478:6;11475:1;11472:13;11464:169;;;11539:13;;11527:26;;11608:15;;;;11573:12;;;;11500:1;11493:9;11464:169;;12070:322;12147:6;12155;12163;12216:2;12204:9;12195:7;12191:23;12187:32;12184:52;;;12232:1;12229;12222:12;12184:52;12255:29;12274:9;12255:29;:::i;:::-;12245:39;12331:2;12316:18;;12303:32;;-1:-1:-1;12382:2:1;12367:18;;;12354:32;;12070:322;-1:-1:-1;;;12070:322:1:o;12397:160::-;12462:20;;12518:13;;12511:21;12501:32;;12491:60;;12547:1;12544;12537:12;12562:254;12627:6;12635;12688:2;12676:9;12667:7;12663:23;12659:32;12656:52;;;12704:1;12701;12694:12;12656:52;12727:29;12746:9;12727:29;:::i;:::-;12717:39;;12775:35;12806:2;12795:9;12791:18;12775:35;:::i;13003:667::-;13098:6;13106;13114;13122;13175:3;13163:9;13154:7;13150:23;13146:33;13143:53;;;13192:1;13189;13182:12;13143:53;13215:29;13234:9;13215:29;:::i;:::-;13205:39;;13263:38;13297:2;13286:9;13282:18;13263:38;:::i;:::-;13253:48;;13348:2;13337:9;13333:18;13320:32;13310:42;;13403:2;13392:9;13388:18;13375:32;-1:-1:-1;;;;;13422:6:1;13419:30;13416:50;;;13462:1;13459;13452:12;13416:50;13485:22;;13538:4;13530:13;;13526:27;-1:-1:-1;13516:55:1;;13567:1;13564;13557:12;13516:55;13590:74;13656:7;13651:2;13638:16;13633:2;13629;13625:11;13590:74;:::i;13675:267::-;9255:12;;-1:-1:-1;;;;;9251:38:1;9239:51;;9343:4;9332:16;;;9326:23;-1:-1:-1;;;;;9322:48:1;9306:14;;;9299:72;9434:4;9423:16;;;9417:23;9410:31;9403:39;9387:14;;;9380:63;13873:2;13858:18;;13885:51;9171:278;13947:1369;14086:6;14094;14102;14110;14118;14126;14179:3;14167:9;14158:7;14154:23;14150:33;14147:53;;;14196:1;14193;14186:12;14147:53;14232:9;14219:23;14209:33;;14261:2;14310;14299:9;14295:18;14282:32;14272:42;;14361:2;14350:9;14346:18;14333:32;14323:42;;14412:2;14401:9;14397:18;14384:32;14374:42;;14463:3;14452:9;14448:19;14435:33;14425:43;;14519:3;14508:9;14504:19;14491:33;-1:-1:-1;;;;;14584:2:1;14576:6;14573:14;14570:34;;;14600:1;14597;14590:12;14570:34;14638:6;14627:9;14623:22;14613:32;;14683:7;14676:4;14672:2;14668:13;14664:27;14654:55;;14705:1;14702;14695:12;14654:55;14741:2;14728:16;14764:60;14780:43;14820:2;14780:43;:::i;14764:60::-;14858:15;;;14940:1;14936:10;;;;14928:19;;14924:28;;;14889:12;;;;14964:19;;;14961:39;;;14996:1;14993;14986:12;14961:39;15028:2;15024;15020:11;15040:246;15056:6;15051:3;15048:15;15040:246;;;15135:2;15129:3;15116:17;15113:25;15110:45;;;15151:1;15148;15141:12;15110:45;15180:63;15235:7;15230:2;15223:3;15210:17;15206:2;15202:26;15198:35;15180:63;:::i;:::-;15168:76;;15264:12;;;;15073;;15040:246;;;15044:3;15305:5;15295:15;;;;;;;;13947:1369;;;;;;;;:::o;15321:933::-;15459:6;15467;15475;15483;15491;15499;15507;15560:3;15548:9;15539:7;15535:23;15531:33;15528:53;;;15577:1;15574;15567:12;15528:53;15617:9;15604:23;-1:-1:-1;;;;;15687:2:1;15679:6;15676:14;15673:34;;;15703:1;15700;15693:12;15673:34;15726:50;15768:7;15759:6;15748:9;15744:22;15726:50;:::i;:::-;15716:60;;15823:2;15812:9;15808:18;15795:32;15785:42;;15874:2;15863:9;15859:18;15846:32;15836:42;;15931:2;15920:9;15916:18;15903:32;15887:48;;15960:2;15950:8;15947:16;15944:36;;;15976:1;15973;15966:12;15944:36;;16015:72;16079:7;16068:8;16057:9;16053:24;16015:72;:::i;:::-;16106:8;;-1:-1:-1;15989:98:1;-1:-1:-1;16160:36:1;;-1:-1:-1;16191:3:1;16176:19;;16160:36;:::i;:::-;16150:46;;16243:3;16232:9;16228:19;16215:33;16205:43;;15321:933;;;;;;;;;;:::o;16259:260::-;16327:6;16335;16388:2;16376:9;16367:7;16363:23;16359:32;16356:52;;;16404:1;16401;16394:12;16356:52;16427:29;16446:9;16427:29;:::i;:::-;16417:39;;16475:38;16509:2;16498:9;16494:18;16475:38;:::i;16524:127::-;16585:10;16580:3;16576:20;16573:1;16566:31;16616:4;16613:1;16606:15;16640:4;16637:1;16630:15;16656:127;16717:10;16712:3;16708:20;16705:1;16698:31;16748:4;16745:1;16738:15;16772:4;16769:1;16762:15;16788:135;16827:3;16848:17;;;16845:43;;16868:18;;:::i;:::-;-1:-1:-1;16915:1:1;16904:13;;16788:135::o;16928:380::-;17007:1;17003:12;;;;17050;;;17071:61;;17125:4;17117:6;17113:17;17103:27;;17071:61;17178:2;17170:6;17167:14;17147:18;17144:38;17141:161;;17224:10;17219:3;17215:20;17212:1;17205:31;17259:4;17256:1;17249:15;17287:4;17284:1;17277:15;17141:161;;16928:380;;;:::o;17313:352::-;17515:2;17497:21;;;17554:2;17534:18;;;17527:30;17593;17588:2;17573:18;;17566:58;17656:2;17641:18;;17313:352::o;17670:276::-;17801:3;17839:6;17833:13;17855:53;17901:6;17896:3;17889:4;17881:6;17877:17;17855:53;:::i;:::-;17924:16;;;;;17670:276;-1:-1:-1;;17670:276:1:o;17951:353::-;18153:2;18135:21;;;18192:2;18172:18;;;18165:30;18231:31;18226:2;18211:18;;18204:59;18295:2;18280:18;;17951:353::o;18309:355::-;18511:2;18493:21;;;18550:2;18530:18;;;18523:30;18589:33;18584:2;18569:18;;18562:61;18655:2;18640:18;;18309:355::o;18669:348::-;18871:2;18853:21;;;18910:2;18890:18;;;18883:30;18949:26;18944:2;18929:18;;18922:54;19008:2;18993:18;;18669:348::o;19022:399::-;19224:2;19206:21;;;19263:2;19243:18;;;19236:30;19302:34;19297:2;19282:18;;19275:62;-1:-1:-1;;;19368:2:1;19353:18;;19346:33;19411:3;19396:19;;19022:399::o;19426:128::-;19466:3;19497:1;19493:6;19490:1;19487:13;19484:39;;;19503:18;;:::i;:::-;-1:-1:-1;19539:9:1;;19426:128::o;19559:402::-;19761:2;19743:21;;;19800:2;19780:18;;;19773:30;19839:34;19834:2;19819:18;;19812:62;-1:-1:-1;;;19905:2:1;19890:18;;19883:36;19951:3;19936:19;;19559:402::o;19966:::-;20168:2;20150:21;;;20207:2;20187:18;;;20180:30;20246:34;20241:2;20226:18;;20219:62;-1:-1:-1;;;20312:2:1;20297:18;;20290:36;20358:3;20343:19;;19966:402::o;20373:400::-;20575:2;20557:21;;;20614:2;20594:18;;;20587:30;20653:34;20648:2;20633:18;;20626:62;-1:-1:-1;;;20719:2:1;20704:18;;20697:34;20763:3;20748:19;;20373:400::o;20988:349::-;21190:2;21172:21;;;21229:2;21209:18;;;21202:30;21268:27;21263:2;21248:18;;21241:55;21328:2;21313:18;;20988:349::o;21342:398::-;21544:2;21526:21;;;21583:2;21563:18;;;21556:30;21622:34;21617:2;21602:18;;21595:62;-1:-1:-1;;;21688:2:1;21673:18;;21666:32;21730:3;21715:19;;21342:398::o;22783:470::-;22962:3;23000:6;22994:13;23016:53;23062:6;23057:3;23050:4;23042:6;23038:17;23016:53;:::i;:::-;23132:13;;23091:16;;;;23154:57;23132:13;23091:16;23188:4;23176:17;;23154:57;:::i;:::-;23227:20;;22783:470;-1:-1:-1;;;;22783:470:1:o;25066:779::-;-1:-1:-1;;;;;25427:32:1;;25409:51;;25397:3;25491:2;25476:18;;25469:30;;;25368:4;;25516:45;25542:18;;;25534:6;25516:45;:::i;:::-;25592:2;25577:18;;25570:34;;;;-1:-1:-1;;25635:2:1;25620:18;;25613:34;;;;25678:3;25663:19;;25656:35;;;;25722:3;25707:19;;25700:35;;;;25766:3;25751:19;;25744:35;25823:14;25816:22;25810:3;25795:19;;;25788:51;25508:53;25066:779;-1:-1:-1;;25066:779:1:o;25850:168::-;25890:7;25956:1;25952;25948:6;25944:14;25941:1;25938:21;25933:1;25926:9;25919:17;25915:45;25912:71;;;25963:18;;:::i;:::-;-1:-1:-1;26003:9:1;;25850:168::o;26023:127::-;26084:10;26079:3;26075:20;26072:1;26065:31;26115:4;26112:1;26105:15;26139:4;26136:1;26129:15;26155:120;26195:1;26221;26211:35;;26226:18;;:::i;:::-;-1:-1:-1;26260:9:1;;26155:120::o;26280:125::-;26320:4;26348:1;26345;26342:8;26339:34;;;26353:18;;:::i;:::-;-1:-1:-1;26390:9:1;;26280:125::o;27466:489::-;-1:-1:-1;;;;;27735:15:1;;;27717:34;;27787:15;;27782:2;27767:18;;27760:43;27834:2;27819:18;;27812:34;;;27882:3;27877:2;27862:18;;27855:31;;;27660:4;;27903:46;;27929:19;;27921:6;27903:46;:::i;27960:249::-;28029:6;28082:2;28070:9;28061:7;28057:23;28053:32;28050:52;;;28098:1;28095;28088:12;28050:52;28130:9;28124:16;28149:30;28173:5;28149:30;:::i;28214:112::-;28246:1;28272;28262:35;;28277:18;;:::i;:::-;-1:-1:-1;28311:9:1;;28214:112::o
Swarm Source
ipfs://bb0f1a3a6bf49701a3876cb96b3b9870b983f7661797a01709664176deff12bb
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.