ETH Price: $3,355.84 (-2.72%)
Gas: 3 Gwei

Token

Hudroidz (DROID)
 

Overview

Max Total Supply

331 DROID

Holders

54

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 DROID
0x3ab55ab060f74acfdddb23eb6b1ce6b5c353bf3a
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Hudroidz

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-01
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

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

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: erc721a/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

    // Mapping owner address to address data
    mapping(address => AddressData) 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 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;
    }

    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 {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _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 (safe && 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 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 This is 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: contracts/Hurdoidz.sol






pragma solidity ^0.8.12;

contract Hudroidz is ERC721A, Ownable {
    using Strings for uint256;

    uint256 public constant RESERVED_TOKENS = 220;
    uint256 public constant FOR_SALE_TOKENS = 10000 - RESERVED_TOKENS;
    address public constant RESERVED_TOKENS_ADDRESS = 0xD8a81E68b37ebc80AEd62D3cA89d54A161926c4b;

    uint256 public constant STAGE_STOPPED = 0;
    uint256 public constant STAGE_PRESALE = 1;
    uint256 public constant STAGE_PUBLIC  = 2;
    uint256 public currentStage = STAGE_STOPPED;

    uint256 public tokenPricePresaleOG = 0.08 ether;
    uint256 public tokenPricePresaleWL1 = 0.09 ether;
    uint256 public tokenPricePresaleWL2 = 0.10 ether;
    uint256 public tokenPricePublicSale = 0.12 ether;

    uint256 public maxTokensPerAddressPresaleOG = 20;
    uint256 public maxTokensPerAddressPresaleWL1 = 20;
    uint256 public maxTokensPerAddressPresaleWL2 = 20;
    uint256 public maxTokensPerAddress = 20;
    uint256 public maxTokensPerTransaction = 20;

    uint256 public presaleTotalLimit = FOR_SALE_TOKENS;

    bytes32 public whitelistRootOG = 0x10d366b33b7841b6168135af512cd865eeb0839a12b3056fdda2c5e071309b34;
    bytes32 public whitelistRoot1 = 0x0e477df0b43c6def604414581f486f8fa50d7eff2b7fef396fb4b18683e4f2e1;
    bytes32 public whitelistRoot2 = 0x16d5905f8b7124ffbe2362357cf780097f701ad0bcbc6f3d7b3e518c58f188ec;

    string public tokenBaseURI;

    uint256 public soldAmount = 0;
    mapping(address => uint256) public purchased;

    constructor() ERC721A("Hudroidz", "DROID") {
        _safeMint(RESERVED_TOKENS_ADDRESS, RESERVED_TOKENS);
    }

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

    function stopSale() external onlyOwner {
        currentStage = STAGE_STOPPED;
    }

    function startPresale() external onlyOwner {
        currentStage = STAGE_PRESALE;
    }

    function startPublicSale() external onlyOwner {
        currentStage = STAGE_PUBLIC;
    }

    function setTokenPricePresaleOG(uint256 val) external onlyOwner {
        tokenPricePresaleOG = val;
    }

    function setTokenPricePresaleWL1(uint256 val) external onlyOwner {
        tokenPricePresaleWL1 = val;
    }

    function setTokenPricePresaleWL2(uint256 val) external onlyOwner {
        tokenPricePresaleWL2 = val;
    }
    
    function setTokenPricePublicSale(uint256 val) external onlyOwner {
        tokenPricePublicSale = val;
    }

    function setMaxTokensPerTransaction(uint256 val) external onlyOwner {
        maxTokensPerTransaction = val;
    }

    function setMaxTokensPerAddressPresaleOG(uint256 val) external onlyOwner {
        maxTokensPerAddressPresaleOG = val;
    }

    function setMaxTokensPerAddressPresaleWL1(uint256 val) external onlyOwner {
        maxTokensPerAddressPresaleWL1 = val;
    }

    function setMaxTokensPerAddressPresaleWL2(uint256 val) external onlyOwner {
        maxTokensPerAddressPresaleWL2 = val;
    }

    function setMaxTokensPerAddress(uint256 val) external onlyOwner {
        maxTokensPerAddress = val;
    }

    function setPresaleTotalLimit(uint256 val) external onlyOwner {
        presaleTotalLimit = val;
    }

    function setWhitelistRoot1(bytes32 val) external onlyOwner {
        whitelistRoot1 = val;
    }

    function setWhitelistRoot2(bytes32 val) external onlyOwner {
        whitelistRoot2 = val;
    }

    function setWhitelistRootOG(bytes32 val) external onlyOwner {
        whitelistRootOG = val;
    }

    function tokenPrice(address target, bytes32[] memory proof) public view returns (uint256) {
        bytes32 leaf = keccak256(abi.encodePacked(target));

        if (currentStage == STAGE_PRESALE) {
            if (MerkleProof.verify(proof, whitelistRootOG, leaf)) {
                return tokenPricePresaleOG;
            } else if (MerkleProof.verify(proof, whitelistRoot1, leaf)) {
                return tokenPricePresaleWL1;
            } else if (MerkleProof.verify(proof, whitelistRoot2, leaf)) {
                return tokenPricePresaleWL2;
            }
        }
        return tokenPricePublicSale;
    }

    function getMaxTokensForPhase(address target, bytes32[] memory proof) public view returns (uint256) {
        bytes32 leaf = keccak256(abi.encodePacked(target));

        if (currentStage == STAGE_PUBLIC) {
            return maxTokensPerAddress;
        } else if (currentStage == STAGE_PRESALE) {
            if (MerkleProof.verify(proof, whitelistRootOG, leaf)) {
                return maxTokensPerAddressPresaleOG;
            } else if (MerkleProof.verify(proof, whitelistRoot1, leaf)) {
                return maxTokensPerAddressPresaleWL1;
            } else if (MerkleProof.verify(proof, whitelistRoot2, leaf)) {
                return maxTokensPerAddressPresaleWL2;
            } else {
                return 0;
            }
        } else {
            return 0;
        }
    }

    function safeSub(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a < b) {
            return 0;
        }
        return a - b;
    }

    function getMaxTokensAllowed(address target, bytes32[] memory proof) public view returns (uint256) {
        uint256 maxAllowedTokens = getMaxTokensForPhase(target, proof);

        uint256 tokensLeftForAddress = safeSub(maxAllowedTokens, purchased[target]);
        maxAllowedTokens = min(maxAllowedTokens, tokensLeftForAddress);

        if (currentStage == STAGE_PRESALE) {
            uint256 presaleTokensLeft = safeSub(presaleTotalLimit, soldAmount);
            maxAllowedTokens = min(maxAllowedTokens, presaleTokensLeft);
        }

        uint256 publicSaleTokensLeft = safeSub(FOR_SALE_TOKENS, soldAmount);
        maxAllowedTokens = min(maxAllowedTokens, publicSaleTokensLeft);

        return min(maxAllowedTokens, maxTokensPerTransaction);
    }

    function getContractInfo(address target, bytes32[] memory proof) external view returns (
        uint256 _currentStage,
        uint256 _maxTokensAllowed,
        uint256 _tokenPrice,
        uint256 _soldAmount,
        uint256 _purchasedAmount,
        uint256 _presaleTotalLimit,
        bytes32 _whitelistRoot1,
        bytes32 _whitelistRoot2,
        bytes32 _whitelistRootOG
    ) {
        _currentStage = currentStage;
        _maxTokensAllowed = getMaxTokensAllowed(target, proof);
        _tokenPrice = tokenPrice(target, proof); 
        _soldAmount = soldAmount;
        _purchasedAmount = purchased[target];
        _presaleTotalLimit = presaleTotalLimit;
        _whitelistRoot1 = whitelistRoot1;
        _whitelistRoot2 = whitelistRoot2;
        _whitelistRootOG = whitelistRootOG;
    }

    function mint(uint256 amount, bytes32[] memory proof) external payable {
        require(msg.value >= tokenPrice(msg.sender, proof) * amount, "Incorrect ETH sent");
        require(amount <= getMaxTokensAllowed(msg.sender, proof), "Cannot mint more than the max allowed tokens");

        _safeMint(msg.sender, amount);
        purchased[msg.sender] += amount;
        soldAmount += amount;
    }

    function _baseURI() internal view override(ERC721A) returns (string memory) {
        return tokenBaseURI;
    }
   
    function setBaseURI(string calldata URI) external onlyOwner {
        tokenBaseURI = URI;
    }

    function withdraw() external onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }
    
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"FOR_SALE_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED_TOKENS_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAGE_PRESALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAGE_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAGE_STOPPED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"getContractInfo","outputs":[{"internalType":"uint256","name":"_currentStage","type":"uint256"},{"internalType":"uint256","name":"_maxTokensAllowed","type":"uint256"},{"internalType":"uint256","name":"_tokenPrice","type":"uint256"},{"internalType":"uint256","name":"_soldAmount","type":"uint256"},{"internalType":"uint256","name":"_purchasedAmount","type":"uint256"},{"internalType":"uint256","name":"_presaleTotalLimit","type":"uint256"},{"internalType":"bytes32","name":"_whitelistRoot1","type":"bytes32"},{"internalType":"bytes32","name":"_whitelistRoot2","type":"bytes32"},{"internalType":"bytes32","name":"_whitelistRootOG","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"getMaxTokensAllowed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"getMaxTokensForPhase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"maxTokensPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokensPerAddressPresaleOG","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokensPerAddressPresaleWL1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokensPerAddressPresaleWL2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokensPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleTotalLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"purchased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setMaxTokensPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setMaxTokensPerAddressPresaleOG","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setMaxTokensPerAddressPresaleWL1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setMaxTokensPerAddressPresaleWL2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setMaxTokensPerTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setPresaleTotalLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setTokenPricePresaleOG","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setTokenPricePresaleWL1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setTokenPricePresaleWL2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setTokenPricePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"val","type":"bytes32"}],"name":"setWhitelistRoot1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"val","type":"bytes32"}],"name":"setWhitelistRoot2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"val","type":"bytes32"}],"name":"setWhitelistRootOG","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"soldAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopSale","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":[],"name":"tokenBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPricePresaleOG","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPricePresaleWL1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPricePresaleWL2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPricePublicSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistRoot1","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistRoot2","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistRootOG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600060095567011c37937e080000600a5567013fbe85edc90000600b5567016345785d8a0000600c556701aa535d3d0c0000600d556014600e556014600f5560146010556014601155601460125560dc6127106200006391906200057b565b6013557f10d366b33b7841b6168135af512cd865eeb0839a12b3056fdda2c5e071309b346014557f0e477df0b43c6def604414581f486f8fa50d7eff2b7fef396fb4b18683e4f2e16015557f16d5905f8b7124ffbe2362357cf780097f701ad0bcbc6f3d7b3e518c58f188ec6016556000601855348015620000e457600080fd5b506040805180820182526008815267243ab23937b4b23d60c11b602080830191825283518085019094526005845264111493d25160da1b9084015281519192916200013291600291620004d5565b50805162000148906003906020840190620004d5565b50506001600055506200015b3362000182565b6200017c73d8a81e68b37ebc80aed62d3ca89d54a161926c4b60dc620001d4565b6200068b565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620001f6828260405180602001604052806000815250620001fa60201b60201c565b5050565b6200020983838360016200020e565b505050565b6000546001600160a01b0385166200023857604051622e076360e81b815260040160405180910390fd5b836000036200025a5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546001600160801b031981166001600160401b038083168c018116918217680100000000000000006001600160401b031990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801562000313575062000313876001600160a01b0316620003d260201b62001acd1760201c565b1562000392575b60405182906001600160a01b0389169060009060008051602062003218833981519152908290a460018201916200035790600090899088620003e1565b62000375576040516368d2bf6b60e11b815260040160405180910390fd5b8082036200031a5782600054146200038c57600080fd5b620003c7565b5b6040516001830192906001600160a01b0389169060009060008051602062003218833981519152908290a480820362000393575b506000555050505050565b6001600160a01b03163b151590565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029062000418903390899088908890600401620005a1565b6020604051808303816000875af192505050801562000456575060408051601f3d908101601f1916820190925262000453918101906200061c565b60015b620004b8573d80801562000487576040519150601f19603f3d011682016040523d82523d6000602084013e6200048c565b606091505b508051600003620004b0576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b828054620004e3906200064f565b90600052602060002090601f01602090048101928262000507576000855562000552565b82601f106200052257805160ff191683800117855562000552565b8280016001018555821562000552579182015b828111156200055257825182559160200191906001019062000535565b506200056092915062000564565b5090565b5b8082111562000560576000815560010162000565565b6000828210156200059c57634e487b7160e01b600052601160045260246000fd5b500390565b600060018060a01b038087168352602081871681850152856040850152608060608501528451915081608085015260005b82811015620005f05785810182015185820160a001528101620005d2565b828111156200060357600060a084870101525b5050601f01601f19169190910160a00195945050505050565b6000602082840312156200062f57600080fd5b81516001600160e01b0319811681146200064857600080fd5b9392505050565b600181811c908216806200066457607f821691505b6020821081036200068557634e487b7160e01b600052602260045260246000fd5b50919050565b612b7d806200069b6000396000f3fe6080604052600436106103b85760003560e01c806361649cd7116101f2578063b88d4fde1161010d578063e8812ae3116100a0578063f85aff941161006f578063f85aff9414610ad0578063f92b7a2114610ae6578063fa1a5f5914610afc578063fbf302f014610b1257600080fd5b8063e8812ae314610a32578063e985e9c514610a47578063f2fde38b14610a90578063f7cd60d114610ab057600080fd5b8063dbb84f11116100dc578063dbb84f11146109bf578063dc504f13146109df578063e13f116114610a07578063e36b0b3714610a1d57600080fd5b8063b88d4fde14610956578063ba41b0c614610976578063c87b56dd14610989578063daab3f09146109a957600080fd5b80637aa44ff8116101855780639a591c57116101545780639a591c57146108ea578063a22cb46514610900578063a9327edd14610920578063ae3aa72f1461093657600080fd5b80637aa44ff81461088b5780637e046f30146108a15780638da5cb5b146108b757806395d89b41146108d557600080fd5b806370a08231116101c157806370a0823114610820578063715018a6146108405780637617731c1461085557806378c5fe371461087557600080fd5b806361649cd7146107b55780636352211e146107d557806368fc68c7146107f55780637018555b1461080a57600080fd5b8063285de8ca116102e25780634e99b8001161027557806355e6738d1161024457806355e6738d1461074a57806355f804b31461075f5780635bf5d54c1461077f5780635d2f80b41461079557600080fd5b80634e99b800146106d25780635099da90146106e7578063522fe98e146106fd578063543133131461072a57600080fd5b80634324851a116102b15780634324851a1461066857806346c4dc271461068857806348e34258146106a85780634d8fae95146106bd57600080fd5b8063285de8ca146105af5780632d84a94c146105cf5780633ccfd60b1461063357806342842e0e1461064857600080fd5b80631449d3e61161035a578063197eaeef11610329578063197eaeef1461053957806321abde101461055957806323a1baaa1461057957806323b872dd1461058f57600080fd5b80631449d3e6146104b857806314a61822146104d857806314ff2779146104fc57806318160ddd1461051c57600080fd5b8063081812fc11610396578063081812fc1461042b578063095ea7b3146104635780630c1c972a14610483578063109541121461049857600080fd5b806301ffc9a7146103bd57806304c98b2b146103f257806306fdde0314610409575b600080fd5b3480156103c957600080fd5b506103dd6103d8366004612578565b610b32565b60405190151581526020015b60405180910390f35b3480156103fe57600080fd5b50610407610bcf565b005b34801561041557600080fd5b5061041e610c23565b6040516103e991906125ed565b34801561043757600080fd5b5061044b610446366004612600565b610cb5565b6040516001600160a01b0390911681526020016103e9565b34801561046f57600080fd5b5061040761047e366004612635565b610d12565b34801561048f57600080fd5b50610407610dd1565b3480156104a457600080fd5b506104076104b3366004612600565b610e20565b3480156104c457600080fd5b506104076104d3366004612600565b610e6d565b3480156104e457600080fd5b506104ee600f5481565b6040519081526020016103e9565b34801561050857600080fd5b50610407610517366004612600565b610eba565b34801561052857600080fd5b5060015460005403600019016104ee565b34801561054557600080fd5b50610407610554366004612600565b610f07565b34801561056557600080fd5b50610407610574366004612600565b610f54565b34801561058557600080fd5b506104ee60115481565b34801561059b57600080fd5b506104076105aa36600461265f565b610fa1565b3480156105bb57600080fd5b506104ee6105ca366004612762565b610fac565b3480156105db57600080fd5b506105ef6105ea366004612762565b611064565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e0830152610100820152610120016103e9565b34801561063f57600080fd5b506104076110d6565b34801561065457600080fd5b5061040761066336600461265f565b611144565b34801561067457600080fd5b506104ee610683366004612762565b61115f565b34801561069457600080fd5b506104076106a3366004612600565b61120a565b3480156106b457600080fd5b506104ee600081565b3480156106c957600080fd5b506104ee611257565b3480156106de57600080fd5b5061041e611267565b3480156106f357600080fd5b506104ee60165481565b34801561070957600080fd5b506104ee6107183660046127b0565b60196020526000908152604090205481565b34801561073657600080fd5b50610407610745366004612600565b6112f5565b34801561075657600080fd5b506104ee600281565b34801561076b57600080fd5b5061040761077a3660046127cb565b611342565b34801561078b57600080fd5b506104ee60095481565b3480156107a157600080fd5b506104076107b0366004612600565b611396565b3480156107c157600080fd5b506104076107d0366004612600565b6113e3565b3480156107e157600080fd5b5061044b6107f0366004612600565b611430565b34801561080157600080fd5b506104ee60dc81565b34801561081657600080fd5b506104ee600a5481565b34801561082c57600080fd5b506104ee61083b3660046127b0565b611442565b34801561084c57600080fd5b506104076114aa565b34801561086157600080fd5b50610407610870366004612600565b6114fc565b34801561088157600080fd5b506104ee600d5481565b34801561089757600080fd5b506104ee600b5481565b3480156108ad57600080fd5b506104ee60135481565b3480156108c357600080fd5b506008546001600160a01b031661044b565b3480156108e157600080fd5b5061041e611549565b3480156108f657600080fd5b506104ee600e5481565b34801561090c57600080fd5b5061040761091b36600461283d565b611558565b34801561092c57600080fd5b506104ee60105481565b34801561094257600080fd5b506104ee610951366004612762565b611606565b34801561096257600080fd5b50610407610971366004612879565b6116ab565b610407610984366004612939565b6116fc565b34801561099557600080fd5b5061041e6109a4366004612600565b61182a565b3480156109b557600080fd5b506104ee600c5481565b3480156109cb57600080fd5b506104076109da366004612600565b6118c7565b3480156109eb57600080fd5b5061044b73d8a81e68b37ebc80aed62d3ca89d54a161926c4b81565b348015610a1357600080fd5b506104ee60155481565b348015610a2957600080fd5b50610407611914565b348015610a3e57600080fd5b506104ee600181565b348015610a5357600080fd5b506103dd610a6236600461296a565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610a9c57600080fd5b50610407610aab3660046127b0565b611963565b348015610abc57600080fd5b50610407610acb366004612600565b611a33565b348015610adc57600080fd5b506104ee60125481565b348015610af257600080fd5b506104ee60145481565b348015610b0857600080fd5b506104ee60185481565b348015610b1e57600080fd5b50610407610b2d366004612600565b611a80565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480610b9557506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610bc957507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6008546001600160a01b03163314610c1c5760405162461bcd60e51b81526020600482018190526024820152600080516020612b2883398151915260448201526064015b60405180910390fd5b6001600955565b606060028054610c329061299d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5e9061299d565b8015610cab5780601f10610c8057610100808354040283529160200191610cab565b820191906000526020600020905b815481529060010190602001808311610c8e57829003601f168201915b5050505050905090565b6000610cc082611adc565b610cf6576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610d1d82611430565b9050806001600160a01b0316836001600160a01b031603610d6a576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03821614801590610d8a5750610d888133610a62565b155b15610dc1576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dcc838383611b15565b505050565b6008546001600160a01b03163314610e195760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b6002600955565b6008546001600160a01b03163314610e685760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b600b55565b6008546001600160a01b03163314610eb55760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b601255565b6008546001600160a01b03163314610f025760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b601355565b6008546001600160a01b03163314610f4f5760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b601555565b6008546001600160a01b03163314610f9c5760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b601055565b610dcc838383611b89565b6040516bffffffffffffffffffffffff19606084901b1660208201526000908190603401604051602081830303815290604052805190602001209050600260095403610ffc575050601154610bc9565b60016009540361105a576110138360145483611dc5565b15611022575050600e54610bc9565b61102f8360155483611dc5565b1561103e575050600f54610bc9565b61104b8360165483611dc5565b1561105a575050601054610bc9565b6000915050610bc9565b60095460008080808080808061107a8b8b61115f565b97506110868b8b611606565b96506018549550601960008c6001600160a01b03166001600160a01b0316815260200190815260200160002054945060135493506015549250601654915060145490509295985092959850929598565b6008546001600160a01b0316331461111e5760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b60405133904780156108fc02916000818181858888f1935050505061114257600080fd5b565b610dcc838383604051806020016040528060008152506116ab565b60008061116c8484610fac565b6001600160a01b03851660009081526019602052604081205491925090611194908390611ddb565b90506111a08282611df7565b91506001600954036111cc5760006111bc601354601854611ddb565b90506111c88382611df7565b9250505b60006111e66111de60dc6127106129ed565b601854611ddb565b90506111f28382611df7565b925061120083601254611df7565b9695505050505050565b6008546001600160a01b031633146112525760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b600d55565b61126460dc6127106129ed565b81565b601780546112749061299d565b80601f01602080910402602001604051908101604052809291908181526020018280546112a09061299d565b80156112ed5780601f106112c2576101008083540402835291602001916112ed565b820191906000526020600020905b8154815290600101906020018083116112d057829003601f168201915b505050505081565b6008546001600160a01b0316331461133d5760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b600f55565b6008546001600160a01b0316331461138a5760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b610dcc601783836124c9565b6008546001600160a01b031633146113de5760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b601455565b6008546001600160a01b0316331461142b5760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b600a55565b600061143b82611e0d565b5192915050565b60006001600160a01b038216611484576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b031633146114f25760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b6111426000611f4f565b6008546001600160a01b031633146115445760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b601655565b606060038054610c329061299d565b336001600160a01b0383160361159a576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6040516bffffffffffffffffffffffff19606084901b16602082015260009081906034016040516020818303038152906040528051906020012090506001600954036116a0576116598360145483611dc5565b15611668575050600a54610bc9565b6116758360155483611dc5565b15611684575050600b54610bc9565b6116918360165483611dc5565b156116a0575050600c54610bc9565b5050600d5492915050565b6116b6848484611b89565b6001600160a01b0383163b151580156116d857506116d684848484611fb9565b155b156116f6576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b816117073383611606565b6117119190612a04565b3410156117605760405162461bcd60e51b815260206004820152601260248201527f496e636f7272656374204554482073656e7400000000000000000000000000006044820152606401610c13565b61176a338261115f565b8211156117df5760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f74206d696e74206d6f7265207468616e20746865206d617820616c60448201527f6c6f77656420746f6b656e7300000000000000000000000000000000000000006064820152608401610c13565b6117e933836120d7565b3360009081526019602052604081208054849290611808908490612a23565b9250508190555081601860008282546118219190612a23565b90915550505050565b606061183582611adc565b61186b576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006118756120f5565b9050805160000361189557604051806020016040528060008152506118c0565b8061189f84612104565b6040516020016118b0929190612a3b565b6040516020818303038152906040525b9392505050565b6008546001600160a01b0316331461190f5760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b601155565b6008546001600160a01b0316331461195c5760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b6000600955565b6008546001600160a01b031633146119ab5760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b6001600160a01b038116611a275760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610c13565b611a3081611f4f565b50565b6008546001600160a01b03163314611a7b5760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b600c55565b6008546001600160a01b03163314611ac85760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b600e55565b6001600160a01b03163b151590565b600081600111158015611af0575060005482105b8015610bc9575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b9482611e0d565b9050836001600160a01b031681600001516001600160a01b031614611be5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000336001600160a01b0386161480611c035750611c038533610a62565b80611c1e575033611c1384610cb5565b6001600160a01b0316145b905080611c57576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416611c97576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ca360008487611b15565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611d79576000548214611d79578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b600082611dd28584612239565b14949350505050565b600081831015611ded57506000610bc9565b6118c082846129ed565b6000818310611e0657816118c0565b5090919050565b60408051606081018252600080825260208201819052918101919091528180600111158015611e3d575060005481105b15611f1d57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff16151591810182905290611f1b5780516001600160a01b031615611eb1579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215611f16579392505050565b611eb1565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081526000906001600160a01b0385169063150b7a0290612007903390899088908890600401612a6a565b6020604051808303816000875af1925050508015612042575060408051601f3d908101601f1916820190925261203f91810190612a9c565b60015b6120a0573d808015612070576040519150601f19603f3d011682016040523d82523d6000602084013e612075565b606091505b508051600003612098576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b0319167f150b7a02000000000000000000000000000000000000000000000000000000001490505b949350505050565b6120f18282604051806020016040528060008152506122ad565b5050565b606060178054610c329061299d565b60608160000361214757505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612171578061215b81612ab9565b915061216a9050600a83612ae9565b915061214b565b60008167ffffffffffffffff81111561218c5761218c61269b565b6040519080825280601f01601f1916602001820160405280156121b6576020820181803683370190505b5090505b84156120cf576121cb6001836129ed565b91506121d8600a86612afd565b6121e3906030612a23565b60f81b8183815181106121f8576121f8612b11565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612232600a86612ae9565b94506121ba565b600081815b84518110156122a557600085828151811061225b5761225b612b11565b602002602001015190508083116122815760008381526020829052604090209250612292565b600081815260208490526040902092505b508061229d81612ab9565b91505061223e565b509392505050565b610dcc83838360016000546001600160a01b0385166122f8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600003612332576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000811667ffffffffffffffff8083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b4290921691909102179055808085018380156123f357506001600160a01b0387163b15155b1561247b575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46124446000888480600101955088611fb9565b612461576040516368d2bf6b60e11b815260040160405180910390fd5b8082036123f957826000541461247657600080fd5b6124c0565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480820361247c575b50600055611dbe565b8280546124d59061299d565b90600052602060002090601f0160209004810192826124f7576000855561253d565b82601f106125105782800160ff1982351617855561253d565b8280016001018555821561253d579182015b8281111561253d578235825591602001919060010190612522565b5061254992915061254d565b5090565b5b80821115612549576000815560010161254e565b6001600160e01b031981168114611a3057600080fd5b60006020828403121561258a57600080fd5b81356118c081612562565b60005b838110156125b0578181015183820152602001612598565b838111156116f65750506000910152565b600081518084526125d9816020860160208601612595565b601f01601f19169290920160200192915050565b6020815260006118c060208301846125c1565b60006020828403121561261257600080fd5b5035919050565b80356001600160a01b038116811461263057600080fd5b919050565b6000806040838503121561264857600080fd5b61265183612619565b946020939093013593505050565b60008060006060848603121561267457600080fd5b61267d84612619565b925061268b60208501612619565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156126da576126da61269b565b604052919050565b600082601f8301126126f357600080fd5b8135602067ffffffffffffffff82111561270f5761270f61269b565b8160051b61271e8282016126b1565b928352848101820192828101908785111561273857600080fd5b83870192505b848310156127575782358252918301919083019061273e565b979650505050505050565b6000806040838503121561277557600080fd5b61277e83612619565b9150602083013567ffffffffffffffff81111561279a57600080fd5b6127a6858286016126e2565b9150509250929050565b6000602082840312156127c257600080fd5b6118c082612619565b600080602083850312156127de57600080fd5b823567ffffffffffffffff808211156127f657600080fd5b818501915085601f83011261280a57600080fd5b81358181111561281957600080fd5b86602082850101111561282b57600080fd5b60209290920196919550909350505050565b6000806040838503121561285057600080fd5b61285983612619565b91506020830135801515811461286e57600080fd5b809150509250929050565b6000806000806080858703121561288f57600080fd5b61289885612619565b935060206128a7818701612619565b935060408601359250606086013567ffffffffffffffff808211156128cb57600080fd5b818801915088601f8301126128df57600080fd5b8135818111156128f1576128f161269b565b61290384601f19601f840116016126b1565b9150808252898482850101111561291957600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561294c57600080fd5b82359150602083013567ffffffffffffffff81111561279a57600080fd5b6000806040838503121561297d57600080fd5b61298683612619565b915061299460208401612619565b90509250929050565b600181811c908216806129b157607f821691505b6020821081036129d157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156129ff576129ff6129d7565b500390565b6000816000190483118215151615612a1e57612a1e6129d7565b500290565b60008219821115612a3657612a366129d7565b500190565b60008351612a4d818460208801612595565b835190830190612a61818360208801612595565b01949350505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261120060808301846125c1565b600060208284031215612aae57600080fd5b81516118c081612562565b60006000198203612acc57612acc6129d7565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082612af857612af8612ad3565b500490565b600082612b0c57612b0c612ad3565b500690565b634e487b7160e01b600052603260045260246000fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122062eb8f417d6f2d238d62bc62dffb20190ff30f1844bf6f97dc76bd5c42504d7764736f6c634300080d0033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

Deployed Bytecode

0x6080604052600436106103b85760003560e01c806361649cd7116101f2578063b88d4fde1161010d578063e8812ae3116100a0578063f85aff941161006f578063f85aff9414610ad0578063f92b7a2114610ae6578063fa1a5f5914610afc578063fbf302f014610b1257600080fd5b8063e8812ae314610a32578063e985e9c514610a47578063f2fde38b14610a90578063f7cd60d114610ab057600080fd5b8063dbb84f11116100dc578063dbb84f11146109bf578063dc504f13146109df578063e13f116114610a07578063e36b0b3714610a1d57600080fd5b8063b88d4fde14610956578063ba41b0c614610976578063c87b56dd14610989578063daab3f09146109a957600080fd5b80637aa44ff8116101855780639a591c57116101545780639a591c57146108ea578063a22cb46514610900578063a9327edd14610920578063ae3aa72f1461093657600080fd5b80637aa44ff81461088b5780637e046f30146108a15780638da5cb5b146108b757806395d89b41146108d557600080fd5b806370a08231116101c157806370a0823114610820578063715018a6146108405780637617731c1461085557806378c5fe371461087557600080fd5b806361649cd7146107b55780636352211e146107d557806368fc68c7146107f55780637018555b1461080a57600080fd5b8063285de8ca116102e25780634e99b8001161027557806355e6738d1161024457806355e6738d1461074a57806355f804b31461075f5780635bf5d54c1461077f5780635d2f80b41461079557600080fd5b80634e99b800146106d25780635099da90146106e7578063522fe98e146106fd578063543133131461072a57600080fd5b80634324851a116102b15780634324851a1461066857806346c4dc271461068857806348e34258146106a85780634d8fae95146106bd57600080fd5b8063285de8ca146105af5780632d84a94c146105cf5780633ccfd60b1461063357806342842e0e1461064857600080fd5b80631449d3e61161035a578063197eaeef11610329578063197eaeef1461053957806321abde101461055957806323a1baaa1461057957806323b872dd1461058f57600080fd5b80631449d3e6146104b857806314a61822146104d857806314ff2779146104fc57806318160ddd1461051c57600080fd5b8063081812fc11610396578063081812fc1461042b578063095ea7b3146104635780630c1c972a14610483578063109541121461049857600080fd5b806301ffc9a7146103bd57806304c98b2b146103f257806306fdde0314610409575b600080fd5b3480156103c957600080fd5b506103dd6103d8366004612578565b610b32565b60405190151581526020015b60405180910390f35b3480156103fe57600080fd5b50610407610bcf565b005b34801561041557600080fd5b5061041e610c23565b6040516103e991906125ed565b34801561043757600080fd5b5061044b610446366004612600565b610cb5565b6040516001600160a01b0390911681526020016103e9565b34801561046f57600080fd5b5061040761047e366004612635565b610d12565b34801561048f57600080fd5b50610407610dd1565b3480156104a457600080fd5b506104076104b3366004612600565b610e20565b3480156104c457600080fd5b506104076104d3366004612600565b610e6d565b3480156104e457600080fd5b506104ee600f5481565b6040519081526020016103e9565b34801561050857600080fd5b50610407610517366004612600565b610eba565b34801561052857600080fd5b5060015460005403600019016104ee565b34801561054557600080fd5b50610407610554366004612600565b610f07565b34801561056557600080fd5b50610407610574366004612600565b610f54565b34801561058557600080fd5b506104ee60115481565b34801561059b57600080fd5b506104076105aa36600461265f565b610fa1565b3480156105bb57600080fd5b506104ee6105ca366004612762565b610fac565b3480156105db57600080fd5b506105ef6105ea366004612762565b611064565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e0830152610100820152610120016103e9565b34801561063f57600080fd5b506104076110d6565b34801561065457600080fd5b5061040761066336600461265f565b611144565b34801561067457600080fd5b506104ee610683366004612762565b61115f565b34801561069457600080fd5b506104076106a3366004612600565b61120a565b3480156106b457600080fd5b506104ee600081565b3480156106c957600080fd5b506104ee611257565b3480156106de57600080fd5b5061041e611267565b3480156106f357600080fd5b506104ee60165481565b34801561070957600080fd5b506104ee6107183660046127b0565b60196020526000908152604090205481565b34801561073657600080fd5b50610407610745366004612600565b6112f5565b34801561075657600080fd5b506104ee600281565b34801561076b57600080fd5b5061040761077a3660046127cb565b611342565b34801561078b57600080fd5b506104ee60095481565b3480156107a157600080fd5b506104076107b0366004612600565b611396565b3480156107c157600080fd5b506104076107d0366004612600565b6113e3565b3480156107e157600080fd5b5061044b6107f0366004612600565b611430565b34801561080157600080fd5b506104ee60dc81565b34801561081657600080fd5b506104ee600a5481565b34801561082c57600080fd5b506104ee61083b3660046127b0565b611442565b34801561084c57600080fd5b506104076114aa565b34801561086157600080fd5b50610407610870366004612600565b6114fc565b34801561088157600080fd5b506104ee600d5481565b34801561089757600080fd5b506104ee600b5481565b3480156108ad57600080fd5b506104ee60135481565b3480156108c357600080fd5b506008546001600160a01b031661044b565b3480156108e157600080fd5b5061041e611549565b3480156108f657600080fd5b506104ee600e5481565b34801561090c57600080fd5b5061040761091b36600461283d565b611558565b34801561092c57600080fd5b506104ee60105481565b34801561094257600080fd5b506104ee610951366004612762565b611606565b34801561096257600080fd5b50610407610971366004612879565b6116ab565b610407610984366004612939565b6116fc565b34801561099557600080fd5b5061041e6109a4366004612600565b61182a565b3480156109b557600080fd5b506104ee600c5481565b3480156109cb57600080fd5b506104076109da366004612600565b6118c7565b3480156109eb57600080fd5b5061044b73d8a81e68b37ebc80aed62d3ca89d54a161926c4b81565b348015610a1357600080fd5b506104ee60155481565b348015610a2957600080fd5b50610407611914565b348015610a3e57600080fd5b506104ee600181565b348015610a5357600080fd5b506103dd610a6236600461296a565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610a9c57600080fd5b50610407610aab3660046127b0565b611963565b348015610abc57600080fd5b50610407610acb366004612600565b611a33565b348015610adc57600080fd5b506104ee60125481565b348015610af257600080fd5b506104ee60145481565b348015610b0857600080fd5b506104ee60185481565b348015610b1e57600080fd5b50610407610b2d366004612600565b611a80565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480610b9557506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610bc957507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6008546001600160a01b03163314610c1c5760405162461bcd60e51b81526020600482018190526024820152600080516020612b2883398151915260448201526064015b60405180910390fd5b6001600955565b606060028054610c329061299d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5e9061299d565b8015610cab5780601f10610c8057610100808354040283529160200191610cab565b820191906000526020600020905b815481529060010190602001808311610c8e57829003601f168201915b5050505050905090565b6000610cc082611adc565b610cf6576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610d1d82611430565b9050806001600160a01b0316836001600160a01b031603610d6a576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03821614801590610d8a5750610d888133610a62565b155b15610dc1576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dcc838383611b15565b505050565b6008546001600160a01b03163314610e195760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b6002600955565b6008546001600160a01b03163314610e685760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b600b55565b6008546001600160a01b03163314610eb55760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b601255565b6008546001600160a01b03163314610f025760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b601355565b6008546001600160a01b03163314610f4f5760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b601555565b6008546001600160a01b03163314610f9c5760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b601055565b610dcc838383611b89565b6040516bffffffffffffffffffffffff19606084901b1660208201526000908190603401604051602081830303815290604052805190602001209050600260095403610ffc575050601154610bc9565b60016009540361105a576110138360145483611dc5565b15611022575050600e54610bc9565b61102f8360155483611dc5565b1561103e575050600f54610bc9565b61104b8360165483611dc5565b1561105a575050601054610bc9565b6000915050610bc9565b60095460008080808080808061107a8b8b61115f565b97506110868b8b611606565b96506018549550601960008c6001600160a01b03166001600160a01b0316815260200190815260200160002054945060135493506015549250601654915060145490509295985092959850929598565b6008546001600160a01b0316331461111e5760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b60405133904780156108fc02916000818181858888f1935050505061114257600080fd5b565b610dcc838383604051806020016040528060008152506116ab565b60008061116c8484610fac565b6001600160a01b03851660009081526019602052604081205491925090611194908390611ddb565b90506111a08282611df7565b91506001600954036111cc5760006111bc601354601854611ddb565b90506111c88382611df7565b9250505b60006111e66111de60dc6127106129ed565b601854611ddb565b90506111f28382611df7565b925061120083601254611df7565b9695505050505050565b6008546001600160a01b031633146112525760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b600d55565b61126460dc6127106129ed565b81565b601780546112749061299d565b80601f01602080910402602001604051908101604052809291908181526020018280546112a09061299d565b80156112ed5780601f106112c2576101008083540402835291602001916112ed565b820191906000526020600020905b8154815290600101906020018083116112d057829003601f168201915b505050505081565b6008546001600160a01b0316331461133d5760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b600f55565b6008546001600160a01b0316331461138a5760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b610dcc601783836124c9565b6008546001600160a01b031633146113de5760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b601455565b6008546001600160a01b0316331461142b5760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b600a55565b600061143b82611e0d565b5192915050565b60006001600160a01b038216611484576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b031633146114f25760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b6111426000611f4f565b6008546001600160a01b031633146115445760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b601655565b606060038054610c329061299d565b336001600160a01b0383160361159a576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6040516bffffffffffffffffffffffff19606084901b16602082015260009081906034016040516020818303038152906040528051906020012090506001600954036116a0576116598360145483611dc5565b15611668575050600a54610bc9565b6116758360155483611dc5565b15611684575050600b54610bc9565b6116918360165483611dc5565b156116a0575050600c54610bc9565b5050600d5492915050565b6116b6848484611b89565b6001600160a01b0383163b151580156116d857506116d684848484611fb9565b155b156116f6576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b816117073383611606565b6117119190612a04565b3410156117605760405162461bcd60e51b815260206004820152601260248201527f496e636f7272656374204554482073656e7400000000000000000000000000006044820152606401610c13565b61176a338261115f565b8211156117df5760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f74206d696e74206d6f7265207468616e20746865206d617820616c60448201527f6c6f77656420746f6b656e7300000000000000000000000000000000000000006064820152608401610c13565b6117e933836120d7565b3360009081526019602052604081208054849290611808908490612a23565b9250508190555081601860008282546118219190612a23565b90915550505050565b606061183582611adc565b61186b576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006118756120f5565b9050805160000361189557604051806020016040528060008152506118c0565b8061189f84612104565b6040516020016118b0929190612a3b565b6040516020818303038152906040525b9392505050565b6008546001600160a01b0316331461190f5760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b601155565b6008546001600160a01b0316331461195c5760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b6000600955565b6008546001600160a01b031633146119ab5760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b6001600160a01b038116611a275760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610c13565b611a3081611f4f565b50565b6008546001600160a01b03163314611a7b5760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b600c55565b6008546001600160a01b03163314611ac85760405162461bcd60e51b81526020600482018190526024820152600080516020612b288339815191526044820152606401610c13565b600e55565b6001600160a01b03163b151590565b600081600111158015611af0575060005482105b8015610bc9575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b9482611e0d565b9050836001600160a01b031681600001516001600160a01b031614611be5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000336001600160a01b0386161480611c035750611c038533610a62565b80611c1e575033611c1384610cb5565b6001600160a01b0316145b905080611c57576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416611c97576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ca360008487611b15565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611d79576000548214611d79578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b600082611dd28584612239565b14949350505050565b600081831015611ded57506000610bc9565b6118c082846129ed565b6000818310611e0657816118c0565b5090919050565b60408051606081018252600080825260208201819052918101919091528180600111158015611e3d575060005481105b15611f1d57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff16151591810182905290611f1b5780516001600160a01b031615611eb1579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215611f16579392505050565b611eb1565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081526000906001600160a01b0385169063150b7a0290612007903390899088908890600401612a6a565b6020604051808303816000875af1925050508015612042575060408051601f3d908101601f1916820190925261203f91810190612a9c565b60015b6120a0573d808015612070576040519150601f19603f3d011682016040523d82523d6000602084013e612075565b606091505b508051600003612098576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b0319167f150b7a02000000000000000000000000000000000000000000000000000000001490505b949350505050565b6120f18282604051806020016040528060008152506122ad565b5050565b606060178054610c329061299d565b60608160000361214757505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612171578061215b81612ab9565b915061216a9050600a83612ae9565b915061214b565b60008167ffffffffffffffff81111561218c5761218c61269b565b6040519080825280601f01601f1916602001820160405280156121b6576020820181803683370190505b5090505b84156120cf576121cb6001836129ed565b91506121d8600a86612afd565b6121e3906030612a23565b60f81b8183815181106121f8576121f8612b11565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612232600a86612ae9565b94506121ba565b600081815b84518110156122a557600085828151811061225b5761225b612b11565b602002602001015190508083116122815760008381526020829052604090209250612292565b600081815260208490526040902092505b508061229d81612ab9565b91505061223e565b509392505050565b610dcc83838360016000546001600160a01b0385166122f8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600003612332576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000811667ffffffffffffffff8083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b4290921691909102179055808085018380156123f357506001600160a01b0387163b15155b1561247b575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46124446000888480600101955088611fb9565b612461576040516368d2bf6b60e11b815260040160405180910390fd5b8082036123f957826000541461247657600080fd5b6124c0565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480820361247c575b50600055611dbe565b8280546124d59061299d565b90600052602060002090601f0160209004810192826124f7576000855561253d565b82601f106125105782800160ff1982351617855561253d565b8280016001018555821561253d579182015b8281111561253d578235825591602001919060010190612522565b5061254992915061254d565b5090565b5b80821115612549576000815560010161254e565b6001600160e01b031981168114611a3057600080fd5b60006020828403121561258a57600080fd5b81356118c081612562565b60005b838110156125b0578181015183820152602001612598565b838111156116f65750506000910152565b600081518084526125d9816020860160208601612595565b601f01601f19169290920160200192915050565b6020815260006118c060208301846125c1565b60006020828403121561261257600080fd5b5035919050565b80356001600160a01b038116811461263057600080fd5b919050565b6000806040838503121561264857600080fd5b61265183612619565b946020939093013593505050565b60008060006060848603121561267457600080fd5b61267d84612619565b925061268b60208501612619565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156126da576126da61269b565b604052919050565b600082601f8301126126f357600080fd5b8135602067ffffffffffffffff82111561270f5761270f61269b565b8160051b61271e8282016126b1565b928352848101820192828101908785111561273857600080fd5b83870192505b848310156127575782358252918301919083019061273e565b979650505050505050565b6000806040838503121561277557600080fd5b61277e83612619565b9150602083013567ffffffffffffffff81111561279a57600080fd5b6127a6858286016126e2565b9150509250929050565b6000602082840312156127c257600080fd5b6118c082612619565b600080602083850312156127de57600080fd5b823567ffffffffffffffff808211156127f657600080fd5b818501915085601f83011261280a57600080fd5b81358181111561281957600080fd5b86602082850101111561282b57600080fd5b60209290920196919550909350505050565b6000806040838503121561285057600080fd5b61285983612619565b91506020830135801515811461286e57600080fd5b809150509250929050565b6000806000806080858703121561288f57600080fd5b61289885612619565b935060206128a7818701612619565b935060408601359250606086013567ffffffffffffffff808211156128cb57600080fd5b818801915088601f8301126128df57600080fd5b8135818111156128f1576128f161269b565b61290384601f19601f840116016126b1565b9150808252898482850101111561291957600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561294c57600080fd5b82359150602083013567ffffffffffffffff81111561279a57600080fd5b6000806040838503121561297d57600080fd5b61298683612619565b915061299460208401612619565b90509250929050565b600181811c908216806129b157607f821691505b6020821081036129d157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156129ff576129ff6129d7565b500390565b6000816000190483118215151615612a1e57612a1e6129d7565b500290565b60008219821115612a3657612a366129d7565b500190565b60008351612a4d818460208801612595565b835190830190612a61818360208801612595565b01949350505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261120060808301846125c1565b600060208284031215612aae57600080fd5b81516118c081612562565b60006000198203612acc57612acc6129d7565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082612af857612af8612ad3565b500490565b600082612b0c57612b0c612ad3565b500690565b634e487b7160e01b600052603260045260246000fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122062eb8f417d6f2d238d62bc62dffb20190ff30f1844bf6f97dc76bd5c42504d7764736f6c634300080d0033

Deployed Bytecode Sourcemap

47225:7669:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29394:305;;;;;;;;;;-1:-1:-1;29394:305:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;29394:305:0;;;;;;;;49037:90;;;;;;;;;;;;;:::i;:::-;;32507:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;34010:204::-;;;;;;;;;;-1:-1:-1;34010:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1797:55:1;;;1779:74;;1767:2;1752:18;34010:204:0;1633:226:1;33573:371:0;;;;;;;;;;-1:-1:-1;33573:371:0;;;;;:::i;:::-;;:::i;49135:92::-;;;;;;;;;;;;;:::i;49351:110::-;;;;;;;;;;-1:-1:-1;49351:110:0;;;;;:::i;:::-;;:::i;49709:116::-;;;;;;;;;;-1:-1:-1;49709:116:0;;;;;:::i;:::-;;:::i;48001:49::-;;;;;;;;;;;;;;;;;;;2470:25:1;;;2458:2;2443:18;48001:49:0;2324:177:1;50355:104:0;;;;;;;;;;-1:-1:-1;50355:104:0;;;;;:::i;:::-;;:::i;28643:303::-;;;;;;;;;;-1:-1:-1;48926:1:0;28897:12;28687:7;28881:13;:28;-1:-1:-1;;28881:46:0;28643:303;;50467:98;;;;;;;;;;-1:-1:-1;50467:98:0;;;;;:::i;:::-;;:::i;50103:128::-;;;;;;;;;;-1:-1:-1;50103:128:0;;;;;:::i;:::-;;:::i;48113:39::-;;;;;;;;;;;;;;;;34875:170;;;;;;;;;;-1:-1:-1;34875:170:0;;;;;:::i;:::-;;:::i;51422:809::-;;;;;;;;;;-1:-1:-1;51422:809:0;;;;;:::i;:::-;;:::i;53187:823::-;;;;;;;;;;-1:-1:-1;53187:823:0;;;;;:::i;:::-;;:::i;:::-;;;;5067:25:1;;;5123:2;5108:18;;5101:34;;;;5151:18;;;5144:34;;;;5209:2;5194:18;;5187:34;;;;5252:3;5237:19;;5230:35;;;;5296:3;5281:19;;5274:35;5340:3;5325:19;;5318:35;5384:3;5369:19;;5362:35;5428:3;5413:19;;5406:35;5054:3;5039:19;53187:823:0;4696:751:1;54659:114:0;;;;;;;;;;;;;:::i;35116:185::-;;;;;;;;;;-1:-1:-1;35116:185:0;;;;;:::i;:::-;;:::i;52405:774::-;;;;;;;;;;-1:-1:-1;52405:774:0;;;;;:::i;:::-;;:::i;49591:110::-;;;;;;;;;;-1:-1:-1;49591:110:0;;;;;:::i;:::-;;:::i;47529:41::-;;;;;;;;;;;;47569:1;47529:41;;47356:65;;;;;;;;;;;;;:::i;48588:26::-;;;;;;;;;;;;;:::i;48481:98::-;;;;;;;;;;;;;;;;48659:44;;;;;;;;;;-1:-1:-1;48659:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;49967:128;;;;;;;;;;-1:-1:-1;49967:128:0;;;;;:::i;:::-;;:::i;47625:41::-;;;;;;;;;;;;47665:1;47625:41;;54554:97;;;;;;;;;;-1:-1:-1;54554:97:0;;;;;:::i;:::-;;:::i;47673:43::-;;;;;;;;;;;;;;;;50679:100;;;;;;;;;;-1:-1:-1;50679:100:0;;;;;:::i;:::-;;:::i;49235:108::-;;;;;;;;;;-1:-1:-1;49235:108:0;;;;;:::i;:::-;;:::i;32315:125::-;;;;;;;;;;-1:-1:-1;32315:125:0;;;;;:::i;:::-;;:::i;47304:45::-;;;;;;;;;;;;47346:3;47304:45;;47725:47;;;;;;;;;;;;;;;;29763:206;;;;;;;;;;-1:-1:-1;29763:206:0;;;;;:::i;:::-;;:::i;7152:103::-;;;;;;;;;;;;;:::i;50573:98::-;;;;;;;;;;-1:-1:-1;50573:98:0;;;;;:::i;:::-;;:::i;47889:48::-;;;;;;;;;;;;;;;;47779;;;;;;;;;;;;;;;;48211:50;;;;;;;;;;;;;;;;6501:87;;;;;;;;;;-1:-1:-1;6574:6:0;;-1:-1:-1;;;;;6574:6:0;6501:87;;32676:104;;;;;;;;;;;;;:::i;47946:48::-;;;;;;;;;;;;;;;;34286:287;;;;;;;;;;-1:-1:-1;34286:287:0;;;;;:::i;:::-;;:::i;48057:49::-;;;;;;;;;;;;;;;;50787:627;;;;;;;;;;-1:-1:-1;50787:627:0;;;;;:::i;:::-;;:::i;35372:369::-;;;;;;;;;;-1:-1:-1;35372:369:0;;;;;:::i;:::-;;:::i;54018:403::-;;;;;;:::i;:::-;;:::i;32851:318::-;;;;;;;;;;-1:-1:-1;32851:318:0;;;;;:::i;:::-;;:::i;47834:48::-;;;;;;;;;;;;;;;;50239:108;;;;;;;;;;-1:-1:-1;50239:108:0;;;;;:::i;:::-;;:::i;47428:92::-;;;;;;;;;;;;47478:42;47428:92;;48376:98;;;;;;;;;;;;;;;;48943:86;;;;;;;;;;;;;:::i;47577:41::-;;;;;;;;;;;;47617:1;47577:41;;34644:164;;;;;;;;;;-1:-1:-1;34644:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;34765:25:0;;;34741:4;34765:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34644:164;7410:201;;;;;;;;;;-1:-1:-1;7410:201:0;;;;;:::i;:::-;;:::i;49469:110::-;;;;;;;;;;-1:-1:-1;49469:110:0;;;;;:::i;:::-;;:::i;48159:43::-;;;;;;;;;;;;;;;;48270:99;;;;;;;;;;;;;;;;48623:29;;;;;;;;;;;;;;;;49833:126;;;;;;;;;;-1:-1:-1;49833:126:0;;;;;:::i;:::-;;:::i;29394:305::-;29496:4;-1:-1:-1;;;;;;29533:40:0;;29548:25;29533:40;;:105;;-1:-1:-1;;;;;;;29590:48:0;;29605:33;29590:48;29533:105;:158;;;-1:-1:-1;19409:25:0;-1:-1:-1;;;;;;19394:40:0;;;29655:36;29513:178;29394:305;-1:-1:-1;;29394:305:0:o;49037:90::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;8706:2:1;6713:68:0;;;8688:21:1;;;8725:18;;;8718:30;-1:-1:-1;;;;;;;;;;;8764:18:1;;;8757:62;8836:18;;6713:68:0;;;;;;;;;47617:1:::1;49091:12;:28:::0;49037:90::o;32507:100::-;32561:13;32594:5;32587:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32507:100;:::o;34010:204::-;34078:7;34103:16;34111:7;34103;:16::i;:::-;34098:64;;34128:34;;;;;;;;;;;;;;34098:64;-1:-1:-1;34182:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;34182:24:0;;34010:204::o;33573:371::-;33646:13;33662:24;33678:7;33662:15;:24::i;:::-;33646:40;;33707:5;-1:-1:-1;;;;;33701:11:0;:2;-1:-1:-1;;;;;33701:11:0;;33697:48;;33721:24;;;;;;;;;;;;;;33697:48;5305:10;-1:-1:-1;;;;;33762:21:0;;;;;;:63;;-1:-1:-1;33788:37:0;33805:5;5305:10;34644:164;:::i;33788:37::-;33787:38;33762:63;33758:138;;;33849:35;;;;;;;;;;;;;;33758:138;33908:28;33917:2;33921:7;33930:5;33908:8;:28::i;:::-;33635:309;33573:371;;:::o;49135:92::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;8706:2:1;6713:68:0;;;8688:21:1;;;8725:18;;;8718:30;-1:-1:-1;;;;;;;;;;;8764:18:1;;;8757:62;8836:18;;6713:68:0;8504:356:1;6713:68:0;47665:1:::1;49192:12;:27:::0;49135:92::o;49351:110::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;8706:2:1;6713:68:0;;;8688:21:1;;;8725:18;;;8718:30;-1:-1:-1;;;;;;;;;;;8764:18:1;;;8757:62;8836:18;;6713:68:0;8504:356:1;6713:68:0;49427:20:::1;:26:::0;49351:110::o;49709:116::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;8706:2:1;6713:68:0;;;8688:21:1;;;8725:18;;;8718:30;-1:-1:-1;;;;;;;;;;;8764:18:1;;;8757:62;8836:18;;6713:68:0;8504:356:1;6713:68:0;49788:23:::1;:29:::0;49709:116::o;50355:104::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;8706:2:1;6713:68:0;;;8688:21:1;;;8725:18;;;8718:30;-1:-1:-1;;;;;;;;;;;8764:18:1;;;8757:62;8836:18;;6713:68:0;8504:356:1;6713:68:0;50428:17:::1;:23:::0;50355:104::o;50467:98::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;8706:2:1;6713:68:0;;;8688:21:1;;;8725:18;;;8718:30;-1:-1:-1;;;;;;;;;;;8764:18:1;;;8757:62;8836:18;;6713:68:0;8504:356:1;6713:68:0;50537:14:::1;:20:::0;50467:98::o;50103:128::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;8706:2:1;6713:68:0;;;8688:21:1;;;8725:18;;;8718:30;-1:-1:-1;;;;;;;;;;;8764:18:1;;;8757:62;8836:18;;6713:68:0;8504:356:1;6713:68:0;50188:29:::1;:35:::0;50103:128::o;34875:170::-;35009:28;35019:4;35025:2;35029:7;35009:9;:28::i;51422:809::-;51558:24;;-1:-1:-1;;9456:2:1;9452:15;;;9448:88;51558:24:0;;;9436:101:1;51513:7:0;;;;9553:12:1;;51558:24:0;;;;;;;;;;;;51548:35;;;;;;51533:50;;47665:1;51600:12;;:28;51596:628;;-1:-1:-1;;51652:19:0;;51645:26;;51596:628;47617:1;51693:12;;:29;51689:535;;51743:48;51762:5;51769:15;;51786:4;51743:18;:48::i;:::-;51739:433;;;-1:-1:-1;;51819:28:0;;51812:35;;51739:433;51873:47;51892:5;51899:14;;51915:4;51873:18;:47::i;:::-;51869:303;;;-1:-1:-1;;51948:29:0;;51941:36;;51869:303;52003:47;52022:5;52029:14;;52045:4;52003:18;:47::i;:::-;51999:173;;;-1:-1:-1;;52078:29:0;;52071:36;;51999:173;52155:1;52148:8;;;;;53187:823;53612:12;;53285:21;;;;;;;;53655:34;53675:6;53683:5;53655:19;:34::i;:::-;53635:54;;53714:25;53725:6;53733:5;53714:10;:25::i;:::-;53700:39;;53765:10;;53751:24;;53805:9;:17;53815:6;-1:-1:-1;;;;;53805:17:0;-1:-1:-1;;;;;53805:17:0;;;;;;;;;;;;;53786:36;;53854:17;;53833:38;;53900:14;;53882:32;;53943:14;;53925:32;;53987:15;;53968:34;;53187:823;;;;;;;;;;;:::o;54659:114::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;8706:2:1;6713:68:0;;;8688:21:1;;;8725:18;;;8718:30;-1:-1:-1;;;;;;;;;;;8764:18:1;;;8757:62;8836:18;;6713:68:0;8504:356:1;6713:68:0;54717:47:::1;::::0;54725:10:::1;::::0;54742:21:::1;54717:47:::0;::::1;;;::::0;::::1;::::0;;;54742:21;54725:10;54717:47;::::1;;;;;;54709:56;;;::::0;::::1;;54659:114::o:0;35116:185::-;35254:39;35271:4;35277:2;35281:7;35254:39;;;;;;;;;;;;:16;:39::i;52405:774::-;52495:7;52515:24;52542:35;52563:6;52571:5;52542:20;:35::i;:::-;-1:-1:-1;;;;;52647:17:0;;52590:28;52647:17;;;:9;:17;;;;;;52515:62;;-1:-1:-1;52590:28:0;52621:44;;52515:62;;52621:7;:44::i;:::-;52590:75;;52695:43;52699:16;52717:20;52695:3;:43::i;:::-;52676:62;;47617:1;52755:12;;:29;52751:202;;52801:25;52829:38;52837:17;;52856:10;;52829:7;:38::i;:::-;52801:66;;52901:40;52905:16;52923:17;52901:3;:40::i;:::-;52882:59;;52786:167;52751:202;52965:28;52996:36;47398:23;47346:3;47398:5;:23;:::i;:::-;53021:10;;52996:7;:36::i;:::-;52965:67;;53062:43;53066:16;53084:20;53062:3;:43::i;:::-;53043:62;;53125:46;53129:16;53147:23;;53125:3;:46::i;:::-;53118:53;52405:774;-1:-1:-1;;;;;;52405:774:0:o;49591:110::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;8706:2:1;6713:68:0;;;8688:21:1;;;8725:18;;;8718:30;-1:-1:-1;;;;;;;;;;;8764:18:1;;;8757:62;8836:18;;6713:68:0;8504:356:1;6713:68:0;49667:20:::1;:26:::0;49591:110::o;47356:65::-;47398:23;47346:3;47398:5;:23;:::i;:::-;47356:65;:::o;48588:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49967:128::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;8706:2:1;6713:68:0;;;8688:21:1;;;8725:18;;;8718:30;-1:-1:-1;;;;;;;;;;;8764:18:1;;;8757:62;8836:18;;6713:68:0;8504:356:1;6713:68:0;50052:29:::1;:35:::0;49967:128::o;54554:97::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;8706:2:1;6713:68:0;;;8688:21:1;;;8725:18;;;8718:30;-1:-1:-1;;;;;;;;;;;8764:18:1;;;8757:62;8836:18;;6713:68:0;8504:356:1;6713:68:0;54625:18:::1;:12;54640:3:::0;;54625:18:::1;:::i;50679:100::-:0;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;8706:2:1;6713:68:0;;;8688:21:1;;;8725:18;;;8718:30;-1:-1:-1;;;;;;;;;;;8764:18:1;;;8757:62;8836:18;;6713:68:0;8504:356:1;6713:68:0;50750:15:::1;:21:::0;50679:100::o;49235:108::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;8706:2:1;6713:68:0;;;8688:21:1;;;8725:18;;;8718:30;-1:-1:-1;;;;;;;;;;;8764:18:1;;;8757:62;8836:18;;6713:68:0;8504:356:1;6713:68:0;49310:19:::1;:25:::0;49235:108::o;32315:125::-;32379:7;32406:21;32419:7;32406:12;:21::i;:::-;:26;;32315:125;-1:-1:-1;;32315:125:0:o;29763:206::-;29827:7;-1:-1:-1;;;;;29851:19:0;;29847:60;;29879:28;;;;;;;;;;;;;;29847:60;-1:-1:-1;;;;;;29933:19:0;;;;;:12;:19;;;;;:27;;;;29763:206::o;7152:103::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;8706:2:1;6713:68:0;;;8688:21:1;;;8725:18;;;8718:30;-1:-1:-1;;;;;;;;;;;8764:18:1;;;8757:62;8836:18;;6713:68:0;8504:356:1;6713:68:0;7217:30:::1;7244:1;7217:18;:30::i;50573:98::-:0;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;8706:2:1;6713:68:0;;;8688:21:1;;;8725:18;;;8718:30;-1:-1:-1;;;;;;;;;;;8764:18:1;;;8757:62;8836:18;;6713:68:0;8504:356:1;6713:68:0;50643:14:::1;:20:::0;50573:98::o;32676:104::-;32732:13;32765:7;32758:14;;;;;:::i;34286:287::-;5305:10;-1:-1:-1;;;;;34385:24:0;;;34381:54;;34418:17;;;;;;;;;;;;;;34381:54;5305:10;34448:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;34448:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;34448:53:0;;;;;;;;;;34517:48;;586:41:1;;;34448:42:0;;5305:10;34517:48;;559:18:1;34517:48:0;;;;;;;34286:287;;:::o;50787:627::-;50913:24;;-1:-1:-1;;9456:2:1;9452:15;;;9448:88;50913:24:0;;;9436:101:1;50868:7:0;;;;9553:12:1;;50913:24:0;;;;;;;;;;;;50903:35;;;;;;50888:50;;47617:1;50955:12;;:29;50951:418;;51005:48;51024:5;51031:15;;51048:4;51005:18;:48::i;:::-;51001:357;;;-1:-1:-1;;51081:19:0;;51074:26;;51001:357;51126:47;51145:5;51152:14;;51168:4;51126:18;:47::i;:::-;51122:236;;;-1:-1:-1;;51201:20:0;;51194:27;;51122:236;51247:47;51266:5;51273:14;;51289:4;51247:18;:47::i;:::-;51243:115;;;-1:-1:-1;;51322:20:0;;51315:27;;51243:115;-1:-1:-1;;51386:20:0;;50787:627;;;;:::o;35372:369::-;35539:28;35549:4;35555:2;35559:7;35539:9;:28::i;:::-;-1:-1:-1;;;;;35582:13:0;;9497:19;:23;;35582:76;;;;;35602:56;35633:4;35639:2;35643:7;35652:5;35602:30;:56::i;:::-;35601:57;35582:76;35578:156;;;35682:40;;-1:-1:-1;;;35682:40:0;;;;;;;;;;;35578:156;35372:369;;;;:::o;54018:403::-;54153:6;54121:29;54132:10;54144:5;54121:10;:29::i;:::-;:38;;;;:::i;:::-;54108:9;:51;;54100:82;;;;-1:-1:-1;;;54100:82:0;;10330:2:1;54100:82:0;;;10312:21:1;10369:2;10349:18;;;10342:30;10408:20;10388:18;;;10381:48;10446:18;;54100:82:0;10128:342:1;54100:82:0;54211:38;54231:10;54243:5;54211:19;:38::i;:::-;54201:6;:48;;54193:105;;;;-1:-1:-1;;;54193:105:0;;10677:2:1;54193:105:0;;;10659:21:1;10716:2;10696:18;;;10689:30;10755:34;10735:18;;;10728:62;10826:14;10806:18;;;10799:42;10858:19;;54193:105:0;10475:408:1;54193:105:0;54311:29;54321:10;54333:6;54311:9;:29::i;:::-;54361:10;54351:21;;;;:9;:21;;;;;:31;;54376:6;;54351:21;:31;;54376:6;;54351:31;:::i;:::-;;;;;;;;54407:6;54393:10;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;54018:403:0:o;32851:318::-;32924:13;32955:16;32963:7;32955;:16::i;:::-;32950:59;;32980:29;;;;;;;;;;;;;;32950:59;33022:21;33046:10;:8;:10::i;:::-;33022:34;;33080:7;33074:21;33099:1;33074:26;:87;;;;;;;;;;;;;;;;;33127:7;33136:18;:7;:16;:18::i;:::-;33110:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33074:87;33067:94;32851:318;-1:-1:-1;;;32851:318:0:o;50239:108::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;8706:2:1;6713:68:0;;;8688:21:1;;;8725:18;;;8718:30;-1:-1:-1;;;;;;;;;;;8764:18:1;;;8757:62;8836:18;;6713:68:0;8504:356:1;6713:68:0;50314:19:::1;:25:::0;50239:108::o;48943:86::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;8706:2:1;6713:68:0;;;8688:21:1;;;8725:18;;;8718:30;-1:-1:-1;;;;;;;;;;;8764:18:1;;;8757:62;8836:18;;6713:68:0;8504:356:1;6713:68:0;47569:1:::1;48993:12;:28:::0;48943:86::o;7410:201::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;8706:2:1;6713:68:0;;;8688:21:1;;;8725:18;;;8718:30;-1:-1:-1;;;;;;;;;;;8764:18:1;;;8757:62;8836:18;;6713:68:0;8504:356:1;6713:68:0;-1:-1:-1;;;;;7499:22:0;::::1;7491:73;;;::::0;-1:-1:-1;;;7491:73:0;;11698:2:1;7491:73:0::1;::::0;::::1;11680:21:1::0;11737:2;11717:18;;;11710:30;11776:34;11756:18;;;11749:62;11847:8;11827:18;;;11820:36;11873:19;;7491:73:0::1;11496:402:1::0;7491:73:0::1;7575:28;7594:8;7575:18;:28::i;:::-;7410:201:::0;:::o;49469:110::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;8706:2:1;6713:68:0;;;8688:21:1;;;8725:18;;;8718:30;-1:-1:-1;;;;;;;;;;;8764:18:1;;;8757:62;8836:18;;6713:68:0;8504:356:1;6713:68:0;49545:20:::1;:26:::0;49469:110::o;49833:126::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;8706:2:1;6713:68:0;;;8688:21:1;;;8725:18;;;8718:30;-1:-1:-1;;;;;;;;;;;8764:18:1;;;8757:62;8836:18;;6713:68:0;8504:356:1;6713:68:0;49917:28:::1;:34:::0;49833:126::o;9202:326::-;-1:-1:-1;;;;;9497:19:0;;:23;;;9202:326::o;35996:187::-;36053:4;36096:7;48926:1;36077:26;;:53;;;;;36117:13;;36107:7;:23;36077:53;:98;;;;-1:-1:-1;;36148:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;36148:27:0;;;;36147:28;;35996:187::o;44166:196::-;44281:24;;;;:15;:24;;;;;;:29;;;;-1:-1:-1;;;;;44281:29:0;;;;;;;;;44326:28;;44281:24;;44326:28;;;;;;;44166:196;;;:::o;39109:2130::-;39224:35;39262:21;39275:7;39262:12;:21::i;:::-;39224:59;;39322:4;-1:-1:-1;;;;;39300:26:0;:13;:18;;;-1:-1:-1;;;;;39300:26:0;;39296:67;;39335:28;;;;;;;;;;;;;;39296:67;39376:22;5305:10;-1:-1:-1;;;;;39402:20:0;;;;:73;;-1:-1:-1;39439:36:0;39456:4;5305:10;34644:164;:::i;39439:36::-;39402:126;;;-1:-1:-1;5305:10:0;39492:20;39504:7;39492:11;:20::i;:::-;-1:-1:-1;;;;;39492:36:0;;39402:126;39376:153;;39547:17;39542:66;;39573:35;;;;;;;;;;;;;;39542:66;-1:-1:-1;;;;;39623:16:0;;39619:52;;39648:23;;;;;;;;;;;;;;39619:52;39792:35;39809:1;39813:7;39822:4;39792:8;:35::i;:::-;-1:-1:-1;;;;;40123:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;40123:31:0;;;;;;;-1:-1:-1;;40123:31:0;;;;;;;40169:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;40169:29:0;;;;;;;;;;;40249:20;;;:11;:20;;;;;;40284:18;;-1:-1:-1;;;;;;40317:49:0;;;;-1:-1:-1;;;40350:15:0;40317:49;;;;;;;;;;40640:11;;40700:24;;;;;40743:13;;40249:20;;40700:24;;40743:13;40739:384;;40953:13;;40938:11;:28;40934:174;;40991:20;;41060:28;;;;41034:54;;-1:-1:-1;;;41034:54:0;-1:-1:-1;;;;;;41034:54:0;;;-1:-1:-1;;;;;40991:20:0;;41034:54;;;;40934:174;40098:1036;;;41170:7;41166:2;-1:-1:-1;;;;;41151:27:0;41160:4;-1:-1:-1;;;;;41151:27:0;;;;;;;;;;;41189:42;39213:2026;;39109:2130;;;:::o;956:190::-;1081:4;1134;1105:25;1118:5;1125:4;1105:12;:25::i;:::-;:33;;956:190;-1:-1:-1;;;;956:190:0:o;52239:158::-;52301:7;52329:1;52325;:5;52321:46;;;-1:-1:-1;52354:1:0;52347:8;;52321:46;52384:5;52388:1;52384;:5;:::i;54785:106::-;54843:7;54874:1;54870;:5;:13;;54882:1;54870:13;;;-1:-1:-1;54878:1:0;;54785:106;-1:-1:-1;54785:106:0:o;31144:1109::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;31255:7:0;;48926:1;31304:23;;:47;;;;;31338:13;;31331:4;:20;31304:47;31300:886;;;31372:31;31406:17;;;:11;:17;;;;;;;;;31372:51;;;;;;;;;-1:-1:-1;;;;;31372:51:0;;;;-1:-1:-1;;;31372:51:0;;;;;;;;;;;-1:-1:-1;;;31372:51:0;;;;;;;;;;;;;;31442:729;;31492:14;;-1:-1:-1;;;;;31492:28:0;;31488:101;;31556:9;31144:1109;-1:-1:-1;;;31144:1109:0:o;31488:101::-;-1:-1:-1;;;31931:6:0;31976:17;;;;:11;:17;;;;;;;;;31964:29;;;;;;;;;-1:-1:-1;;;;;31964:29:0;;;;;-1:-1:-1;;;31964:29:0;;;;;;;;;;;-1:-1:-1;;;31964:29:0;;;;;;;;;;;;;32024:28;32020:109;;32092:9;31144:1109;-1:-1:-1;;;31144:1109:0:o;32020:109::-;31891:261;;;31353:833;31300:886;32214:31;;;;;;;;;;;;;;7771:191;7864:6;;;-1:-1:-1;;;;;7881:17:0;;;;;;;;;;;7914:40;;7864:6;;;7881:17;7864:6;;7914:40;;7845:16;;7914:40;7834:128;7771:191;:::o;44854:667::-;45038:72;;;;;45017:4;;-1:-1:-1;;;;;45038:36:0;;;;;:72;;5305:10;;45089:4;;45095:7;;45104:5;;45038:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45038:72:0;;;;;;;;-1:-1:-1;;45038:72:0;;;;;;;;;;;;:::i;:::-;;;45034:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45272:6;:13;45289:1;45272:18;45268:235;;45318:40;;-1:-1:-1;;;45318:40:0;;;;;;;;;;;45268:235;45461:6;45455:13;45446:6;45442:2;45438:15;45431:38;45034:480;-1:-1:-1;;;;;;45157:55:0;45167:45;45157:55;;-1:-1:-1;45034:480:0;44854:667;;;;;;:::o;36191:104::-;36260:27;36270:2;36274:8;36260:27;;;;;;;;;;;;:9;:27::i;:::-;36191:104;;:::o;54429:114::-;54490:13;54523:12;54516:19;;;;;:::i;2787:723::-;2843:13;3064:5;3073:1;3064:10;3060:53;;-1:-1:-1;;3091:10:0;;;;;;;;;;;;;;;;;;2787:723::o;3060:53::-;3138:5;3123:12;3179:78;3186:9;;3179:78;;3212:8;;;;:::i;:::-;;-1:-1:-1;3235:10:0;;-1:-1:-1;3243:2:0;3235:10;;:::i;:::-;;;3179:78;;;3267:19;3299:6;3289:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3289:17:0;;3267:39;;3317:154;3324:10;;3317:154;;3351:11;3361:1;3351:11;;:::i;:::-;;-1:-1:-1;3420:10:0;3428:2;3420:5;:10;:::i;:::-;3407:24;;:2;:24;:::i;:::-;3394:39;;3377:6;3384;3377:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;3448:11:0;3457:2;3448:11;;:::i;:::-;;;3317:154;;1508:675;1591:7;1634:4;1591:7;1649:497;1673:5;:12;1669:1;:16;1649:497;;;1707:20;1730:5;1736:1;1730:8;;;;;;;;:::i;:::-;;;;;;;1707:31;;1773:12;1757;:28;1753:382;;2259:13;2309:15;;;2345:4;2338:15;;;2392:4;2376:21;;1885:57;;1753:382;;;2259:13;2309:15;;;2345:4;2338:15;;;2392:4;2376:21;;2062:57;;1753:382;-1:-1:-1;1687:3:0;;;;:::i;:::-;;;;1649:497;;;-1:-1:-1;2163:12:0;1508:675;-1:-1:-1;;;1508:675:0:o;36658:163::-;36781:32;36787:2;36791:8;36801:5;36808:4;37219:20;37242:13;-1:-1:-1;;;;;37270:16:0;;37266:48;;37295:19;;;;;;;;;;;;;;37266:48;37329:8;37341:1;37329:13;37325:44;;37351:18;;;;;;;;;;;;;;37325:44;-1:-1:-1;;;;;37720:16:0;;;;;;:12;:16;;;;;;;;:44;;37779:49;;;37720:44;;;;;;;;37779:49;;;;-1:-1:-1;;37720:44:0;;;;;;37779:49;;;;;;;;;;;;;;;;37845:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;37895:66:0;;;;-1:-1:-1;;;37945:15:0;37895:66;;;;;;;;;;37845:25;38042:23;;;38086:4;:23;;;;-1:-1:-1;;;;;;38094:13:0;;9497:19;:23;;38094:15;38082:641;;;38130:314;38161:38;;38186:12;;-1:-1:-1;;;;;38161:38:0;;;38178:1;;38161:38;;38178:1;;38161:38;38227:69;38266:1;38270:2;38274:14;;;;;;38290:5;38227:30;:69::i;:::-;38222:174;;38332:40;;-1:-1:-1;;;38332:40:0;;;;;;;;;;;38222:174;38439:3;38423:12;:19;38130:314;;38525:12;38508:13;;:29;38504:43;;38539:8;;;38504:43;38082:641;;;38588:120;38619:40;;38644:14;;;;;-1:-1:-1;;;;;38619:40:0;;;38636:1;;38619:40;;38636:1;;38619:40;38703:3;38687:12;:19;38588:120;;38082:641;-1:-1:-1;38737:13:0;:28;38787:60;35372:369;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:177:1;-1:-1:-1;;;;;;92:5:1;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:1;868:16;;861:27;638:258::o;901:317::-;943:3;981:5;975:12;1008:6;1003:3;996:19;1024:63;1080:6;1073:4;1068:3;1064:14;1057:4;1050:5;1046:16;1024:63;:::i;:::-;1132:2;1120:15;-1:-1:-1;;1116:88:1;1107:98;;;;1207:4;1103:109;;901:317;-1:-1:-1;;901:317:1:o;1223:220::-;1372:2;1361:9;1354:21;1335:4;1392:45;1433:2;1422:9;1418:18;1410:6;1392:45;:::i;1448:180::-;1507:6;1560:2;1548:9;1539:7;1535:23;1531:32;1528:52;;;1576:1;1573;1566:12;1528:52;-1:-1:-1;1599:23:1;;1448:180;-1:-1:-1;1448:180:1:o;1864:196::-;1932:20;;-1:-1:-1;;;;;1981:54:1;;1971:65;;1961:93;;2050:1;2047;2040:12;1961:93;1864:196;;;:::o;2065:254::-;2133:6;2141;2194:2;2182:9;2173:7;2169:23;2165:32;2162:52;;;2210:1;2207;2200:12;2162:52;2233:29;2252:9;2233:29;:::i;:::-;2223:39;2309:2;2294:18;;;;2281:32;;-1:-1:-1;;;2065:254:1:o;2691:328::-;2768:6;2776;2784;2837:2;2825:9;2816:7;2812:23;2808:32;2805:52;;;2853:1;2850;2843:12;2805:52;2876:29;2895:9;2876:29;:::i;:::-;2866:39;;2924:38;2958:2;2947:9;2943:18;2924:38;:::i;:::-;2914:48;;3009:2;2998:9;2994:18;2981:32;2971:42;;2691:328;;;;;:::o;3024:184::-;-1:-1:-1;;;3073:1:1;3066:88;3173:4;3170:1;3163:15;3197:4;3194:1;3187:15;3213:334;3284:2;3278:9;3340:2;3330:13;;-1:-1:-1;;3326:86:1;3314:99;;3443:18;3428:34;;3464:22;;;3425:62;3422:88;;;3490:18;;:::i;:::-;3526:2;3519:22;3213:334;;-1:-1:-1;3213:334:1:o;3552:712::-;3606:5;3659:3;3652:4;3644:6;3640:17;3636:27;3626:55;;3677:1;3674;3667:12;3626:55;3713:6;3700:20;3739:4;3762:18;3758:2;3755:26;3752:52;;;3784:18;;:::i;:::-;3830:2;3827:1;3823:10;3853:28;3877:2;3873;3869:11;3853:28;:::i;:::-;3915:15;;;3985;;;3981:24;;;3946:12;;;;4017:15;;;4014:35;;;4045:1;4042;4035:12;4014:35;4081:2;4073:6;4069:15;4058:26;;4093:142;4109:6;4104:3;4101:15;4093:142;;;4175:17;;4163:30;;4126:12;;;;4213;;;;4093:142;;;4253:5;3552:712;-1:-1:-1;;;;;;;3552:712:1:o;4269:422::-;4362:6;4370;4423:2;4411:9;4402:7;4398:23;4394:32;4391:52;;;4439:1;4436;4429:12;4391:52;4462:29;4481:9;4462:29;:::i;:::-;4452:39;;4542:2;4531:9;4527:18;4514:32;4569:18;4561:6;4558:30;4555:50;;;4601:1;4598;4591:12;4555:50;4624:61;4677:7;4668:6;4657:9;4653:22;4624:61;:::i;:::-;4614:71;;;4269:422;;;;;:::o;5634:186::-;5693:6;5746:2;5734:9;5725:7;5721:23;5717:32;5714:52;;;5762:1;5759;5752:12;5714:52;5785:29;5804:9;5785:29;:::i;5825:592::-;5896:6;5904;5957:2;5945:9;5936:7;5932:23;5928:32;5925:52;;;5973:1;5970;5963:12;5925:52;6013:9;6000:23;6042:18;6083:2;6075:6;6072:14;6069:34;;;6099:1;6096;6089:12;6069:34;6137:6;6126:9;6122:22;6112:32;;6182:7;6175:4;6171:2;6167:13;6163:27;6153:55;;6204:1;6201;6194:12;6153:55;6244:2;6231:16;6270:2;6262:6;6259:14;6256:34;;;6286:1;6283;6276:12;6256:34;6331:7;6326:2;6317:6;6313:2;6309:15;6305:24;6302:37;6299:57;;;6352:1;6349;6342:12;6299:57;6383:2;6375:11;;;;;6405:6;;-1:-1:-1;5825:592:1;;-1:-1:-1;;;;5825:592:1:o;6422:347::-;6487:6;6495;6548:2;6536:9;6527:7;6523:23;6519:32;6516:52;;;6564:1;6561;6554:12;6516:52;6587:29;6606:9;6587:29;:::i;:::-;6577:39;;6666:2;6655:9;6651:18;6638:32;6713:5;6706:13;6699:21;6692:5;6689:32;6679:60;;6735:1;6732;6725:12;6679:60;6758:5;6748:15;;;6422:347;;;;;:::o;6774:1039::-;6869:6;6877;6885;6893;6946:3;6934:9;6925:7;6921:23;6917:33;6914:53;;;6963:1;6960;6953:12;6914:53;6986:29;7005:9;6986:29;:::i;:::-;6976:39;;7034:2;7055:38;7089:2;7078:9;7074:18;7055:38;:::i;:::-;7045:48;;7140:2;7129:9;7125:18;7112:32;7102:42;;7195:2;7184:9;7180:18;7167:32;7218:18;7259:2;7251:6;7248:14;7245:34;;;7275:1;7272;7265:12;7245:34;7313:6;7302:9;7298:22;7288:32;;7358:7;7351:4;7347:2;7343:13;7339:27;7329:55;;7380:1;7377;7370:12;7329:55;7416:2;7403:16;7438:2;7434;7431:10;7428:36;;;7444:18;;:::i;:::-;7486:112;7594:2;-1:-1:-1;;7518:4:1;7514:2;7510:13;7506:86;7502:95;7486:112;:::i;:::-;7473:125;;7621:2;7614:5;7607:17;7661:7;7656:2;7651;7647;7643:11;7639:20;7636:33;7633:53;;;7682:1;7679;7672:12;7633:53;7737:2;7732;7728;7724:11;7719:2;7712:5;7708:14;7695:45;7781:1;7776:2;7771;7764:5;7760:14;7756:23;7749:34;;7802:5;7792:15;;;;;6774:1039;;;;;;;:::o;7818:416::-;7911:6;7919;7972:2;7960:9;7951:7;7947:23;7943:32;7940:52;;;7988:1;7985;7978:12;7940:52;8024:9;8011:23;8001:33;;8085:2;8074:9;8070:18;8057:32;8112:18;8104:6;8101:30;8098:50;;;8144:1;8141;8134:12;8239:260;8307:6;8315;8368:2;8356:9;8347:7;8343:23;8339:32;8336:52;;;8384:1;8381;8374:12;8336:52;8407:29;8426:9;8407:29;:::i;:::-;8397:39;;8455:38;8489:2;8478:9;8474:18;8455:38;:::i;:::-;8445:48;;8239:260;;;;;:::o;8865:437::-;8944:1;8940:12;;;;8987;;;9008:61;;9062:4;9054:6;9050:17;9040:27;;9008:61;9115:2;9107:6;9104:14;9084:18;9081:38;9078:218;;-1:-1:-1;;;9149:1:1;9142:88;9253:4;9250:1;9243:15;9281:4;9278:1;9271:15;9078:218;;8865:437;;;:::o;9576:184::-;-1:-1:-1;;;9625:1:1;9618:88;9725:4;9722:1;9715:15;9749:4;9746:1;9739:15;9765:125;9805:4;9833:1;9830;9827:8;9824:34;;;9838:18;;:::i;:::-;-1:-1:-1;9875:9:1;;9765:125::o;9895:228::-;9935:7;10061:1;-1:-1:-1;;9989:74:1;9986:1;9983:81;9978:1;9971:9;9964:17;9960:105;9957:131;;;10068:18;;:::i;:::-;-1:-1:-1;10108:9:1;;9895:228::o;10888:128::-;10928:3;10959:1;10955:6;10952:1;10949:13;10946:39;;;10965:18;;:::i;:::-;-1:-1:-1;11001:9:1;;10888:128::o;11021:470::-;11200:3;11238:6;11232:13;11254:53;11300:6;11295:3;11288:4;11280:6;11276:17;11254:53;:::i;:::-;11370:13;;11329:16;;;;11392:57;11370:13;11329:16;11426:4;11414:17;;11392:57;:::i;:::-;11465:20;;11021:470;-1:-1:-1;;;;11021:470:1:o;11903:512::-;12097:4;-1:-1:-1;;;;;12207:2:1;12199:6;12195:15;12184:9;12177:34;12259:2;12251:6;12247:15;12242:2;12231:9;12227:18;12220:43;;12299:6;12294:2;12283:9;12279:18;12272:34;12342:3;12337:2;12326:9;12322:18;12315:31;12363:46;12404:3;12393:9;12389:19;12381:6;12363:46;:::i;12420:249::-;12489:6;12542:2;12530:9;12521:7;12517:23;12513:32;12510:52;;;12558:1;12555;12548:12;12510:52;12590:9;12584:16;12609:30;12633:5;12609:30;:::i;12674:195::-;12713:3;-1:-1:-1;;12737:5:1;12734:77;12731:103;;12814:18;;:::i;:::-;-1:-1:-1;12861:1:1;12850:13;;12674:195::o;12874:184::-;-1:-1:-1;;;12923:1:1;12916:88;13023:4;13020:1;13013:15;13047:4;13044:1;13037:15;13063:120;13103:1;13129;13119:35;;13134:18;;:::i;:::-;-1:-1:-1;13168:9:1;;13063:120::o;13188:112::-;13220:1;13246;13236:35;;13251:18;;:::i;:::-;-1:-1:-1;13285:9:1;;13188:112::o;13305:184::-;-1:-1:-1;;;13354:1:1;13347:88;13454:4;13451:1;13444:15;13478:4;13475:1;13468:15

Swarm Source

ipfs://62eb8f417d6f2d238d62bc62dffb20190ff30f1844bf6f97dc76bd5c42504d77
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.