ETH Price: $3,623.33 (-2.81%)

Token

Dragonia (DRACO)
 

Overview

Max Total Supply

5,000 DRACO

Holders

1,588

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 DRACO
0x5c7cc29b4f47c67c9117230a498b49b25c776012
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:
Dragonia

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-31
*/

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.6.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.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
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 Merkle 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 (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// 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/common/ERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {
        return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `tokenId` must be already minted.
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: 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/dragonia.sol

pragma solidity >=0.8.9 <0.9.0;






contract Dragonia is ERC721A, Ownable, ReentrancyGuard {

 using Strings for uint256;

  bytes32 public merkleRoot;
  mapping(address => bool) public whitelistClaimed1;

  bytes32 public merkleRoot2;
  mapping(address => bool) public whitelistClaimed2;

  bytes32 public merkleRoot3;
  mapping(address => bool) public whitelistClaimed3;

  string public uriPrefix = '';
  string public uriSuffix = '.json';
  string public hiddenMetadataUri;
  
  uint256 public publicCost;
  uint256 public whitelistCost1;
  uint256 public whitelistCost2;
  uint256 public whitelistCost3;
  uint256 public maxSupply;
  uint256 public maxMintAmountPerTx1;
  uint256 public maxMintAmountPerTx2;
  uint256 public maxMintAmountPerTx3;
  uint256 public maxMintAmountPerTx4;

  bool public paused = true;
  bool public whitelistMint1Enabled = false;
  bool public whitelistMint2Enabled = false;
  bool public whitelistMint3Enabled = false;
  bool public revealed = true;

  constructor(
    string memory _tokenName,
    string memory _tokenSymbol,
    // uint256 _whitelistCost1,
    // uint256 _whitelistCost2,
    // uint256 _whitelistCost3,
    // uint256 _publicCost,
    uint256 _maxSupply,
    // uint256 _maxMintAmountPerTx1,
    // uint256 _maxMintAmountPerTx2,
    // uint256 _maxMintAmountPerTx3,
    // uint256 _maxMintAmountPerTx4,
    string memory _uriPrefix,
    string memory _hiddenMetadataUri,
    bytes32 _merkleRoot,
    bytes32 _merkleRoot1,
    bytes32 _merkleRoot2
  ) ERC721A(_tokenName, _tokenSymbol) {
    // setCost1(_whitelistCost1);
    // setCost2(_whitelistCost2);
    // setCost3(_whitelistCost3);
    maxSupply = _maxSupply;
    // setMaxMintAmountPerTx1(_maxMintAmountPerTx1);
    // setMaxMintAmountPerTx2(_maxMintAmountPerTx2);
    // setMaxMintAmountPerTx3(_maxMintAmountPerTx3);
    // setMaxMintAmountPerTx4(_maxMintAmountPerTx4);
    setHiddenMetadataUri(_hiddenMetadataUri);
    setUriPrefix(_uriPrefix);
    setMerkleRoot1(_merkleRoot);
    setMerkleRoot2(_merkleRoot1);
    setMerkleRoot3(_merkleRoot2);
  }

  modifier mintCompliancePublic(uint256 _mintAmount) {
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx4, 'Invalid mint amount!');
    require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!');
    _;
  }

  modifier mintPriceCompliancePublic(uint256 _mintAmount) {
    require(msg.value >= publicCost * _mintAmount, 'Insufficient funds!');
    _;
  }

  modifier mintComplianceWhitelist1(uint256 _mintAmount) {
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx1, 'Invalid mint amount!');
    require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!');
    _;
  }

  modifier mintPriceComplianceWhitelist1(uint256 _mintAmount) {
    require(msg.value >= whitelistCost1 * _mintAmount, 'Insufficient funds!');
    _;
  }

  modifier mintComplianceWhitelist2(uint256 _mintAmount) {
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx2, 'Invalid mint amount!');
    require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!');
    _;
  }

  modifier mintPriceComplianceWhitelist2(uint256 _mintAmount) {
    require(msg.value >= whitelistCost2 * _mintAmount, 'Insufficient funds!');
    _;
  }

   modifier mintComplianceWhitelist3(uint256 _mintAmount) {
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx3, 'Invalid mint amount!');
    require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!');
    _;
  }

  modifier mintPriceComplianceWhitelist3(uint256 _mintAmount) {
    require(msg.value >= whitelistCost3 * _mintAmount, 'Insufficient funds!');
    _;
  }
  
  function setRevealed(bool _state) public onlyOwner {
    revealed = _state;
  }

   function setCost1(uint256 _cost) public onlyOwner {
    whitelistCost1 = _cost;
  }

   function setCost2(uint256 _cost) public onlyOwner {
    whitelistCost2 = _cost;
  }

  function setCost3(uint256 _cost) public onlyOwner {
    whitelistCost3 = _cost;
  }

  function setMaxMintAmountPerTx1(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx1 = _maxMintAmountPerTx;
  }
  function setMaxMintAmountPerTx2(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx2 = _maxMintAmountPerTx;
  }

  function setMaxMintAmountPerTx3(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx3 = _maxMintAmountPerTx;
  }

  function setMaxMintAmountPerTx4(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx4 = _maxMintAmountPerTx;
  }
  
  function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
    hiddenMetadataUri = _hiddenMetadataUri;
  }

  function setMerkleRoot1(bytes32 _merkleRoot) public onlyOwner {
    merkleRoot = _merkleRoot;
  }

  function setMerkleRoot2(bytes32 _merkleRoot) public onlyOwner {
    merkleRoot2 = _merkleRoot;
  }

  function setMerkleRoot3(bytes32 _merkleRoot) public onlyOwner {
    merkleRoot3 = _merkleRoot;
  }

  function setWhitelist1MintEnabled(bool _state,uint _cost, uint _maxMintAmountPerTx1) public onlyOwner {
    setCost1(_cost);
    setMaxMintAmountPerTx1(_maxMintAmountPerTx1);
    whitelistMint1Enabled = _state;
  }

  function setWhitelist2MintEnabled(bool _state,uint _cost, uint _maxMintAmountPerTx2) public onlyOwner {
    setCost2(_cost);
    setMaxMintAmountPerTx2(_maxMintAmountPerTx2);
    whitelistMint1Enabled = false;
    whitelistMint2Enabled = _state;
  }

  function setWhitelist3MintEnabled(bool _state,uint _cost, uint _maxMintAmountPerTx3) public onlyOwner {
    setCost3(_cost);
    setMaxMintAmountPerTx3(_maxMintAmountPerTx3);
    whitelistMint2Enabled = false;
    whitelistMint3Enabled = _state;
  }

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }

  function setPaused(bool _state,uint _cost, uint _maxMintAmountPerTx4) public onlyOwner {
    publicCost = _cost;
    setMaxMintAmountPerTx4(_maxMintAmountPerTx4);
    whitelistMint1Enabled = false;
    whitelistMint2Enabled = false;
    whitelistMint3Enabled = false;
    paused = _state;
  }

  function walletOfOwner(address _owner) public view returns (uint256[] memory) {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = _startTokenId();
    uint256 ownedTokenIndex = 0;
    address latestOwnerAddress;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      TokenOwnership memory ownership = _ownerships[currentTokenId];

      if (!ownership.burned && ownership.addr != address(0)) {
        latestOwnerAddress = ownership.addr;
      }

      if (latestOwnerAddress == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

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

  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
    require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token');

    if (revealed == false) {
      return hiddenMetadataUri;
    }

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
        : '';
  }

  function mint(uint256 _mintAmount) public payable mintCompliancePublic(_mintAmount) mintPriceCompliancePublic(_mintAmount) {
    require(!paused, 'The contract is paused!');

    _safeMint(_msgSender(), _mintAmount);
  }

    function mintForAddress(uint256 _mintAmount, address _receiver) public onlyOwner {
    _safeMint(_receiver, _mintAmount);
  }

    function whitelist1Mint(uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable mintComplianceWhitelist1(_mintAmount) mintPriceComplianceWhitelist1(_mintAmount) {
    // Verify whitelist requirements
    require(whitelistMint1Enabled, 'The whitelist sale is not enabled!');
    require(!whitelistClaimed1[_msgSender()], 'Address already claimed!');
    bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
    require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), 'Invalid proof!');

    whitelistClaimed1[_msgSender()] = true;
    _safeMint(_msgSender(), _mintAmount);
  }

  function whitelist2Mint(uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable mintComplianceWhitelist2(_mintAmount) mintPriceComplianceWhitelist2(_mintAmount) {
    // Verify whitelist requirements
    require(whitelistMint2Enabled, 'The whitelist sale is not enabled!');
    require(!whitelistClaimed2[_msgSender()], 'Address already claimed!');
    bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
    require(MerkleProof.verify(_merkleProof, merkleRoot2, leaf), 'Invalid proof!');

    whitelistClaimed2[_msgSender()] = true;
    _safeMint(_msgSender(), _mintAmount);
  }

  function whitelist3Mint(uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable mintComplianceWhitelist3(_mintAmount) mintPriceComplianceWhitelist3(_mintAmount) {
    // Verify whitelist requirements
    require(whitelistMint3Enabled, 'The whitelist sale is not enabled!');
    require(!whitelistClaimed3[_msgSender()], 'Address already claimed!');
    bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
    require(MerkleProof.verify(_merkleProof, merkleRoot3, leaf), 'Invalid proof!');

    whitelistClaimed3[_msgSender()] = true;
    _safeMint(_msgSender(), _mintAmount);
  }

   function withdraw() public onlyOwner nonReentrant {

    (bool os, ) = payable(owner()).call{value: address(this).balance}('');
    require(os);
   
  }

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

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"string","name":"_uriPrefix","type":"string"},{"internalType":"string","name":"_hiddenMetadataUri","type":"string"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"bytes32","name":"_merkleRoot1","type":"bytes32"},{"internalType":"bytes32","name":"_merkleRoot2","type":"bytes32"}],"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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"maxMintAmountPerTx1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx4","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot2","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot3","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx4","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"},{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint256","name":"_maxMintAmountPerTx4","type":"uint256"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"},{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint256","name":"_maxMintAmountPerTx1","type":"uint256"}],"name":"setWhitelist1MintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"},{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint256","name":"_maxMintAmountPerTx2","type":"uint256"}],"name":"setWhitelist2MintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"},{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint256","name":"_maxMintAmountPerTx3","type":"uint256"}],"name":"setWhitelist3MintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelist1Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelist2Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelist3Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed1","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed3","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistCost1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistCost2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistCost3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMint1Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMint2Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMint3Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250601090805190602001906200002b92919062000634565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250601190805190602001906200007992919062000634565b506001601c60006101000a81548160ff0219169083151502179055506000601c60016101000a81548160ff0219169083151502179055506000601c60026101000a81548160ff0219169083151502179055506000601c60036101000a81548160ff0219169083151502179055506001601c60046101000a81548160ff0219169083151502179055503480156200010e57600080fd5b50604051620066d9380380620066d98339818101604052810190620001349190620008f7565b878781600290805190602001906200014e92919062000634565b5080600390805190602001906200016792919062000634565b50620001786200021260201b60201c565b6000819055505050620001a0620001946200021b60201b60201c565b6200022360201b60201c565b600160098190555085601781905550620001c084620002e960201b60201c565b620001d1856200039460201b60201c565b620001e2836200043f60201b60201c565b620001f382620004d860201b60201c565b62000204816200057160201b60201c565b505050505050505062000b24565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002f96200021b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200031f6200060a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000378576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200036f9062000a9d565b60405180910390fd5b80601290805190602001906200039092919062000634565b5050565b620003a46200021b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003ca6200060a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000423576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200041a9062000a9d565b60405180910390fd5b80601090805190602001906200043b92919062000634565b5050565b6200044f6200021b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620004756200060a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620004ce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004c59062000a9d565b60405180910390fd5b80600a8190555050565b620004e86200021b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200050e6200060a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000567576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200055e9062000a9d565b60405180910390fd5b80600c8190555050565b620005816200021b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620005a76200060a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000600576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005f79062000a9d565b60405180910390fd5b80600e8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620006429062000aee565b90600052602060002090601f016020900481019282620006665760008555620006b2565b82601f106200068157805160ff1916838001178555620006b2565b82800160010185558215620006b2579182015b82811115620006b157825182559160200191906001019062000694565b5b509050620006c19190620006c5565b5090565b5b80821115620006e0576000816000905550600101620006c6565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200074d8262000702565b810181811067ffffffffffffffff821117156200076f576200076e62000713565b5b80604052505050565b600062000784620006e4565b905062000792828262000742565b919050565b600067ffffffffffffffff821115620007b557620007b462000713565b5b620007c08262000702565b9050602081019050919050565b60005b83811015620007ed578082015181840152602081019050620007d0565b83811115620007fd576000848401525b50505050565b60006200081a620008148462000797565b62000778565b905082815260208101848484011115620008395762000838620006fd565b5b62000846848285620007cd565b509392505050565b600082601f830112620008665762000865620006f8565b5b81516200087884826020860162000803565b91505092915050565b6000819050919050565b620008968162000881565b8114620008a257600080fd5b50565b600081519050620008b6816200088b565b92915050565b6000819050919050565b620008d181620008bc565b8114620008dd57600080fd5b50565b600081519050620008f181620008c6565b92915050565b600080600080600080600080610100898b0312156200091b576200091a620006ee565b5b600089015167ffffffffffffffff8111156200093c576200093b620006f3565b5b6200094a8b828c016200084e565b985050602089015167ffffffffffffffff8111156200096e576200096d620006f3565b5b6200097c8b828c016200084e565b97505060406200098f8b828c01620008a5565b965050606089015167ffffffffffffffff811115620009b357620009b2620006f3565b5b620009c18b828c016200084e565b955050608089015167ffffffffffffffff811115620009e557620009e4620006f3565b5b620009f38b828c016200084e565b94505060a062000a068b828c01620008e0565b93505060c062000a198b828c01620008e0565b92505060e062000a2c8b828c01620008e0565b9150509295985092959890939650565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000a8560208362000a3c565b915062000a928262000a4d565b602082019050919050565b6000602082019050818103600083015262000ab88162000a76565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000b0757607f821691505b6020821081141562000b1e5762000b1d62000abf565b5b50919050565b615ba58062000b346000396000f3fe6080604052600436106103ce5760003560e01c8063694aaf5b116101fd578063a22cb46511610118578063ca34adf0116100ab578063e985e9c51161007a578063e985e9c514610df9578063efbd73f414610e36578063f2fde38b14610e5f578063f96feb9714610e88578063fc4d26c714610eb1576103ce565b8063ca34adf014610d51578063d5abeb0114610d7c578063dc5ed7ce14610da7578063e0a8085314610dd0576103ce565b8063b08a55f6116100e7578063b08a55f614610c99578063b88d4fde14610cc2578063bd9ebe8b14610ceb578063c87b56dd14610d14576103ce565b8063a22cb46514610bef578063a2ec32f114610c18578063a45ba8e714610c43578063b079277114610c6e576103ce565b80637ec4a659116101905780638815cb231161015f5780638815cb2314610b545780638da5cb5b14610b7d57806395d89b4114610ba8578063a0712d6814610bd3576103ce565b80637ec4a65914610aac578063813b2ef814610ad557806384db206814610afe5780638693da2014610b29576103ce565b8063715018a6116101cc578063715018a614610a1657806373025b2014610a2d578063791ef18914610a585780637cd4761014610a81576103ce565b8063694aaf5b146109485780636af86c16146109715780636f1e154e1461099c57806370a08231146109d9576103ce565b80633373b3eb116102ed5780634fdd43cb116102805780635c975abb1161024f5780635c975abb1461088c57806362b99ad4146108b75780636352211e146108e257806368bcea8a1461091f576103ce565b80634fdd43cb146107e25780635061a1b31461080b57806351830227146108365780635503a0e814610861576103ce565b80633ee7b798116102bc5780633ee7b7981461072857806342842e0e14610751578063438b63001461077a578063442d9dec146107b7576103ce565b80633373b3eb1461067b578063347917c5146106b85780633ccfd60b146106d45780633d5aa27f146106eb576103ce565b80631950c2fc11610365578063294797ee11610334578063294797ee146105e05780632aa4520c146105fc5780632dfdb48c146106255780632eb4a7ab14610650576103ce565b80631950c2fc146105495780631c4ad7c91461057257806323b872dd1461059b5780632418e22c146105c4576103ce565b80630af11a13116103a15780630af11a13146104a157806314295774146104cc57806316ba10e0146104f557806318160ddd1461051e576103ce565b806301ffc9a7146103d357806306fdde0314610410578063081812fc1461043b578063095ea7b314610478575b600080fd5b3480156103df57600080fd5b506103fa60048036038101906103f59190614821565b610edc565b6040516104079190614869565b60405180910390f35b34801561041c57600080fd5b50610425610fbe565b604051610432919061491d565b60405180910390f35b34801561044757600080fd5b50610462600480360381019061045d9190614975565b611050565b60405161046f91906149e3565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a9190614a2a565b6110cc565b005b3480156104ad57600080fd5b506104b66111d7565b6040516104c39190614a79565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee9190614aca565b6111dd565b005b34801561050157600080fd5b5061051c60048036038101906105179190614c2c565b611263565b005b34801561052a57600080fd5b506105336112f9565b6040516105409190614a79565b60405180910390f35b34801561055557600080fd5b50610570600480360381019061056b9190614975565b611310565b005b34801561057e57600080fd5b5061059960048036038101906105949190614aca565b611396565b005b3480156105a757600080fd5b506105c260048036038101906105bd9190614c75565b61141c565b005b6105de60048036038101906105d99190614d28565b61142c565b005b6105fa60048036038101906105f59190614d28565b611740565b005b34801561060857600080fd5b50610623600480360381019061061e9190614db4565b611a54565b005b34801561063157600080fd5b5061063a611b01565b6040516106479190614a79565b60405180910390f35b34801561065c57600080fd5b50610665611b07565b6040516106729190614e16565b60405180910390f35b34801561068757600080fd5b506106a2600480360381019061069d9190614e31565b611b0d565b6040516106af9190614869565b60405180910390f35b6106d260048036038101906106cd9190614d28565b611b2d565b005b3480156106e057600080fd5b506106e9611e41565b005b3480156106f757600080fd5b50610712600480360381019061070d9190614e31565b611f93565b60405161071f9190614869565b60405180910390f35b34801561073457600080fd5b5061074f600480360381019061074a9190614975565b611fb3565b005b34801561075d57600080fd5b5061077860048036038101906107739190614c75565b612039565b005b34801561078657600080fd5b506107a1600480360381019061079c9190614e31565b612059565b6040516107ae9190614f1c565b60405180910390f35b3480156107c357600080fd5b506107cc612274565b6040516107d99190614a79565b60405180910390f35b3480156107ee57600080fd5b5061080960048036038101906108049190614c2c565b61227a565b005b34801561081757600080fd5b50610820612310565b60405161082d9190614a79565b60405180910390f35b34801561084257600080fd5b5061084b612316565b6040516108589190614869565b60405180910390f35b34801561086d57600080fd5b50610876612329565b604051610883919061491d565b60405180910390f35b34801561089857600080fd5b506108a16123b7565b6040516108ae9190614869565b60405180910390f35b3480156108c357600080fd5b506108cc6123ca565b6040516108d9919061491d565b60405180910390f35b3480156108ee57600080fd5b5061090960048036038101906109049190614975565b612458565b60405161091691906149e3565b60405180910390f35b34801561092b57600080fd5b5061094660048036038101906109419190614db4565b61246e565b005b34801561095457600080fd5b5061096f600480360381019061096a9190614975565b612536565b005b34801561097d57600080fd5b506109866125bc565b6040516109939190614869565b60405180910390f35b3480156109a857600080fd5b506109c360048036038101906109be9190614e31565b6125cf565b6040516109d09190614869565b60405180910390f35b3480156109e557600080fd5b50610a0060048036038101906109fb9190614e31565b6125ef565b604051610a0d9190614a79565b60405180910390f35b348015610a2257600080fd5b50610a2b6126bf565b005b348015610a3957600080fd5b50610a42612747565b604051610a4f9190614e16565b60405180910390f35b348015610a6457600080fd5b50610a7f6004803603810190610a7a9190614db4565b61274d565b005b348015610a8d57600080fd5b50610a96612815565b604051610aa39190614a79565b60405180910390f35b348015610ab857600080fd5b50610ad36004803603810190610ace9190614c2c565b61281b565b005b348015610ae157600080fd5b50610afc6004803603810190610af79190614975565b6128b1565b005b348015610b0a57600080fd5b50610b13612937565b604051610b209190614a79565b60405180910390f35b348015610b3557600080fd5b50610b3e61293d565b604051610b4b9190614a79565b60405180910390f35b348015610b6057600080fd5b50610b7b6004803603810190610b769190614975565b612943565b005b348015610b8957600080fd5b50610b926129c9565b604051610b9f91906149e3565b60405180910390f35b348015610bb457600080fd5b50610bbd6129f3565b604051610bca919061491d565b60405180910390f35b610bed6004803603810190610be89190614975565b612a85565b005b348015610bfb57600080fd5b50610c166004803603810190610c119190614f3e565b612be5565b005b348015610c2457600080fd5b50610c2d612d5d565b604051610c3a9190614869565b60405180910390f35b348015610c4f57600080fd5b50610c58612d70565b604051610c65919061491d565b60405180910390f35b348015610c7a57600080fd5b50610c83612dfe565b604051610c909190614869565b60405180910390f35b348015610ca557600080fd5b50610cc06004803603810190610cbb9190614975565b612e11565b005b348015610cce57600080fd5b50610ce96004803603810190610ce4919061501f565b612e97565b005b348015610cf757600080fd5b50610d126004803603810190610d0d9190614aca565b612f13565b005b348015610d2057600080fd5b50610d3b6004803603810190610d369190614975565b612f99565b604051610d48919061491d565b60405180910390f35b348015610d5d57600080fd5b50610d666130f2565b604051610d739190614e16565b60405180910390f35b348015610d8857600080fd5b50610d916130f8565b604051610d9e9190614a79565b60405180910390f35b348015610db357600080fd5b50610dce6004803603810190610dc99190614db4565b6130fe565b005b348015610ddc57600080fd5b50610df76004803603810190610df291906150a2565b6131fa565b005b348015610e0557600080fd5b50610e206004803603810190610e1b91906150cf565b613293565b604051610e2d9190614869565b60405180910390f35b348015610e4257600080fd5b50610e5d6004803603810190610e58919061510f565b613327565b005b348015610e6b57600080fd5b50610e866004803603810190610e819190614e31565b6133b1565b005b348015610e9457600080fd5b50610eaf6004803603810190610eaa9190614975565b6134a9565b005b348015610ebd57600080fd5b50610ec661352f565b604051610ed39190614a79565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610fa757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610fb75750610fb682613535565b5b9050919050565b606060028054610fcd9061517e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff99061517e565b80156110465780601f1061101b57610100808354040283529160200191611046565b820191906000526020600020905b81548152906001019060200180831161102957829003601f168201915b5050505050905090565b600061105b8261359f565b611091576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006110d782612458565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561113f576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661115e6135ed565b73ffffffffffffffffffffffffffffffffffffffff1614158015611190575061118e816111896135ed565b613293565b155b156111c7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111d28383836135f5565b505050565b601a5481565b6111e56135ed565b73ffffffffffffffffffffffffffffffffffffffff166112036129c9565b73ffffffffffffffffffffffffffffffffffffffff1614611259576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611250906151fc565b60405180910390fd5b80600c8190555050565b61126b6135ed565b73ffffffffffffffffffffffffffffffffffffffff166112896129c9565b73ffffffffffffffffffffffffffffffffffffffff16146112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d6906151fc565b60405180910390fd5b80601190805190602001906112f59291906146cf565b5050565b60006113036136a7565b6001546000540303905090565b6113186135ed565b73ffffffffffffffffffffffffffffffffffffffff166113366129c9565b73ffffffffffffffffffffffffffffffffffffffff161461138c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611383906151fc565b60405180910390fd5b8060158190555050565b61139e6135ed565b73ffffffffffffffffffffffffffffffffffffffff166113bc6129c9565b73ffffffffffffffffffffffffffffffffffffffff1614611412576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611409906151fc565b60405180910390fd5b80600e8190555050565b6114278383836136b0565b505050565b8260008111801561143f57506018548111155b61147e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147590615268565b60405180910390fd5b6017548161148a6112f9565b61149491906152b7565b11156114d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cc90615359565b60405180910390fd5b83806014546114e49190615379565b341015611526576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151d9061541f565b60405180910390fd5b601c60019054906101000a900460ff16611575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156c906154b1565b60405180910390fd5b600b60006115816135ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611609576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116009061551d565b60405180910390fd5b60006116136135ed565b6040516020016116239190615585565b604051602081830303815290604052805190602001209050611689858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483613b66565b6116c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bf906155ec565b60405180910390fd5b6001600b60006116d66135ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506117386117326135ed565b87613b7d565b505050505050565b8260008111801561175357506019548111155b611792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178990615268565b60405180910390fd5b6017548161179e6112f9565b6117a891906152b7565b11156117e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e090615359565b60405180910390fd5b83806015546117f89190615379565b34101561183a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118319061541f565b60405180910390fd5b601c60029054906101000a900460ff16611889576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611880906154b1565b60405180910390fd5b600d60006118956135ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561191d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119149061551d565b60405180910390fd5b60006119276135ed565b6040516020016119379190615585565b60405160208183030381529060405280519060200120905061199d858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c5483613b66565b6119dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d3906155ec565b60405180910390fd5b6001600d60006119ea6135ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611a4c611a466135ed565b87613b7d565b505050505050565b611a5c6135ed565b73ffffffffffffffffffffffffffffffffffffffff16611a7a6129c9565b73ffffffffffffffffffffffffffffffffffffffff1614611ad0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac7906151fc565b60405180910390fd5b611ad982612e11565b611ae2816134a9565b82601c60016101000a81548160ff021916908315150217905550505050565b601b5481565b600a5481565b600d6020528060005260406000206000915054906101000a900460ff1681565b82600081118015611b405750601a548111155b611b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7690615268565b60405180910390fd5b60175481611b8b6112f9565b611b9591906152b7565b1115611bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcd90615359565b60405180910390fd5b8380601654611be59190615379565b341015611c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1e9061541f565b60405180910390fd5b601c60039054906101000a900460ff16611c76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6d906154b1565b60405180910390fd5b600f6000611c826135ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d019061551d565b60405180910390fd5b6000611d146135ed565b604051602001611d249190615585565b604051602081830303815290604052805190602001209050611d8a858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483613b66565b611dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc0906155ec565b60405180910390fd5b6001600f6000611dd76135ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611e39611e336135ed565b87613b7d565b505050505050565b611e496135ed565b73ffffffffffffffffffffffffffffffffffffffff16611e676129c9565b73ffffffffffffffffffffffffffffffffffffffff1614611ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb4906151fc565b60405180910390fd5b60026009541415611f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efa90615658565b60405180910390fd5b60026009819055506000611f156129c9565b73ffffffffffffffffffffffffffffffffffffffff1647604051611f38906156a9565b60006040518083038185875af1925050503d8060008114611f75576040519150601f19603f3d011682016040523d82523d6000602084013e611f7a565b606091505b5050905080611f8857600080fd5b506001600981905550565b600b6020528060005260406000206000915054906101000a900460ff1681565b611fbb6135ed565b73ffffffffffffffffffffffffffffffffffffffff16611fd96129c9565b73ffffffffffffffffffffffffffffffffffffffff161461202f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612026906151fc565b60405180910390fd5b80601a8190555050565b61205483838360405180602001604052806000815250612e97565b505050565b60606000612066836125ef565b905060008167ffffffffffffffff81111561208457612083614b01565b5b6040519080825280602002602001820160405280156120b25781602001602082028036833780820191505090505b50905060006120bf6136a7565b90506000805b84821080156120d657506017548311155b15612267576000600460008581526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511580156121e35750600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614155b156121f057806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122535783858481518110612238576122376156be565b5b602002602001018181525050828061224f906156ed565b9350505b838061225e906156ed565b945050506120c5565b8395505050505050919050565b60145481565b6122826135ed565b73ffffffffffffffffffffffffffffffffffffffff166122a06129c9565b73ffffffffffffffffffffffffffffffffffffffff16146122f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ed906151fc565b60405180910390fd5b806012908051906020019061230c9291906146cf565b5050565b60195481565b601c60049054906101000a900460ff1681565b601180546123369061517e565b80601f01602080910402602001604051908101604052809291908181526020018280546123629061517e565b80156123af5780601f10612384576101008083540402835291602001916123af565b820191906000526020600020905b81548152906001019060200180831161239257829003601f168201915b505050505081565b601c60009054906101000a900460ff1681565b601080546123d79061517e565b80601f01602080910402602001604051908101604052809291908181526020018280546124039061517e565b80156124505780601f1061242557610100808354040283529160200191612450565b820191906000526020600020905b81548152906001019060200180831161243357829003601f168201915b505050505081565b600061246382613b9b565b600001519050919050565b6124766135ed565b73ffffffffffffffffffffffffffffffffffffffff166124946129c9565b73ffffffffffffffffffffffffffffffffffffffff16146124ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e1906151fc565b60405180910390fd5b6124f382612536565b6124fc81611fb3565b6000601c60026101000a81548160ff02191690831515021790555082601c60036101000a81548160ff021916908315150217905550505050565b61253e6135ed565b73ffffffffffffffffffffffffffffffffffffffff1661255c6129c9565b73ffffffffffffffffffffffffffffffffffffffff16146125b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a9906151fc565b60405180910390fd5b8060168190555050565b601c60019054906101000a900460ff1681565b600f6020528060005260406000206000915054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612657576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6126c76135ed565b73ffffffffffffffffffffffffffffffffffffffff166126e56129c9565b73ffffffffffffffffffffffffffffffffffffffff161461273b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612732906151fc565b60405180910390fd5b6127456000613e2a565b565b600e5481565b6127556135ed565b73ffffffffffffffffffffffffffffffffffffffff166127736129c9565b73ffffffffffffffffffffffffffffffffffffffff16146127c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c0906151fc565b60405180910390fd5b6127d282611310565b6127db81612943565b6000601c60016101000a81548160ff02191690831515021790555082601c60026101000a81548160ff021916908315150217905550505050565b60165481565b6128236135ed565b73ffffffffffffffffffffffffffffffffffffffff166128416129c9565b73ffffffffffffffffffffffffffffffffffffffff1614612897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288e906151fc565b60405180910390fd5b80601090805190602001906128ad9291906146cf565b5050565b6128b96135ed565b73ffffffffffffffffffffffffffffffffffffffff166128d76129c9565b73ffffffffffffffffffffffffffffffffffffffff161461292d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612924906151fc565b60405180910390fd5b80601b8190555050565b60155481565b60135481565b61294b6135ed565b73ffffffffffffffffffffffffffffffffffffffff166129696129c9565b73ffffffffffffffffffffffffffffffffffffffff16146129bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b6906151fc565b60405180910390fd5b8060198190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054612a029061517e565b80601f0160208091040260200160405190810160405280929190818152602001828054612a2e9061517e565b8015612a7b5780601f10612a5057610100808354040283529160200191612a7b565b820191906000526020600020905b815481529060010190602001808311612a5e57829003601f168201915b5050505050905090565b80600081118015612a985750601b548111155b612ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ace90615268565b60405180910390fd5b60175481612ae36112f9565b612aed91906152b7565b1115612b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2590615359565b60405180910390fd5b8180601354612b3d9190615379565b341015612b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b769061541f565b60405180910390fd5b601c60009054906101000a900460ff1615612bcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc690615782565b60405180910390fd5b612be0612bda6135ed565b84613b7d565b505050565b612bed6135ed565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c52576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612c5f6135ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612d0c6135ed565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612d519190614869565b60405180910390a35050565b601c60039054906101000a900460ff1681565b60128054612d7d9061517e565b80601f0160208091040260200160405190810160405280929190818152602001828054612da99061517e565b8015612df65780601f10612dcb57610100808354040283529160200191612df6565b820191906000526020600020905b815481529060010190602001808311612dd957829003601f168201915b505050505081565b601c60029054906101000a900460ff1681565b612e196135ed565b73ffffffffffffffffffffffffffffffffffffffff16612e376129c9565b73ffffffffffffffffffffffffffffffffffffffff1614612e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e84906151fc565b60405180910390fd5b8060148190555050565b612ea28484846136b0565b612ec18373ffffffffffffffffffffffffffffffffffffffff16613ef0565b8015612ed65750612ed484848484613f13565b155b15612f0d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b612f1b6135ed565b73ffffffffffffffffffffffffffffffffffffffff16612f396129c9565b73ffffffffffffffffffffffffffffffffffffffff1614612f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f86906151fc565b60405180910390fd5b80600a8190555050565b6060612fa48261359f565b612fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fda90615814565b60405180910390fd5b60001515601c60049054906101000a900460ff1615151415613091576012805461300c9061517e565b80601f01602080910402602001604051908101604052809291908181526020018280546130389061517e565b80156130855780601f1061305a57610100808354040283529160200191613085565b820191906000526020600020905b81548152906001019060200180831161306857829003601f168201915b505050505090506130ed565b600061309b614064565b905060008151116130bb57604051806020016040528060008152506130e9565b806130c5846140f6565b60116040516020016130d993929190615904565b6040516020818303038152906040525b9150505b919050565b600c5481565b60175481565b6131066135ed565b73ffffffffffffffffffffffffffffffffffffffff166131246129c9565b73ffffffffffffffffffffffffffffffffffffffff161461317a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613171906151fc565b60405180910390fd5b8160138190555061318a816128b1565b6000601c60016101000a81548160ff0219169083151502179055506000601c60026101000a81548160ff0219169083151502179055506000601c60036101000a81548160ff02191690831515021790555082601c60006101000a81548160ff021916908315150217905550505050565b6132026135ed565b73ffffffffffffffffffffffffffffffffffffffff166132206129c9565b73ffffffffffffffffffffffffffffffffffffffff1614613276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326d906151fc565b60405180910390fd5b80601c60046101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61332f6135ed565b73ffffffffffffffffffffffffffffffffffffffff1661334d6129c9565b73ffffffffffffffffffffffffffffffffffffffff16146133a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339a906151fc565b60405180910390fd5b6133ad8183613b7d565b5050565b6133b96135ed565b73ffffffffffffffffffffffffffffffffffffffff166133d76129c9565b73ffffffffffffffffffffffffffffffffffffffff161461342d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613424906151fc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561349d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613494906159a7565b60405180910390fd5b6134a681613e2a565b50565b6134b16135ed565b73ffffffffffffffffffffffffffffffffffffffff166134cf6129c9565b73ffffffffffffffffffffffffffffffffffffffff1614613525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351c906151fc565b60405180910390fd5b8060188190555050565b60185481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816135aa6136a7565b111580156135b9575060005482105b80156135e6575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006136bb82613b9b565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613726576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166137476135ed565b73ffffffffffffffffffffffffffffffffffffffff1614806137765750613775856137706135ed565b613293565b5b806137bb57506137846135ed565b73ffffffffffffffffffffffffffffffffffffffff166137a384611050565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806137f4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561385b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6138688585856001614257565b613874600084876135f5565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613af4576000548214613af357878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613b5f858585600161425d565b5050505050565b600082613b738584614263565b1490509392505050565b613b978282604051806020016040528060008152506142d8565b5050565b613ba3614755565b600082905080613bb16136a7565b11158015613bc0575060005481105b15613df3576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151613df157600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613cd5578092505050613e25565b5b600115613df057818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613deb578092505050613e25565b613cd6565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613f396135ed565b8786866040518563ffffffff1660e01b8152600401613f5b9493929190615a1c565b6020604051808303816000875af1925050508015613f9757506040513d601f19601f82011682018060405250810190613f949190615a7d565b60015b614011573d8060008114613fc7576040519150601f19603f3d011682016040523d82523d6000602084013e613fcc565b606091505b50600081511415614009576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060601080546140739061517e565b80601f016020809104026020016040519081016040528092919081815260200182805461409f9061517e565b80156140ec5780601f106140c1576101008083540402835291602001916140ec565b820191906000526020600020905b8154815290600101906020018083116140cf57829003601f168201915b5050505050905090565b6060600082141561413e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050614252565b600082905060005b60008214614170578080614159906156ed565b915050600a826141699190615ad9565b9150614146565b60008167ffffffffffffffff81111561418c5761418b614b01565b5b6040519080825280601f01601f1916602001820160405280156141be5781602001600182028036833780820191505090505b5090505b6000851461424b576001826141d79190615b0a565b9150600a856141e69190615b3e565b60306141f291906152b7565b60f81b818381518110614208576142076156be565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856142449190615ad9565b94506141c2565b8093505050505b919050565b50505050565b50505050565b60008082905060005b84518110156142cd57600085828151811061428a576142896156be565b5b602002602001015190508083116142ac576142a583826142ea565b92506142b9565b6142b681846142ea565b92505b5080806142c5906156ed565b91505061426c565b508091505092915050565b6142e58383836001614301565b505050565b600082600052816020526040600020905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561436e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156143a9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6143b66000868387614257565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015614580575061457f8773ffffffffffffffffffffffffffffffffffffffff16613ef0565b5b15614646575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46145f56000888480600101955088613f13565b61462b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561458657826000541461464157600080fd5b6146b2565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415614647575b8160008190555050506146c8600086838761425d565b5050505050565b8280546146db9061517e565b90600052602060002090601f0160209004810192826146fd5760008555614744565b82601f1061471657805160ff1916838001178555614744565b82800160010185558215614744579182015b82811115614743578251825591602001919060010190614728565b5b5090506147519190614798565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156147b1576000816000905550600101614799565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6147fe816147c9565b811461480957600080fd5b50565b60008135905061481b816147f5565b92915050565b600060208284031215614837576148366147bf565b5b60006148458482850161480c565b91505092915050565b60008115159050919050565b6148638161484e565b82525050565b600060208201905061487e600083018461485a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156148be5780820151818401526020810190506148a3565b838111156148cd576000848401525b50505050565b6000601f19601f8301169050919050565b60006148ef82614884565b6148f9818561488f565b93506149098185602086016148a0565b614912816148d3565b840191505092915050565b6000602082019050818103600083015261493781846148e4565b905092915050565b6000819050919050565b6149528161493f565b811461495d57600080fd5b50565b60008135905061496f81614949565b92915050565b60006020828403121561498b5761498a6147bf565b5b600061499984828501614960565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006149cd826149a2565b9050919050565b6149dd816149c2565b82525050565b60006020820190506149f860008301846149d4565b92915050565b614a07816149c2565b8114614a1257600080fd5b50565b600081359050614a24816149fe565b92915050565b60008060408385031215614a4157614a406147bf565b5b6000614a4f85828601614a15565b9250506020614a6085828601614960565b9150509250929050565b614a738161493f565b82525050565b6000602082019050614a8e6000830184614a6a565b92915050565b6000819050919050565b614aa781614a94565b8114614ab257600080fd5b50565b600081359050614ac481614a9e565b92915050565b600060208284031215614ae057614adf6147bf565b5b6000614aee84828501614ab5565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614b39826148d3565b810181811067ffffffffffffffff82111715614b5857614b57614b01565b5b80604052505050565b6000614b6b6147b5565b9050614b778282614b30565b919050565b600067ffffffffffffffff821115614b9757614b96614b01565b5b614ba0826148d3565b9050602081019050919050565b82818337600083830152505050565b6000614bcf614bca84614b7c565b614b61565b905082815260208101848484011115614beb57614bea614afc565b5b614bf6848285614bad565b509392505050565b600082601f830112614c1357614c12614af7565b5b8135614c23848260208601614bbc565b91505092915050565b600060208284031215614c4257614c416147bf565b5b600082013567ffffffffffffffff811115614c6057614c5f6147c4565b5b614c6c84828501614bfe565b91505092915050565b600080600060608486031215614c8e57614c8d6147bf565b5b6000614c9c86828701614a15565b9350506020614cad86828701614a15565b9250506040614cbe86828701614960565b9150509250925092565b600080fd5b600080fd5b60008083601f840112614ce857614ce7614af7565b5b8235905067ffffffffffffffff811115614d0557614d04614cc8565b5b602083019150836020820283011115614d2157614d20614ccd565b5b9250929050565b600080600060408486031215614d4157614d406147bf565b5b6000614d4f86828701614960565b935050602084013567ffffffffffffffff811115614d7057614d6f6147c4565b5b614d7c86828701614cd2565b92509250509250925092565b614d918161484e565b8114614d9c57600080fd5b50565b600081359050614dae81614d88565b92915050565b600080600060608486031215614dcd57614dcc6147bf565b5b6000614ddb86828701614d9f565b9350506020614dec86828701614960565b9250506040614dfd86828701614960565b9150509250925092565b614e1081614a94565b82525050565b6000602082019050614e2b6000830184614e07565b92915050565b600060208284031215614e4757614e466147bf565b5b6000614e5584828501614a15565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614e938161493f565b82525050565b6000614ea58383614e8a565b60208301905092915050565b6000602082019050919050565b6000614ec982614e5e565b614ed38185614e69565b9350614ede83614e7a565b8060005b83811015614f0f578151614ef68882614e99565b9750614f0183614eb1565b925050600181019050614ee2565b5085935050505092915050565b60006020820190508181036000830152614f368184614ebe565b905092915050565b60008060408385031215614f5557614f546147bf565b5b6000614f6385828601614a15565b9250506020614f7485828601614d9f565b9150509250929050565b600067ffffffffffffffff821115614f9957614f98614b01565b5b614fa2826148d3565b9050602081019050919050565b6000614fc2614fbd84614f7e565b614b61565b905082815260208101848484011115614fde57614fdd614afc565b5b614fe9848285614bad565b509392505050565b600082601f83011261500657615005614af7565b5b8135615016848260208601614faf565b91505092915050565b60008060008060808587031215615039576150386147bf565b5b600061504787828801614a15565b945050602061505887828801614a15565b935050604061506987828801614960565b925050606085013567ffffffffffffffff81111561508a576150896147c4565b5b61509687828801614ff1565b91505092959194509250565b6000602082840312156150b8576150b76147bf565b5b60006150c684828501614d9f565b91505092915050565b600080604083850312156150e6576150e56147bf565b5b60006150f485828601614a15565b925050602061510585828601614a15565b9150509250929050565b60008060408385031215615126576151256147bf565b5b600061513485828601614960565b925050602061514585828601614a15565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061519657607f821691505b602082108114156151aa576151a961514f565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006151e660208361488f565b91506151f1826151b0565b602082019050919050565b60006020820190508181036000830152615215816151d9565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b600061525260148361488f565b915061525d8261521c565b602082019050919050565b6000602082019050818103600083015261528181615245565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006152c28261493f565b91506152cd8361493f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561530257615301615288565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b600061534360148361488f565b915061534e8261530d565b602082019050919050565b6000602082019050818103600083015261537281615336565b9050919050565b60006153848261493f565b915061538f8361493f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156153c8576153c7615288565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b600061540960138361488f565b9150615414826153d3565b602082019050919050565b60006020820190508181036000830152615438816153fc565b9050919050565b7f5468652077686974656c6973742073616c65206973206e6f7420656e61626c6560008201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b600061549b60228361488f565b91506154a68261543f565b604082019050919050565b600060208201905081810360008301526154ca8161548e565b9050919050565b7f4164647265737320616c726561647920636c61696d6564210000000000000000600082015250565b600061550760188361488f565b9150615512826154d1565b602082019050919050565b60006020820190508181036000830152615536816154fa565b9050919050565b60008160601b9050919050565b60006155558261553d565b9050919050565b60006155678261554a565b9050919050565b61557f61557a826149c2565b61555c565b82525050565b6000615591828461556e565b60148201915081905092915050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b60006155d6600e8361488f565b91506155e1826155a0565b602082019050919050565b60006020820190508181036000830152615605816155c9565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000615642601f8361488f565b915061564d8261560c565b602082019050919050565b6000602082019050818103600083015261567181615635565b9050919050565b600081905092915050565b50565b6000615693600083615678565b915061569e82615683565b600082019050919050565b60006156b482615686565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006156f88261493f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561572b5761572a615288565b5b600182019050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b600061576c60178361488f565b915061577782615736565b602082019050919050565b6000602082019050818103600083015261579b8161575f565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006157fe602f8361488f565b9150615809826157a2565b604082019050919050565b6000602082019050818103600083015261582d816157f1565b9050919050565b600081905092915050565b600061584a82614884565b6158548185615834565b93506158648185602086016148a0565b80840191505092915050565b60008190508160005260206000209050919050565b600081546158928161517e565b61589c8186615834565b945060018216600081146158b757600181146158c8576158fb565b60ff198316865281860193506158fb565b6158d185615870565b60005b838110156158f3578154818901526001820191506020810190506158d4565b838801955050505b50505092915050565b6000615910828661583f565b915061591c828561583f565b91506159288284615885565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061599160268361488f565b915061599c82615935565b604082019050919050565b600060208201905081810360008301526159c081615984565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006159ee826159c7565b6159f881856159d2565b9350615a088185602086016148a0565b615a11816148d3565b840191505092915050565b6000608082019050615a3160008301876149d4565b615a3e60208301866149d4565b615a4b6040830185614a6a565b8181036060830152615a5d81846159e3565b905095945050505050565b600081519050615a77816147f5565b92915050565b600060208284031215615a9357615a926147bf565b5b6000615aa184828501615a68565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615ae48261493f565b9150615aef8361493f565b925082615aff57615afe615aaa565b5b828204905092915050565b6000615b158261493f565b9150615b208361493f565b925082821015615b3357615b32615288565b5b828203905092915050565b6000615b498261493f565b9150615b548361493f565b925082615b6457615b63615aaa565b5b82820690509291505056fea2646970667358221220608b98324475d55e9ac55c4ccf7cf41e3ef4b5ac3fa6df475d500b87e35f600964736f6c634300080b00330000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000013880000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000020075d1304e2c2eb1b1fada10fd29b94ae29bd85441fa68acc9ffde79d9869dc399757040437e1eeb740018b9cad6cce2fb8bcabc10be5374f4b4952060301c0bae75d1304e2c2eb1b1fada10fd29b94ae29bd85441fa68acc9ffde79d9869dc3990000000000000000000000000000000000000000000000000000000000000008447261676f6e69610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005445241434f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f62616679626569687667727234736b343663727874676f70617879657533683462653461617267693565663437696d34676a6761746b76756462692f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b68696464656e2e6a736f6e000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103ce5760003560e01c8063694aaf5b116101fd578063a22cb46511610118578063ca34adf0116100ab578063e985e9c51161007a578063e985e9c514610df9578063efbd73f414610e36578063f2fde38b14610e5f578063f96feb9714610e88578063fc4d26c714610eb1576103ce565b8063ca34adf014610d51578063d5abeb0114610d7c578063dc5ed7ce14610da7578063e0a8085314610dd0576103ce565b8063b08a55f6116100e7578063b08a55f614610c99578063b88d4fde14610cc2578063bd9ebe8b14610ceb578063c87b56dd14610d14576103ce565b8063a22cb46514610bef578063a2ec32f114610c18578063a45ba8e714610c43578063b079277114610c6e576103ce565b80637ec4a659116101905780638815cb231161015f5780638815cb2314610b545780638da5cb5b14610b7d57806395d89b4114610ba8578063a0712d6814610bd3576103ce565b80637ec4a65914610aac578063813b2ef814610ad557806384db206814610afe5780638693da2014610b29576103ce565b8063715018a6116101cc578063715018a614610a1657806373025b2014610a2d578063791ef18914610a585780637cd4761014610a81576103ce565b8063694aaf5b146109485780636af86c16146109715780636f1e154e1461099c57806370a08231146109d9576103ce565b80633373b3eb116102ed5780634fdd43cb116102805780635c975abb1161024f5780635c975abb1461088c57806362b99ad4146108b75780636352211e146108e257806368bcea8a1461091f576103ce565b80634fdd43cb146107e25780635061a1b31461080b57806351830227146108365780635503a0e814610861576103ce565b80633ee7b798116102bc5780633ee7b7981461072857806342842e0e14610751578063438b63001461077a578063442d9dec146107b7576103ce565b80633373b3eb1461067b578063347917c5146106b85780633ccfd60b146106d45780633d5aa27f146106eb576103ce565b80631950c2fc11610365578063294797ee11610334578063294797ee146105e05780632aa4520c146105fc5780632dfdb48c146106255780632eb4a7ab14610650576103ce565b80631950c2fc146105495780631c4ad7c91461057257806323b872dd1461059b5780632418e22c146105c4576103ce565b80630af11a13116103a15780630af11a13146104a157806314295774146104cc57806316ba10e0146104f557806318160ddd1461051e576103ce565b806301ffc9a7146103d357806306fdde0314610410578063081812fc1461043b578063095ea7b314610478575b600080fd5b3480156103df57600080fd5b506103fa60048036038101906103f59190614821565b610edc565b6040516104079190614869565b60405180910390f35b34801561041c57600080fd5b50610425610fbe565b604051610432919061491d565b60405180910390f35b34801561044757600080fd5b50610462600480360381019061045d9190614975565b611050565b60405161046f91906149e3565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a9190614a2a565b6110cc565b005b3480156104ad57600080fd5b506104b66111d7565b6040516104c39190614a79565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee9190614aca565b6111dd565b005b34801561050157600080fd5b5061051c60048036038101906105179190614c2c565b611263565b005b34801561052a57600080fd5b506105336112f9565b6040516105409190614a79565b60405180910390f35b34801561055557600080fd5b50610570600480360381019061056b9190614975565b611310565b005b34801561057e57600080fd5b5061059960048036038101906105949190614aca565b611396565b005b3480156105a757600080fd5b506105c260048036038101906105bd9190614c75565b61141c565b005b6105de60048036038101906105d99190614d28565b61142c565b005b6105fa60048036038101906105f59190614d28565b611740565b005b34801561060857600080fd5b50610623600480360381019061061e9190614db4565b611a54565b005b34801561063157600080fd5b5061063a611b01565b6040516106479190614a79565b60405180910390f35b34801561065c57600080fd5b50610665611b07565b6040516106729190614e16565b60405180910390f35b34801561068757600080fd5b506106a2600480360381019061069d9190614e31565b611b0d565b6040516106af9190614869565b60405180910390f35b6106d260048036038101906106cd9190614d28565b611b2d565b005b3480156106e057600080fd5b506106e9611e41565b005b3480156106f757600080fd5b50610712600480360381019061070d9190614e31565b611f93565b60405161071f9190614869565b60405180910390f35b34801561073457600080fd5b5061074f600480360381019061074a9190614975565b611fb3565b005b34801561075d57600080fd5b5061077860048036038101906107739190614c75565b612039565b005b34801561078657600080fd5b506107a1600480360381019061079c9190614e31565b612059565b6040516107ae9190614f1c565b60405180910390f35b3480156107c357600080fd5b506107cc612274565b6040516107d99190614a79565b60405180910390f35b3480156107ee57600080fd5b5061080960048036038101906108049190614c2c565b61227a565b005b34801561081757600080fd5b50610820612310565b60405161082d9190614a79565b60405180910390f35b34801561084257600080fd5b5061084b612316565b6040516108589190614869565b60405180910390f35b34801561086d57600080fd5b50610876612329565b604051610883919061491d565b60405180910390f35b34801561089857600080fd5b506108a16123b7565b6040516108ae9190614869565b60405180910390f35b3480156108c357600080fd5b506108cc6123ca565b6040516108d9919061491d565b60405180910390f35b3480156108ee57600080fd5b5061090960048036038101906109049190614975565b612458565b60405161091691906149e3565b60405180910390f35b34801561092b57600080fd5b5061094660048036038101906109419190614db4565b61246e565b005b34801561095457600080fd5b5061096f600480360381019061096a9190614975565b612536565b005b34801561097d57600080fd5b506109866125bc565b6040516109939190614869565b60405180910390f35b3480156109a857600080fd5b506109c360048036038101906109be9190614e31565b6125cf565b6040516109d09190614869565b60405180910390f35b3480156109e557600080fd5b50610a0060048036038101906109fb9190614e31565b6125ef565b604051610a0d9190614a79565b60405180910390f35b348015610a2257600080fd5b50610a2b6126bf565b005b348015610a3957600080fd5b50610a42612747565b604051610a4f9190614e16565b60405180910390f35b348015610a6457600080fd5b50610a7f6004803603810190610a7a9190614db4565b61274d565b005b348015610a8d57600080fd5b50610a96612815565b604051610aa39190614a79565b60405180910390f35b348015610ab857600080fd5b50610ad36004803603810190610ace9190614c2c565b61281b565b005b348015610ae157600080fd5b50610afc6004803603810190610af79190614975565b6128b1565b005b348015610b0a57600080fd5b50610b13612937565b604051610b209190614a79565b60405180910390f35b348015610b3557600080fd5b50610b3e61293d565b604051610b4b9190614a79565b60405180910390f35b348015610b6057600080fd5b50610b7b6004803603810190610b769190614975565b612943565b005b348015610b8957600080fd5b50610b926129c9565b604051610b9f91906149e3565b60405180910390f35b348015610bb457600080fd5b50610bbd6129f3565b604051610bca919061491d565b60405180910390f35b610bed6004803603810190610be89190614975565b612a85565b005b348015610bfb57600080fd5b50610c166004803603810190610c119190614f3e565b612be5565b005b348015610c2457600080fd5b50610c2d612d5d565b604051610c3a9190614869565b60405180910390f35b348015610c4f57600080fd5b50610c58612d70565b604051610c65919061491d565b60405180910390f35b348015610c7a57600080fd5b50610c83612dfe565b604051610c909190614869565b60405180910390f35b348015610ca557600080fd5b50610cc06004803603810190610cbb9190614975565b612e11565b005b348015610cce57600080fd5b50610ce96004803603810190610ce4919061501f565b612e97565b005b348015610cf757600080fd5b50610d126004803603810190610d0d9190614aca565b612f13565b005b348015610d2057600080fd5b50610d3b6004803603810190610d369190614975565b612f99565b604051610d48919061491d565b60405180910390f35b348015610d5d57600080fd5b50610d666130f2565b604051610d739190614e16565b60405180910390f35b348015610d8857600080fd5b50610d916130f8565b604051610d9e9190614a79565b60405180910390f35b348015610db357600080fd5b50610dce6004803603810190610dc99190614db4565b6130fe565b005b348015610ddc57600080fd5b50610df76004803603810190610df291906150a2565b6131fa565b005b348015610e0557600080fd5b50610e206004803603810190610e1b91906150cf565b613293565b604051610e2d9190614869565b60405180910390f35b348015610e4257600080fd5b50610e5d6004803603810190610e58919061510f565b613327565b005b348015610e6b57600080fd5b50610e866004803603810190610e819190614e31565b6133b1565b005b348015610e9457600080fd5b50610eaf6004803603810190610eaa9190614975565b6134a9565b005b348015610ebd57600080fd5b50610ec661352f565b604051610ed39190614a79565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610fa757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610fb75750610fb682613535565b5b9050919050565b606060028054610fcd9061517e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff99061517e565b80156110465780601f1061101b57610100808354040283529160200191611046565b820191906000526020600020905b81548152906001019060200180831161102957829003601f168201915b5050505050905090565b600061105b8261359f565b611091576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006110d782612458565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561113f576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661115e6135ed565b73ffffffffffffffffffffffffffffffffffffffff1614158015611190575061118e816111896135ed565b613293565b155b156111c7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111d28383836135f5565b505050565b601a5481565b6111e56135ed565b73ffffffffffffffffffffffffffffffffffffffff166112036129c9565b73ffffffffffffffffffffffffffffffffffffffff1614611259576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611250906151fc565b60405180910390fd5b80600c8190555050565b61126b6135ed565b73ffffffffffffffffffffffffffffffffffffffff166112896129c9565b73ffffffffffffffffffffffffffffffffffffffff16146112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d6906151fc565b60405180910390fd5b80601190805190602001906112f59291906146cf565b5050565b60006113036136a7565b6001546000540303905090565b6113186135ed565b73ffffffffffffffffffffffffffffffffffffffff166113366129c9565b73ffffffffffffffffffffffffffffffffffffffff161461138c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611383906151fc565b60405180910390fd5b8060158190555050565b61139e6135ed565b73ffffffffffffffffffffffffffffffffffffffff166113bc6129c9565b73ffffffffffffffffffffffffffffffffffffffff1614611412576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611409906151fc565b60405180910390fd5b80600e8190555050565b6114278383836136b0565b505050565b8260008111801561143f57506018548111155b61147e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147590615268565b60405180910390fd5b6017548161148a6112f9565b61149491906152b7565b11156114d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cc90615359565b60405180910390fd5b83806014546114e49190615379565b341015611526576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151d9061541f565b60405180910390fd5b601c60019054906101000a900460ff16611575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156c906154b1565b60405180910390fd5b600b60006115816135ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611609576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116009061551d565b60405180910390fd5b60006116136135ed565b6040516020016116239190615585565b604051602081830303815290604052805190602001209050611689858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483613b66565b6116c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bf906155ec565b60405180910390fd5b6001600b60006116d66135ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506117386117326135ed565b87613b7d565b505050505050565b8260008111801561175357506019548111155b611792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178990615268565b60405180910390fd5b6017548161179e6112f9565b6117a891906152b7565b11156117e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e090615359565b60405180910390fd5b83806015546117f89190615379565b34101561183a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118319061541f565b60405180910390fd5b601c60029054906101000a900460ff16611889576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611880906154b1565b60405180910390fd5b600d60006118956135ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561191d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119149061551d565b60405180910390fd5b60006119276135ed565b6040516020016119379190615585565b60405160208183030381529060405280519060200120905061199d858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c5483613b66565b6119dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d3906155ec565b60405180910390fd5b6001600d60006119ea6135ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611a4c611a466135ed565b87613b7d565b505050505050565b611a5c6135ed565b73ffffffffffffffffffffffffffffffffffffffff16611a7a6129c9565b73ffffffffffffffffffffffffffffffffffffffff1614611ad0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac7906151fc565b60405180910390fd5b611ad982612e11565b611ae2816134a9565b82601c60016101000a81548160ff021916908315150217905550505050565b601b5481565b600a5481565b600d6020528060005260406000206000915054906101000a900460ff1681565b82600081118015611b405750601a548111155b611b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7690615268565b60405180910390fd5b60175481611b8b6112f9565b611b9591906152b7565b1115611bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcd90615359565b60405180910390fd5b8380601654611be59190615379565b341015611c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1e9061541f565b60405180910390fd5b601c60039054906101000a900460ff16611c76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6d906154b1565b60405180910390fd5b600f6000611c826135ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d019061551d565b60405180910390fd5b6000611d146135ed565b604051602001611d249190615585565b604051602081830303815290604052805190602001209050611d8a858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483613b66565b611dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc0906155ec565b60405180910390fd5b6001600f6000611dd76135ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611e39611e336135ed565b87613b7d565b505050505050565b611e496135ed565b73ffffffffffffffffffffffffffffffffffffffff16611e676129c9565b73ffffffffffffffffffffffffffffffffffffffff1614611ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb4906151fc565b60405180910390fd5b60026009541415611f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efa90615658565b60405180910390fd5b60026009819055506000611f156129c9565b73ffffffffffffffffffffffffffffffffffffffff1647604051611f38906156a9565b60006040518083038185875af1925050503d8060008114611f75576040519150601f19603f3d011682016040523d82523d6000602084013e611f7a565b606091505b5050905080611f8857600080fd5b506001600981905550565b600b6020528060005260406000206000915054906101000a900460ff1681565b611fbb6135ed565b73ffffffffffffffffffffffffffffffffffffffff16611fd96129c9565b73ffffffffffffffffffffffffffffffffffffffff161461202f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612026906151fc565b60405180910390fd5b80601a8190555050565b61205483838360405180602001604052806000815250612e97565b505050565b60606000612066836125ef565b905060008167ffffffffffffffff81111561208457612083614b01565b5b6040519080825280602002602001820160405280156120b25781602001602082028036833780820191505090505b50905060006120bf6136a7565b90506000805b84821080156120d657506017548311155b15612267576000600460008581526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511580156121e35750600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614155b156121f057806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122535783858481518110612238576122376156be565b5b602002602001018181525050828061224f906156ed565b9350505b838061225e906156ed565b945050506120c5565b8395505050505050919050565b60145481565b6122826135ed565b73ffffffffffffffffffffffffffffffffffffffff166122a06129c9565b73ffffffffffffffffffffffffffffffffffffffff16146122f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ed906151fc565b60405180910390fd5b806012908051906020019061230c9291906146cf565b5050565b60195481565b601c60049054906101000a900460ff1681565b601180546123369061517e565b80601f01602080910402602001604051908101604052809291908181526020018280546123629061517e565b80156123af5780601f10612384576101008083540402835291602001916123af565b820191906000526020600020905b81548152906001019060200180831161239257829003601f168201915b505050505081565b601c60009054906101000a900460ff1681565b601080546123d79061517e565b80601f01602080910402602001604051908101604052809291908181526020018280546124039061517e565b80156124505780601f1061242557610100808354040283529160200191612450565b820191906000526020600020905b81548152906001019060200180831161243357829003601f168201915b505050505081565b600061246382613b9b565b600001519050919050565b6124766135ed565b73ffffffffffffffffffffffffffffffffffffffff166124946129c9565b73ffffffffffffffffffffffffffffffffffffffff16146124ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e1906151fc565b60405180910390fd5b6124f382612536565b6124fc81611fb3565b6000601c60026101000a81548160ff02191690831515021790555082601c60036101000a81548160ff021916908315150217905550505050565b61253e6135ed565b73ffffffffffffffffffffffffffffffffffffffff1661255c6129c9565b73ffffffffffffffffffffffffffffffffffffffff16146125b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a9906151fc565b60405180910390fd5b8060168190555050565b601c60019054906101000a900460ff1681565b600f6020528060005260406000206000915054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612657576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6126c76135ed565b73ffffffffffffffffffffffffffffffffffffffff166126e56129c9565b73ffffffffffffffffffffffffffffffffffffffff161461273b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612732906151fc565b60405180910390fd5b6127456000613e2a565b565b600e5481565b6127556135ed565b73ffffffffffffffffffffffffffffffffffffffff166127736129c9565b73ffffffffffffffffffffffffffffffffffffffff16146127c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c0906151fc565b60405180910390fd5b6127d282611310565b6127db81612943565b6000601c60016101000a81548160ff02191690831515021790555082601c60026101000a81548160ff021916908315150217905550505050565b60165481565b6128236135ed565b73ffffffffffffffffffffffffffffffffffffffff166128416129c9565b73ffffffffffffffffffffffffffffffffffffffff1614612897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288e906151fc565b60405180910390fd5b80601090805190602001906128ad9291906146cf565b5050565b6128b96135ed565b73ffffffffffffffffffffffffffffffffffffffff166128d76129c9565b73ffffffffffffffffffffffffffffffffffffffff161461292d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612924906151fc565b60405180910390fd5b80601b8190555050565b60155481565b60135481565b61294b6135ed565b73ffffffffffffffffffffffffffffffffffffffff166129696129c9565b73ffffffffffffffffffffffffffffffffffffffff16146129bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b6906151fc565b60405180910390fd5b8060198190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054612a029061517e565b80601f0160208091040260200160405190810160405280929190818152602001828054612a2e9061517e565b8015612a7b5780601f10612a5057610100808354040283529160200191612a7b565b820191906000526020600020905b815481529060010190602001808311612a5e57829003601f168201915b5050505050905090565b80600081118015612a985750601b548111155b612ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ace90615268565b60405180910390fd5b60175481612ae36112f9565b612aed91906152b7565b1115612b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2590615359565b60405180910390fd5b8180601354612b3d9190615379565b341015612b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b769061541f565b60405180910390fd5b601c60009054906101000a900460ff1615612bcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc690615782565b60405180910390fd5b612be0612bda6135ed565b84613b7d565b505050565b612bed6135ed565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c52576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612c5f6135ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612d0c6135ed565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612d519190614869565b60405180910390a35050565b601c60039054906101000a900460ff1681565b60128054612d7d9061517e565b80601f0160208091040260200160405190810160405280929190818152602001828054612da99061517e565b8015612df65780601f10612dcb57610100808354040283529160200191612df6565b820191906000526020600020905b815481529060010190602001808311612dd957829003601f168201915b505050505081565b601c60029054906101000a900460ff1681565b612e196135ed565b73ffffffffffffffffffffffffffffffffffffffff16612e376129c9565b73ffffffffffffffffffffffffffffffffffffffff1614612e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e84906151fc565b60405180910390fd5b8060148190555050565b612ea28484846136b0565b612ec18373ffffffffffffffffffffffffffffffffffffffff16613ef0565b8015612ed65750612ed484848484613f13565b155b15612f0d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b612f1b6135ed565b73ffffffffffffffffffffffffffffffffffffffff16612f396129c9565b73ffffffffffffffffffffffffffffffffffffffff1614612f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f86906151fc565b60405180910390fd5b80600a8190555050565b6060612fa48261359f565b612fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fda90615814565b60405180910390fd5b60001515601c60049054906101000a900460ff1615151415613091576012805461300c9061517e565b80601f01602080910402602001604051908101604052809291908181526020018280546130389061517e565b80156130855780601f1061305a57610100808354040283529160200191613085565b820191906000526020600020905b81548152906001019060200180831161306857829003601f168201915b505050505090506130ed565b600061309b614064565b905060008151116130bb57604051806020016040528060008152506130e9565b806130c5846140f6565b60116040516020016130d993929190615904565b6040516020818303038152906040525b9150505b919050565b600c5481565b60175481565b6131066135ed565b73ffffffffffffffffffffffffffffffffffffffff166131246129c9565b73ffffffffffffffffffffffffffffffffffffffff161461317a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613171906151fc565b60405180910390fd5b8160138190555061318a816128b1565b6000601c60016101000a81548160ff0219169083151502179055506000601c60026101000a81548160ff0219169083151502179055506000601c60036101000a81548160ff02191690831515021790555082601c60006101000a81548160ff021916908315150217905550505050565b6132026135ed565b73ffffffffffffffffffffffffffffffffffffffff166132206129c9565b73ffffffffffffffffffffffffffffffffffffffff1614613276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326d906151fc565b60405180910390fd5b80601c60046101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61332f6135ed565b73ffffffffffffffffffffffffffffffffffffffff1661334d6129c9565b73ffffffffffffffffffffffffffffffffffffffff16146133a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339a906151fc565b60405180910390fd5b6133ad8183613b7d565b5050565b6133b96135ed565b73ffffffffffffffffffffffffffffffffffffffff166133d76129c9565b73ffffffffffffffffffffffffffffffffffffffff161461342d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613424906151fc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561349d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613494906159a7565b60405180910390fd5b6134a681613e2a565b50565b6134b16135ed565b73ffffffffffffffffffffffffffffffffffffffff166134cf6129c9565b73ffffffffffffffffffffffffffffffffffffffff1614613525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351c906151fc565b60405180910390fd5b8060188190555050565b60185481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816135aa6136a7565b111580156135b9575060005482105b80156135e6575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006136bb82613b9b565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613726576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166137476135ed565b73ffffffffffffffffffffffffffffffffffffffff1614806137765750613775856137706135ed565b613293565b5b806137bb57506137846135ed565b73ffffffffffffffffffffffffffffffffffffffff166137a384611050565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806137f4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561385b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6138688585856001614257565b613874600084876135f5565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613af4576000548214613af357878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613b5f858585600161425d565b5050505050565b600082613b738584614263565b1490509392505050565b613b978282604051806020016040528060008152506142d8565b5050565b613ba3614755565b600082905080613bb16136a7565b11158015613bc0575060005481105b15613df3576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151613df157600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613cd5578092505050613e25565b5b600115613df057818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613deb578092505050613e25565b613cd6565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613f396135ed565b8786866040518563ffffffff1660e01b8152600401613f5b9493929190615a1c565b6020604051808303816000875af1925050508015613f9757506040513d601f19601f82011682018060405250810190613f949190615a7d565b60015b614011573d8060008114613fc7576040519150601f19603f3d011682016040523d82523d6000602084013e613fcc565b606091505b50600081511415614009576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060601080546140739061517e565b80601f016020809104026020016040519081016040528092919081815260200182805461409f9061517e565b80156140ec5780601f106140c1576101008083540402835291602001916140ec565b820191906000526020600020905b8154815290600101906020018083116140cf57829003601f168201915b5050505050905090565b6060600082141561413e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050614252565b600082905060005b60008214614170578080614159906156ed565b915050600a826141699190615ad9565b9150614146565b60008167ffffffffffffffff81111561418c5761418b614b01565b5b6040519080825280601f01601f1916602001820160405280156141be5781602001600182028036833780820191505090505b5090505b6000851461424b576001826141d79190615b0a565b9150600a856141e69190615b3e565b60306141f291906152b7565b60f81b818381518110614208576142076156be565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856142449190615ad9565b94506141c2565b8093505050505b919050565b50505050565b50505050565b60008082905060005b84518110156142cd57600085828151811061428a576142896156be565b5b602002602001015190508083116142ac576142a583826142ea565b92506142b9565b6142b681846142ea565b92505b5080806142c5906156ed565b91505061426c565b508091505092915050565b6142e58383836001614301565b505050565b600082600052816020526040600020905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561436e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156143a9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6143b66000868387614257565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015614580575061457f8773ffffffffffffffffffffffffffffffffffffffff16613ef0565b5b15614646575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46145f56000888480600101955088613f13565b61462b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561458657826000541461464157600080fd5b6146b2565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415614647575b8160008190555050506146c8600086838761425d565b5050505050565b8280546146db9061517e565b90600052602060002090601f0160209004810192826146fd5760008555614744565b82601f1061471657805160ff1916838001178555614744565b82800160010185558215614744579182015b82811115614743578251825591602001919060010190614728565b5b5090506147519190614798565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156147b1576000816000905550600101614799565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6147fe816147c9565b811461480957600080fd5b50565b60008135905061481b816147f5565b92915050565b600060208284031215614837576148366147bf565b5b60006148458482850161480c565b91505092915050565b60008115159050919050565b6148638161484e565b82525050565b600060208201905061487e600083018461485a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156148be5780820151818401526020810190506148a3565b838111156148cd576000848401525b50505050565b6000601f19601f8301169050919050565b60006148ef82614884565b6148f9818561488f565b93506149098185602086016148a0565b614912816148d3565b840191505092915050565b6000602082019050818103600083015261493781846148e4565b905092915050565b6000819050919050565b6149528161493f565b811461495d57600080fd5b50565b60008135905061496f81614949565b92915050565b60006020828403121561498b5761498a6147bf565b5b600061499984828501614960565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006149cd826149a2565b9050919050565b6149dd816149c2565b82525050565b60006020820190506149f860008301846149d4565b92915050565b614a07816149c2565b8114614a1257600080fd5b50565b600081359050614a24816149fe565b92915050565b60008060408385031215614a4157614a406147bf565b5b6000614a4f85828601614a15565b9250506020614a6085828601614960565b9150509250929050565b614a738161493f565b82525050565b6000602082019050614a8e6000830184614a6a565b92915050565b6000819050919050565b614aa781614a94565b8114614ab257600080fd5b50565b600081359050614ac481614a9e565b92915050565b600060208284031215614ae057614adf6147bf565b5b6000614aee84828501614ab5565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614b39826148d3565b810181811067ffffffffffffffff82111715614b5857614b57614b01565b5b80604052505050565b6000614b6b6147b5565b9050614b778282614b30565b919050565b600067ffffffffffffffff821115614b9757614b96614b01565b5b614ba0826148d3565b9050602081019050919050565b82818337600083830152505050565b6000614bcf614bca84614b7c565b614b61565b905082815260208101848484011115614beb57614bea614afc565b5b614bf6848285614bad565b509392505050565b600082601f830112614c1357614c12614af7565b5b8135614c23848260208601614bbc565b91505092915050565b600060208284031215614c4257614c416147bf565b5b600082013567ffffffffffffffff811115614c6057614c5f6147c4565b5b614c6c84828501614bfe565b91505092915050565b600080600060608486031215614c8e57614c8d6147bf565b5b6000614c9c86828701614a15565b9350506020614cad86828701614a15565b9250506040614cbe86828701614960565b9150509250925092565b600080fd5b600080fd5b60008083601f840112614ce857614ce7614af7565b5b8235905067ffffffffffffffff811115614d0557614d04614cc8565b5b602083019150836020820283011115614d2157614d20614ccd565b5b9250929050565b600080600060408486031215614d4157614d406147bf565b5b6000614d4f86828701614960565b935050602084013567ffffffffffffffff811115614d7057614d6f6147c4565b5b614d7c86828701614cd2565b92509250509250925092565b614d918161484e565b8114614d9c57600080fd5b50565b600081359050614dae81614d88565b92915050565b600080600060608486031215614dcd57614dcc6147bf565b5b6000614ddb86828701614d9f565b9350506020614dec86828701614960565b9250506040614dfd86828701614960565b9150509250925092565b614e1081614a94565b82525050565b6000602082019050614e2b6000830184614e07565b92915050565b600060208284031215614e4757614e466147bf565b5b6000614e5584828501614a15565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614e938161493f565b82525050565b6000614ea58383614e8a565b60208301905092915050565b6000602082019050919050565b6000614ec982614e5e565b614ed38185614e69565b9350614ede83614e7a565b8060005b83811015614f0f578151614ef68882614e99565b9750614f0183614eb1565b925050600181019050614ee2565b5085935050505092915050565b60006020820190508181036000830152614f368184614ebe565b905092915050565b60008060408385031215614f5557614f546147bf565b5b6000614f6385828601614a15565b9250506020614f7485828601614d9f565b9150509250929050565b600067ffffffffffffffff821115614f9957614f98614b01565b5b614fa2826148d3565b9050602081019050919050565b6000614fc2614fbd84614f7e565b614b61565b905082815260208101848484011115614fde57614fdd614afc565b5b614fe9848285614bad565b509392505050565b600082601f83011261500657615005614af7565b5b8135615016848260208601614faf565b91505092915050565b60008060008060808587031215615039576150386147bf565b5b600061504787828801614a15565b945050602061505887828801614a15565b935050604061506987828801614960565b925050606085013567ffffffffffffffff81111561508a576150896147c4565b5b61509687828801614ff1565b91505092959194509250565b6000602082840312156150b8576150b76147bf565b5b60006150c684828501614d9f565b91505092915050565b600080604083850312156150e6576150e56147bf565b5b60006150f485828601614a15565b925050602061510585828601614a15565b9150509250929050565b60008060408385031215615126576151256147bf565b5b600061513485828601614960565b925050602061514585828601614a15565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061519657607f821691505b602082108114156151aa576151a961514f565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006151e660208361488f565b91506151f1826151b0565b602082019050919050565b60006020820190508181036000830152615215816151d9565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b600061525260148361488f565b915061525d8261521c565b602082019050919050565b6000602082019050818103600083015261528181615245565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006152c28261493f565b91506152cd8361493f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561530257615301615288565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b600061534360148361488f565b915061534e8261530d565b602082019050919050565b6000602082019050818103600083015261537281615336565b9050919050565b60006153848261493f565b915061538f8361493f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156153c8576153c7615288565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b600061540960138361488f565b9150615414826153d3565b602082019050919050565b60006020820190508181036000830152615438816153fc565b9050919050565b7f5468652077686974656c6973742073616c65206973206e6f7420656e61626c6560008201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b600061549b60228361488f565b91506154a68261543f565b604082019050919050565b600060208201905081810360008301526154ca8161548e565b9050919050565b7f4164647265737320616c726561647920636c61696d6564210000000000000000600082015250565b600061550760188361488f565b9150615512826154d1565b602082019050919050565b60006020820190508181036000830152615536816154fa565b9050919050565b60008160601b9050919050565b60006155558261553d565b9050919050565b60006155678261554a565b9050919050565b61557f61557a826149c2565b61555c565b82525050565b6000615591828461556e565b60148201915081905092915050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b60006155d6600e8361488f565b91506155e1826155a0565b602082019050919050565b60006020820190508181036000830152615605816155c9565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000615642601f8361488f565b915061564d8261560c565b602082019050919050565b6000602082019050818103600083015261567181615635565b9050919050565b600081905092915050565b50565b6000615693600083615678565b915061569e82615683565b600082019050919050565b60006156b482615686565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006156f88261493f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561572b5761572a615288565b5b600182019050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b600061576c60178361488f565b915061577782615736565b602082019050919050565b6000602082019050818103600083015261579b8161575f565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006157fe602f8361488f565b9150615809826157a2565b604082019050919050565b6000602082019050818103600083015261582d816157f1565b9050919050565b600081905092915050565b600061584a82614884565b6158548185615834565b93506158648185602086016148a0565b80840191505092915050565b60008190508160005260206000209050919050565b600081546158928161517e565b61589c8186615834565b945060018216600081146158b757600181146158c8576158fb565b60ff198316865281860193506158fb565b6158d185615870565b60005b838110156158f3578154818901526001820191506020810190506158d4565b838801955050505b50505092915050565b6000615910828661583f565b915061591c828561583f565b91506159288284615885565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061599160268361488f565b915061599c82615935565b604082019050919050565b600060208201905081810360008301526159c081615984565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006159ee826159c7565b6159f881856159d2565b9350615a088185602086016148a0565b615a11816148d3565b840191505092915050565b6000608082019050615a3160008301876149d4565b615a3e60208301866149d4565b615a4b6040830185614a6a565b8181036060830152615a5d81846159e3565b905095945050505050565b600081519050615a77816147f5565b92915050565b600060208284031215615a9357615a926147bf565b5b6000615aa184828501615a68565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615ae48261493f565b9150615aef8361493f565b925082615aff57615afe615aaa565b5b828204905092915050565b6000615b158261493f565b9150615b208361493f565b925082821015615b3357615b32615288565b5b828203905092915050565b6000615b498261493f565b9150615b548361493f565b925082615b6457615b63615aaa565b5b82820690509291505056fea2646970667358221220608b98324475d55e9ac55c4ccf7cf41e3ef4b5ac3fa6df475d500b87e35f600964736f6c634300080b0033

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

0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000013880000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000020075d1304e2c2eb1b1fada10fd29b94ae29bd85441fa68acc9ffde79d9869dc399757040437e1eeb740018b9cad6cce2fb8bcabc10be5374f4b4952060301c0bae75d1304e2c2eb1b1fada10fd29b94ae29bd85441fa68acc9ffde79d9869dc3990000000000000000000000000000000000000000000000000000000000000008447261676f6e69610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005445241434f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f62616679626569687667727234736b343663727874676f70617879657533683462653461617267693565663437696d34676a6761746b76756462692f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b68696464656e2e6a736f6e000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _tokenName (string): Dragonia
Arg [1] : _tokenSymbol (string): DRACO
Arg [2] : _maxSupply (uint256): 5000
Arg [3] : _uriPrefix (string): ipfs://bafybeihvgrr4sk46crxtgopaxyeu3h4be4aargi5ef47im4gjgatkvudbi/
Arg [4] : _hiddenMetadataUri (string): hidden.json
Arg [5] : _merkleRoot (bytes32): 0x75d1304e2c2eb1b1fada10fd29b94ae29bd85441fa68acc9ffde79d9869dc399
Arg [6] : _merkleRoot1 (bytes32): 0x757040437e1eeb740018b9cad6cce2fb8bcabc10be5374f4b4952060301c0bae
Arg [7] : _merkleRoot2 (bytes32): 0x75d1304e2c2eb1b1fada10fd29b94ae29bd85441fa68acc9ffde79d9869dc399

-----Encoded View---------------
18 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001388
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [5] : 75d1304e2c2eb1b1fada10fd29b94ae29bd85441fa68acc9ffde79d9869dc399
Arg [6] : 757040437e1eeb740018b9cad6cce2fb8bcabc10be5374f4b4952060301c0bae
Arg [7] : 75d1304e2c2eb1b1fada10fd29b94ae29bd85441fa68acc9ffde79d9869dc399
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [9] : 447261676f6e6961000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [11] : 445241434f000000000000000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [13] : 697066733a2f2f62616679626569687667727234736b343663727874676f7061
Arg [14] : 7879657533683462653461617267693565663437696d34676a6761746b767564
Arg [15] : 62692f0000000000000000000000000000000000000000000000000000000000
Arg [16] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [17] : 68696464656e2e6a736f6e000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

55379:10184:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37541:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40654:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42157:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41720:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56082:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60258:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36790:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59281:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60364:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43022:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63452:606;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64064:607;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60470:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56121:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55472:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55589:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64677:607;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65291:157;;;;;;;;;;;;;:::i;:::-;;55502:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59737:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43263:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61731:796;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55873:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60015:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56043:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56330:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55765:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56162:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55732:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40462:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60954:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59372:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56192:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55676:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37910:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10174:103;;;;;;;;;;;;;:::i;:::-;;55645:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60694:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55941:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61214:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59875:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55907:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55843:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59599:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9523:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40823:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63085:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42433:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56284:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55803:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56238:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59189:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43519:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60153:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62634:445;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55558:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55975:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61426:299;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59101:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42791:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63317:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10432:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59463:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56004:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37541:305;37643:4;37695:25;37680:40;;;:11;:40;;;;:105;;;;37752:33;37737:48;;;:11;:48;;;;37680:105;:158;;;;37802:36;37826:11;37802:23;:36::i;:::-;37680:158;37660:178;;37541:305;;;:::o;40654:100::-;40708:13;40741:5;40734:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40654:100;:::o;42157:204::-;42225:7;42250:16;42258:7;42250;:16::i;:::-;42245:64;;42275:34;;;;;;;;;;;;;;42245:64;42329:15;:24;42345:7;42329:24;;;;;;;;;;;;;;;;;;;;;42322:31;;42157:204;;;:::o;41720:371::-;41793:13;41809:24;41825:7;41809:15;:24::i;:::-;41793:40;;41854:5;41848:11;;:2;:11;;;41844:48;;;41868:24;;;;;;;;;;;;;;41844:48;41925:5;41909:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;41935:37;41952:5;41959:12;:10;:12::i;:::-;41935:16;:37::i;:::-;41934:38;41909:63;41905:138;;;41996:35;;;;;;;;;;;;;;41905:138;42055:28;42064:2;42068:7;42077:5;42055:8;:28::i;:::-;41782:309;41720:371;;:::o;56082:34::-;;;;:::o;60258:100::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60341:11:::1;60327;:25;;;;60258:100:::0;:::o;61320:::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61404:10:::1;61392:9;:22;;;;;;;;;;;;:::i;:::-;;61320:100:::0;:::o;36790:303::-;36834:7;37059:15;:13;:15::i;:::-;37044:12;;37028:13;;:28;:46;37021:53;;36790:303;:::o;59281:85::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59355:5:::1;59338:14;:22;;;;59281:85:::0;:::o;60364:100::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60447:11:::1;60433;:25;;;;60364:100:::0;:::o;43022:170::-;43156:28;43166:4;43172:2;43176:7;43156:9;:28::i;:::-;43022:170;;;:::o;63452:606::-;63570:11;57958:1;57944:11;:15;:53;;;;;57978:19;;57963:11;:34;;57944:53;57936:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;58068:9;;58053:11;58037:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;58029:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;63613:11:::1;58227;58210:14;;:28;;;;:::i;:::-;58197:9;:41;;58189:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;63679:21:::2;;;;;;;;;;;63671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63755:17;:31;63773:12;:10;:12::i;:::-;63755:31;;;;;;;;;;;;;;;;;;;;;;;;;63754:32;63746:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;63822:12;63864;:10;:12::i;:::-;63847:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;63837:41;;;;;;63822:56;;63893:50;63912:12;;63893:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63926:10;;63938:4;63893:18;:50::i;:::-;63885:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;64005:4;63971:17;:31;63989:12;:10;:12::i;:::-;63971:31;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;64016:36;64026:12;:10;:12::i;:::-;64040:11;64016:9;:36::i;:::-;63626:432;58109:1:::1;63452:606:::0;;;;:::o;64064:607::-;64182:11;58366:1;58352:11;:15;:53;;;;;58386:19;;58371:11;:34;;58352:53;58344:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;58476:9;;58461:11;58445:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;58437:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;64225:11:::1;58635;58618:14;;:28;;;;:::i;:::-;58605:9;:41;;58597:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;64291:21:::2;;;;;;;;;;;64283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64367:17;:31;64385:12;:10;:12::i;:::-;64367:31;;;;;;;;;;;;;;;;;;;;;;;;;64366:32;64358:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;64434:12;64476;:10;:12::i;:::-;64459:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;64449:41;;;;;;64434:56;;64505:51;64524:12;;64505:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64538:11;;64551:4;64505:18;:51::i;:::-;64497:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;64618:4;64584:17;:31;64602:12;:10;:12::i;:::-;64584:31;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;64629:36;64639:12;:10;:12::i;:::-;64653:11;64629:9;:36::i;:::-;64238:433;58517:1:::1;64064:607:::0;;;;:::o;60470:218::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60579:15:::1;60588:5;60579:8;:15::i;:::-;60601:44;60624:20;60601:22;:44::i;:::-;60676:6;60652:21;;:30;;;;;;;;;;;;;;;;;;60470:218:::0;;;:::o;56121:34::-;;;;:::o;55472:25::-;;;;:::o;55589:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;64677:607::-;64795:11;58775:1;58761:11;:15;:53;;;;;58795:19;;58780:11;:34;;58761:53;58753:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;58885:9;;58870:11;58854:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;58846:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;64838:11:::1;59044;59027:14;;:28;;;;:::i;:::-;59014:9;:41;;59006:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;64904:21:::2;;;;;;;;;;;64896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64980:17;:31;64998:12;:10;:12::i;:::-;64980:31;;;;;;;;;;;;;;;;;;;;;;;;;64979:32;64971:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;65047:12;65089;:10;:12::i;:::-;65072:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;65062:41;;;;;;65047:56;;65118:51;65137:12;;65118:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65151:11;;65164:4;65118:18;:51::i;:::-;65110:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;65231:4;65197:17;:31;65215:12;:10;:12::i;:::-;65197:31;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;65242:36;65252:12;:10;:12::i;:::-;65266:11;65242:9;:36::i;:::-;64851:433;58926:1:::1;64677:607:::0;;;;:::o;65291:157::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1:::1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;65351:7:::2;65372;:5;:7::i;:::-;65364:21;;65393;65364:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65350:69;;;65434:2;65426:11;;;::::0;::::2;;65341:107;1768:1:::1;2722:7;:22;;;;65291:157::o:0;55502:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;59737:132::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59844:19:::1;59822;:41;;;;59737:132:::0;:::o;43263:185::-;43401:39;43418:4;43424:2;43428:7;43401:39;;;;;;;;;;;;:16;:39::i;:::-;43263:185;;;:::o;61731:796::-;61791:16;61816:23;61842:17;61852:6;61842:9;:17::i;:::-;61816:43;;61866:30;61913:15;61899:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61866:63;;61936:22;61961:15;:13;:15::i;:::-;61936:40;;61983:23;62017:26;62052:441;62077:15;62059;:33;:64;;;;;62114:9;;62096:14;:27;;62059:64;62052:441;;;62134:31;62168:11;:27;62180:14;62168:27;;;;;;;;;;;62134:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62211:9;:16;;;62210:17;:49;;;;;62257:1;62231:28;;:9;:14;;;:28;;;;62210:49;62206:111;;;62293:9;:14;;;62272:35;;62206:111;62353:6;62331:28;;:18;:28;;;62327:132;;;62405:14;62372:13;62386:15;62372:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;62432:17;;;;;:::i;:::-;;;;62327:132;62469:16;;;;;:::i;:::-;;;;62125:368;62052:441;;;62508:13;62501:20;;;;;;;61731:796;;;:::o;55873:29::-;;;;:::o;60015:132::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60123:18:::1;60103:17;:38;;;;;;;;;;;;:::i;:::-;;60015:132:::0;:::o;56043:34::-;;;;:::o;56330:27::-;;;;;;;;;;;;;:::o;55765:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56162:25::-;;;;;;;;;;;;;:::o;55732:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40462:125::-;40526:7;40553:21;40566:7;40553:12;:21::i;:::-;:26;;;40546:33;;40462:125;;;:::o;60954:254::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61063:15:::1;61072:5;61063:8;:15::i;:::-;61085:44;61108:20;61085:22;:44::i;:::-;61160:5;61136:21;;:29;;;;;;;;;;;;;;;;;;61196:6;61172:21;;:30;;;;;;;;;;;;;;;;;;60954:254:::0;;;:::o;59372:85::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59446:5:::1;59429:14;:22;;;;59372:85:::0;:::o;56192:41::-;;;;;;;;;;;;;:::o;55676:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;37910:206::-;37974:7;38015:1;37998:19;;:5;:19;;;37994:60;;;38026:28;;;;;;;;;;;;;;37994:60;38080:12;:19;38093:5;38080:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;38072:36;;38065:43;;37910:206;;;:::o;10174:103::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10239:30:::1;10266:1;10239:18;:30::i;:::-;10174:103::o:0;55645:26::-;;;;:::o;60694:254::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60803:15:::1;60812:5;60803:8;:15::i;:::-;60825:44;60848:20;60825:22;:44::i;:::-;60900:5;60876:21;;:29;;;;;;;;;;;;;;;;;;60936:6;60912:21;;:30;;;;;;;;;;;;;;;;;;60694:254:::0;;;:::o;55941:29::-;;;;:::o;61214:100::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61298:10:::1;61286:9;:22;;;;;;;;;;;;:::i;:::-;;61214:100:::0;:::o;59875:132::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59982:19:::1;59960;:41;;;;59875:132:::0;:::o;55907:29::-;;;;:::o;55843:25::-;;;;:::o;59599:132::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59706:19:::1;59684;:41;;;;59599:132:::0;:::o;9523:87::-;9569:7;9596:6;;;;;;;;;;;9589:13;;9523:87;:::o;40823:104::-;40879:13;40912:7;40905:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40823:104;:::o;63085:224::-;63156:11;57558:1;57544:11;:15;:53;;;;;57578:19;;57563:11;:34;;57544:53;57536:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;57668:9;;57653:11;57637:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;57629:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;63195:11:::1;57819;57806:10;;:24;;;;:::i;:::-;57793:9;:37;;57785:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;63224:6:::2;;;;;;;;;;;63223:7;63215:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;63267:36;63277:12;:10;:12::i;:::-;63291:11;63267:9;:36::i;:::-;57709:1:::1;63085:224:::0;;:::o;42433:287::-;42544:12;:10;:12::i;:::-;42532:24;;:8;:24;;;42528:54;;;42565:17;;;;;;;;;;;;;;42528:54;42640:8;42595:18;:32;42614:12;:10;:12::i;:::-;42595:32;;;;;;;;;;;;;;;:42;42628:8;42595:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;42693:8;42664:48;;42679:12;:10;:12::i;:::-;42664:48;;;42703:8;42664:48;;;;;;:::i;:::-;;;;;;;;42433:287;;:::o;56284:41::-;;;;;;;;;;;;;:::o;55803:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56238:41::-;;;;;;;;;;;;;:::o;59189:85::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59263:5:::1;59246:14;:22;;;;59189:85:::0;:::o;43519:369::-;43686:28;43696:4;43702:2;43706:7;43686:9;:28::i;:::-;43729:15;:2;:13;;;:15::i;:::-;:76;;;;;43749:56;43780:4;43786:2;43790:7;43799:5;43749:30;:56::i;:::-;43748:57;43729:76;43725:156;;;43829:40;;;;;;;;;;;;;;43725:156;43519:369;;;;:::o;60153:99::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60235:11:::1;60222:10;:24;;;;60153:99:::0;:::o;62634:445::-;62708:13;62738:17;62746:8;62738:7;:17::i;:::-;62730:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;62832:5;62820:17;;:8;;;;;;;;;;;:17;;;62816:64;;;62855:17;62848:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62816:64;62888:28;62919:10;:8;:10::i;:::-;62888:41;;62974:1;62949:14;62943:28;:32;:130;;;;;;;;;;;;;;;;;63011:14;63027:19;:8;:17;:19::i;:::-;63048:9;62994:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62943:130;62936:137;;;62634:445;;;;:::o;55558:26::-;;;;:::o;55975:24::-;;;;:::o;61426:299::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61533:5:::1;61520:10;:18;;;;61545:44;61568:20;61545:22;:44::i;:::-;61620:5;61596:21;;:29;;;;;;;;;;;;;;;;;;61656:5;61632:21;;:29;;;;;;;;;;;;;;;;;;61692:5;61668:21;;:29;;;;;;;;;;;;;;;;;;61713:6;61704;;:15;;;;;;;;;;;;;;;;;;61426:299:::0;;;:::o;59101:81::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59170:6:::1;59159:8;;:17;;;;;;;;;;;;;;;;;;59101:81:::0;:::o;42791:164::-;42888:4;42912:18;:25;42931:5;42912:25;;;;;;;;;;;;;;;:35;42938:8;42912:35;;;;;;;;;;;;;;;;;;;;;;;;;42905:42;;42791:164;;;;:::o;63317:127::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63405:33:::1;63415:9;63426:11;63405:9;:33::i;:::-;63317:127:::0;;:::o;10432:201::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10541:1:::1;10521:22;;:8;:22;;;;10513:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10597:28;10616:8;10597:18;:28::i;:::-;10432:201:::0;:::o;59463:132::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59570:19:::1;59548;:41;;;;59463:132:::0;:::o;56004:34::-;;;;:::o;23228:157::-;23313:4;23352:25;23337:40;;;:11;:40;;;;23330:47;;23228:157;;;:::o;44143:187::-;44200:4;44243:7;44224:15;:13;:15::i;:::-;:26;;:53;;;;;44264:13;;44254:7;:23;44224:53;:98;;;;;44295:11;:20;44307:7;44295:20;;;;;;;;;;;:27;;;;;;;;;;;;44294:28;44224:98;44217:105;;44143:187;;;:::o;8247:98::-;8300:7;8327:10;8320:17;;8247:98;:::o;52313:196::-;52455:2;52428:15;:24;52444:7;52428:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;52493:7;52489:2;52473:28;;52482:5;52473:28;;;;;;;;;;;;52313:196;;;:::o;62533:95::-;62598:7;62621:1;62614:8;;62533:95;:::o;47256:2130::-;47371:35;47409:21;47422:7;47409:12;:21::i;:::-;47371:59;;47469:4;47447:26;;:13;:18;;;:26;;;47443:67;;47482:28;;;;;;;;;;;;;;47443:67;47523:22;47565:4;47549:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;47586:36;47603:4;47609:12;:10;:12::i;:::-;47586:16;:36::i;:::-;47549:73;:126;;;;47663:12;:10;:12::i;:::-;47639:36;;:20;47651:7;47639:11;:20::i;:::-;:36;;;47549:126;47523:153;;47694:17;47689:66;;47720:35;;;;;;;;;;;;;;47689:66;47784:1;47770:16;;:2;:16;;;47766:52;;;47795:23;;;;;;;;;;;;;;47766:52;47831:43;47853:4;47859:2;47863:7;47872:1;47831:21;:43::i;:::-;47939:35;47956:1;47960:7;47969:4;47939:8;:35::i;:::-;48300:1;48270:12;:18;48283:4;48270:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48344:1;48316:12;:16;48329:2;48316:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48362:31;48396:11;:20;48408:7;48396:20;;;;;;;;;;;48362:54;;48447:2;48431:8;:13;;;:18;;;;;;;;;;;;;;;;;;48497:15;48464:8;:23;;;:49;;;;;;;;;;;;;;;;;;48765:19;48797:1;48787:7;:11;48765:33;;48813:31;48847:11;:24;48859:11;48847:24;;;;;;;;;;;48813:58;;48915:1;48890:27;;:8;:13;;;;;;;;;;;;:27;;;48886:384;;;49100:13;;49085:11;:28;49081:174;;49154:4;49138:8;:13;;;:20;;;;;;;;;;;;;;;;;;49207:13;:28;;;49181:8;:23;;;:54;;;;;;;;;;;;;;;;;;49081:174;48886:384;48245:1036;;;49317:7;49313:2;49298:27;;49307:4;49298:27;;;;;;;;;;;;49336:42;49357:4;49363:2;49367:7;49376:1;49336:20;:42::i;:::-;47360:2026;;47256:2130;;;:::o;3979:190::-;4104:4;4157;4128:25;4141:5;4148:4;4128:12;:25::i;:::-;:33;4121:40;;3979:190;;;;;:::o;44338:104::-;44407:27;44417:2;44421:8;44407:27;;;;;;;;;;;;:9;:27::i;:::-;44338:104;;:::o;39291:1109::-;39353:21;;:::i;:::-;39387:12;39402:7;39387:22;;39470:4;39451:15;:13;:15::i;:::-;:23;;:47;;;;;39485:13;;39478:4;:20;39451:47;39447:886;;;39519:31;39553:11;:17;39565:4;39553:17;;;;;;;;;;;39519:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39594:9;:16;;;39589:729;;39665:1;39639:28;;:9;:14;;;:28;;;39635:101;;39703:9;39696:16;;;;;;39635:101;40038:261;40045:4;40038:261;;;40078:6;;;;;;;;40123:11;:17;40135:4;40123:17;;;;;;;;;;;40111:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40197:1;40171:28;;:9;:14;;;:28;;;40167:109;;40239:9;40232:16;;;;;;40167:109;40038:261;;;39589:729;39500:833;39447:886;40361:31;;;;;;;;;;;;;;39291:1109;;;;:::o;10793:191::-;10867:16;10886:6;;;;;;;;;;;10867:25;;10912:8;10903:6;;:17;;;;;;;;;;;;;;;;;;10967:8;10936:40;;10957:8;10936:40;;;;;;;;;;;;10856:128;10793:191;:::o;12224:326::-;12284:4;12541:1;12519:7;:19;;;:23;12512:30;;12224:326;;;:::o;53001:667::-;53164:4;53201:2;53185:36;;;53222:12;:10;:12::i;:::-;53236:4;53242:7;53251:5;53185:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53181:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53436:1;53419:6;:13;:18;53415:235;;;53465:40;;;;;;;;;;;;;;53415:235;53608:6;53602:13;53593:6;53589:2;53585:15;53578:38;53181:480;53314:45;;;53304:55;;;:6;:55;;;;53297:62;;;53001:667;;;;;;:::o;65454:104::-;65514:13;65543:9;65536:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65454:104;:::o;5809:723::-;5865:13;6095:1;6086:5;:10;6082:53;;;6113:10;;;;;;;;;;;;;;;;;;;;;6082:53;6145:12;6160:5;6145:20;;6176:14;6201:78;6216:1;6208:4;:9;6201:78;;6234:8;;;;;:::i;:::-;;;;6265:2;6257:10;;;;;:::i;:::-;;;6201:78;;;6289:19;6321:6;6311:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6289:39;;6339:154;6355:1;6346:5;:10;6339:154;;6383:1;6373:11;;;;;:::i;:::-;;;6450:2;6442:5;:10;;;;:::i;:::-;6429:2;:24;;;;:::i;:::-;6416:39;;6399:6;6406;6399:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;6479:2;6470:11;;;;;:::i;:::-;;;6339:154;;;6517:6;6503:21;;;;;5809:723;;;;:::o;54316:159::-;;;;;:::o;55134:158::-;;;;;:::o;4530:675::-;4613:7;4633:20;4656:4;4633:27;;4676:9;4671:497;4695:5;:12;4691:1;:16;4671:497;;;4729:20;4752:5;4758:1;4752:8;;;;;;;;:::i;:::-;;;;;;;;4729:31;;4795:12;4779;:28;4775:382;;4922:42;4937:12;4951;4922:14;:42::i;:::-;4907:57;;4775:382;;;5099:42;5114:12;5128;5099:14;:42::i;:::-;5084:57;;4775:382;4714:454;4709:3;;;;;:::i;:::-;;;;4671:497;;;;5185:12;5178:19;;;4530:675;;;;:::o;44805:163::-;44928:32;44934:2;44938:8;44948:5;44955:4;44928:5;:32::i;:::-;44805:163;;;:::o;5213:224::-;5281:13;5344:1;5338:4;5331:15;5373:1;5367:4;5360:15;5414:4;5408;5398:21;5389:30;;5213:224;;;;:::o;45227:1775::-;45366:20;45389:13;;45366:36;;45431:1;45417:16;;:2;:16;;;45413:48;;;45442:19;;;;;;;;;;;;;;45413:48;45488:1;45476:8;:13;45472:44;;;45498:18;;;;;;;;;;;;;;45472:44;45529:61;45559:1;45563:2;45567:12;45581:8;45529:21;:61::i;:::-;45902:8;45867:12;:16;45880:2;45867:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45966:8;45926:12;:16;45939:2;45926:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46025:2;45992:11;:25;46004:12;45992:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;46092:15;46042:11;:25;46054:12;46042:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;46125:20;46148:12;46125:35;;46175:11;46204:8;46189:12;:23;46175:37;;46233:4;:23;;;;;46241:15;:2;:13;;;:15::i;:::-;46233:23;46229:641;;;46277:314;46333:12;46329:2;46308:38;;46325:1;46308:38;;;;;;;;;;;;46374:69;46413:1;46417:2;46421:14;;;;;;46437:5;46374:30;:69::i;:::-;46369:174;;46479:40;;;;;;;;;;;;;;46369:174;46586:3;46570:12;:19;;46277:314;;46672:12;46655:13;;:29;46651:43;;46686:8;;;46651:43;46229:641;;;46735:120;46791:14;;;;;;46787:2;46766:40;;46783:1;46766:40;;;;;;;;;;;;46850:3;46834:12;:19;;46735:120;;46229:641;46900:12;46884:13;:28;;;;45842:1082;;46934:60;46963:1;46967:2;46971:12;46985:8;46934:20;:60::i;:::-;45355:1647;45227:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:77::-;5327:7;5356:5;5345:16;;5290:77;;;:::o;5373:122::-;5446:24;5464:5;5446:24;:::i;:::-;5439:5;5436:35;5426:63;;5485:1;5482;5475:12;5426:63;5373:122;:::o;5501:139::-;5547:5;5585:6;5572:20;5563:29;;5601:33;5628:5;5601:33;:::i;:::-;5501:139;;;;:::o;5646:329::-;5705:6;5754:2;5742:9;5733:7;5729:23;5725:32;5722:119;;;5760:79;;:::i;:::-;5722:119;5880:1;5905:53;5950:7;5941:6;5930:9;5926:22;5905:53;:::i;:::-;5895:63;;5851:117;5646:329;;;;:::o;5981:117::-;6090:1;6087;6080:12;6104:117;6213:1;6210;6203:12;6227:180;6275:77;6272:1;6265:88;6372:4;6369:1;6362:15;6396:4;6393:1;6386:15;6413:281;6496:27;6518:4;6496:27;:::i;:::-;6488:6;6484:40;6626:6;6614:10;6611:22;6590:18;6578:10;6575:34;6572:62;6569:88;;;6637:18;;:::i;:::-;6569:88;6677:10;6673:2;6666:22;6456:238;6413:281;;:::o;6700:129::-;6734:6;6761:20;;:::i;:::-;6751:30;;6790:33;6818:4;6810:6;6790:33;:::i;:::-;6700:129;;;:::o;6835:308::-;6897:4;6987:18;6979:6;6976:30;6973:56;;;7009:18;;:::i;:::-;6973:56;7047:29;7069:6;7047:29;:::i;:::-;7039:37;;7131:4;7125;7121:15;7113:23;;6835:308;;;:::o;7149:154::-;7233:6;7228:3;7223;7210:30;7295:1;7286:6;7281:3;7277:16;7270:27;7149:154;;;:::o;7309:412::-;7387:5;7412:66;7428:49;7470:6;7428:49;:::i;:::-;7412:66;:::i;:::-;7403:75;;7501:6;7494:5;7487:21;7539:4;7532:5;7528:16;7577:3;7568:6;7563:3;7559:16;7556:25;7553:112;;;7584:79;;:::i;:::-;7553:112;7674:41;7708:6;7703:3;7698;7674:41;:::i;:::-;7393:328;7309:412;;;;;:::o;7741:340::-;7797:5;7846:3;7839:4;7831:6;7827:17;7823:27;7813:122;;7854:79;;:::i;:::-;7813:122;7971:6;7958:20;7996:79;8071:3;8063:6;8056:4;8048:6;8044:17;7996:79;:::i;:::-;7987:88;;7803:278;7741:340;;;;:::o;8087:509::-;8156:6;8205:2;8193:9;8184:7;8180:23;8176:32;8173:119;;;8211:79;;:::i;:::-;8173:119;8359:1;8348:9;8344:17;8331:31;8389:18;8381:6;8378:30;8375:117;;;8411:79;;:::i;:::-;8375:117;8516:63;8571:7;8562:6;8551:9;8547:22;8516:63;:::i;:::-;8506:73;;8302:287;8087:509;;;;:::o;8602:619::-;8679:6;8687;8695;8744:2;8732:9;8723:7;8719:23;8715:32;8712:119;;;8750:79;;:::i;:::-;8712:119;8870:1;8895:53;8940:7;8931:6;8920:9;8916:22;8895:53;:::i;:::-;8885:63;;8841:117;8997:2;9023:53;9068:7;9059:6;9048:9;9044:22;9023:53;:::i;:::-;9013:63;;8968:118;9125:2;9151:53;9196:7;9187:6;9176:9;9172:22;9151:53;:::i;:::-;9141:63;;9096:118;8602:619;;;;;:::o;9227:117::-;9336:1;9333;9326:12;9350:117;9459:1;9456;9449:12;9490:568;9563:8;9573:6;9623:3;9616:4;9608:6;9604:17;9600:27;9590:122;;9631:79;;:::i;:::-;9590:122;9744:6;9731:20;9721:30;;9774:18;9766:6;9763:30;9760:117;;;9796:79;;:::i;:::-;9760:117;9910:4;9902:6;9898:17;9886:29;;9964:3;9956:4;9948:6;9944:17;9934:8;9930:32;9927:41;9924:128;;;9971:79;;:::i;:::-;9924:128;9490:568;;;;;:::o;10064:704::-;10159:6;10167;10175;10224:2;10212:9;10203:7;10199:23;10195:32;10192:119;;;10230:79;;:::i;:::-;10192:119;10350:1;10375:53;10420:7;10411:6;10400:9;10396:22;10375:53;:::i;:::-;10365:63;;10321:117;10505:2;10494:9;10490:18;10477:32;10536:18;10528:6;10525:30;10522:117;;;10558:79;;:::i;:::-;10522:117;10671:80;10743:7;10734:6;10723:9;10719:22;10671:80;:::i;:::-;10653:98;;;;10448:313;10064:704;;;;;:::o;10774:116::-;10844:21;10859:5;10844:21;:::i;:::-;10837:5;10834:32;10824:60;;10880:1;10877;10870:12;10824:60;10774:116;:::o;10896:133::-;10939:5;10977:6;10964:20;10955:29;;10993:30;11017:5;10993:30;:::i;:::-;10896:133;;;;:::o;11035:613::-;11109:6;11117;11125;11174:2;11162:9;11153:7;11149:23;11145:32;11142:119;;;11180:79;;:::i;:::-;11142:119;11300:1;11325:50;11367:7;11358:6;11347:9;11343:22;11325:50;:::i;:::-;11315:60;;11271:114;11424:2;11450:53;11495:7;11486:6;11475:9;11471:22;11450:53;:::i;:::-;11440:63;;11395:118;11552:2;11578:53;11623:7;11614:6;11603:9;11599:22;11578:53;:::i;:::-;11568:63;;11523:118;11035:613;;;;;:::o;11654:118::-;11741:24;11759:5;11741:24;:::i;:::-;11736:3;11729:37;11654:118;;:::o;11778:222::-;11871:4;11909:2;11898:9;11894:18;11886:26;;11922:71;11990:1;11979:9;11975:17;11966:6;11922:71;:::i;:::-;11778:222;;;;:::o;12006:329::-;12065:6;12114:2;12102:9;12093:7;12089:23;12085:32;12082:119;;;12120:79;;:::i;:::-;12082:119;12240:1;12265:53;12310:7;12301:6;12290:9;12286:22;12265:53;:::i;:::-;12255:63;;12211:117;12006:329;;;;:::o;12341:114::-;12408:6;12442:5;12436:12;12426:22;;12341:114;;;:::o;12461:184::-;12560:11;12594:6;12589:3;12582:19;12634:4;12629:3;12625:14;12610:29;;12461:184;;;;:::o;12651:132::-;12718:4;12741:3;12733:11;;12771:4;12766:3;12762:14;12754:22;;12651:132;;;:::o;12789:108::-;12866:24;12884:5;12866:24;:::i;:::-;12861:3;12854:37;12789:108;;:::o;12903:179::-;12972:10;12993:46;13035:3;13027:6;12993:46;:::i;:::-;13071:4;13066:3;13062:14;13048:28;;12903:179;;;;:::o;13088:113::-;13158:4;13190;13185:3;13181:14;13173:22;;13088:113;;;:::o;13237:732::-;13356:3;13385:54;13433:5;13385:54;:::i;:::-;13455:86;13534:6;13529:3;13455:86;:::i;:::-;13448:93;;13565:56;13615:5;13565:56;:::i;:::-;13644:7;13675:1;13660:284;13685:6;13682:1;13679:13;13660:284;;;13761:6;13755:13;13788:63;13847:3;13832:13;13788:63;:::i;:::-;13781:70;;13874:60;13927:6;13874:60;:::i;:::-;13864:70;;13720:224;13707:1;13704;13700:9;13695:14;;13660:284;;;13664:14;13960:3;13953:10;;13361:608;;;13237:732;;;;:::o;13975:373::-;14118:4;14156:2;14145:9;14141:18;14133:26;;14205:9;14199:4;14195:20;14191:1;14180:9;14176:17;14169:47;14233:108;14336:4;14327:6;14233:108;:::i;:::-;14225:116;;13975:373;;;;:::o;14354:468::-;14419:6;14427;14476:2;14464:9;14455:7;14451:23;14447:32;14444:119;;;14482:79;;:::i;:::-;14444:119;14602:1;14627:53;14672:7;14663:6;14652:9;14648:22;14627:53;:::i;:::-;14617:63;;14573:117;14729:2;14755:50;14797:7;14788:6;14777:9;14773:22;14755:50;:::i;:::-;14745:60;;14700:115;14354:468;;;;;:::o;14828:307::-;14889:4;14979:18;14971:6;14968:30;14965:56;;;15001:18;;:::i;:::-;14965:56;15039:29;15061:6;15039:29;:::i;:::-;15031:37;;15123:4;15117;15113:15;15105:23;;14828:307;;;:::o;15141:410::-;15218:5;15243:65;15259:48;15300:6;15259:48;:::i;:::-;15243:65;:::i;:::-;15234:74;;15331:6;15324:5;15317:21;15369:4;15362:5;15358:16;15407:3;15398:6;15393:3;15389:16;15386:25;15383:112;;;15414:79;;:::i;:::-;15383:112;15504:41;15538:6;15533:3;15528;15504:41;:::i;:::-;15224:327;15141:410;;;;;:::o;15570:338::-;15625:5;15674:3;15667:4;15659:6;15655:17;15651:27;15641:122;;15682:79;;:::i;:::-;15641:122;15799:6;15786:20;15824:78;15898:3;15890:6;15883:4;15875:6;15871:17;15824:78;:::i;:::-;15815:87;;15631:277;15570:338;;;;:::o;15914:943::-;16009:6;16017;16025;16033;16082:3;16070:9;16061:7;16057:23;16053:33;16050:120;;;16089:79;;:::i;:::-;16050:120;16209:1;16234:53;16279:7;16270:6;16259:9;16255:22;16234:53;:::i;:::-;16224:63;;16180:117;16336:2;16362:53;16407:7;16398:6;16387:9;16383:22;16362:53;:::i;:::-;16352:63;;16307:118;16464:2;16490:53;16535:7;16526:6;16515:9;16511:22;16490:53;:::i;:::-;16480:63;;16435:118;16620:2;16609:9;16605:18;16592:32;16651:18;16643:6;16640:30;16637:117;;;16673:79;;:::i;:::-;16637:117;16778:62;16832:7;16823:6;16812:9;16808:22;16778:62;:::i;:::-;16768:72;;16563:287;15914:943;;;;;;;:::o;16863:323::-;16919:6;16968:2;16956:9;16947:7;16943:23;16939:32;16936:119;;;16974:79;;:::i;:::-;16936:119;17094:1;17119:50;17161:7;17152:6;17141:9;17137:22;17119:50;:::i;:::-;17109:60;;17065:114;16863:323;;;;:::o;17192:474::-;17260:6;17268;17317:2;17305:9;17296:7;17292:23;17288:32;17285:119;;;17323:79;;:::i;:::-;17285:119;17443:1;17468:53;17513:7;17504:6;17493:9;17489:22;17468:53;:::i;:::-;17458:63;;17414:117;17570:2;17596:53;17641:7;17632:6;17621:9;17617:22;17596:53;:::i;:::-;17586:63;;17541:118;17192:474;;;;;:::o;17672:::-;17740:6;17748;17797:2;17785:9;17776:7;17772:23;17768:32;17765:119;;;17803:79;;:::i;:::-;17765:119;17923:1;17948:53;17993:7;17984:6;17973:9;17969:22;17948:53;:::i;:::-;17938:63;;17894:117;18050:2;18076:53;18121:7;18112:6;18101:9;18097:22;18076:53;:::i;:::-;18066:63;;18021:118;17672:474;;;;;:::o;18152:180::-;18200:77;18197:1;18190:88;18297:4;18294:1;18287:15;18321:4;18318:1;18311:15;18338:320;18382:6;18419:1;18413:4;18409:12;18399:22;;18466:1;18460:4;18456:12;18487:18;18477:81;;18543:4;18535:6;18531:17;18521:27;;18477:81;18605:2;18597:6;18594:14;18574:18;18571:38;18568:84;;;18624:18;;:::i;:::-;18568:84;18389:269;18338:320;;;:::o;18664:182::-;18804:34;18800:1;18792:6;18788:14;18781:58;18664:182;:::o;18852:366::-;18994:3;19015:67;19079:2;19074:3;19015:67;:::i;:::-;19008:74;;19091:93;19180:3;19091:93;:::i;:::-;19209:2;19204:3;19200:12;19193:19;;18852:366;;;:::o;19224:419::-;19390:4;19428:2;19417:9;19413:18;19405:26;;19477:9;19471:4;19467:20;19463:1;19452:9;19448:17;19441:47;19505:131;19631:4;19505:131;:::i;:::-;19497:139;;19224:419;;;:::o;19649:170::-;19789:22;19785:1;19777:6;19773:14;19766:46;19649:170;:::o;19825:366::-;19967:3;19988:67;20052:2;20047:3;19988:67;:::i;:::-;19981:74;;20064:93;20153:3;20064:93;:::i;:::-;20182:2;20177:3;20173:12;20166:19;;19825:366;;;:::o;20197:419::-;20363:4;20401:2;20390:9;20386:18;20378:26;;20450:9;20444:4;20440:20;20436:1;20425:9;20421:17;20414:47;20478:131;20604:4;20478:131;:::i;:::-;20470:139;;20197:419;;;:::o;20622:180::-;20670:77;20667:1;20660:88;20767:4;20764:1;20757:15;20791:4;20788:1;20781:15;20808:305;20848:3;20867:20;20885:1;20867:20;:::i;:::-;20862:25;;20901:20;20919:1;20901:20;:::i;:::-;20896:25;;21055:1;20987:66;20983:74;20980:1;20977:81;20974:107;;;21061:18;;:::i;:::-;20974:107;21105:1;21102;21098:9;21091:16;;20808:305;;;;:::o;21119:170::-;21259:22;21255:1;21247:6;21243:14;21236:46;21119:170;:::o;21295:366::-;21437:3;21458:67;21522:2;21517:3;21458:67;:::i;:::-;21451:74;;21534:93;21623:3;21534:93;:::i;:::-;21652:2;21647:3;21643:12;21636:19;;21295:366;;;:::o;21667:419::-;21833:4;21871:2;21860:9;21856:18;21848:26;;21920:9;21914:4;21910:20;21906:1;21895:9;21891:17;21884:47;21948:131;22074:4;21948:131;:::i;:::-;21940:139;;21667:419;;;:::o;22092:348::-;22132:7;22155:20;22173:1;22155:20;:::i;:::-;22150:25;;22189:20;22207:1;22189:20;:::i;:::-;22184:25;;22377:1;22309:66;22305:74;22302:1;22299:81;22294:1;22287:9;22280:17;22276:105;22273:131;;;22384:18;;:::i;:::-;22273:131;22432:1;22429;22425:9;22414:20;;22092:348;;;;:::o;22446:169::-;22586:21;22582:1;22574:6;22570:14;22563:45;22446:169;:::o;22621:366::-;22763:3;22784:67;22848:2;22843:3;22784:67;:::i;:::-;22777:74;;22860:93;22949:3;22860:93;:::i;:::-;22978:2;22973:3;22969:12;22962:19;;22621:366;;;:::o;22993:419::-;23159:4;23197:2;23186:9;23182:18;23174:26;;23246:9;23240:4;23236:20;23232:1;23221:9;23217:17;23210:47;23274:131;23400:4;23274:131;:::i;:::-;23266:139;;22993:419;;;:::o;23418:221::-;23558:34;23554:1;23546:6;23542:14;23535:58;23627:4;23622:2;23614:6;23610:15;23603:29;23418:221;:::o;23645:366::-;23787:3;23808:67;23872:2;23867:3;23808:67;:::i;:::-;23801:74;;23884:93;23973:3;23884:93;:::i;:::-;24002:2;23997:3;23993:12;23986:19;;23645:366;;;:::o;24017:419::-;24183:4;24221:2;24210:9;24206:18;24198:26;;24270:9;24264:4;24260:20;24256:1;24245:9;24241:17;24234:47;24298:131;24424:4;24298:131;:::i;:::-;24290:139;;24017:419;;;:::o;24442:174::-;24582:26;24578:1;24570:6;24566:14;24559:50;24442:174;:::o;24622:366::-;24764:3;24785:67;24849:2;24844:3;24785:67;:::i;:::-;24778:74;;24861:93;24950:3;24861:93;:::i;:::-;24979:2;24974:3;24970:12;24963:19;;24622:366;;;:::o;24994:419::-;25160:4;25198:2;25187:9;25183:18;25175:26;;25247:9;25241:4;25237:20;25233:1;25222:9;25218:17;25211:47;25275:131;25401:4;25275:131;:::i;:::-;25267:139;;24994:419;;;:::o;25419:94::-;25452:8;25500:5;25496:2;25492:14;25471:35;;25419:94;;;:::o;25519:::-;25558:7;25587:20;25601:5;25587:20;:::i;:::-;25576:31;;25519:94;;;:::o;25619:100::-;25658:7;25687:26;25707:5;25687:26;:::i;:::-;25676:37;;25619:100;;;:::o;25725:157::-;25830:45;25850:24;25868:5;25850:24;:::i;:::-;25830:45;:::i;:::-;25825:3;25818:58;25725:157;;:::o;25888:256::-;26000:3;26015:75;26086:3;26077:6;26015:75;:::i;:::-;26115:2;26110:3;26106:12;26099:19;;26135:3;26128:10;;25888:256;;;;:::o;26150:164::-;26290:16;26286:1;26278:6;26274:14;26267:40;26150:164;:::o;26320:366::-;26462:3;26483:67;26547:2;26542:3;26483:67;:::i;:::-;26476:74;;26559:93;26648:3;26559:93;:::i;:::-;26677:2;26672:3;26668:12;26661:19;;26320:366;;;:::o;26692:419::-;26858:4;26896:2;26885:9;26881:18;26873:26;;26945:9;26939:4;26935:20;26931:1;26920:9;26916:17;26909:47;26973:131;27099:4;26973:131;:::i;:::-;26965:139;;26692:419;;;:::o;27117:181::-;27257:33;27253:1;27245:6;27241:14;27234:57;27117:181;:::o;27304:366::-;27446:3;27467:67;27531:2;27526:3;27467:67;:::i;:::-;27460:74;;27543:93;27632:3;27543:93;:::i;:::-;27661:2;27656:3;27652:12;27645:19;;27304:366;;;:::o;27676:419::-;27842:4;27880:2;27869:9;27865:18;27857:26;;27929:9;27923:4;27919:20;27915:1;27904:9;27900:17;27893:47;27957:131;28083:4;27957:131;:::i;:::-;27949:139;;27676:419;;;:::o;28101:147::-;28202:11;28239:3;28224:18;;28101:147;;;;:::o;28254:114::-;;:::o;28374:398::-;28533:3;28554:83;28635:1;28630:3;28554:83;:::i;:::-;28547:90;;28646:93;28735:3;28646:93;:::i;:::-;28764:1;28759:3;28755:11;28748:18;;28374:398;;;:::o;28778:379::-;28962:3;28984:147;29127:3;28984:147;:::i;:::-;28977:154;;29148:3;29141:10;;28778:379;;;:::o;29163:180::-;29211:77;29208:1;29201:88;29308:4;29305:1;29298:15;29332:4;29329:1;29322:15;29349:233;29388:3;29411:24;29429:5;29411:24;:::i;:::-;29402:33;;29457:66;29450:5;29447:77;29444:103;;;29527:18;;:::i;:::-;29444:103;29574:1;29567:5;29563:13;29556:20;;29349:233;;;:::o;29588:173::-;29728:25;29724:1;29716:6;29712:14;29705:49;29588:173;:::o;29767:366::-;29909:3;29930:67;29994:2;29989:3;29930:67;:::i;:::-;29923:74;;30006:93;30095:3;30006:93;:::i;:::-;30124:2;30119:3;30115:12;30108:19;;29767:366;;;:::o;30139:419::-;30305:4;30343:2;30332:9;30328:18;30320:26;;30392:9;30386:4;30382:20;30378:1;30367:9;30363:17;30356:47;30420:131;30546:4;30420:131;:::i;:::-;30412:139;;30139:419;;;:::o;30564:234::-;30704:34;30700:1;30692:6;30688:14;30681:58;30773:17;30768:2;30760:6;30756:15;30749:42;30564:234;:::o;30804:366::-;30946:3;30967:67;31031:2;31026:3;30967:67;:::i;:::-;30960:74;;31043:93;31132:3;31043:93;:::i;:::-;31161:2;31156:3;31152:12;31145:19;;30804:366;;;:::o;31176:419::-;31342:4;31380:2;31369:9;31365:18;31357:26;;31429:9;31423:4;31419:20;31415:1;31404:9;31400:17;31393:47;31457:131;31583:4;31457:131;:::i;:::-;31449:139;;31176:419;;;:::o;31601:148::-;31703:11;31740:3;31725:18;;31601:148;;;;:::o;31755:377::-;31861:3;31889:39;31922:5;31889:39;:::i;:::-;31944:89;32026:6;32021:3;31944:89;:::i;:::-;31937:96;;32042:52;32087:6;32082:3;32075:4;32068:5;32064:16;32042:52;:::i;:::-;32119:6;32114:3;32110:16;32103:23;;31865:267;31755:377;;;;:::o;32138:141::-;32187:4;32210:3;32202:11;;32233:3;32230:1;32223:14;32267:4;32264:1;32254:18;32246:26;;32138:141;;;:::o;32309:845::-;32412:3;32449:5;32443:12;32478:36;32504:9;32478:36;:::i;:::-;32530:89;32612:6;32607:3;32530:89;:::i;:::-;32523:96;;32650:1;32639:9;32635:17;32666:1;32661:137;;;;32812:1;32807:341;;;;32628:520;;32661:137;32745:4;32741:9;32730;32726:25;32721:3;32714:38;32781:6;32776:3;32772:16;32765:23;;32661:137;;32807:341;32874:38;32906:5;32874:38;:::i;:::-;32934:1;32948:154;32962:6;32959:1;32956:13;32948:154;;;33036:7;33030:14;33026:1;33021:3;33017:11;33010:35;33086:1;33077:7;33073:15;33062:26;;32984:4;32981:1;32977:12;32972:17;;32948:154;;;33131:6;33126:3;33122:16;33115:23;;32814:334;;32628:520;;32416:738;;32309:845;;;;:::o;33160:589::-;33385:3;33407:95;33498:3;33489:6;33407:95;:::i;:::-;33400:102;;33519:95;33610:3;33601:6;33519:95;:::i;:::-;33512:102;;33631:92;33719:3;33710:6;33631:92;:::i;:::-;33624:99;;33740:3;33733:10;;33160:589;;;;;;:::o;33755:225::-;33895:34;33891:1;33883:6;33879:14;33872:58;33964:8;33959:2;33951:6;33947:15;33940:33;33755:225;:::o;33986:366::-;34128:3;34149:67;34213:2;34208:3;34149:67;:::i;:::-;34142:74;;34225:93;34314:3;34225:93;:::i;:::-;34343:2;34338:3;34334:12;34327:19;;33986:366;;;:::o;34358:419::-;34524:4;34562:2;34551:9;34547:18;34539:26;;34611:9;34605:4;34601:20;34597:1;34586:9;34582:17;34575:47;34639:131;34765:4;34639:131;:::i;:::-;34631:139;;34358:419;;;:::o;34783:98::-;34834:6;34868:5;34862:12;34852:22;;34783:98;;;:::o;34887:168::-;34970:11;35004:6;34999:3;34992:19;35044:4;35039:3;35035:14;35020:29;;34887:168;;;;:::o;35061:360::-;35147:3;35175:38;35207:5;35175:38;:::i;:::-;35229:70;35292:6;35287:3;35229:70;:::i;:::-;35222:77;;35308:52;35353:6;35348:3;35341:4;35334:5;35330:16;35308:52;:::i;:::-;35385:29;35407:6;35385:29;:::i;:::-;35380:3;35376:39;35369:46;;35151:270;35061:360;;;;:::o;35427:640::-;35622:4;35660:3;35649:9;35645:19;35637:27;;35674:71;35742:1;35731:9;35727:17;35718:6;35674:71;:::i;:::-;35755:72;35823:2;35812:9;35808:18;35799:6;35755:72;:::i;:::-;35837;35905:2;35894:9;35890:18;35881:6;35837:72;:::i;:::-;35956:9;35950:4;35946:20;35941:2;35930:9;35926:18;35919:48;35984:76;36055:4;36046:6;35984:76;:::i;:::-;35976:84;;35427:640;;;;;;;:::o;36073:141::-;36129:5;36160:6;36154:13;36145:22;;36176:32;36202:5;36176:32;:::i;:::-;36073:141;;;;:::o;36220:349::-;36289:6;36338:2;36326:9;36317:7;36313:23;36309:32;36306:119;;;36344:79;;:::i;:::-;36306:119;36464:1;36489:63;36544:7;36535:6;36524:9;36520:22;36489:63;:::i;:::-;36479:73;;36435:127;36220:349;;;;:::o;36575:180::-;36623:77;36620:1;36613:88;36720:4;36717:1;36710:15;36744:4;36741:1;36734:15;36761:185;36801:1;36818:20;36836:1;36818:20;:::i;:::-;36813:25;;36852:20;36870:1;36852:20;:::i;:::-;36847:25;;36891:1;36881:35;;36896:18;;:::i;:::-;36881:35;36938:1;36935;36931:9;36926:14;;36761:185;;;;:::o;36952:191::-;36992:4;37012:20;37030:1;37012:20;:::i;:::-;37007:25;;37046:20;37064:1;37046:20;:::i;:::-;37041:25;;37085:1;37082;37079:8;37076:34;;;37090:18;;:::i;:::-;37076:34;37135:1;37132;37128:9;37120:17;;36952:191;;;;:::o;37149:176::-;37181:1;37198:20;37216:1;37198:20;:::i;:::-;37193:25;;37232:20;37250:1;37232:20;:::i;:::-;37227:25;;37271:1;37261:35;;37276:18;;:::i;:::-;37261:35;37317:1;37314;37310:9;37305:14;;37149:176;;;;:::o

Swarm Source

ipfs://608b98324475d55e9ac55c4ccf7cf41e3ef4b5ac3fa6df475d500b87e35f6009
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.