ETH Price: $3,078.13 (+3.95%)
Gas: 9.57 Gwei

Token

Aiko Virtual (AIKO)
 

Overview

Max Total Supply

8,888 AIKO

Holders

2,761

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
0 AIKO
0x6cb0bc14d3f513301a83cd00f9f1501b824fa514
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Aiko Virtual is a collection of 8.888 NFTs that are all about "Cyber Cute", an aesthetic that blends future tech with anime vibes to create a unique look with broad appeal and an even broader vision.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
AikoVirtual

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-25
*/

// .......................***********************************,.....................
// .....................,*////////////////////////////////////,.............**,*/*.
// ...................*/////********************************////*...........,,***,.
// ................,/////*...................................,/////,.......,/****,.
// ..............*/////........................................./////*.............
// ...........,*////*.............................................*/////,..........
// .........*////*,...........,/////////////////////////,............*////*........
// ......,*////*............*////////////*****////////////*............,/////,.....
// ....*/////............,///////////*...........,///////////,............/////*...
// ..,////*............*///////////*...............,///////////*............*////*.
// ..,///,..........,/////////////,.................,/////////////,..........,///*.
// ..,///,........,//////////////..........,..........//////////////*........,///*.
// ..,///,........,////////////*..........*//..........*////////////*........,///*.
// ..,///,........,///////////*........../////,.........,///////////*........,///*.
// ..,///,........,//////////,.........,///////*..........//////////*........,///*.
// ..,///,........,/////////..........*/////////*..........*////////*........,///*.
// ..,///,........,///////*..........//,.......,//..........*///////*........,///*.
// ..,///,........,//////,.........,//...........*/*.........,///////////////////*.
// ..,///,........................*//,...........,//*........................,///*.
// ..,///,.......................*////...........*////.......................,///*.
// ..,///,.....................,///////*,.....,*///////,.....................,///*.
// ..,///,....................,/////////////////////////*....................,///*.
// ..,///*...........,*//////////////////////////////////////////,...........,///*.
// ...*////*............*/////////////////////////////////////*............*////*,.
// .....,/////,...........,*///////////////////////////////*,...........,*////*....
// ........*////*............*///////////////////////////*............*////*,......
// ..........*/////,................................................/////*.........
// .............*////*...........................................*////*,...........
// ...............,/////,.....................................,*////*..............
// ..................*////*.................................*////*,................
// ....................*///////////////////////////////////////*...................
// .......................***********************************,.....................
// 
// Made with love by uwulabs for Aiko Virtual <3

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File src/contracts/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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


// File src/contracts/utils/Strings.sol

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}


// File src/contracts/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 src/contracts/tokens/IERC721.sol

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}


// File src/contracts/tokens/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 src/contracts/tokens/IERC721Receiver.sol

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


// File src/contracts/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 src/contracts/tokens/ERC721Holder.sol

pragma solidity ^0.8.0;

/**
 * @dev Implementation of the {IERC721Receiver} interface.
 *
 * Accepts all token transfers.
 * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}.
 */
contract ERC721Holder is IERC721Receiver {
    /**
     * @dev See {IERC721Receiver-onERC721Received}.
     *
     * Always returns `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address,
        address,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC721Received.selector;
    }
}


// File src/contracts/tokens/IERC721A.sol

pragma solidity ^0.8.0;


/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A is IERC721, IERC721Metadata {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     * 
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);
}


// File src/contracts/tokens/ERC721A.sol

// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.0;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721A {
    using Address for address;
    using Strings for uint256;

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(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) 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) public virtual override {
        if (operator == _msgSender()) revert ApproveToCaller();

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, "");
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try 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 {}
}


// File src/contracts/utils/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() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


// File src/contracts/utils/MerkleProof.sol

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        bytes32 computedHash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}

// File src/contracts/AikoVirtual.sol

pragma solidity ^0.8.0;

contract AikoVirtual is Ownable, ERC721A {
	struct AccountInfo {
		uint64 freeMinted;
		uint64 purchasedFirst;
		uint64 purchasedSecond;
		uint64 purchasedPublic;
	}

	uint256 public immutable MAX_SUPPLY;
	uint256 public constant FIRST_SALE_MAX = 3333;
	uint256 public constant WALLET_MAX = 6;

	uint256 public constant FIRST_ORB_PRICE = 0.05 ether;
	uint256 public constant SECOND_ORB_PRICE = 0.075 ether;
	uint256 public constant PUBLIC_PRICE = 0.1 ether;

	uint256 public constant FREE_MAX = 6;
	uint256 public constant FIRST_ORB_MAX = 6;
	uint256 public constant SECOND_ORB_MAX = 6;
	uint256 public constant PUBLIC_MAX = 2;

	uint256 public totalFreeMinted;
	uint256 public devMinted;

	// Start and End Times for each sale
	uint64 public firstSaleStartTime = type(uint64).max;
	uint64 public firstSaleEndTime = type(uint64).max;

	uint64 public secondSaleStartTime = type(uint64).max;
	uint64 public secondSaleEndTime = type(uint64).max;

	uint64 public publicSaleStartTime = type(uint64).max;
	uint64 public publicSaleEndTime = type(uint64).max;

	bool public allPaused;

	mapping(address => AccountInfo) public accountInfo;

	bytes32 public freeRoot;
	bytes32 public firstRoot;
	bytes32 public secondRoot;

	string public baseURI;

	constructor(
		string memory _name,
		string memory _symbol,
		uint256 maxSupply
	) ERC721A(_name, _symbol) {
		MAX_SUPPLY = maxSupply;
	}

	function setBaseURI(string memory newURI) public onlyOwner {
		baseURI = newURI;
	}

	function setPauseState(bool paused) public onlyOwner {
		allPaused = paused;
	}

	function devMint(uint256 amount) public onlyOwner {
		devMintTo(msg.sender, amount);
	}

	function devMintTo(address who, uint256 amount) public onlyOwner {
		uint256 maxCanMint = 88;
		uint256 _devMinted = devMinted;

		// If still supply after last sale, let team mint rest.
		if (block.timestamp > publicSaleEndTime) {
			maxCanMint = MAX_SUPPLY - totalSupply();
		} else {
			maxCanMint = maxCanMint - _devMinted;
		}

		if (amount > maxCanMint) {
			amount = maxCanMint;
		}

		devMinted = _devMinted + amount;
		_mint(who, amount);
	}

	function setSaleRoots(
		bytes32 _freeRoot,
		bytes32 _firstRoot,
		bytes32 _secondRoot
	) external onlyOwner {
		freeRoot = _freeRoot;
		firstRoot = _firstRoot;
		secondRoot = _secondRoot;
	}

	function setStartAndEndTimes(uint64[3] memory _startTimes, uint64[3] memory _endTimes) external onlyOwner {
		require(_startTimes[0] < _endTimes[0], "0 bad");
		require(_startTimes[1] < _endTimes[1], "1 bad");
		require(_startTimes[2] < _endTimes[2], "2 bad");
		firstSaleStartTime = _startTimes[0];
		firstSaleEndTime = _endTimes[0];
		secondSaleStartTime = _startTimes[1];
		secondSaleEndTime = _endTimes[1];
		publicSaleStartTime = _startTimes[2];
		publicSaleEndTime = _endTimes[2];
	}

	function freeAiko(
		uint64 amountToBuy,
		uint256 amount,
		bytes32[] calldata merkleProof
	) external {
		require(amountToBuy > 0, "0");
		require(merkleProof.length != 0, "No proof given");
		require(totalSupply() + amountToBuy <= MAX_SUPPLY, "Sold out");
		require(_saleOpen(firstSaleStartTime, publicSaleEndTime), "sale ended");

		bytes32 node = keccak256(abi.encodePacked(msg.sender, amount));
		require(MerkleProof.verify(merkleProof, freeRoot, node), "MerkleProof: Invalid proof.");

		AccountInfo memory accountInfo_ = accountInfo[msg.sender];
		uint256 purchased = accountInfo_.purchasedFirst + accountInfo_.purchasedSecond + accountInfo_.purchasedPublic;
		uint256 fromCurrentSale = accountInfo_.freeMinted + amountToBuy;
		require(purchased + fromCurrentSale <= WALLET_MAX, "above max");
		require(fromCurrentSale <= FREE_MAX, "above sale max");
		require(amountToBuy <= amount, "gt tree");

		accountInfo[msg.sender].freeMinted += amountToBuy;
		totalFreeMinted += amountToBuy;

		_mint(msg.sender, amountToBuy);
	}

	function firstCyberOrbAiko(
		uint64 amountToBuy,
		uint256 amount,
		bytes32[] calldata merkleProof
	) external payable {
		require(amountToBuy > 0, "0");
		require(merkleProof.length != 0, "No proof given");
		uint256 adjustedMax = FIRST_SALE_MAX + totalFreeMinted + devMinted; // Add to max for dev minted and total free mints.
		require(totalSupply() + amountToBuy <= adjustedMax, "Sold out");
		require(_saleOpen(firstSaleStartTime, firstSaleEndTime), "sale ended");

		bytes32 node = keccak256(abi.encodePacked(msg.sender, amount));
		require(MerkleProof.verify(merkleProof, firstRoot, node), "MerkleProof: Invalid proof");
		require(msg.value == amountToBuy * FIRST_ORB_PRICE, "Not right ETH sent");

		AccountInfo memory accountInfo_ = accountInfo[msg.sender];
		uint256 purchased = accountInfo_.freeMinted + accountInfo_.purchasedSecond + accountInfo_.purchasedPublic;
		uint256 fromCurrentSale = accountInfo_.purchasedFirst + amountToBuy;
		require(purchased + fromCurrentSale <= WALLET_MAX, "above max");
		require(fromCurrentSale <= FIRST_ORB_MAX, "above sale max");
		require(amountToBuy <= amount, "gt tree");

		accountInfo[msg.sender].purchasedFirst += amountToBuy;

		_mint(msg.sender, amountToBuy);
	}

	function secondCyberOrbAiko(
		uint64 amountToBuy,
		uint256 amount,
		bytes32[] calldata merkleProof
	) external payable {
		require(amountToBuy > 0, "0");
		require(merkleProof.length != 0, "No proof given");
		require(totalSupply() + amountToBuy <= MAX_SUPPLY, "Sold out");
		require(_saleOpen(secondSaleStartTime, secondSaleEndTime), "sale ended");

		bytes32 node = keccak256(abi.encodePacked(msg.sender, amount));
		require(MerkleProof.verify(merkleProof, secondRoot, node), "MerkleProof: Invalid proof.");
		require(msg.value == amountToBuy * SECOND_ORB_PRICE, "Not right ETH sent");

		AccountInfo memory accountInfo_ = accountInfo[msg.sender];
		uint256 purchased = accountInfo_.freeMinted + accountInfo_.purchasedFirst + accountInfo_.purchasedPublic;
		uint256 fromCurrentSale = accountInfo_.purchasedSecond + amountToBuy;
		require(purchased + fromCurrentSale <= WALLET_MAX, "above max");
		require(fromCurrentSale <= SECOND_ORB_MAX, "above sale max");
		require(amountToBuy <= amount, "gt tree");

		accountInfo[msg.sender].purchasedSecond += amountToBuy;

		_mint(msg.sender, amountToBuy);
	}

	function publicAikoSale(uint64 amountToBuy) external payable {
		require(amountToBuy > 0, "0");
		require(totalSupply() + amountToBuy <= MAX_SUPPLY, "Sold out");
		require(_saleOpen(publicSaleStartTime, publicSaleEndTime), "sale ended");
		require(msg.value == amountToBuy * PUBLIC_PRICE, "Not right ETH sent");

		AccountInfo memory accountInfo_ = accountInfo[msg.sender];
		uint256 purchased = accountInfo_.freeMinted + accountInfo_.purchasedFirst + accountInfo_.purchasedSecond;
		uint256 fromCurrentSale = accountInfo_.purchasedPublic + amountToBuy;
		require(purchased + fromCurrentSale <= WALLET_MAX, "above max");
		require(fromCurrentSale <= PUBLIC_MAX, "above sale max");

		accountInfo[msg.sender].purchasedPublic += amountToBuy;

		_mint(msg.sender, amountToBuy);
	}

	function totalMinted(address who) external view returns (uint256) {
		AccountInfo memory accountInfo_ = accountInfo[who];
		return accountInfo_.freeMinted + accountInfo_.purchasedFirst + accountInfo_.purchasedSecond + accountInfo_.purchasedPublic;
	}

	function withdrawETH() external onlyOwner {
		address VINNE = 0xBe640005EB23d1cDA7EB249540494BEF6BA4b319;
		address KYO = 0x30C156D9C064FB573aECa82225E1FF5C46A2E806;
		address GARRID = 0x6C44E579e19DC7f892804b83d64202D5bA4397Eb;
		address MATARELLI = 0xec2610feabEB0F422670f1b22AdcE78391408fE6;
		address KINOKO = 0x171D64661Ee33CC9296ae048C753c529641F65bb;
		address CHASE = 0x26EE5302D8cc0422EE5DCdF19668c663e2fAfb8E;
		address UWULABS = 0x354A70969F0b4a4C994403051A81C2ca45db3615;
		address SHVRK = 0xB8842D2eFd92d895DE19B5339fB1a28BBDD7c110;

		uint256 teamAmount = (7 gwei * address(this).balance)/10 gwei; // 70% goes to team
		_sendValue(VINNE, _percentOfTotal(teamAmount, 0.225 gwei)); // (22.5% of team)
		_sendValue(KYO, _percentOfTotal(teamAmount, 0.225 gwei)); // (22.5% of team)
		_sendValue(GARRID, _percentOfTotal(teamAmount, 0.125 gwei)); // (12.5% of team)
		_sendValue(MATARELLI, _percentOfTotal(teamAmount, 0.125 gwei)); // (12.5% of team)
		_sendValue(CHASE, _percentOfTotal(teamAmount, 0.115 gwei)); // (11.5% of team)
		_sendValue(KINOKO, _percentOfTotal(teamAmount, 0.075 gwei)); // (7.5% of team)
		_sendValue(UWULABS, _percentOfTotal(teamAmount, 0.075 gwei)); // (7.5% of team)
		_sendValue(SHVRK, _percentOfTotal(teamAmount, 0.035 gwei)); // (3.5% of team)

		address AIKO_MULTISIG = 0xBa89826aE052da88962c0fB23bF3840F594d630E;
		_sendValue(AIKO_MULTISIG, address(this).balance); // Other 30%
	}

	function emergencyWithdrawETH() external onlyOwner {
		address AIKO_MULTISIG = 0xBa89826aE052da88962c0fB23bF3840F594d630E;
		_sendValue(AIKO_MULTISIG, address(this).balance);
	}

	function _saleOpen(uint256 startTime, uint256 endTime) internal view returns (bool) {
		return !allPaused && block.timestamp > startTime && block.timestamp < endTime;
	}

	function _startTokenId() internal pure virtual override returns (uint256) {
		return 1;
	}

	function _sendValue(address recipient, uint256 amount) internal {
		require(address(this).balance >= amount, "insufficient balance");
		// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
		(bool success, ) = payable(recipient).call{value: amount}("");
		require(success, "unable to send ETH");
	}

	function _percentOfTotal(uint256 total, uint256 percentInGwei) internal pure returns (uint256) {
		return (total * percentInGwei) / 1 gwei;
	}

	function _baseURI() internal view virtual override returns (string memory) {
		return baseURI;
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"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":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FIRST_ORB_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FIRST_ORB_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FIRST_SALE_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREE_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECOND_ORB_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECOND_ORB_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WALLET_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"accountInfo","outputs":[{"internalType":"uint64","name":"freeMinted","type":"uint64"},{"internalType":"uint64","name":"purchasedFirst","type":"uint64"},{"internalType":"uint64","name":"purchasedSecond","type":"uint64"},{"internalType":"uint64","name":"purchasedPublic","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"amount","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"devMintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"amountToBuy","type":"uint64"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"firstCyberOrbAiko","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"firstRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"firstSaleEndTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"firstSaleStartTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"amountToBuy","type":"uint64"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"freeAiko","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":[],"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":[{"internalType":"uint64","name":"amountToBuy","type":"uint64"}],"name":"publicAikoSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleEndTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleStartTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":"uint64","name":"amountToBuy","type":"uint64"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"secondCyberOrbAiko","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"secondRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"secondSaleEndTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"secondSaleStartTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","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":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"paused","type":"bool"}],"name":"setPauseState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_freeRoot","type":"bytes32"},{"internalType":"bytes32","name":"_firstRoot","type":"bytes32"},{"internalType":"bytes32","name":"_secondRoot","type":"bytes32"}],"name":"setSaleRoots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64[3]","name":"_startTimes","type":"uint64[3]"},{"internalType":"uint64[3]","name":"_endTimes","type":"uint64[3]"}],"name":"setStartAndEndTimes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFreeMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"totalMinted","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":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a0604052600019600b55600c80546001600160801b0319166001600160801b031790553480156200003057600080fd5b5060405162003e0338038062003e0383398101604081905262000053916200022f565b600080546001600160a01b03191633908117825560405185928592918291907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508151620000ad906003906020850190620000d6565b508051620000c3906004906020840190620000d6565b5060018055505060805250620002f29050565b828054620000e4906200029f565b90600052602060002090601f01602090048101928262000108576000855562000153565b82601f106200012357805160ff191683800117855562000153565b8280016001018555821562000153579182015b828111156200015357825182559160200191906001019062000136565b506200016192915062000165565b5090565b5b8082111562000161576000815560010162000166565b600082601f8301126200018d578081fd5b81516001600160401b0380821115620001aa57620001aa620002dc565b604051601f8301601f19908116603f01168101908282118183101715620001d557620001d5620002dc565b81604052838152602092508683858801011115620001f1578485fd5b8491505b83821015620002145785820183015181830184015290820190620001f5565b838211156200022557848385830101525b9695505050505050565b60008060006060848603121562000244578283fd5b83516001600160401b03808211156200025b578485fd5b62000269878388016200017c565b945060208601519150808211156200027f578384fd5b506200028e868287016200017c565b925050604084015190509250925092565b600181811c90821680620002b457607f821691505b60208210811415620002d657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b608051613ad96200032a6000396000818161054c01528181611063015281816115a30152818161169701526123c50152613ad96000f3fe6080604052600436106103545760003560e01c80636bb7b1d9116101bb578063a22cb465116100f7578063cdb88ad111610095578063e086e5ec1161006f578063e086e5ec14610973578063e985e9c514610988578063ecb7d676146109d1578063f2fde38b146109f957600080fd5b8063cdb88ad11461092a578063dad7b5c91461094a578063df2752521461096057600080fd5b8063b4186cde116100d1578063b4186cde1461048f578063b88d4fde146108d7578063c87b56dd146108f7578063cd6cdf521461091757600080fd5b8063a22cb46514610817578063a7310b5814610837578063adf2131b146108c157600080fd5b8063715018a611610164578063845360171161013e57806384536017146107cf5780638da5cb5b146107e457806395d89b411461080257806397e3facb1461048f57600080fd5b8063715018a61461077957806379f997a11461078e5780637d457f52146107af57600080fd5b80636fc1cdf7116101955780636fc1cdf71461048f5780636fe5d98a1461074657806370a082311461075957600080fd5b80636bb7b1d9146106f05780636c0360eb146107115780636f2a7add1461072657600080fd5b806332cb6b0c116102955780634f5cdd96116102335780636352211e1161020d5780636352211e146106715780636741e4de14610691578063697a80b7146106a75780636a6de4de146106c857600080fd5b80634f5cdd961461061a57806355f804b314610635578063611f3f101461065557600080fd5b80633e1706f61161026f5780633e1706f6146105ae57806342842e0e146105c4578063452c5f6f146105e45780634df34e781461060457600080fd5b806332cb6b0c1461053a57806334b75d141461056e578063375a069a1461058e57600080fd5b80630a212137116103025780631af5e861116102dc5780631af5e861146104c15780631e4d185f146104d657806323b872dd146104fe57806327b412bb1461051e57600080fd5b80630a2121371461044e5780630cf0bc1c1461048f57806318160ddd146104a457600080fd5b806306fdde031161033357806306fdde03146103d2578063081812fc146103f4578063095ea7b31461042c57600080fd5b80623d47901461035957806301ffc9a71461038c5780630500563b146103bc575b600080fd5b34801561036557600080fd5b5061037961037436600461358f565b610a19565b6040519081526020015b60405180910390f35b34801561039857600080fd5b506103ac6103a7366004613751565b610aae565b6040519015158152602001610383565b3480156103c857600080fd5b50610379600f5481565b3480156103de57600080fd5b506103e7610b4b565b604051610383919061391d565b34801561040057600080fd5b5061041461040f3660046137cf565b610bdd565b6040516001600160a01b039091168152602001610383565b34801561043857600080fd5b5061044c6104473660046136b8565b610c3a565b005b34801561045a57600080fd5b50600b5461047690600160401b900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610383565b34801561049b57600080fd5b50610379600681565b3480156104b057600080fd5b506002546001540360001901610379565b3480156104cd57600080fd5b50610379600281565b3480156104e257600080fd5b50600c5461047690600160401b900467ffffffffffffffff1681565b34801561050a57600080fd5b5061044c6105193660046135db565b610cfa565b34801561052a57600080fd5b5061037967010a741a4627800081565b34801561054657600080fd5b506103797f000000000000000000000000000000000000000000000000000000000000000081565b34801561057a57600080fd5b5061044c6105893660046136e1565b610d05565b34801561059a57600080fd5b5061044c6105a93660046137cf565b610f4e565b3480156105ba57600080fd5b5061037960105481565b3480156105d057600080fd5b5061044c6105df3660046135db565b610fb5565b3480156105f057600080fd5b5061044c6105ff366004613801565b610fd0565b34801561061057600080fd5b50610379600e5481565b34801561062657600080fd5b5061037966b1a2bc2ec5000081565b34801561064157600080fd5b5061044c610650366004613789565b611405565b34801561066157600080fd5b5061037967016345785d8a000081565b34801561067d57600080fd5b5061041461068c3660046137cf565b611476565b34801561069d57600080fd5b50610379610d0581565b3480156106b357600080fd5b50600c546103ac90600160801b900460ff1681565b3480156106d457600080fd5b50600b5461047690600160801b900467ffffffffffffffff1681565b3480156106fc57600080fd5b50600c546104769067ffffffffffffffff1681565b34801561071d57600080fd5b506103e7611488565b34801561073257600080fd5b5061044c6107413660046136b8565b611516565b61044c610754366004613801565b611604565b34801561076557600080fd5b5061037961077436600461358f565b611a87565b34801561078557600080fd5b5061044c611aef565b34801561079a57600080fd5b50600b546104769067ffffffffffffffff1681565b3480156107bb57600080fd5b5061044c6107ca366004613726565b611ba0565b3480156107db57600080fd5b5061044c611c08565b3480156107f057600080fd5b506000546001600160a01b0316610414565b34801561080e57600080fd5b506103e7611c81565b34801561082357600080fd5b5061044c61083236600461368f565b611c90565b34801561084357600080fd5b5061088d61085236600461358f565b600d6020526000908152604090205467ffffffffffffffff80821691600160401b8104821691600160801b8204811691600160c01b90041684565b6040805167ffffffffffffffff95861681529385166020850152918416918301919091529091166060820152608001610383565b3480156108cd57600080fd5b50610379600a5481565b3480156108e357600080fd5b5061044c6108f2366004613616565b611d5d565b34801561090357600080fd5b506103e76109123660046137cf565b611dc1565b61044c610925366004613801565b611e5f565b34801561093657600080fd5b5061044c61094536600461370c565b6122ec565b34801561095657600080fd5b5061037960095481565b61044c61096e3660046137e7565b61237f565b34801561097f57600080fd5b5061044c612698565b34801561099457600080fd5b506103ac6109a33660046135a9565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b3480156109dd57600080fd5b50600b5461047690600160c01b900467ffffffffffffffff1681565b348015610a0557600080fd5b5061044c610a1436600461358f565b61287d565b6001600160a01b0381166000908152600d602090815260408083208151608081018352905467ffffffffffffffff808216808452600160401b83048216958401869052600160801b83048216948401859052600160c01b90920416606083018190529193919291610a8991613948565b610a939190613948565b610a9d9190613948565b67ffffffffffffffff169392505050565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480610b1157506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610b4557507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b606060038054610b5a906139e1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b86906139e1565b8015610bd35780601f10610ba857610100808354040283529160200191610bd3565b820191906000526020600020905b815481529060010190602001808311610bb657829003601f168201915b5050505050905090565b6000610be8826129bb565b610c1e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610c4582611476565b9050806001600160a01b0316836001600160a01b03161415610c93576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03821614801590610cb35750610cb181336109a3565b155b15610cea576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cf58383836129f4565b505050565b610cf5838383612a5d565b6000546001600160a01b03163314610d645760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b8051825167ffffffffffffffff918216911610610dc35760405162461bcd60e51b815260206004820152600560248201527f30206261640000000000000000000000000000000000000000000000000000006044820152606401610d5b565b6020808201519083015167ffffffffffffffff918216911610610e285760405162461bcd60e51b815260206004820152600560248201527f31206261640000000000000000000000000000000000000000000000000000006044820152606401610d5b565b6040808201519083015167ffffffffffffffff918216911610610e8d5760405162461bcd60e51b815260206004820152600560248201527f32206261640000000000000000000000000000000000000000000000000000006044820152606401610d5b565b8151600b805483516020808701519086015167ffffffffffffffff908116600160c01b02928116600160401b9081029682167fffffffffffffffffffffffffffffffff0000000000000000000000000000000095861617969096176fffffffffffffffffffffffffffffffff16918116600160801b0277ffffffffffffffffffffffffffffffffffffffffffffffff169190911791909117909255604094850151600c80549690950151831690930292909116931692909217919091179055565b6000546001600160a01b03163314610fa85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d5b565b610fb23382611516565b50565b610cf583838360405180602001604052806000815250611d5d565b60008467ffffffffffffffff161161100e5760405162461bcd60e51b81526020600482015260016024820152600360fc1b6044820152606401610d5b565b8061105b5760405162461bcd60e51b815260206004820152600e60248201527f4e6f2070726f6f6620676976656e0000000000000000000000000000000000006044820152606401610d5b565b6002546001547f00000000000000000000000000000000000000000000000000000000000000009167ffffffffffffffff871691036000190161109e9190613930565b11156110d75760405162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b6044820152606401610d5b565b600b54600c546110fb9167ffffffffffffffff90811691600160401b900416612c98565b6111345760405162461bcd60e51b815260206004820152600a6024820152691cd85b1948195b99195960b21b6044820152606401610d5b565b6040516bffffffffffffffffffffffff193360601b166020820152603481018490526000906054016040516020818303038152906040528051906020012090506111b583838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e549150849050612cc3565b6112015760405162461bcd60e51b815260206004820152601b60248201527f4d65726b6c6550726f6f663a20496e76616c69642070726f6f662e00000000006044820152606401610d5b565b336000908152600d602090815260408083208151608081018352905467ffffffffffffffff8082168352600160401b82048116948301859052600160801b82048116938301849052600160c01b9091041660608201819052909392909161126791613948565b6112719190613948565b67ffffffffffffffff169050600087836000015161128f9190613948565b67ffffffffffffffff16905060066112a78284613930565b11156112e15760405162461bcd60e51b81526020600482015260096024820152680c2c4deecca40dac2f60bb1b6044820152606401610d5b565b60068111156113325760405162461bcd60e51b815260206004820152600e60248201527f61626f76652073616c65206d61780000000000000000000000000000000000006044820152606401610d5b565b868867ffffffffffffffff1611156113765760405162461bcd60e51b81526020600482015260076024820152666774207472656560c81b6044820152606401610d5b565b336000908152600d6020526040812080548a929061139f90849067ffffffffffffffff16613948565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508767ffffffffffffffff16600960008282546113e19190613930565b909155506113fb90503367ffffffffffffffff8a16612d80565b5050505050505050565b6000546001600160a01b0316331461145f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d5b565b80516114729060119060208401906133c1565b5050565b600061148182612eed565b5192915050565b60118054611495906139e1565b80601f01602080910402602001604051908101604052809291908181526020018280546114c1906139e1565b801561150e5780601f106114e35761010080835404028352916020019161150e565b820191906000526020600020905b8154815290600101906020018083116114f157829003601f168201915b505050505081565b6000546001600160a01b031633146115705760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d5b565b600a54600c5460589190600160401b900467ffffffffffffffff164211156115ce5760025460015403600019016115c7907f000000000000000000000000000000000000000000000000000000000000000061399e565b91506115db565b6115d8818361399e565b91505b818311156115e7578192505b6115f18382613930565b600a556115fe8484612d80565b50505050565b60008467ffffffffffffffff16116116425760405162461bcd60e51b81526020600482015260016024820152600360fc1b6044820152606401610d5b565b8061168f5760405162461bcd60e51b815260206004820152600e60248201527f4e6f2070726f6f6620676976656e0000000000000000000000000000000000006044820152606401610d5b565b6002546001547f00000000000000000000000000000000000000000000000000000000000000009167ffffffffffffffff87169103600019016116d29190613930565b111561170b5760405162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b6044820152606401610d5b565b600b546117329067ffffffffffffffff600160801b8204811691600160c01b900416612c98565b61176b5760405162461bcd60e51b815260206004820152600a6024820152691cd85b1948195b99195960b21b6044820152606401610d5b565b6040516bffffffffffffffffffffffff193360601b166020820152603481018490526000906054016040516020818303038152906040528051906020012090506117ec838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506010549150849050612cc3565b6118385760405162461bcd60e51b815260206004820152601b60248201527f4d65726b6c6550726f6f663a20496e76616c69642070726f6f662e00000000006044820152606401610d5b565b61185467010a741a4627800067ffffffffffffffff871661397f565b34146118a25760405162461bcd60e51b815260206004820152601260248201527f4e6f74207269676874204554482073656e7400000000000000000000000000006044820152606401610d5b565b336000908152600d602090815260408083208151608081018352905467ffffffffffffffff808216808452600160401b83048216958401869052600160801b8304821694840194909452600160c01b9091041660608201819052909392909161190b9190613948565b6119159190613948565b67ffffffffffffffff16905060008783604001516119339190613948565b67ffffffffffffffff169050600661194b8284613930565b11156119855760405162461bcd60e51b81526020600482015260096024820152680c2c4deecca40dac2f60bb1b6044820152606401610d5b565b60068111156119d65760405162461bcd60e51b815260206004820152600e60248201527f61626f76652073616c65206d61780000000000000000000000000000000000006044820152606401610d5b565b868867ffffffffffffffff161115611a1a5760405162461bcd60e51b81526020600482015260076024820152666774207472656560c81b6044820152606401610d5b565b336000908152600d602052604090208054899190601090611a4d908490600160801b900467ffffffffffffffff16613948565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506113fb338967ffffffffffffffff16612d80565b60006001600160a01b038216611ac9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b6000546001600160a01b03163314611b495760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d5b565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b6000546001600160a01b03163314611bfa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d5b565b600e92909255600f55601055565b6000546001600160a01b03163314611c625760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d5b565b73ba89826ae052da88962c0fb23bf3840f594d630e610fb2814761302f565b606060048054610b5a906139e1565b6001600160a01b038216331415611cd3576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611d68848484612a5d565b6001600160a01b0383163b15158015611d8a5750611d8884848484613122565b155b156115fe576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060611dcc826129bb565b611e02576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e0c613265565b9050805160001415611e2d5760405180602001604052806000815250611e58565b80611e3784613274565b604051602001611e489291906138b2565b6040516020818303038152906040525b9392505050565b60008467ffffffffffffffff1611611e9d5760405162461bcd60e51b81526020600482015260016024820152600360fc1b6044820152606401610d5b565b80611eea5760405162461bcd60e51b815260206004820152600e60248201527f4e6f2070726f6f6620676976656e0000000000000000000000000000000000006044820152606401610d5b565b6000600a54600954610d05611eff9190613930565b611f099190613930565b9050808567ffffffffffffffff16611f2a6002546001546000199190030190565b611f349190613930565b1115611f6d5760405162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b6044820152606401610d5b565b600b54611f8e9067ffffffffffffffff80821691600160401b900416612c98565b611fc75760405162461bcd60e51b815260206004820152600a6024820152691cd85b1948195b99195960b21b6044820152606401610d5b565b6040516bffffffffffffffffffffffff193360601b1660208201526034810185905260009060540160405160208183030381529060405280519060200120905061204884848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600f549150849050612cc3565b6120945760405162461bcd60e51b815260206004820152601a60248201527f4d65726b6c6550726f6f663a20496e76616c69642070726f6f660000000000006044820152606401610d5b565b6120af66b1a2bc2ec5000067ffffffffffffffff881661397f565b34146120fd5760405162461bcd60e51b815260206004820152601260248201527f4e6f74207269676874204554482073656e7400000000000000000000000000006044820152606401610d5b565b336000908152600d602090815260408083208151608081018352905467ffffffffffffffff808216808452600160401b8304821695840195909552600160801b82048116938301849052600160c01b9091041660608201819052909392909161216591613948565b61216f9190613948565b67ffffffffffffffff169050600088836020015161218d9190613948565b67ffffffffffffffff16905060066121a58284613930565b11156121df5760405162461bcd60e51b81526020600482015260096024820152680c2c4deecca40dac2f60bb1b6044820152606401610d5b565b60068111156122305760405162461bcd60e51b815260206004820152600e60248201527f61626f76652073616c65206d61780000000000000000000000000000000000006044820152606401610d5b565b878967ffffffffffffffff1611156122745760405162461bcd60e51b81526020600482015260076024820152666774207472656560c81b6044820152606401610d5b565b336000908152600d6020526040902080548a91906008906122a7908490600160401b900467ffffffffffffffff16613948565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506122e1338a67ffffffffffffffff16612d80565b505050505050505050565b6000546001600160a01b031633146123465760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d5b565b600c8054911515600160801b027fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff909216919091179055565b60008167ffffffffffffffff16116123bd5760405162461bcd60e51b81526020600482015260016024820152600360fc1b6044820152606401610d5b565b6002546001547f00000000000000000000000000000000000000000000000000000000000000009167ffffffffffffffff84169103600019016124009190613930565b11156124395760405162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b6044820152606401610d5b565b600c5461245a9067ffffffffffffffff80821691600160401b900416612c98565b6124935760405162461bcd60e51b815260206004820152600a6024820152691cd85b1948195b99195960b21b6044820152606401610d5b565b6124af67016345785d8a000067ffffffffffffffff831661397f565b34146124fd5760405162461bcd60e51b815260206004820152601260248201527f4e6f74207269676874204554482073656e7400000000000000000000000000006044820152606401610d5b565b336000908152600d602090815260408083208151608081018352905467ffffffffffffffff808216808452600160401b83048216958401869052600160801b83048216948401859052600160c01b90920416606083015290939261256091613948565b61256a9190613948565b67ffffffffffffffff16905060008383606001516125889190613948565b67ffffffffffffffff16905060066125a08284613930565b11156125da5760405162461bcd60e51b81526020600482015260096024820152680c2c4deecca40dac2f60bb1b6044820152606401610d5b565b600281111561262b5760405162461bcd60e51b815260206004820152600e60248201527f61626f76652073616c65206d61780000000000000000000000000000000000006044820152606401610d5b565b336000908152600d60205260409020805485919060189061265e908490600160c01b900467ffffffffffffffff16613948565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506115fe338567ffffffffffffffff16612d80565b6000546001600160a01b031633146126f25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d5b565b73be640005eb23d1cda7eb249540494bef6ba4b3197330c156d9c064fb573aeca82225e1ff5c46a2e806736c44e579e19dc7f892804b83d64202d5ba4397eb73ec2610feabeb0f422670f1b22adce78391408fe673171d64661ee33cc9296ae048c753c529641f65bb7326ee5302d8cc0422ee5dcdf19668c663e2fafb8e73354a70969f0b4a4c994403051a81c2ca45db361573b8842d2efd92d895de19b5339fb1a28bbdd7c11060006402540be4006127b1476401a13b860061397f565b6127bb919061396b565b90506127d4896127cf83630d693a406133a6565b61302f565b6127e6886127cf83630d693a406133a6565b6127f8876127cf8363077359406133a6565b61280a866127cf8363077359406133a6565b61281c846127cf836306dac2c06133a6565b61282e856127cf8363047868c06133a6565b612840836127cf8363047868c06133a6565b612852826127cf836302160ec06133a6565b73ba89826ae052da88962c0fb23bf3840f594d630e612871814761302f565b50505050505050505050565b6000546001600160a01b031633146128d75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d5b565b6001600160a01b0381166129535760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d5b565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000816001111580156129cf575060015482105b8015610b45575050600090815260056020526040902054600160e01b900460ff161590565b600082815260076020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000612a6882612eed565b9050836001600160a01b031681600001516001600160a01b031614612ab9576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000336001600160a01b0386161480612ad75750612ad785336109a3565b80612af2575033612ae784610bdd565b6001600160a01b0316145b905080612b2b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416612b6b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b77600084876129f4565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116612c4d576001548214612c4d578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b600c54600090600160801b900460ff16158015612cb457508242115b8015611e585750504210919050565b600081815b8551811015612d75576000868281518110612cf357634e487b7160e01b600052603260045260246000fd5b60200260200101519050808311612d35576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612d62565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612d6d81613a1c565b915050612cc8565b509092149392505050565b6001546001600160a01b038316612dc3576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81612dfa576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316600081815260066020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000811667ffffffffffffffff8083168a018116918217600160401b67ffffffffffffffff1990941690921783900481168a01811690920217909155858452600590925290912080546001600160e01b031916909217600160a01b4290921691909102179055808083015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210612ea15750600155505050565b60408051606081018252600080825260208201819052918101919091528180600111158015612f1d575060015481105b15612ffd57600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff16151591810182905290612ffb5780516001600160a01b031615612f91579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215612ff6579392505050565b612f91565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8047101561307f5760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e63650000000000000000000000006044820152606401610d5b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146130cc576040519150601f19603f3d011682016040523d82523d6000602084013e6130d1565b606091505b5050905080610cf55760405162461bcd60e51b815260206004820152601260248201527f756e61626c6520746f2073656e642045544800000000000000000000000000006044820152606401610d5b565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081526000906001600160a01b0385169063150b7a02906131709033908990889088906004016138e1565b602060405180830381600087803b15801561318a57600080fd5b505af19250505080156131ba575060408051601f3d908101601f191682019092526131b79181019061376d565b60015b61322e573d8080156131e8576040519150601f19603f3d011682016040523d82523d6000602084013e6131ed565b606091505b508051613226576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b6001600160e01b0319167f150b7a02000000000000000000000000000000000000000000000000000000001490505b949350505050565b606060118054610b5a906139e1565b6060816132985750506040805180820190915260018152600360fc1b602082015290565b8160005b81156132c257806132ac81613a1c565b91506132bb9050600a8361396b565b915061329c565b60008167ffffffffffffffff8111156132eb57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613315576020820181803683370190505b5090505b841561325d5761332a60018361399e565b9150613337600a86613a37565b613342906030613930565b60f81b81838151811061336557634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061339f600a8661396b565b9450613319565b6000633b9aca006133b7838561397f565b611e58919061396b565b8280546133cd906139e1565b90600052602060002090601f0160209004810192826133ef5760008555613435565b82601f1061340857805160ff1916838001178555613435565b82800160010185558215613435579182015b8281111561343557825182559160200191906001019061341a565b50613441929150613445565b5090565b5b808211156134415760008155600101613446565b600067ffffffffffffffff8084111561347557613475613a77565b604051601f8501601f19908116603f0116810190828211818310171561349d5761349d613a77565b816040528093508581528686860111156134b657600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146134e757600080fd5b919050565b600082601f8301126134fc578081fd5b6040516060810181811067ffffffffffffffff8211171561351f5761351f613a77565b604052808360608101861015613533578384fd5b835b600381101561355c5761354782613577565b83526020928301929190910190600101613535565b509195945050505050565b803580151581146134e757600080fd5b803567ffffffffffffffff811681146134e757600080fd5b6000602082840312156135a0578081fd5b611e58826134d0565b600080604083850312156135bb578081fd5b6135c4836134d0565b91506135d2602084016134d0565b90509250929050565b6000806000606084860312156135ef578081fd5b6135f8846134d0565b9250613606602085016134d0565b9150604084013590509250925092565b6000806000806080858703121561362b578081fd5b613634856134d0565b9350613642602086016134d0565b925060408501359150606085013567ffffffffffffffff811115613664578182fd5b8501601f81018713613674578182fd5b6136838782356020840161345a565b91505092959194509250565b600080604083850312156136a1578182fd5b6136aa836134d0565b91506135d260208401613567565b600080604083850312156136ca578182fd5b6136d3836134d0565b946020939093013593505050565b60008060c083850312156136f3578182fd5b6136fd84846134ec565b91506135d284606085016134ec565b60006020828403121561371d578081fd5b611e5882613567565b60008060006060848603121561373a578283fd5b505081359360208301359350604090920135919050565b600060208284031215613762578081fd5b8135611e5881613a8d565b60006020828403121561377e578081fd5b8151611e5881613a8d565b60006020828403121561379a578081fd5b813567ffffffffffffffff8111156137b0578182fd5b8201601f810184136137c0578182fd5b61325d8482356020840161345a565b6000602082840312156137e0578081fd5b5035919050565b6000602082840312156137f8578081fd5b611e5882613577565b60008060008060608587031215613816578182fd5b61381f85613577565b935060208501359250604085013567ffffffffffffffff80821115613842578384fd5b818701915087601f830112613855578384fd5b813581811115613863578485fd5b8860208260051b8501011115613877578485fd5b95989497505060200194505050565b6000815180845261389e8160208601602086016139b5565b601f01601f19169290920160200192915050565b600083516138c48184602088016139b5565b8351908301906138d88183602088016139b5565b01949350505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526139136080830184613886565b9695505050505050565b602081526000611e586020830184613886565b6000821982111561394357613943613a4b565b500190565b600067ffffffffffffffff8083168185168083038211156138d8576138d8613a4b565b60008261397a5761397a613a61565b500490565b600081600019048311821515161561399957613999613a4b565b500290565b6000828210156139b0576139b0613a4b565b500390565b60005b838110156139d05781810151838201526020016139b8565b838111156115fe5750506000910152565b600181811c908216806139f557607f821691505b60208210811415613a1657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613a3057613a30613a4b565b5060010190565b600082613a4657613a46613a61565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610fb257600080fdfea26469706673582212203b7c89020f58c80ad7e83d81e3f92349a7c04ecc000941cecc892c474ad794e764736f6c63430008040033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000022b8000000000000000000000000000000000000000000000000000000000000000c41696b6f205669727475616c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000441494b4f00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103545760003560e01c80636bb7b1d9116101bb578063a22cb465116100f7578063cdb88ad111610095578063e086e5ec1161006f578063e086e5ec14610973578063e985e9c514610988578063ecb7d676146109d1578063f2fde38b146109f957600080fd5b8063cdb88ad11461092a578063dad7b5c91461094a578063df2752521461096057600080fd5b8063b4186cde116100d1578063b4186cde1461048f578063b88d4fde146108d7578063c87b56dd146108f7578063cd6cdf521461091757600080fd5b8063a22cb46514610817578063a7310b5814610837578063adf2131b146108c157600080fd5b8063715018a611610164578063845360171161013e57806384536017146107cf5780638da5cb5b146107e457806395d89b411461080257806397e3facb1461048f57600080fd5b8063715018a61461077957806379f997a11461078e5780637d457f52146107af57600080fd5b80636fc1cdf7116101955780636fc1cdf71461048f5780636fe5d98a1461074657806370a082311461075957600080fd5b80636bb7b1d9146106f05780636c0360eb146107115780636f2a7add1461072657600080fd5b806332cb6b0c116102955780634f5cdd96116102335780636352211e1161020d5780636352211e146106715780636741e4de14610691578063697a80b7146106a75780636a6de4de146106c857600080fd5b80634f5cdd961461061a57806355f804b314610635578063611f3f101461065557600080fd5b80633e1706f61161026f5780633e1706f6146105ae57806342842e0e146105c4578063452c5f6f146105e45780634df34e781461060457600080fd5b806332cb6b0c1461053a57806334b75d141461056e578063375a069a1461058e57600080fd5b80630a212137116103025780631af5e861116102dc5780631af5e861146104c15780631e4d185f146104d657806323b872dd146104fe57806327b412bb1461051e57600080fd5b80630a2121371461044e5780630cf0bc1c1461048f57806318160ddd146104a457600080fd5b806306fdde031161033357806306fdde03146103d2578063081812fc146103f4578063095ea7b31461042c57600080fd5b80623d47901461035957806301ffc9a71461038c5780630500563b146103bc575b600080fd5b34801561036557600080fd5b5061037961037436600461358f565b610a19565b6040519081526020015b60405180910390f35b34801561039857600080fd5b506103ac6103a7366004613751565b610aae565b6040519015158152602001610383565b3480156103c857600080fd5b50610379600f5481565b3480156103de57600080fd5b506103e7610b4b565b604051610383919061391d565b34801561040057600080fd5b5061041461040f3660046137cf565b610bdd565b6040516001600160a01b039091168152602001610383565b34801561043857600080fd5b5061044c6104473660046136b8565b610c3a565b005b34801561045a57600080fd5b50600b5461047690600160401b900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610383565b34801561049b57600080fd5b50610379600681565b3480156104b057600080fd5b506002546001540360001901610379565b3480156104cd57600080fd5b50610379600281565b3480156104e257600080fd5b50600c5461047690600160401b900467ffffffffffffffff1681565b34801561050a57600080fd5b5061044c6105193660046135db565b610cfa565b34801561052a57600080fd5b5061037967010a741a4627800081565b34801561054657600080fd5b506103797f00000000000000000000000000000000000000000000000000000000000022b881565b34801561057a57600080fd5b5061044c6105893660046136e1565b610d05565b34801561059a57600080fd5b5061044c6105a93660046137cf565b610f4e565b3480156105ba57600080fd5b5061037960105481565b3480156105d057600080fd5b5061044c6105df3660046135db565b610fb5565b3480156105f057600080fd5b5061044c6105ff366004613801565b610fd0565b34801561061057600080fd5b50610379600e5481565b34801561062657600080fd5b5061037966b1a2bc2ec5000081565b34801561064157600080fd5b5061044c610650366004613789565b611405565b34801561066157600080fd5b5061037967016345785d8a000081565b34801561067d57600080fd5b5061041461068c3660046137cf565b611476565b34801561069d57600080fd5b50610379610d0581565b3480156106b357600080fd5b50600c546103ac90600160801b900460ff1681565b3480156106d457600080fd5b50600b5461047690600160801b900467ffffffffffffffff1681565b3480156106fc57600080fd5b50600c546104769067ffffffffffffffff1681565b34801561071d57600080fd5b506103e7611488565b34801561073257600080fd5b5061044c6107413660046136b8565b611516565b61044c610754366004613801565b611604565b34801561076557600080fd5b5061037961077436600461358f565b611a87565b34801561078557600080fd5b5061044c611aef565b34801561079a57600080fd5b50600b546104769067ffffffffffffffff1681565b3480156107bb57600080fd5b5061044c6107ca366004613726565b611ba0565b3480156107db57600080fd5b5061044c611c08565b3480156107f057600080fd5b506000546001600160a01b0316610414565b34801561080e57600080fd5b506103e7611c81565b34801561082357600080fd5b5061044c61083236600461368f565b611c90565b34801561084357600080fd5b5061088d61085236600461358f565b600d6020526000908152604090205467ffffffffffffffff80821691600160401b8104821691600160801b8204811691600160c01b90041684565b6040805167ffffffffffffffff95861681529385166020850152918416918301919091529091166060820152608001610383565b3480156108cd57600080fd5b50610379600a5481565b3480156108e357600080fd5b5061044c6108f2366004613616565b611d5d565b34801561090357600080fd5b506103e76109123660046137cf565b611dc1565b61044c610925366004613801565b611e5f565b34801561093657600080fd5b5061044c61094536600461370c565b6122ec565b34801561095657600080fd5b5061037960095481565b61044c61096e3660046137e7565b61237f565b34801561097f57600080fd5b5061044c612698565b34801561099457600080fd5b506103ac6109a33660046135a9565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b3480156109dd57600080fd5b50600b5461047690600160c01b900467ffffffffffffffff1681565b348015610a0557600080fd5b5061044c610a1436600461358f565b61287d565b6001600160a01b0381166000908152600d602090815260408083208151608081018352905467ffffffffffffffff808216808452600160401b83048216958401869052600160801b83048216948401859052600160c01b90920416606083018190529193919291610a8991613948565b610a939190613948565b610a9d9190613948565b67ffffffffffffffff169392505050565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480610b1157506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610b4557507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b606060038054610b5a906139e1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b86906139e1565b8015610bd35780601f10610ba857610100808354040283529160200191610bd3565b820191906000526020600020905b815481529060010190602001808311610bb657829003601f168201915b5050505050905090565b6000610be8826129bb565b610c1e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610c4582611476565b9050806001600160a01b0316836001600160a01b03161415610c93576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03821614801590610cb35750610cb181336109a3565b155b15610cea576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cf58383836129f4565b505050565b610cf5838383612a5d565b6000546001600160a01b03163314610d645760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b8051825167ffffffffffffffff918216911610610dc35760405162461bcd60e51b815260206004820152600560248201527f30206261640000000000000000000000000000000000000000000000000000006044820152606401610d5b565b6020808201519083015167ffffffffffffffff918216911610610e285760405162461bcd60e51b815260206004820152600560248201527f31206261640000000000000000000000000000000000000000000000000000006044820152606401610d5b565b6040808201519083015167ffffffffffffffff918216911610610e8d5760405162461bcd60e51b815260206004820152600560248201527f32206261640000000000000000000000000000000000000000000000000000006044820152606401610d5b565b8151600b805483516020808701519086015167ffffffffffffffff908116600160c01b02928116600160401b9081029682167fffffffffffffffffffffffffffffffff0000000000000000000000000000000095861617969096176fffffffffffffffffffffffffffffffff16918116600160801b0277ffffffffffffffffffffffffffffffffffffffffffffffff169190911791909117909255604094850151600c80549690950151831690930292909116931692909217919091179055565b6000546001600160a01b03163314610fa85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d5b565b610fb23382611516565b50565b610cf583838360405180602001604052806000815250611d5d565b60008467ffffffffffffffff161161100e5760405162461bcd60e51b81526020600482015260016024820152600360fc1b6044820152606401610d5b565b8061105b5760405162461bcd60e51b815260206004820152600e60248201527f4e6f2070726f6f6620676976656e0000000000000000000000000000000000006044820152606401610d5b565b6002546001547f00000000000000000000000000000000000000000000000000000000000022b89167ffffffffffffffff871691036000190161109e9190613930565b11156110d75760405162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b6044820152606401610d5b565b600b54600c546110fb9167ffffffffffffffff90811691600160401b900416612c98565b6111345760405162461bcd60e51b815260206004820152600a6024820152691cd85b1948195b99195960b21b6044820152606401610d5b565b6040516bffffffffffffffffffffffff193360601b166020820152603481018490526000906054016040516020818303038152906040528051906020012090506111b583838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e549150849050612cc3565b6112015760405162461bcd60e51b815260206004820152601b60248201527f4d65726b6c6550726f6f663a20496e76616c69642070726f6f662e00000000006044820152606401610d5b565b336000908152600d602090815260408083208151608081018352905467ffffffffffffffff8082168352600160401b82048116948301859052600160801b82048116938301849052600160c01b9091041660608201819052909392909161126791613948565b6112719190613948565b67ffffffffffffffff169050600087836000015161128f9190613948565b67ffffffffffffffff16905060066112a78284613930565b11156112e15760405162461bcd60e51b81526020600482015260096024820152680c2c4deecca40dac2f60bb1b6044820152606401610d5b565b60068111156113325760405162461bcd60e51b815260206004820152600e60248201527f61626f76652073616c65206d61780000000000000000000000000000000000006044820152606401610d5b565b868867ffffffffffffffff1611156113765760405162461bcd60e51b81526020600482015260076024820152666774207472656560c81b6044820152606401610d5b565b336000908152600d6020526040812080548a929061139f90849067ffffffffffffffff16613948565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508767ffffffffffffffff16600960008282546113e19190613930565b909155506113fb90503367ffffffffffffffff8a16612d80565b5050505050505050565b6000546001600160a01b0316331461145f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d5b565b80516114729060119060208401906133c1565b5050565b600061148182612eed565b5192915050565b60118054611495906139e1565b80601f01602080910402602001604051908101604052809291908181526020018280546114c1906139e1565b801561150e5780601f106114e35761010080835404028352916020019161150e565b820191906000526020600020905b8154815290600101906020018083116114f157829003601f168201915b505050505081565b6000546001600160a01b031633146115705760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d5b565b600a54600c5460589190600160401b900467ffffffffffffffff164211156115ce5760025460015403600019016115c7907f00000000000000000000000000000000000000000000000000000000000022b861399e565b91506115db565b6115d8818361399e565b91505b818311156115e7578192505b6115f18382613930565b600a556115fe8484612d80565b50505050565b60008467ffffffffffffffff16116116425760405162461bcd60e51b81526020600482015260016024820152600360fc1b6044820152606401610d5b565b8061168f5760405162461bcd60e51b815260206004820152600e60248201527f4e6f2070726f6f6620676976656e0000000000000000000000000000000000006044820152606401610d5b565b6002546001547f00000000000000000000000000000000000000000000000000000000000022b89167ffffffffffffffff87169103600019016116d29190613930565b111561170b5760405162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b6044820152606401610d5b565b600b546117329067ffffffffffffffff600160801b8204811691600160c01b900416612c98565b61176b5760405162461bcd60e51b815260206004820152600a6024820152691cd85b1948195b99195960b21b6044820152606401610d5b565b6040516bffffffffffffffffffffffff193360601b166020820152603481018490526000906054016040516020818303038152906040528051906020012090506117ec838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506010549150849050612cc3565b6118385760405162461bcd60e51b815260206004820152601b60248201527f4d65726b6c6550726f6f663a20496e76616c69642070726f6f662e00000000006044820152606401610d5b565b61185467010a741a4627800067ffffffffffffffff871661397f565b34146118a25760405162461bcd60e51b815260206004820152601260248201527f4e6f74207269676874204554482073656e7400000000000000000000000000006044820152606401610d5b565b336000908152600d602090815260408083208151608081018352905467ffffffffffffffff808216808452600160401b83048216958401869052600160801b8304821694840194909452600160c01b9091041660608201819052909392909161190b9190613948565b6119159190613948565b67ffffffffffffffff16905060008783604001516119339190613948565b67ffffffffffffffff169050600661194b8284613930565b11156119855760405162461bcd60e51b81526020600482015260096024820152680c2c4deecca40dac2f60bb1b6044820152606401610d5b565b60068111156119d65760405162461bcd60e51b815260206004820152600e60248201527f61626f76652073616c65206d61780000000000000000000000000000000000006044820152606401610d5b565b868867ffffffffffffffff161115611a1a5760405162461bcd60e51b81526020600482015260076024820152666774207472656560c81b6044820152606401610d5b565b336000908152600d602052604090208054899190601090611a4d908490600160801b900467ffffffffffffffff16613948565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506113fb338967ffffffffffffffff16612d80565b60006001600160a01b038216611ac9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b6000546001600160a01b03163314611b495760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d5b565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b6000546001600160a01b03163314611bfa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d5b565b600e92909255600f55601055565b6000546001600160a01b03163314611c625760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d5b565b73ba89826ae052da88962c0fb23bf3840f594d630e610fb2814761302f565b606060048054610b5a906139e1565b6001600160a01b038216331415611cd3576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611d68848484612a5d565b6001600160a01b0383163b15158015611d8a5750611d8884848484613122565b155b156115fe576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060611dcc826129bb565b611e02576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e0c613265565b9050805160001415611e2d5760405180602001604052806000815250611e58565b80611e3784613274565b604051602001611e489291906138b2565b6040516020818303038152906040525b9392505050565b60008467ffffffffffffffff1611611e9d5760405162461bcd60e51b81526020600482015260016024820152600360fc1b6044820152606401610d5b565b80611eea5760405162461bcd60e51b815260206004820152600e60248201527f4e6f2070726f6f6620676976656e0000000000000000000000000000000000006044820152606401610d5b565b6000600a54600954610d05611eff9190613930565b611f099190613930565b9050808567ffffffffffffffff16611f2a6002546001546000199190030190565b611f349190613930565b1115611f6d5760405162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b6044820152606401610d5b565b600b54611f8e9067ffffffffffffffff80821691600160401b900416612c98565b611fc75760405162461bcd60e51b815260206004820152600a6024820152691cd85b1948195b99195960b21b6044820152606401610d5b565b6040516bffffffffffffffffffffffff193360601b1660208201526034810185905260009060540160405160208183030381529060405280519060200120905061204884848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600f549150849050612cc3565b6120945760405162461bcd60e51b815260206004820152601a60248201527f4d65726b6c6550726f6f663a20496e76616c69642070726f6f660000000000006044820152606401610d5b565b6120af66b1a2bc2ec5000067ffffffffffffffff881661397f565b34146120fd5760405162461bcd60e51b815260206004820152601260248201527f4e6f74207269676874204554482073656e7400000000000000000000000000006044820152606401610d5b565b336000908152600d602090815260408083208151608081018352905467ffffffffffffffff808216808452600160401b8304821695840195909552600160801b82048116938301849052600160c01b9091041660608201819052909392909161216591613948565b61216f9190613948565b67ffffffffffffffff169050600088836020015161218d9190613948565b67ffffffffffffffff16905060066121a58284613930565b11156121df5760405162461bcd60e51b81526020600482015260096024820152680c2c4deecca40dac2f60bb1b6044820152606401610d5b565b60068111156122305760405162461bcd60e51b815260206004820152600e60248201527f61626f76652073616c65206d61780000000000000000000000000000000000006044820152606401610d5b565b878967ffffffffffffffff1611156122745760405162461bcd60e51b81526020600482015260076024820152666774207472656560c81b6044820152606401610d5b565b336000908152600d6020526040902080548a91906008906122a7908490600160401b900467ffffffffffffffff16613948565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506122e1338a67ffffffffffffffff16612d80565b505050505050505050565b6000546001600160a01b031633146123465760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d5b565b600c8054911515600160801b027fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff909216919091179055565b60008167ffffffffffffffff16116123bd5760405162461bcd60e51b81526020600482015260016024820152600360fc1b6044820152606401610d5b565b6002546001547f00000000000000000000000000000000000000000000000000000000000022b89167ffffffffffffffff84169103600019016124009190613930565b11156124395760405162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b6044820152606401610d5b565b600c5461245a9067ffffffffffffffff80821691600160401b900416612c98565b6124935760405162461bcd60e51b815260206004820152600a6024820152691cd85b1948195b99195960b21b6044820152606401610d5b565b6124af67016345785d8a000067ffffffffffffffff831661397f565b34146124fd5760405162461bcd60e51b815260206004820152601260248201527f4e6f74207269676874204554482073656e7400000000000000000000000000006044820152606401610d5b565b336000908152600d602090815260408083208151608081018352905467ffffffffffffffff808216808452600160401b83048216958401869052600160801b83048216948401859052600160c01b90920416606083015290939261256091613948565b61256a9190613948565b67ffffffffffffffff16905060008383606001516125889190613948565b67ffffffffffffffff16905060066125a08284613930565b11156125da5760405162461bcd60e51b81526020600482015260096024820152680c2c4deecca40dac2f60bb1b6044820152606401610d5b565b600281111561262b5760405162461bcd60e51b815260206004820152600e60248201527f61626f76652073616c65206d61780000000000000000000000000000000000006044820152606401610d5b565b336000908152600d60205260409020805485919060189061265e908490600160c01b900467ffffffffffffffff16613948565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506115fe338567ffffffffffffffff16612d80565b6000546001600160a01b031633146126f25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d5b565b73be640005eb23d1cda7eb249540494bef6ba4b3197330c156d9c064fb573aeca82225e1ff5c46a2e806736c44e579e19dc7f892804b83d64202d5ba4397eb73ec2610feabeb0f422670f1b22adce78391408fe673171d64661ee33cc9296ae048c753c529641f65bb7326ee5302d8cc0422ee5dcdf19668c663e2fafb8e73354a70969f0b4a4c994403051a81c2ca45db361573b8842d2efd92d895de19b5339fb1a28bbdd7c11060006402540be4006127b1476401a13b860061397f565b6127bb919061396b565b90506127d4896127cf83630d693a406133a6565b61302f565b6127e6886127cf83630d693a406133a6565b6127f8876127cf8363077359406133a6565b61280a866127cf8363077359406133a6565b61281c846127cf836306dac2c06133a6565b61282e856127cf8363047868c06133a6565b612840836127cf8363047868c06133a6565b612852826127cf836302160ec06133a6565b73ba89826ae052da88962c0fb23bf3840f594d630e612871814761302f565b50505050505050505050565b6000546001600160a01b031633146128d75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d5b565b6001600160a01b0381166129535760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d5b565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000816001111580156129cf575060015482105b8015610b45575050600090815260056020526040902054600160e01b900460ff161590565b600082815260076020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000612a6882612eed565b9050836001600160a01b031681600001516001600160a01b031614612ab9576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000336001600160a01b0386161480612ad75750612ad785336109a3565b80612af2575033612ae784610bdd565b6001600160a01b0316145b905080612b2b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416612b6b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b77600084876129f4565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116612c4d576001548214612c4d578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b600c54600090600160801b900460ff16158015612cb457508242115b8015611e585750504210919050565b600081815b8551811015612d75576000868281518110612cf357634e487b7160e01b600052603260045260246000fd5b60200260200101519050808311612d35576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612d62565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612d6d81613a1c565b915050612cc8565b509092149392505050565b6001546001600160a01b038316612dc3576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81612dfa576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316600081815260066020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000811667ffffffffffffffff8083168a018116918217600160401b67ffffffffffffffff1990941690921783900481168a01811690920217909155858452600590925290912080546001600160e01b031916909217600160a01b4290921691909102179055808083015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210612ea15750600155505050565b60408051606081018252600080825260208201819052918101919091528180600111158015612f1d575060015481105b15612ffd57600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff16151591810182905290612ffb5780516001600160a01b031615612f91579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215612ff6579392505050565b612f91565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8047101561307f5760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e63650000000000000000000000006044820152606401610d5b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146130cc576040519150601f19603f3d011682016040523d82523d6000602084013e6130d1565b606091505b5050905080610cf55760405162461bcd60e51b815260206004820152601260248201527f756e61626c6520746f2073656e642045544800000000000000000000000000006044820152606401610d5b565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081526000906001600160a01b0385169063150b7a02906131709033908990889088906004016138e1565b602060405180830381600087803b15801561318a57600080fd5b505af19250505080156131ba575060408051601f3d908101601f191682019092526131b79181019061376d565b60015b61322e573d8080156131e8576040519150601f19603f3d011682016040523d82523d6000602084013e6131ed565b606091505b508051613226576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b6001600160e01b0319167f150b7a02000000000000000000000000000000000000000000000000000000001490505b949350505050565b606060118054610b5a906139e1565b6060816132985750506040805180820190915260018152600360fc1b602082015290565b8160005b81156132c257806132ac81613a1c565b91506132bb9050600a8361396b565b915061329c565b60008167ffffffffffffffff8111156132eb57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613315576020820181803683370190505b5090505b841561325d5761332a60018361399e565b9150613337600a86613a37565b613342906030613930565b60f81b81838151811061336557634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061339f600a8661396b565b9450613319565b6000633b9aca006133b7838561397f565b611e58919061396b565b8280546133cd906139e1565b90600052602060002090601f0160209004810192826133ef5760008555613435565b82601f1061340857805160ff1916838001178555613435565b82800160010185558215613435579182015b8281111561343557825182559160200191906001019061341a565b50613441929150613445565b5090565b5b808211156134415760008155600101613446565b600067ffffffffffffffff8084111561347557613475613a77565b604051601f8501601f19908116603f0116810190828211818310171561349d5761349d613a77565b816040528093508581528686860111156134b657600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146134e757600080fd5b919050565b600082601f8301126134fc578081fd5b6040516060810181811067ffffffffffffffff8211171561351f5761351f613a77565b604052808360608101861015613533578384fd5b835b600381101561355c5761354782613577565b83526020928301929190910190600101613535565b509195945050505050565b803580151581146134e757600080fd5b803567ffffffffffffffff811681146134e757600080fd5b6000602082840312156135a0578081fd5b611e58826134d0565b600080604083850312156135bb578081fd5b6135c4836134d0565b91506135d2602084016134d0565b90509250929050565b6000806000606084860312156135ef578081fd5b6135f8846134d0565b9250613606602085016134d0565b9150604084013590509250925092565b6000806000806080858703121561362b578081fd5b613634856134d0565b9350613642602086016134d0565b925060408501359150606085013567ffffffffffffffff811115613664578182fd5b8501601f81018713613674578182fd5b6136838782356020840161345a565b91505092959194509250565b600080604083850312156136a1578182fd5b6136aa836134d0565b91506135d260208401613567565b600080604083850312156136ca578182fd5b6136d3836134d0565b946020939093013593505050565b60008060c083850312156136f3578182fd5b6136fd84846134ec565b91506135d284606085016134ec565b60006020828403121561371d578081fd5b611e5882613567565b60008060006060848603121561373a578283fd5b505081359360208301359350604090920135919050565b600060208284031215613762578081fd5b8135611e5881613a8d565b60006020828403121561377e578081fd5b8151611e5881613a8d565b60006020828403121561379a578081fd5b813567ffffffffffffffff8111156137b0578182fd5b8201601f810184136137c0578182fd5b61325d8482356020840161345a565b6000602082840312156137e0578081fd5b5035919050565b6000602082840312156137f8578081fd5b611e5882613577565b60008060008060608587031215613816578182fd5b61381f85613577565b935060208501359250604085013567ffffffffffffffff80821115613842578384fd5b818701915087601f830112613855578384fd5b813581811115613863578485fd5b8860208260051b8501011115613877578485fd5b95989497505060200194505050565b6000815180845261389e8160208601602086016139b5565b601f01601f19169290920160200192915050565b600083516138c48184602088016139b5565b8351908301906138d88183602088016139b5565b01949350505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526139136080830184613886565b9695505050505050565b602081526000611e586020830184613886565b6000821982111561394357613943613a4b565b500190565b600067ffffffffffffffff8083168185168083038211156138d8576138d8613a4b565b60008261397a5761397a613a61565b500490565b600081600019048311821515161561399957613999613a4b565b500290565b6000828210156139b0576139b0613a4b565b500390565b60005b838110156139d05781810151838201526020016139b8565b838111156115fe5750506000910152565b600181811c908216806139f557607f821691505b60208210811415613a1657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613a3057613a30613a4b565b5060010190565b600082613a4657613a46613a61565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610fb257600080fdfea26469706673582212203b7c89020f58c80ad7e83d81e3f92349a7c04ecc000941cecc892c474ad794e764736f6c63430008040033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000022b8000000000000000000000000000000000000000000000000000000000000000c41696b6f205669727475616c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000441494b4f00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Aiko Virtual
Arg [1] : _symbol (string): AIKO
Arg [2] : maxSupply (uint256): 8888

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000022b8
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [4] : 41696b6f205669727475616c0000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 41494b4f00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

51283:9861:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58405:253;;;;;;;;;;-1:-1:-1;58405:253:0;;;;;:::i;:::-;;:::i;:::-;;;9784:25:1;;;9772:2;9757:18;58405:253:0;;;;;;;;28465:305;;;;;;;;;;-1:-1:-1;28465:305:0;;;;;:::i;:::-;;:::i;:::-;;;9611:14:1;;9604:22;9586:41;;9574:2;9559:18;28465:305:0;9541:92:1;52481:24:0;;;;;;;;;;;;;;;;31578:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33081:204::-;;;;;;;;;;-1:-1:-1;33081:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8863:55:1;;;8845:74;;8833:2;8818:18;33081:204:0;8800:125:1;32644:371:0;;;;;;;;;;-1:-1:-1;32644:371:0;;;;;:::i;:::-;;:::i;:::-;;52092:49;;;;;;;;;;-1:-1:-1;52092:49:0;;;;-1:-1:-1;;;52092:49:0;;;;;;;;;16283:18:1;16271:31;;;16253:50;;16241:2;16226:18;52092:49:0;16208:101:1;51759:36:0;;;;;;;;;;;;51794:1;51759:36;;27705:312;;;;;;;;;;-1:-1:-1;27968:12:0;;60558:1;27952:13;:28;-1:-1:-1;;27952:46:0;27705:312;;51890:38;;;;;;;;;;;;51927:1;51890:38;;52315:50;;;;;;;;;;-1:-1:-1;52315:50:0;;;;-1:-1:-1;;;52315:50:0;;;;;;33946:170;;;;;;;;;;-1:-1:-1;33946:170:0;;;;;:::i;:::-;;:::i;51647:54::-;;;;;;;;;;;;51690:11;51647:54;;51459:35;;;;;;;;;;;;;;;53663:499;;;;;;;;;;-1:-1:-1;53663:499:0;;;;;:::i;:::-;;:::i;52892:89::-;;;;;;;;;;-1:-1:-1;52892:89:0;;;;;:::i;:::-;;:::i;52509:25::-;;;;;;;;;;;;;;;;34187:185;;;;;;;;;;-1:-1:-1;34187:185:0;;;;;:::i;:::-;;:::i;54167:1053::-;;;;;;;;;;-1:-1:-1;54167:1053:0;;;;;:::i;:::-;;:::i;52454:23::-;;;;;;;;;;;;;;;;51591:52;;;;;;;;;;;;51633:10;51591:52;;52716:85;;;;;;;;;;-1:-1:-1;52716:85:0;;;;;:::i;:::-;;:::i;51705:48::-;;;;;;;;;;;;51744:9;51705:48;;31386:125;;;;;;;;;;-1:-1:-1;31386:125:0;;;;;:::i;:::-;;:::i;51498:45::-;;;;;;;;;;;;51539:4;51498:45;;52371:21;;;;;;;;;;-1:-1:-1;52371:21:0;;;;-1:-1:-1;;;52371:21:0;;;;;;52147:52;;;;;;;;;;-1:-1:-1;52147:52:0;;;;-1:-1:-1;;;52147:52:0;;;;;;52259;;;;;;;;;;-1:-1:-1;52259:52:0;;;;;;;;52540:21;;;;;;;;;;;;;:::i;52986:467::-;;;;;;;;;;-1:-1:-1;52986:467:0;;;;;:::i;:::-;;:::i;56474:1129::-;;;;;;:::i;:::-;;:::i;28834:206::-;;;;;;;;;;-1:-1:-1;28834:206:0;;;;;:::i;:::-;;:::i;49013:148::-;;;;;;;;;;;;;:::i;52037:51::-;;;;;;;;;;-1:-1:-1;52037:51:0;;;;;;;;53458:200;;;;;;;;;;-1:-1:-1;53458:200:0;;;;;:::i;:::-;;:::i;60111:180::-;;;;;;;;;;;;;:::i;48362:87::-;;;;;;;;;;-1:-1:-1;48408:7:0;48435:6;-1:-1:-1;;;;;48435:6:0;48362:87;;31747:104;;;;;;;;;;;;;:::i;33357:287::-;;;;;;;;;;-1:-1:-1;33357:287:0;;;;;:::i;:::-;;:::i;52398:50::-;;;;;;;;;;-1:-1:-1;52398:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;52398:50:0;;;;;-1:-1:-1;;;52398:50:0;;;;;-1:-1:-1;;;52398:50:0;;;;;;;;;16547:18:1;16592:15;;;16574:34;;16644:15;;;16639:2;16624:18;;16617:43;16696:15;;;16676:18;;;16669:43;;;;16748:15;;;16743:2;16728:18;;16721:43;16524:3;16509:19;52398:50:0;16491:279:1;51968:24:0;;;;;;;;;;;;;;;;34443:369;;;;;;;;;;-1:-1:-1;34443:369:0;;;;;:::i;:::-;;:::i;31922:318::-;;;;;;;;;;-1:-1:-1;31922:318:0;;;;;:::i;:::-;;:::i;55225:1244::-;;;;;;:::i;:::-;;:::i;52806:81::-;;;;;;;;;;-1:-1:-1;52806:81:0;;;;;:::i;:::-;;:::i;51934:30::-;;;;;;;;;;;;;;;;57608:792;;;;;;:::i;:::-;;:::i;58663:1443::-;;;;;;;;;;;;;:::i;33715:164::-;;;;;;;;;;-1:-1:-1;33715:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;33836:25:0;;;33812:4;33836:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;33715:164;52203:50;;;;;;;;;;-1:-1:-1;52203:50:0;;;;-1:-1:-1;;;52203:50:0;;;;;;49316:244;;;;;;;;;;-1:-1:-1;49316:244:0;;;;;:::i;:::-;;:::i;58405:253::-;-1:-1:-1;;;;;58510:16:0;;58462:7;58510:16;;;:11;:16;;;;;;;;58476:50;;;;;;;;;;;;;;;;-1:-1:-1;;;58476:50:0;;;;;;;;;;-1:-1:-1;;;58476:50:0;;;;;;;;;;-1:-1:-1;;;58476:50:0;;;;;;;;;;;;;;;58538:53;;;:::i;:::-;:84;;;;:::i;:::-;:115;;;;:::i;:::-;58531:122;;;58405:253;-1:-1:-1;;;58405:253:0:o;28465:305::-;28567:4;-1:-1:-1;;;;;;28604:40:0;;28619:25;28604:40;;:105;;-1:-1:-1;;;;;;;28661:48:0;;28676:33;28661:48;28604:105;:158;;;-1:-1:-1;21956:25:0;-1:-1:-1;;;;;;21941:40:0;;;28726:36;28584:178;28465:305;-1:-1:-1;;28465:305:0:o;31578:100::-;31632:13;31665:5;31658:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31578:100;:::o;33081:204::-;33149:7;33174:16;33182:7;33174;:16::i;:::-;33169:64;;33199:34;;;;;;;;;;;;;;33169:64;-1:-1:-1;33253:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;33253:24:0;;33081:204::o;32644:371::-;32717:13;32733:24;32749:7;32733:15;:24::i;:::-;32717:40;;32778:5;-1:-1:-1;;;;;32772:11:0;:2;-1:-1:-1;;;;;32772:11:0;;32768:48;;;32792:24;;;;;;;;;;;;;;32768:48;11470:10;-1:-1:-1;;;;;32833:21:0;;;;;;:63;;-1:-1:-1;32859:37:0;32876:5;11470:10;33715:164;:::i;32859:37::-;32858:38;32833:63;32829:138;;;32920:35;;;;;;;;;;;;;;32829:138;32979:28;32988:2;32992:7;33001:5;32979:8;:28::i;:::-;32644:371;;;:::o;33946:170::-;34080:28;34090:4;34096:2;34100:7;34080:9;:28::i;53663:499::-;48408:7;48435:6;-1:-1:-1;;;;;48435:6:0;11470:10;48582:23;48574:68;;;;-1:-1:-1;;;48574:68:0;;13727:2:1;48574:68:0;;;13709:21:1;;;13746:18;;;13739:30;13805:34;13785:18;;;13778:62;13857:18;;48574:68:0;;;;;;;;;53799:12;;53782:14;;:29:::1;::::0;;::::1;::::0;::::1;;53774:47;;;::::0;-1:-1:-1;;;53774:47:0;;12355:2:1;53774:47:0::1;::::0;::::1;12337:21:1::0;12394:1;12374:18;;;12367:29;12432:7;12412:18;;;12405:35;12457:18;;53774:47:0::1;12327:154:1::0;53774:47:0::1;53851:12;::::0;;::::1;::::0;53834:14;;::::1;::::0;:29:::1;::::0;;::::1;::::0;::::1;;53826:47;;;::::0;-1:-1:-1;;;53826:47:0;;14780:2:1;53826:47:0::1;::::0;::::1;14762:21:1::0;14819:1;14799:18;;;14792:29;14857:7;14837:18;;;14830:35;14882:18;;53826:47:0::1;14752:154:1::0;53826:47:0::1;53903:12:::0;;;::::1;::::0;53886:14;;::::1;::::0;:29:::1;::::0;;::::1;::::0;::::1;;53878:47;;;::::0;-1:-1:-1;;;53878:47:0;;15796:2:1;53878:47:0::1;::::0;::::1;15778:21:1::0;15835:1;15815:18;;;15808:29;15873:7;15853:18;;;15846:35;15898:18;;53878:47:0::1;15768:154:1::0;53878:47:0::1;53951:14:::0;;53930:18:::1;:35:::0;;53989:12;;53951:14:::1;54028::::0;;::::1;::::0;54067:12;;::::1;::::0;53930:35:::1;54047:32:::0;;::::1;-1:-1:-1::0;;;54047:32:0::1;53970:31:::0;;::::1;-1:-1:-1::0;;;53970:31:0;;::::1;53930:35:::0;;::::1;53970:31:::0;;;;;;;;::::1;54047:32:::0;;54006:36;;::::1;-1:-1:-1::0;;;54006:36:0::1;54047:32:::0;;;;;;;;;::::1;::::0;;;54106:14;;;::::1;::::0;54084:19:::1;:36:::0;;54145:12;;;::::1;::::0;54125:32;::::1;::::0;;::::1;54084:36:::0;;;::::1;54125:32:::0;;;;;;;;;::::1;::::0;;53663:499::o;52892:89::-;48408:7;48435:6;-1:-1:-1;;;;;48435:6:0;11470:10;48582:23;48574:68;;;;-1:-1:-1;;;48574:68:0;;13727:2:1;48574:68:0;;;13709:21:1;;;13746:18;;;13739:30;13805:34;13785:18;;;13778:62;13857:18;;48574:68:0;13699:182:1;48574:68:0;52947:29:::1;52957:10;52969:6;52947:9;:29::i;:::-;52892:89:::0;:::o;34187:185::-;34325:39;34342:4;34348:2;34352:7;34325:39;;;;;;;;;;;;:16;:39::i;54167:1053::-;54302:1;54288:11;:15;;;54280:29;;;;-1:-1:-1;;;54280:29:0;;10602:2:1;54280:29:0;;;10584:21:1;10641:1;10621:18;;;10614:29;-1:-1:-1;;;10659:18:1;;;10652:31;10700:18;;54280:29:0;10574:150:1;54280:29:0;54322:23;54314:50;;;;-1:-1:-1;;;54314:50:0;;11673:2:1;54314:50:0;;;11655:21:1;11712:2;11692:18;;;11685:30;11751:16;11731:18;;;11724:44;11785:18;;54314:50:0;11645:164:1;54314:50:0;27968:12;;60558:1;27952:13;54408:10;;54377:27;;;;27952:28;-1:-1:-1;;27952:46:0;54377:27;;;;:::i;:::-;:41;;54369:62;;;;-1:-1:-1;;;54369:62:0;;15113:2:1;54369:62:0;;;15095:21:1;15152:1;15132:18;;;15125:29;-1:-1:-1;;;15170:18:1;;;15163:38;15218:18;;54369:62:0;15085:157:1;54369:62:0;54454:18;;54474:17;;54444:48;;54454:18;;;;;-1:-1:-1;;;54474:17:0;;;54444:9;:48::i;:::-;54436:71;;;;-1:-1:-1;;;54436:71:0;;12016:2:1;54436:71:0;;;11998:21:1;12055:2;12035:18;;;12028:30;-1:-1:-1;;;12074:18:1;;;12067:40;12124:18;;54436:71:0;11988:160:1;54436:71:0;54539:36;;-1:-1:-1;;54556:10:0;7605:2:1;7601:15;7597:88;54539:36:0;;;7585:101:1;7702:12;;;7695:28;;;54514:12:0;;7739::1;;54539:36:0;;;;;;;;;;;;54529:47;;;;;;54514:62;;54589:47;54608:11;;54589:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54621:8:0;;;-1:-1:-1;54631:4:0;;-1:-1:-1;54589:18:0;:47::i;:::-;54581:87;;;;-1:-1:-1;;;54581:87:0;;10246:2:1;54581:87:0;;;10228:21:1;10285:2;10265:18;;;10258:30;10324:29;10304:18;;;10297:57;10371:18;;54581:87:0;10218:177:1;54581:87:0;54721:10;54675:31;54709:23;;;:11;:23;;;;;;;;54675:57;;;;;;;;;;;;;;;-1:-1:-1;;;54675:57:0;;;;;;;;;;-1:-1:-1;;;54675:57:0;;;;;;;;;;-1:-1:-1;;;54675:57:0;;;;;;;;;;;;:31;:57;;54757:58;;;:::i;:::-;:89;;;;:::i;:::-;54737:109;;;;54851:23;54903:11;54877:12;:23;;;:37;;;;:::i;:::-;54851:63;;;-1:-1:-1;51584:1:0;54927:27;54851:63;54927:9;:27;:::i;:::-;:41;;54919:63;;;;-1:-1:-1;;;54919:63:0;;12688:2:1;54919:63:0;;;12670:21:1;12727:1;12707:18;;;12700:29;-1:-1:-1;;;12745:18:1;;;12738:39;12794:18;;54919:63:0;12660:158:1;54919:63:0;51794:1;54995:15;:27;;54987:54;;;;-1:-1:-1;;;54987:54:0;;14437:2:1;54987:54:0;;;14419:21:1;14476:2;14456:18;;;14449:30;14515:16;14495:18;;;14488:44;14549:18;;54987:54:0;14409:164:1;54987:54:0;55069:6;55054:11;:21;;;;55046:41;;;;-1:-1:-1;;;55046:41:0;;10931:2:1;55046:41:0;;;10913:21:1;10970:1;10950:18;;;10943:29;-1:-1:-1;;;10988:18:1;;;10981:37;11035:18;;55046:41:0;10903:156:1;55046:41:0;55106:10;55094:23;;;;:11;:23;;;;;:49;;55132:11;;55094:23;:49;;55132:11;;55094:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;55167:11;55148:30;;:15;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;55185:30:0;;-1:-1:-1;55191:10:0;55185:30;;;:5;:30::i;:::-;54167:1053;;;;;;;;:::o;52716:85::-;48408:7;48435:6;-1:-1:-1;;;;;48435:6:0;11470:10;48582:23;48574:68;;;;-1:-1:-1;;;48574:68:0;;13727:2:1;48574:68:0;;;13709:21:1;;;13746:18;;;13739:30;13805:34;13785:18;;;13778:62;13857:18;;48574:68:0;13699:182:1;48574:68:0;52780:16;;::::1;::::0;:7:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;:::-;;52716:85:::0;:::o;31386:125::-;31450:7;31477:21;31490:7;31477:12;:21::i;:::-;:26;;31386:125;-1:-1:-1;;31386:125:0:o;52540:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52986:467::-;48408:7;48435:6;-1:-1:-1;;;;;48435:6:0;11470:10;48582:23;48574:68;;;;-1:-1:-1;;;48574:68:0;;13727:2:1;48574:68:0;;;13709:21:1;;;13746:18;;;13739:30;13805:34;13785:18;;;13778:62;13857:18;;48574:68:0;13699:182:1;48574:68:0;53105:9:::1;::::0;53202:17:::1;::::0;53077:2:::1;::::0;53105:9;-1:-1:-1;;;53202:17:0;::::1;;;53184:15;:35;53180:146;;;27968:12:::0;;60558:1;27952:13;:28;-1:-1:-1;;27952:46:0;53240:26:::1;::::0;:10:::1;:26;:::i;:::-;53227:39;;53180:146;;;53297:23;53310:10:::0;53297;:23:::1;:::i;:::-;53284:36;;53180:146;53345:10;53336:6;:19;53332:56;;;53372:10;53363:19;;53332:56;53406:19;53419:6:::0;53406:10;:19:::1;:::i;:::-;53394:9;:31:::0;53430:18:::1;53436:3:::0;53441:6;53430:5:::1;:18::i;:::-;48653:1;;52986:467:::0;;:::o;56474:1129::-;56627:1;56613:11;:15;;;56605:29;;;;-1:-1:-1;;;56605:29:0;;10602:2:1;56605:29:0;;;10584:21:1;10641:1;10621:18;;;10614:29;-1:-1:-1;;;10659:18:1;;;10652:31;10700:18;;56605:29:0;10574:150:1;56605:29:0;56647:23;56639:50;;;;-1:-1:-1;;;56639:50:0;;11673:2:1;56639:50:0;;;11655:21:1;11712:2;11692:18;;;11685:30;11751:16;11731:18;;;11724:44;11785:18;;56639:50:0;11645:164:1;56639:50:0;27968:12;;60558:1;27952:13;56733:10;;56702:27;;;;27952:28;-1:-1:-1;;27952:46:0;56702:27;;;;:::i;:::-;:41;;56694:62;;;;-1:-1:-1;;;56694:62:0;;15113:2:1;56694:62:0;;;15095:21:1;15152:1;15132:18;;;15125:29;-1:-1:-1;;;15170:18:1;;;15163:38;15218:18;;56694:62:0;15085:157:1;56694:62:0;56779:19;;56769:49;;56779:19;-1:-1:-1;;;56779:19:0;;;;;-1:-1:-1;;;56800:17:0;;;56769:9;:49::i;:::-;56761:72;;;;-1:-1:-1;;;56761:72:0;;12016:2:1;56761:72:0;;;11998:21:1;12055:2;12035:18;;;12028:30;-1:-1:-1;;;12074:18:1;;;12067:40;12124:18;;56761:72:0;11988:160:1;56761:72:0;56865:36;;-1:-1:-1;;56882:10:0;7605:2:1;7601:15;7597:88;56865:36:0;;;7585:101:1;7702:12;;;7695:28;;;56840:12:0;;7739::1;;56865:36:0;;;;;;;;;;;;56855:47;;;;;;56840:62;;56915:49;56934:11;;56915:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56947:10:0;;;-1:-1:-1;56959:4:0;;-1:-1:-1;56915:18:0;:49::i;:::-;56907:89;;;;-1:-1:-1;;;56907:89:0;;10246:2:1;56907:89:0;;;10228:21:1;10285:2;10265:18;;;10258:30;10324:29;10304:18;;;10297:57;10371:18;;56907:89:0;10218:177:1;56907:89:0;57022:30;51690:11;57022:30;;;;:::i;:::-;57009:9;:43;57001:74;;;;-1:-1:-1;;;57001:74:0;;13025:2:1;57001:74:0;;;13007:21:1;13064:2;13044:18;;;13037:30;13103:20;13083:18;;;13076:48;13141:18;;57001:74:0;12997:168:1;57001:74:0;57128:10;57082:31;57116:23;;;:11;:23;;;;;;;;57082:57;;;;;;;;;;;;;;;;-1:-1:-1;;;57082:57:0;;;;;;;;;;-1:-1:-1;;;57082:57:0;;;;;;;;;;;-1:-1:-1;;;57082:57:0;;;;;;;;;;;;:31;:57;;57164:53;;57082:57;57164:53;:::i;:::-;:84;;;;:::i;:::-;57144:104;;;;57253:23;57310:11;57279:12;:28;;;:42;;;;:::i;:::-;57253:68;;;-1:-1:-1;51584:1:0;57334:27;57253:68;57334:9;:27;:::i;:::-;:41;;57326:63;;;;-1:-1:-1;;;57326:63:0;;12688:2:1;57326:63:0;;;12670:21:1;12727:1;12707:18;;;12700:29;-1:-1:-1;;;12745:18:1;;;12738:39;12794:18;;57326:63:0;12660:158:1;57326:63:0;51885:1;57402:15;:33;;57394:60;;;;-1:-1:-1;;;57394:60:0;;14437:2:1;57394:60:0;;;14419:21:1;14476:2;14456:18;;;14449:30;14515:16;14495:18;;;14488:44;14549:18;;57394:60:0;14409:164:1;57394:60:0;57482:6;57467:11;:21;;;;57459:41;;;;-1:-1:-1;;;57459:41:0;;10931:2:1;57459:41:0;;;10913:21:1;10970:1;10950:18;;;10943:29;-1:-1:-1;;;10988:18:1;;;10981:37;11035:18;;57459:41:0;10903:156:1;57459:41:0;57519:10;57507:23;;;;:11;:23;;;;;:54;;57550:11;;57507:23;:39;;:54;;57550:11;;-1:-1:-1;;;57507:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;57568:30;57574:10;57586:11;57568:30;;:5;:30::i;28834:206::-;28898:7;-1:-1:-1;;;;;28922:19:0;;28918:60;;28950:28;;;;;;;;;;;;;;28918:60;-1:-1:-1;;;;;;29004:19:0;;;;;:12;:19;;;;;:27;;;;28834:206::o;49013:148::-;48408:7;48435:6;-1:-1:-1;;;;;48435:6:0;11470:10;48582:23;48574:68;;;;-1:-1:-1;;;48574:68:0;;13727:2:1;48574:68:0;;;13709:21:1;;;13746:18;;;13739:30;13805:34;13785:18;;;13778:62;13857:18;;48574:68:0;13699:182:1;48574:68:0;49120:1:::1;49104:6:::0;;49083:40:::1;::::0;-1:-1:-1;;;;;49104:6:0;;::::1;::::0;49083:40:::1;::::0;49120:1;;49083:40:::1;49151:1;49134:19:::0;;-1:-1:-1;;49134:19:0::1;::::0;;49013:148::o;53458:200::-;48408:7;48435:6;-1:-1:-1;;;;;48435:6:0;11470:10;48582:23;48574:68;;;;-1:-1:-1;;;48574:68:0;;13727:2:1;48574:68:0;;;13709:21:1;;;13746:18;;;13739:30;13805:34;13785:18;;;13778:62;13857:18;;48574:68:0;13699:182:1;48574:68:0;53577:8:::1;:20:::0;;;;53602:9:::1;:22:::0;53629:10:::1;:24:::0;53458:200::o;60111:180::-;48408:7;48435:6;-1:-1:-1;;;;;48435:6:0;11470:10;48582:23;48574:68;;;;-1:-1:-1;;;48574:68:0;;13727:2:1;48574:68:0;;;13709:21:1;;;13746:18;;;13739:30;13805:34;13785:18;;;13778:62;13857:18;;48574:68:0;13699:182:1;48574:68:0;60191:42:::1;60238:48;60191:42:::0;60264:21:::1;60238:10;:48::i;31747:104::-:0;31803:13;31836:7;31829:14;;;;;:::i;33357:287::-;-1:-1:-1;;;;;33456:24:0;;11470:10;33456:24;33452:54;;;33489:17;;;;;;;;;;;;;;33452:54;11470:10;33519:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;33519:42:0;;;;;;;;;;;;:53;;;;;;;;;;;;;33588:48;;9586:41:1;;;33519:42:0;;11470:10;33588:48;;9559:18:1;33588:48:0;;;;;;;33357:287;;:::o;34443:369::-;34610:28;34620:4;34626:2;34630:7;34610:9;:28::i;:::-;-1:-1:-1;;;;;34653:13:0;;3887:20;3926:8;;34653:76;;;;;34673:56;34704:4;34710:2;34714:7;34723:5;34673:30;:56::i;:::-;34672:57;34653:76;34649:156;;;34753:40;;;;;;;;;;;;;;31922:318;31995:13;32026:16;32034:7;32026;:16::i;:::-;32021:59;;32051:29;;;;;;;;;;;;;;32021:59;32093:21;32117:10;:8;:10::i;:::-;32093:34;;32151:7;32145:21;32170:1;32145:26;;:87;;;;;;;;;;;;;;;;;32198:7;32207:18;:7;:16;:18::i;:::-;32181:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32145:87;32138:94;31922:318;-1:-1:-1;;;31922:318:0:o;55225:1244::-;55377:1;55363:11;:15;;;55355:29;;;;-1:-1:-1;;;55355:29:0;;10602:2:1;55355:29:0;;;10584:21:1;10641:1;10621:18;;;10614:29;-1:-1:-1;;;10659:18:1;;;10652:31;10700:18;;55355:29:0;10574:150:1;55355:29:0;55397:23;55389:50;;;;-1:-1:-1;;;55389:50:0;;11673:2:1;55389:50:0;;;11655:21:1;11712:2;11692:18;;;11685:30;11751:16;11731:18;;;11724:44;11785:18;;55389:50:0;11645:164:1;55389:50:0;55444:19;55501:9;;55483:15;;51539:4;55466:32;;;;:::i;:::-;:44;;;;:::i;:::-;55444:66;;55605:11;55590;55574:27;;:13;27968:12;;60558:1;27952:13;-1:-1:-1;;27952:28:0;;;:46;;27705:312;55574:13;:27;;;;:::i;:::-;:42;;55566:63;;;;-1:-1:-1;;;55566:63:0;;15113:2:1;55566:63:0;;;15095:21:1;15152:1;15132:18;;;15125:29;-1:-1:-1;;;15170:18:1;;;15163:38;15218:18;;55566:63:0;15085:157:1;55566:63:0;55652:18;;55642:47;;55652:18;;;;;-1:-1:-1;;;55672:16:0;;;55642:9;:47::i;:::-;55634:70;;;;-1:-1:-1;;;55634:70:0;;12016:2:1;55634:70:0;;;11998:21:1;12055:2;12035:18;;;12028:30;-1:-1:-1;;;12074:18:1;;;12067:40;12124:18;;55634:70:0;11988:160:1;55634:70:0;55736:36;;-1:-1:-1;;55753:10:0;7605:2:1;7601:15;7597:88;55736:36:0;;;7585:101:1;7702:12;;;7695:28;;;55711:12:0;;7739::1;;55736:36:0;;;;;;;;;;;;55726:47;;;;;;55711:62;;55786:48;55805:11;;55786:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55818:9:0;;;-1:-1:-1;55829:4:0;;-1:-1:-1;55786:18:0;:48::i;:::-;55778:87;;;;-1:-1:-1;;;55778:87:0;;13372:2:1;55778:87:0;;;13354:21:1;13411:2;13391:18;;;13384:30;13450:28;13430:18;;;13423:56;13496:18;;55778:87:0;13344:176:1;55778:87:0;55891:29;51633:10;55891:29;;;;:::i;:::-;55878:9;:42;55870:73;;;;-1:-1:-1;;;55870:73:0;;13025:2:1;55870:73:0;;;13007:21:1;13064:2;13044:18;;;13037:30;13103:20;13083:18;;;13076:48;13141:18;;55870:73:0;12997:168:1;55870:73:0;55996:10;55950:31;55984:23;;;:11;:23;;;;;;;;55950:57;;;;;;;;;;;;;;;;-1:-1:-1;;;55950:57:0;;;;;;;;;;;-1:-1:-1;;;55950:57:0;;;;;;;;;;-1:-1:-1;;;55950:57:0;;;;;;;;;;;;:31;:57;;56032:54;;;:::i;:::-;:85;;;;:::i;:::-;56012:105;;;;56122:23;56178:11;56148:12;:27;;;:41;;;;:::i;:::-;56122:67;;;-1:-1:-1;51584:1:0;56202:27;56122:67;56202:9;:27;:::i;:::-;:41;;56194:63;;;;-1:-1:-1;;;56194:63:0;;12688:2:1;56194:63:0;;;12670:21:1;12727:1;12707:18;;;12700:29;-1:-1:-1;;;12745:18:1;;;12738:39;12794:18;;56194:63:0;12660:158:1;56194:63:0;51839:1;56270:15;:32;;56262:59;;;;-1:-1:-1;;;56262:59:0;;14437:2:1;56262:59:0;;;14419:21:1;14476:2;14456:18;;;14449:30;14515:16;14495:18;;;14488:44;14549:18;;56262:59:0;14409:164:1;56262:59:0;56349:6;56334:11;:21;;;;56326:41;;;;-1:-1:-1;;;56326:41:0;;10931:2:1;56326:41:0;;;10913:21:1;10970:1;10950:18;;;10943:29;-1:-1:-1;;;10988:18:1;;;10981:37;11035:18;;56326:41:0;10903:156:1;56326:41:0;56386:10;56374:23;;;;:11;:23;;;;;:53;;56416:11;;56374:23;:38;;:53;;56416:11;;-1:-1:-1;;;56374:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;56434:30;56440:10;56452:11;56434:30;;:5;:30::i;:::-;55225:1244;;;;;;;;;:::o;52806:81::-;48408:7;48435:6;-1:-1:-1;;;;;48435:6:0;11470:10;48582:23;48574:68;;;;-1:-1:-1;;;48574:68:0;;13727:2:1;48574:68:0;;;13709:21:1;;;13746:18;;;13739:30;13805:34;13785:18;;;13778:62;13857:18;;48574:68:0;13699:182:1;48574:68:0;52864:9:::1;:18:::0;;;::::1;;-1:-1:-1::0;;;52864:18:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;52806:81::o;57608:792::-;57696:1;57682:11;:15;;;57674:29;;;;-1:-1:-1;;;57674:29:0;;10602:2:1;57674:29:0;;;10584:21:1;10641:1;10621:18;;;10614:29;-1:-1:-1;;;10659:18:1;;;10652:31;10700:18;;57674:29:0;10574:150:1;57674:29:0;27968:12;;60558:1;27952:13;57747:10;;57716:27;;;;27952:28;-1:-1:-1;;27952:46:0;57716:27;;;;:::i;:::-;:41;;57708:62;;;;-1:-1:-1;;;57708:62:0;;15113:2:1;57708:62:0;;;15095:21:1;15152:1;15132:18;;;15125:29;-1:-1:-1;;;15170:18:1;;;15163:38;15218:18;;57708:62:0;15085:157:1;57708:62:0;57793:19;;57783:49;;57793:19;;;;;-1:-1:-1;;;57814:17:0;;;57783:9;:49::i;:::-;57775:72;;;;-1:-1:-1;;;57775:72:0;;12016:2:1;57775:72:0;;;11998:21:1;12055:2;12035:18;;;12028:30;-1:-1:-1;;;12074:18:1;;;12067:40;12124:18;;57775:72:0;11988:160:1;57775:72:0;57873:26;51744:9;57873:26;;;;:::i;:::-;57860:9;:39;57852:70;;;;-1:-1:-1;;;57852:70:0;;13025:2:1;57852:70:0;;;13007:21:1;13064:2;13044:18;;;13037:30;13103:20;13083:18;;;13076:48;13141:18;;57852:70:0;12997:168:1;57852:70:0;57975:10;57929:31;57963:23;;;:11;:23;;;;;;;;57929:57;;;;;;;;;;;;;;;;-1:-1:-1;;;57929:57:0;;;;;;;;;;-1:-1:-1;;;57929:57:0;;;;;;;;;;-1:-1:-1;;;57929:57:0;;;;;;;;;;:31;58011:53;;;:::i;:::-;:84;;;;:::i;:::-;57991:104;;;;58100:23;58157:11;58126:12;:28;;;:42;;;;:::i;:::-;58100:68;;;-1:-1:-1;51584:1:0;58181:27;58100:68;58181:9;:27;:::i;:::-;:41;;58173:63;;;;-1:-1:-1;;;58173:63:0;;12688:2:1;58173:63:0;;;12670:21:1;12727:1;12707:18;;;12700:29;-1:-1:-1;;;12745:18:1;;;12738:39;12794:18;;58173:63:0;12660:158:1;58173:63:0;51927:1;58249:15;:29;;58241:56;;;;-1:-1:-1;;;58241:56:0;;14437:2:1;58241:56:0;;;14419:21:1;14476:2;14456:18;;;14449:30;14515:16;14495:18;;;14488:44;14549:18;;58241:56:0;14409:164:1;58241:56:0;58316:10;58304:23;;;;:11;:23;;;;;:54;;58347:11;;58304:23;:39;;:54;;58347:11;;-1:-1:-1;;;58304:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;58365:30;58371:10;58383:11;58365:30;;:5;:30::i;58663:1443::-;48408:7;48435:6;-1:-1:-1;;;;;48435:6:0;11470:10;48582:23;48574:68;;;;-1:-1:-1;;;48574:68:0;;13727:2:1;48574:68:0;;;13709:21:1;;;13746:18;;;13739:30;13805:34;13785:18;;;13778:62;13857:18;;48574:68:0;13699:182:1;48574:68:0;58726:42:::1;58787;58851;58918;58982;59045;59110;59173;58710:13;59276:7;59244:30;59253:21;59244:6;:30;:::i;:::-;59243:40;;;;:::i;:::-;59222:61;;59308:58;59319:5;59326:39;59342:10;59354;59326:15;:39::i;:::-;59308:10;:58::i;:::-;59390:56;59401:3;59406:39;59422:10;59434;59406:15;:39::i;59390:56::-;59470:59;59481:6;59489:39;59505:10;59517;59489:15;:39::i;59470:59::-;59553:62;59564:9;59575:39;59591:10;59603;59575:15;:39::i;59553:62::-;59639:58;59650:5;59657:39;59673:10;59685;59657:15;:39::i;59639:58::-;59721:59;59732:6;59740:39;59756:10;59768;59740:15;:39::i;59721:59::-;59803:60;59814:7;59823:39;59839:10;59851;59823:15;:39::i;59803:60::-;59886:58;59897:5;59904:39;59920:10;59932;59904:15;:39::i;59886:58::-;59993:42;60040:48;59993:42:::0;60066:21:::1;60040:10;:48::i;:::-;48653:1;;;;;;;;;;58663:1443::o:0;49316:244::-;48408:7;48435:6;-1:-1:-1;;;;;48435:6:0;11470:10;48582:23;48574:68;;;;-1:-1:-1;;;48574:68:0;;13727:2:1;48574:68:0;;;13709:21:1;;;13746:18;;;13739:30;13805:34;13785:18;;;13778:62;13857:18;;48574:68:0;13699:182:1;48574:68:0;-1:-1:-1;;;;;49405:22:0;::::1;49397:73;;;::::0;-1:-1:-1;;;49397:73:0;;11266:2:1;49397:73:0::1;::::0;::::1;11248:21:1::0;11305:2;11285:18;;;11278:30;11344:34;11324:18;;;11317:62;11415:8;11395:18;;;11388:36;11441:19;;49397:73:0::1;11238:228:1::0;49397:73:0::1;49507:6;::::0;;49486:38:::1;::::0;-1:-1:-1;;;;;49486:38:0;;::::1;::::0;49507:6;::::1;::::0;49486:38:::1;::::0;::::1;49535:6;:17:::0;;-1:-1:-1;;49535:17:0::1;-1:-1:-1::0;;;;;49535:17:0;;;::::1;::::0;;;::::1;::::0;;49316:244::o;35067:174::-;35124:4;35167:7;60558:1;35148:26;;:53;;;;;35188:13;;35178:7;:23;35148:53;:85;;;;-1:-1:-1;;35206:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;35206:27:0;;;;35205:28;;35067:174::o;44297:196::-;44412:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;44412:29:0;-1:-1:-1;;;;;44412:29:0;;;;;;;;;44457:28;;44412:24;;44457:28;;;;;;;44297:196;;;:::o;39245:2130::-;39360:35;39398:21;39411:7;39398:12;:21::i;:::-;39360:59;;39458:4;-1:-1:-1;;;;;39436:26:0;:13;:18;;;-1:-1:-1;;;;;39436:26:0;;39432:67;;39471:28;;;;;;;;;;;;;;39432:67;39512:22;11470:10;-1:-1:-1;;;;;39538:20:0;;;;:73;;-1:-1:-1;39575:36:0;39592:4;11470:10;33715:164;:::i;39575:36::-;39538:126;;;-1:-1:-1;11470:10:0;39628:20;39640:7;39628:11;:20::i;:::-;-1:-1:-1;;;;;39628:36:0;;39538:126;39512:153;;39683:17;39678:66;;39709:35;;;;;;;;;;;;;;39678:66;-1:-1:-1;;;;;39759:16:0;;39755:52;;39784:23;;;;;;;;;;;;;;39755:52;39928:35;39945:1;39949:7;39958:4;39928:8;:35::i;:::-;-1:-1:-1;;;;;40259:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;40259:31:0;;;;;;;-1:-1:-1;;40259:31:0;;;;;;;40305:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;40305:29:0;;;;;;;;;;;40385:20;;;:11;:20;;;;;;40420:18;;-1:-1:-1;;;;;;40453:49:0;;;;-1:-1:-1;;;40486:15:0;40453:49;;;;;;;;;;40776:11;;40836:24;;;;;40879:13;;40385:20;;40836:24;;40879:13;40875:384;;41089:13;;41074:11;:28;41070:174;;41127:20;;41196:28;;;;41170:54;;-1:-1:-1;;;41170:54:0;-1:-1:-1;;;;;;41170:54:0;;;-1:-1:-1;;;;;41127:20:0;;41170:54;;;;41070:174;39245:2130;;;41306:7;41302:2;-1:-1:-1;;;;;41287:27:0;41296:4;-1:-1:-1;;;;;41287:27:0;;;;;;;;;;;39245:2130;;;;;:::o;60296:171::-;60393:9;;60374:4;;-1:-1:-1;;;60393:9:0;;;;60392:10;:41;;;;;60424:9;60406:15;:27;60392:41;:70;;;;-1:-1:-1;;60437:15:0;:25;;60385:77;-1:-1:-1;60296:171:0:o;50378:830::-;50503:4;50543;50503;50560:525;50584:5;:12;50580:1;:16;50560:525;;;50618:20;50641:5;50647:1;50641:8;;;;;;-1:-1:-1;;;50641:8:0;;;;;;;;;;;;;;;50618:31;;50686:12;50670;:28;50666:408;;50823:44;;;;;;7919:19:1;;;7954:12;;;7947:28;;;7991:12;;50823:44:0;;;;;;;;;;;;50813:55;;;;;;50798:70;;50666:408;;;51013:44;;;;;;7919:19:1;;;7954:12;;;7947:28;;;7991:12;;51013:44:0;;;;;;;;;;;;51003:55;;;;;;50988:70;;50666:408;-1:-1:-1;50598:3:0;;;;:::i;:::-;;;;50560:525;;;-1:-1:-1;51180:20:0;;;;50378:830;-1:-1:-1;;;50378:830:0:o;37810:1181::-;37906:13;;-1:-1:-1;;;;;37934:16:0;;37930:48;;37959:19;;;;;;;;;;;;;;37930:48;37993:13;37989:44;;38015:18;;;;;;;;;;;;;;37989:44;-1:-1:-1;;;;;38384:16:0;;;;;;:12;:16;;;;;;;;:44;;38443:49;;;38384:44;;;;;;;;38443:49;;;-1:-1:-1;;;;;38384:44:0;;;;;;38443:49;;;;;;;;;;;;;;;;38509:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;38559:66:0;;;;-1:-1:-1;;;38609:15:0;38559:66;;;;;;;;;;38509:25;38706:23;;;38746:111;38773:40;;38798:14;;;;;-1:-1:-1;;;;;38773:40:0;;;38790:1;;38773:40;;38790:1;;38773:40;38852:3;38837:12;:18;38746:111;;-1:-1:-1;38873:13:0;:28;32644:371;;;:::o;30215:1109::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;30326:7:0;;60558:1;30375:23;;:47;;;;;30409:13;;30402:4;:20;30375:47;30371:886;;;30443:31;30477:17;;;:11;:17;;;;;;;;;30443:51;;;;;;;;;-1:-1:-1;;;;;30443:51:0;;;;-1:-1:-1;;;30443:51:0;;;;;;;;;;;-1:-1:-1;;;30443:51:0;;;;;;;;;;;;;;30513:729;;30563:14;;-1:-1:-1;;;;;30563:28:0;;30559:101;;30627:9;30215:1109;-1:-1:-1;;;30215:1109:0:o;30559:101::-;-1:-1:-1;;;31002:6:0;31047:17;;;;:11;:17;;;;;;;;;31035:29;;;;;;;;;-1:-1:-1;;;;;31035:29:0;;;;;-1:-1:-1;;;31035:29:0;;;;;;;;;;;-1:-1:-1;;;31035:29:0;;;;;;;;;;;;;31095:28;31091:109;;31163:9;30215:1109;-1:-1:-1;;;30215:1109:0:o;31091:109::-;30962:261;;;30371:886;;31285:31;;;;;;;;;;;;;;60569:319;60671:6;60646:21;:31;;60638:64;;;;-1:-1:-1;;;60638:64:0;;14088:2:1;60638:64:0;;;14070:21:1;14127:2;14107:18;;;14100:30;14166:22;14146:18;;;14139:50;14206:18;;60638:64:0;14060:170:1;60638:64:0;60780:12;60806:9;-1:-1:-1;;;;;60798:23:0;60829:6;60798:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60779:61;;;60853:7;60845:38;;;;-1:-1:-1;;;60845:38:0;;15449:2:1;60845:38:0;;;15431:21:1;15488:2;15468:18;;;15461:30;15527:20;15507:18;;;15500:48;15565:18;;60845:38:0;15421:168:1;44985:667:0;45169:72;;;;;45148:4;;-1:-1:-1;;;;;45169:36:0;;;;;:72;;11470:10;;45220:4;;45226:7;;45235:5;;45169:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45169:72:0;;;;;;;;-1:-1:-1;;45169:72:0;;;;;;;;;;;;:::i;:::-;;;45165:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45403:13:0;;45399:235;;45449:40;;;;;;;;;;;;;;45399:235;45592:6;45586:13;45577:6;45573:2;45569:15;45562:38;45165:480;-1:-1:-1;;;;;;45288:55:0;45298:45;45288:55;;-1:-1:-1;45165:480:0;44985:667;;;;;;:::o;61042:99::-;61102:13;61129:7;61122:14;;;;;:::i;12032:723::-;12088:13;12309:10;12305:53;;-1:-1:-1;;12336:10:0;;;;;;;;;;;;-1:-1:-1;;;12336:10:0;;;;;12032:723::o;12305:53::-;12383:5;12368:12;12424:78;12431:9;;12424:78;;12457:8;;;;:::i;:::-;;-1:-1:-1;12480:10:0;;-1:-1:-1;12488:2:0;12480:10;;:::i;:::-;;;12424:78;;;12512:19;12544:6;12534:17;;;;;;-1:-1:-1;;;12534:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12534:17:0;;12512:39;;12562:154;12569:10;;12562:154;;12596:11;12606:1;12596:11;;:::i;:::-;;-1:-1:-1;12665:10:0;12673:2;12665:5;:10;:::i;:::-;12652:24;;:2;:24;:::i;:::-;12639:39;;12622:6;12629;12622:14;;;;;;-1:-1:-1;;;12622:14:0;;;;;;;;;;;;:56;;;;;;;;;;-1:-1:-1;12693:11:0;12702:2;12693:11;;:::i;:::-;;;12562:154;;60893:144;60979:7;61026:6;61001:21;61009:13;61001:5;:21;:::i;:::-;61000:32;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:690:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;289:2;283:9;355:2;343:15;;-1:-1:-1;;339:24:1;;;365:2;335:33;331:42;319:55;;;389:18;;;409:22;;;386:46;383:2;;;435:18;;:::i;:::-;475:10;471:2;464:22;504:6;495:15;;534:6;526;519:22;574:3;565:6;560:3;556:16;553:25;550:2;;;591:1;588;581:12;550:2;641:6;636:3;629:4;621:6;617:17;604:44;696:1;689:4;680:6;672;668:19;664:30;657:41;;;;88:616;;;;;:::o;709:196::-;777:20;;-1:-1:-1;;;;;826:54:1;;816:65;;806:2;;895:1;892;885:12;806:2;758:147;;;:::o;910:706::-;959:5;1012:3;1005:4;997:6;993:17;989:27;979:2;;1034:5;1027;1020:20;979:2;1071;1065:9;1113:2;1105:6;1101:15;1182:6;1170:10;1167:22;1146:18;1134:10;1131:34;1128:62;1125:2;;;1193:18;;:::i;:::-;1229:2;1222:22;1264:6;1290;1323:2;1311:15;;1308:24;-1:-1:-1;1305:2:1;;;1349:5;1342;1335:20;1305:2;1375:5;1389:197;1403:4;1400:1;1397:11;1389:197;;;1462:22;1480:3;1462:22;:::i;:::-;1450:35;;1508:4;1532:12;;;;1564;;;;;1423:1;1416:9;1389:197;;;-1:-1:-1;1604:6:1;;969:647;-1:-1:-1;;;;;969:647:1:o;1621:160::-;1686:20;;1742:13;;1735:21;1725:32;;1715:2;;1771:1;1768;1761:12;1786:171;1853:20;;1913:18;1902:30;;1892:41;;1882:2;;1947:1;1944;1937:12;1962:196;2021:6;2074:2;2062:9;2053:7;2049:23;2045:32;2042:2;;;2095:6;2087;2080:22;2042:2;2123:29;2142:9;2123:29;:::i;2163:270::-;2231:6;2239;2292:2;2280:9;2271:7;2267:23;2263:32;2260:2;;;2313:6;2305;2298:22;2260:2;2341:29;2360:9;2341:29;:::i;:::-;2331:39;;2389:38;2423:2;2412:9;2408:18;2389:38;:::i;:::-;2379:48;;2250:183;;;;;:::o;2438:338::-;2515:6;2523;2531;2584:2;2572:9;2563:7;2559:23;2555:32;2552:2;;;2605:6;2597;2590:22;2552:2;2633:29;2652:9;2633:29;:::i;:::-;2623:39;;2681:38;2715:2;2704:9;2700:18;2681:38;:::i;:::-;2671:48;;2766:2;2755:9;2751:18;2738:32;2728:42;;2542:234;;;;;:::o;2781:696::-;2876:6;2884;2892;2900;2953:3;2941:9;2932:7;2928:23;2924:33;2921:2;;;2975:6;2967;2960:22;2921:2;3003:29;3022:9;3003:29;:::i;:::-;2993:39;;3051:38;3085:2;3074:9;3070:18;3051:38;:::i;:::-;3041:48;;3136:2;3125:9;3121:18;3108:32;3098:42;;3191:2;3180:9;3176:18;3163:32;3218:18;3210:6;3207:30;3204:2;;;3255:6;3247;3240:22;3204:2;3283:22;;3336:4;3328:13;;3324:27;-1:-1:-1;3314:2:1;;3370:6;3362;3355:22;3314:2;3398:73;3463:7;3458:2;3445:16;3440:2;3436;3432:11;3398:73;:::i;:::-;3388:83;;;2911:566;;;;;;;:::o;3482:264::-;3547:6;3555;3608:2;3596:9;3587:7;3583:23;3579:32;3576:2;;;3629:6;3621;3614:22;3576:2;3657:29;3676:9;3657:29;:::i;:::-;3647:39;;3705:35;3736:2;3725:9;3721:18;3705:35;:::i;3751:264::-;3819:6;3827;3880:2;3868:9;3859:7;3855:23;3851:32;3848:2;;;3901:6;3893;3886:22;3848:2;3929:29;3948:9;3929:29;:::i;:::-;3919:39;4005:2;3990:18;;;;3977:32;;-1:-1:-1;;;3838:177:1:o;4020:343::-;4132:6;4140;4193:3;4181:9;4172:7;4168:23;4164:33;4161:2;;;4215:6;4207;4200:22;4161:2;4243:43;4278:7;4267:9;4243:43;:::i;:::-;4233:53;;4305:52;4349:7;4344:2;4333:9;4329:18;4305:52;:::i;4368:190::-;4424:6;4477:2;4465:9;4456:7;4452:23;4448:32;4445:2;;;4498:6;4490;4483:22;4445:2;4526:26;4542:9;4526:26;:::i;4563:326::-;4640:6;4648;4656;4709:2;4697:9;4688:7;4684:23;4680:32;4677:2;;;4730:6;4722;4715:22;4677:2;-1:-1:-1;;4758:23:1;;;4828:2;4813:18;;4800:32;;-1:-1:-1;4879:2:1;4864:18;;;4851:32;;4667:222;-1:-1:-1;4667:222:1:o;4894:255::-;4952:6;5005:2;4993:9;4984:7;4980:23;4976:32;4973:2;;;5026:6;5018;5011:22;4973:2;5070:9;5057:23;5089:30;5113:5;5089:30;:::i;5154:259::-;5223:6;5276:2;5264:9;5255:7;5251:23;5247:32;5244:2;;;5297:6;5289;5282:22;5244:2;5334:9;5328:16;5353:30;5377:5;5353:30;:::i;5418:480::-;5487:6;5540:2;5528:9;5519:7;5515:23;5511:32;5508:2;;;5561:6;5553;5546:22;5508:2;5606:9;5593:23;5639:18;5631:6;5628:30;5625:2;;;5676:6;5668;5661:22;5625:2;5704:22;;5757:4;5749:13;;5745:27;-1:-1:-1;5735:2:1;;5791:6;5783;5776:22;5735:2;5819:73;5884:7;5879:2;5866:16;5861:2;5857;5853:11;5819:73;:::i;5903:190::-;5962:6;6015:2;6003:9;5994:7;5990:23;5986:32;5983:2;;;6036:6;6028;6021:22;5983:2;-1:-1:-1;6064:23:1;;5973:120;-1:-1:-1;5973:120:1:o;6098:194::-;6156:6;6209:2;6197:9;6188:7;6184:23;6180:32;6177:2;;;6230:6;6222;6215:22;6177:2;6258:28;6276:9;6258:28;:::i;6297:805::-;6400:6;6408;6416;6424;6477:2;6465:9;6456:7;6452:23;6448:32;6445:2;;;6498:6;6490;6483:22;6445:2;6526:28;6544:9;6526:28;:::i;:::-;6516:38;;6601:2;6590:9;6586:18;6573:32;6563:42;;6656:2;6645:9;6641:18;6628:32;6679:18;6720:2;6712:6;6709:14;6706:2;;;6741:6;6733;6726:22;6706:2;6784:6;6773:9;6769:22;6759:32;;6829:7;6822:4;6818:2;6814:13;6810:27;6800:2;;6856:6;6848;6841:22;6800:2;6901;6888:16;6927:2;6919:6;6916:14;6913:2;;;6948:6;6940;6933:22;6913:2;7006:7;7001:2;6991:6;6988:1;6984:14;6980:2;6976:23;6972:32;6969:45;6966:2;;;7032:6;7024;7017:22;6966:2;6435:667;;;;-1:-1:-1;;7068:2:1;7060:11;;-1:-1:-1;;;6435:667:1:o;7107:316::-;7148:3;7186:5;7180:12;7213:6;7208:3;7201:19;7229:63;7285:6;7278:4;7273:3;7269:14;7262:4;7255:5;7251:16;7229:63;:::i;:::-;7337:2;7325:15;-1:-1:-1;;7321:88:1;7312:98;;;;7412:4;7308:109;;7156:267;-1:-1:-1;;7156:267:1:o;8014:470::-;8193:3;8231:6;8225:13;8247:53;8293:6;8288:3;8281:4;8273:6;8269:17;8247:53;:::i;:::-;8363:13;;8322:16;;;;8385:57;8363:13;8322:16;8419:4;8407:17;;8385:57;:::i;:::-;8458:20;;8201:283;-1:-1:-1;;;;8201:283:1:o;8930:511::-;9124:4;-1:-1:-1;;;;;9234:2:1;9226:6;9222:15;9211:9;9204:34;9286:2;9278:6;9274:15;9269:2;9258:9;9254:18;9247:43;;9326:6;9321:2;9310:9;9306:18;9299:34;9369:3;9364:2;9353:9;9349:18;9342:31;9390:45;9430:3;9419:9;9415:19;9407:6;9390:45;:::i;:::-;9382:53;9133:308;-1:-1:-1;;;;;;9133:308:1:o;9820:219::-;9969:2;9958:9;9951:21;9932:4;9989:44;10029:2;10018:9;10014:18;10006:6;9989:44;:::i;16775:128::-;16815:3;16846:1;16842:6;16839:1;16836:13;16833:2;;;16852:18;;:::i;:::-;-1:-1:-1;16888:9:1;;16823:80::o;16908:236::-;16947:3;16975:18;17020:2;17017:1;17013:10;17050:2;17047:1;17043:10;17081:3;17077:2;17073:12;17068:3;17065:21;17062:2;;;17089:18;;:::i;17149:120::-;17189:1;17215;17205:2;;17220:18;;:::i;:::-;-1:-1:-1;17254:9:1;;17195:74::o;17274:228::-;17314:7;17440:1;-1:-1:-1;;17368:74:1;17365:1;17362:81;17357:1;17350:9;17343:17;17339:105;17336:2;;;17447:18;;:::i;:::-;-1:-1:-1;17487:9:1;;17326:176::o;17507:125::-;17547:4;17575:1;17572;17569:8;17566:2;;;17580:18;;:::i;:::-;-1:-1:-1;17617:9:1;;17556:76::o;17637:258::-;17709:1;17719:113;17733:6;17730:1;17727:13;17719:113;;;17809:11;;;17803:18;17790:11;;;17783:39;17755:2;17748:10;17719:113;;;17850:6;17847:1;17844:13;17841:2;;;-1:-1:-1;;17885:1:1;17867:16;;17860:27;17690:205::o;17900:437::-;17979:1;17975:12;;;;18022;;;18043:2;;18097:4;18089:6;18085:17;18075:27;;18043:2;18150;18142:6;18139:14;18119:18;18116:38;18113:2;;;-1:-1:-1;;;18184:1:1;18177:88;18288:4;18285:1;18278:15;18316:4;18313:1;18306:15;18113:2;;17955:382;;;:::o;18342:195::-;18381:3;-1:-1:-1;;18405:5:1;18402:77;18399:2;;;18482:18;;:::i;:::-;-1:-1:-1;18529:1:1;18518:13;;18389:148::o;18542:112::-;18574:1;18600;18590:2;;18605:18;;:::i;:::-;-1:-1:-1;18639:9:1;;18580:74::o;18659:184::-;-1:-1:-1;;;18708:1:1;18701:88;18808:4;18805:1;18798:15;18832:4;18829:1;18822:15;18848:184;-1:-1:-1;;;18897:1:1;18890:88;18997:4;18994:1;18987:15;19021:4;19018:1;19011:15;19037:184;-1:-1:-1;;;19086:1:1;19079:88;19186:4;19183:1;19176:15;19210:4;19207:1;19200:15;19226:177;-1:-1:-1;;;;;;19304:5:1;19300:78;19293:5;19290:89;19280:2;;19393:1;19390;19383:12

Swarm Source

ipfs://3b7c89020f58c80ad7e83d81e3f92349a7c04ecc000941cecc892c474ad794e7
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.