ETH Price: $3,372.17 (+2.97%)
Gas: 3 Gwei

Token

QuantArts: Dali - Alegoria al mar (DALMA)
 

Overview

Max Total Supply

500 DALMA

Holders

218

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 DALMA
0x533a8bd3d7d4ef071ccee3a8323b233f91eefe08
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:
QuantArtsNFT

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-09
*/

// File: @uniswap/lib/contracts/libraries/TransferHelper.sol



pragma solidity >=0.6.0;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::safeApprove: approve failed'
        );
    }

    function safeTransfer(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::safeTransfer: transfer failed'
        );
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::transferFrom: transferFrom failed'
        );
    }

    function safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
    }
}

// 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/cryptography/ECDSA.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

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

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: contracts/QuantArtsNFT.sol

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;





contract QuantArtsNFT is ERC721, Ownable {
    using Strings for uint256;
    using ECDSA for bytes32;

    uint256 constant public maxSupply = 6801;
    uint256 constant public minimumSoldSuplyNeeded = 500;
    uint256 constant public maxMintAmount = 30;
    uint256 constant public referralPercentage = 1000;
    uint256 constant public marketingPercentage = 1500;
    uint256 constant public divFactor = 10000;
    uint256 constant public minimumMintCost = 250000000;
    bytes[] public authHashes;
    uint256 public totalSupply = 0;
    uint256 public publicMintCost = 450000000;
    uint256 public guaranteedAirdropSupply = 20;
    uint256 public guaranteedWLSupply = 2000;
    address public paymentToken;
    address public marketingAccount;
    address public signer;
    string public baseURI;
    string public baseExtension = ".json";
    uint256 public whitelistStartTimestamp = 0; // 1647072000
    uint256 public publicStartTimestamp = 0; // 1647331200
    uint256 public mintFinishTimestamp = 0; // 1647676800
    uint256 public guaranteedWLTimestamp = 0; // 1647093600
    uint256 public ownerBalance = 0;
    mapping(address => uint256) public alreadyMintedAmount;
    mapping(address => uint256) public mintPaidAmounts;
    mapping(address => bool) public hasWhitelistAccountAlreadyMinted;

    struct MintAmounts {
        uint256 totalMintCost;
        uint256 refundableAmount;
        uint256 referralAmount;
    }

    struct MintCheckInfo {
        uint256 mintAmount;
        address referrer;
        uint256 maxAmount;
        uint256 unitPrice;
        bool isGuaranteed;
        bytes signature;
        bool isWhitelist;
    }

    event OwnerClaimed(address indexed to, uint256 amount);
    event Refunded(address indexed to, uint256 amount);
    event Mint(address indexed to, address indexed referrer,uint256 amount, uint256 unitPrice);

    constructor(string memory _name, string memory _symbol, address _signer, address _paymentToken, address _marketingAccount, string memory _initBaseURI, 
                uint256 _initWhitelistStartTimestamp, uint256 _initPublicStartTimestamp, uint256 _initMintFinishTimestamp, uint256 _initGuaranteedWLTimestamp) ERC721(_name, _symbol) {
        setBaseURI(_initBaseURI);
        setWhitelistStartTimestamp(_initWhitelistStartTimestamp);
        setPublicStartTimestamp(_initPublicStartTimestamp);
        setMintFinishTimestamp(_initMintFinishTimestamp);
        setGuaranteedWLTimestamp(_initGuaranteedWLTimestamp);
        setPaymentToken(_paymentToken);
        setMarketingAccount(_marketingAccount);
        setSigner(_signer);
        addAuthHash(bytes("0x784c3e712e86c80f42fcde15c79019dd3a4792105b5e03744ced5253c545433c"));
    }

    function setPublicMintCost(uint256 _newPublicMintCost) public onlyOwner {
        publicMintCost = _newPublicMintCost;
    }

    function addAuthHash(bytes memory _newAuthHash) public onlyOwner {
        authHashes.push(_newAuthHash);
    }

    function setGuaranteedAirdropSupply(uint256 _newGuaranteedAirdropSupply) public onlyOwner {
        guaranteedAirdropSupply = _newGuaranteedAirdropSupply;
    }

    function setGuaranteedWLSupply(uint256 _newGuaranteedWLSupply) public onlyOwner {
        guaranteedWLSupply = _newGuaranteedWLSupply;
    }

    function setSigner(address _newSigner) public onlyOwner {
        signer = _newSigner;
    }

    function setPaymentToken(address _newPaymentToken) public onlyOwner {
        paymentToken = _newPaymentToken;
    }

    function setMarketingAccount(address _newMarketingAccount) public onlyOwner {
        marketingAccount = _newMarketingAccount;
    }

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

    function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
        baseExtension = _newBaseExtension;
    }

    function setGuaranteedWLTimestamp(uint256 _newGuaranteedWLTimestamp) public onlyOwner {
        require(_newGuaranteedWLTimestamp >= whitelistStartTimestamp && _newGuaranteedWLTimestamp < publicStartTimestamp, "QuantArtsNFT: Incorect guaranteed timestamp");
        guaranteedWLTimestamp = _newGuaranteedWLTimestamp;
    }

    function setWhitelistStartTimestamp(uint256 _newWhitelistStartTimestamp) public onlyOwner {
        whitelistStartTimestamp = _newWhitelistStartTimestamp;
    }

    function setPublicStartTimestamp(uint256 _newPublicStartTimestamp) public onlyOwner {
        require(_newPublicStartTimestamp >= whitelistStartTimestamp, "QuantArtsNFT: Public timestamp is before whitelist timestamp");
        publicStartTimestamp = _newPublicStartTimestamp;
    }

    function setMintFinishTimestamp(uint256 _newMintFinishTimestamp) public onlyOwner {
        require(_newMintFinishTimestamp >= publicStartTimestamp, "QuantArtsNFT: Mint finish timestamp is before public timestamp");
        mintFinishTimestamp = _newMintFinishTimestamp;
    }

    function redeemOwnerBalance(address payable _to) public onlyOwner {
        require(totalSupply >= minimumSoldSuplyNeeded, "QuantArtsNFT: Minimum sold supply is not reached");
        uint256 amount = ownerBalance;
        ownerBalance = 0;
        TransferHelper.safeTransfer(paymentToken ,_to, amount);
        emit OwnerClaimed(_to, amount);
    }

    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory){
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), baseExtension)) : "";
    }

    function mint(uint256 _mintAmount) external {
        MintCheckInfo memory info;
        info.mintAmount = _mintAmount;
        checkCorrectMint(info);
        alreadyMintedAmount[_msgSender()] += _mintAmount;
        MintAmounts memory amounts;
        amounts.totalMintCost = publicMintCost * _mintAmount;
        amounts.refundableAmount =  (amounts.totalMintCost * (divFactor - marketingPercentage)) / divFactor;
        mintPaidAmounts[_msgSender()] += amounts.refundableAmount;
        ownerBalance += amounts.refundableAmount;
        TransferHelper.safeTransferFrom(paymentToken, _msgSender(), address(this), amounts.totalMintCost);
        TransferHelper.safeTransfer(paymentToken, marketingAccount, (amounts.totalMintCost - amounts.refundableAmount));
        for (uint256 i = 0; i < _mintAmount; i++) {
            totalSupply++;
            _safeMint(_msgSender(), totalSupply - 1);
        }
        emit Mint(_msgSender(), address(0), _mintAmount, publicMintCost);
    }

    function mintReferred(uint256 _mintAmount, address _referrer) external {
         MintCheckInfo memory info;
        info.mintAmount = _mintAmount;
        checkCorrectMint(info);
        require(_referrer != _msgSender(), "QuantArtsNFT: Referrer cannot be equal to msg sender");
        require(_referrer != address(0), "QuantArtsNFT: Referral cannot be address zero");
        alreadyMintedAmount[_msgSender()] += _mintAmount;
        MintAmounts memory amounts;
        amounts.totalMintCost = publicMintCost * _mintAmount;
        amounts.refundableAmount =  (amounts.totalMintCost * (divFactor - marketingPercentage - referralPercentage)) / divFactor;
        mintPaidAmounts[_msgSender()] += amounts.refundableAmount;
        amounts.referralAmount = (amounts.totalMintCost * referralPercentage) / divFactor;
        ownerBalance += amounts.refundableAmount;
        TransferHelper.safeTransferFrom(paymentToken, _msgSender(), address(this), amounts.totalMintCost);
        TransferHelper.safeTransfer(paymentToken, _referrer, amounts.referralAmount);
        TransferHelper.safeTransfer(paymentToken, marketingAccount, amounts.totalMintCost - (amounts.referralAmount + amounts.refundableAmount));
        for (uint256 i = 0; i < _mintAmount; i++) {
            totalSupply++;
            _safeMint(_msgSender(), totalSupply - 1);
        }
        emit Mint(_msgSender(), _referrer, _mintAmount, publicMintCost);
    }

    function whitelistMint(uint256 _mintAmount, address _referrer, uint256 _maxAmount, 
                           uint256 _unitPrice , bool _isGuaranteed, bytes calldata _signature) external {
        MintCheckInfo memory info;
        info.mintAmount = _mintAmount;
        info.referrer = _referrer;
        info.maxAmount = _maxAmount;
        info.unitPrice = _unitPrice;
        info.isGuaranteed = _isGuaranteed;
        info.signature = _signature;
        info.isWhitelist = true;
        checkCorrectMint(info);
        hasWhitelistAccountAlreadyMinted[_msgSender()] = true;
        alreadyMintedAmount[_msgSender()] += _mintAmount;
        MintAmounts memory amounts;
        amounts.totalMintCost = _unitPrice * _mintAmount;
        amounts.refundableAmount =  (amounts.totalMintCost * (divFactor - marketingPercentage - referralPercentage)) / divFactor;
        mintPaidAmounts[_msgSender()] += amounts.refundableAmount;
        amounts.referralAmount = (amounts.totalMintCost * referralPercentage) / divFactor;
        ownerBalance += amounts.refundableAmount;
        TransferHelper.safeTransferFrom(paymentToken, _msgSender(), address(this), amounts.totalMintCost);
        TransferHelper.safeTransfer(paymentToken, _referrer, amounts.referralAmount);
        TransferHelper.safeTransfer(paymentToken, marketingAccount, amounts.totalMintCost - (amounts.referralAmount + amounts.refundableAmount));
        for (uint256 i = 0; i < _mintAmount; i++) {
            totalSupply++;
            _safeMint(_msgSender(), totalSupply - 1);
        }
        emit Mint(_msgSender(), _referrer, _mintAmount, _unitPrice);
    }

    function airdrop(address[] calldata _receivers ,uint256[] calldata amounts) external onlyOwner {
        require(_receivers.length == amounts.length, "QuantArtsNFT: Array lengths are not equal");
        for (uint256 i = 0; i < _receivers.length; i++) {
            require(amounts[i] > 0, "QuantArtsNFT: Airdrop amount is zero");
            require(totalSupply + amounts[i] <= maxSupply, "QuantArtsNFT: Mint amount is bigger than supply left");
            for (uint256 j = 0; j < amounts[i]; j++) {
                totalSupply++;
                _safeMint(_receivers[i], totalSupply - 1);
            }
        }
    }

   function refundMint() external {
        require(totalSupply < minimumSoldSuplyNeeded, "QuantArtsNFT: Minimum sold supply has been reached");
        require(block.timestamp >= mintFinishTimestamp, "QuantArtsNFT: Mint has not finished");
        uint256 refundAmount = mintPaidAmounts[_msgSender()];
        require(refundAmount > 0, "QuantArtsNFT: User has not minted any tokens");
        mintPaidAmounts[_msgSender()] = 0;
        TransferHelper.safeTransfer(paymentToken ,_msgSender(), refundAmount);
        emit Refunded(_msgSender(), refundAmount);
    }

    function checkCorrectMint(MintCheckInfo memory _info) internal view returns (bool){
        if (totalSupply < minimumSoldSuplyNeeded) {
            require(block.timestamp < mintFinishTimestamp, "QuantArtsNFT: Mint has finished");
        }
        require(block.timestamp > whitelistStartTimestamp, "QuantArtsNFT: Whitelist mint has not started yet");
        if (block.timestamp < publicStartTimestamp) {
            require(_info.isWhitelist, "QuantArtsNFT: Method is not WL mint");
            require(_info.unitPrice >= minimumMintCost, "QuantArtsNFT: UnitPrice is less than minimum");
            require(!hasWhitelistAccountAlreadyMinted[_msgSender()], "QuantArtsNFT: User has already minted with WL");
            require(_info.mintAmount <= _info.maxAmount, "QuantArtsNFT: Mint amount is bigger than WL max amount");
            require(_info.referrer != _msgSender(), "QuantArtsNFT: Referrer cannot be equal to msg sender");
            require(_info.referrer != address(0), "QuantArtsNFT: Referral cannot be address zero");
            bytes32 messageHash = keccak256(abi.encodePacked(_msgSender(), _info.referrer, _info.maxAmount, _info.unitPrice, _info.isGuaranteed));
            bytes32 ethHash = messageHash.toEthSignedMessageHash();
            address messageSigner = ethHash.recover(_info.signature);
            require(messageSigner == signer, "QuantArtsNFT: Signer is not valid");
            if (block.timestamp < guaranteedWLTimestamp && !_info.isGuaranteed ) {
                require(totalSupply + _info.mintAmount <= maxSupply - guaranteedAirdropSupply - guaranteedWLSupply, "QuantArtsNFT: Mint amount is bigger than supply left");
            } else {
                require(totalSupply + _info.mintAmount <= maxSupply - guaranteedAirdropSupply, "QuantArtsNFT: Mint amount is bigger than supply left");
            }
        } else {
            require(!_info.isWhitelist, "QuantArtsNFT: Method is WL mint");
            require(totalSupply + _info.mintAmount <= maxSupply - guaranteedAirdropSupply, "QuantArtsNFT: Mint amount is bigger than supply left");
            require(_info.mintAmount <= maxMintAmount - alreadyMintedAmount[_msgSender()], "QuantArtsNFT: Already minted amount is bigger than maxMintAmount");
        }
        require(_info.mintAmount > 0, "QuantArtsNFT: Mint amount is zero");
        return true;
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_signer","type":"address"},{"internalType":"address","name":"_paymentToken","type":"address"},{"internalType":"address","name":"_marketingAccount","type":"address"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"uint256","name":"_initWhitelistStartTimestamp","type":"uint256"},{"internalType":"uint256","name":"_initPublicStartTimestamp","type":"uint256"},{"internalType":"uint256","name":"_initMintFinishTimestamp","type":"uint256"},{"internalType":"uint256","name":"_initGuaranteedWLTimestamp","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"to","type":"address"},{"indexed":true,"internalType":"address","name":"referrer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unitPrice","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OwnerClaimed","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":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Refunded","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":"bytes","name":"_newAuthHash","type":"bytes"}],"name":"addAuthHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_receivers","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"alreadyMintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"authHashes","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"divFactor","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":"guaranteedAirdropSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"guaranteedWLSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"guaranteedWLTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasWhitelistAccountAlreadyMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"marketingAccount","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","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":"minimumMintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumSoldSuplyNeeded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintFinishTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintPaidAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_referrer","type":"address"}],"name":"mintReferred","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":[],"name":"ownerBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"paymentToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicStartTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"}],"name":"redeemOwnerBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"referralPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newGuaranteedAirdropSupply","type":"uint256"}],"name":"setGuaranteedAirdropSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newGuaranteedWLSupply","type":"uint256"}],"name":"setGuaranteedWLSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newGuaranteedWLTimestamp","type":"uint256"}],"name":"setGuaranteedWLTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newMarketingAccount","type":"address"}],"name":"setMarketingAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMintFinishTimestamp","type":"uint256"}],"name":"setMintFinishTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPaymentToken","type":"address"}],"name":"setPaymentToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPublicMintCost","type":"uint256"}],"name":"setPublicMintCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPublicStartTimestamp","type":"uint256"}],"name":"setPublicStartTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newSigner","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newWhitelistStartTimestamp","type":"uint256"}],"name":"setWhitelistStartTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_referrer","type":"address"},{"internalType":"uint256","name":"_maxAmount","type":"uint256"},{"internalType":"uint256","name":"_unitPrice","type":"uint256"},{"internalType":"bool","name":"_isGuaranteed","type":"bool"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"whitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistStartTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6000600855631ad274806009556014600a556107d0600b5560c06040526005608081905264173539b7b760d91b60a09081526200004091601091906200069c565b50600060115560006012556000601355600060145560006015553480156200006757600080fd5b506040516200460d3803806200460d8339810160408190526200008a916200082c565b89518a908a90620000a39060009060208501906200069c565b508051620000b99060019060208401906200069c565b505050620000d6620000d06200016260201b60201c565b62000166565b620000e185620001b8565b620000ec8462000220565b620000f78362000270565b62000102826200033a565b6200010d8162000404565b6200011887620004ca565b620001238662000537565b6200012e88620005a4565b62000152604051806080016040528060428152602001620045ab6042913962000611565b505050505050505050506200095b565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6006546001600160a01b03163314620002075760405162461bcd60e51b81526020600482018190526024820152600080516020620045ed83398151915260448201526064015b60405180910390fd5b80516200021c90600f9060208401906200069c565b5050565b6006546001600160a01b031633146200026b5760405162461bcd60e51b81526020600482018190526024820152600080516020620045ed8339815191526044820152606401620001fe565b601155565b6006546001600160a01b03163314620002bb5760405162461bcd60e51b81526020600482018190526024820152600080516020620045ed8339815191526044820152606401620001fe565b601154811015620003355760405162461bcd60e51b815260206004820152603c60248201527f5175616e74417274734e46543a205075626c69632074696d657374616d70206960448201527f73206265666f72652077686974656c6973742074696d657374616d70000000006064820152608401620001fe565b601255565b6006546001600160a01b03163314620003855760405162461bcd60e51b81526020600482018190526024820152600080516020620045ed8339815191526044820152606401620001fe565b601254811015620003ff5760405162461bcd60e51b815260206004820152603e60248201527f5175616e74417274734e46543a204d696e742066696e6973682074696d65737460448201527f616d70206973206265666f7265207075626c69632074696d657374616d7000006064820152608401620001fe565b601355565b6006546001600160a01b031633146200044f5760405162461bcd60e51b81526020600482018190526024820152600080516020620045ed8339815191526044820152606401620001fe565b601154811015801562000463575060125481105b620004c55760405162461bcd60e51b815260206004820152602b60248201527f5175616e74417274734e46543a20496e636f726563742067756172616e74656560448201526a0642074696d657374616d760ac1b6064820152608401620001fe565b601455565b6006546001600160a01b03163314620005155760405162461bcd60e51b81526020600482018190526024820152600080516020620045ed8339815191526044820152606401620001fe565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b03163314620005825760405162461bcd60e51b81526020600482018190526024820152600080516020620045ed8339815191526044820152606401620001fe565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b03163314620005ef5760405162461bcd60e51b81526020600482018190526024820152600080516020620045ed8339815191526044820152606401620001fe565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b031633146200065c5760405162461bcd60e51b81526020600482018190526024820152600080516020620045ed8339815191526044820152606401620001fe565b6007805460018101825560009190915281516200021c917fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688019060208401905b828054620006aa906200091e565b90600052602060002090601f016020900481019282620006ce576000855562000719565b82601f10620006e957805160ff191683800117855562000719565b8280016001018555821562000719579182015b8281111562000719578251825591602001919060010190620006fc565b50620007279291506200072b565b5090565b5b808211156200072757600081556001016200072c565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200076a57600080fd5b81516001600160401b038082111562000787576200078762000742565b604051601f8301601f19908116603f01168101908282118183101715620007b257620007b262000742565b81604052838152602092508683858801011115620007cf57600080fd5b600091505b83821015620007f35785820183015181830184015290820190620007d4565b83821115620008055760008385830101525b9695505050505050565b80516001600160a01b03811681146200082757600080fd5b919050565b6000806000806000806000806000806101408b8d0312156200084d57600080fd5b8a516001600160401b03808211156200086557600080fd5b620008738e838f0162000758565b9b5060208d01519150808211156200088a57600080fd5b620008988e838f0162000758565b9a50620008a860408e016200080f565b9950620008b860608e016200080f565b9850620008c860808e016200080f565b975060a08d0151915080821115620008df57600080fd5b50620008ee8d828e0162000758565b95505060c08b0151935060e08b015192506101008b015191506101208b015190509295989b9194979a5092959850565b600181811c908216806200093357607f821691505b602082108114156200095557634e487b7160e01b600052602260045260246000fd5b50919050565b613c40806200096b6000396000f3fe608060405234801561001057600080fd5b50600436106103a45760003560e01c806380eae578116101e9578063b88d4fde1161010f578063d5abeb01116100ad578063de20308a1161007c578063de20308a1461076c578063e1bb861a14610775578063e985e9c514610788578063f2fde38b146107c457600080fd5b8063d5abeb0114610734578063d75116fa1461073d578063d91a424814610750578063da3ef23f1461075957600080fd5b8063c6682862116100e9578063c6682862146106fd578063c726c97c14610705578063c87b56dd1461070e578063d0ea76e81461072157600080fd5b8063b88d4fde146106ce578063be87bbbc146106e1578063bedcf003146106f457600080fd5b80639725353f11610187578063acc11c1a11610156578063acc11c1a14610682578063ad1b61ec14610695578063ad750148146106a8578063b4811636146106bb57600080fd5b80639725353f1461064a5780639ecfab9b14610653578063a0712d681461065c578063a22cb4651461066f57600080fd5b80638da5cb5b116101c35780638da5cb5b146106155780638e3fc6321461062657806395d89b411461063957806396ea8b9c1461064157600080fd5b806380eae578146105e657806383ac44e6146105f95780638c7700671461060c57600080fd5b806355f804b3116102ce578063672434821161026c5780636dec4d7b1161023b5780636dec4d7b1461058857806370a08231146105a8578063715018a6146105bb5780637c8c93b2146105c357600080fd5b806367243482146105475780636a326ab11461055a5780636c0360eb1461056d5780636c19e7831461057557600080fd5b80636352211e116102a85780636352211e146104f957806363adb3341461050c57806365d48b381461051f5780636656fc961461053f57600080fd5b806355f804b3146104ca5780635696417c146104dd57806361df7ef7146104f057600080fd5b8063238ac933116103465780633e65408a116103155780633e65408a1461049257806342842e0e1461049b5780634677a3af146104ae57806350b2a881146104b757600080fd5b8063238ac93314610451578063239c70ae1461046457806323b872dd1461046c5780633013ce291461047f57600080fd5b8063095ea7b311610382578063095ea7b3146104115780630c031e2914610426578063178a7c931461043d57806318160ddd1461044857600080fd5b806301ffc9a7146103a957806306fdde03146103d1578063081812fc146103e6575b600080fd5b6103bc6103b73660046132ec565b6107d7565b60405190151581526020015b60405180910390f35b6103d9610829565b6040516103c89190613361565b6103f96103f4366004613374565b6108bb565b6040516001600160a01b0390911681526020016103c8565b61042461041f3660046133a2565b610955565b005b61042f60145481565b6040519081526020016103c8565b61042f630ee6b28081565b61042f60085481565b600e546103f9906001600160a01b031681565b61042f601e81565b61042461047a3660046133ce565b610a6b565b600c546103f9906001600160a01b031681565b61042f60125481565b6104246104a93660046133ce565b610a9c565b61042f6101f481565b6104246104c536600461340f565b610ab7565b6104246104d83660046134b8565b610b03565b6104246104eb366004613374565b610b44565b61042f60135481565b6103f9610507366004613374565b610beb565b61042461051a366004613501565b610c62565b61042f61052d36600461340f565b60176020526000908152604090205481565b610424610ed1565b610424610555366004613576565b611070565b61042461056836600461340f565b61124f565b6103d961129b565b61042461058336600461340f565b611329565b61042f61059636600461340f565b60166020526000908152604090205481565b61042f6105b636600461340f565b611375565b6104246113fc565b6103bc6105d136600461340f565b60186020526000908152604090205460ff1681565b6104246105f4366004613374565b611432565b600d546103f9906001600160a01b031681565b61042f60095481565b6006546001600160a01b03166103f9565b610424610634366004613374565b611461565b6103d9611490565b61042f6103e881565b61042f600a5481565b61042f60115481565b61042461066a366004613374565b61149f565b61042461067d3660046135f0565b61163e565b61042461069036600461361e565b611649565b6104246106a3366004613374565b6118b7565b6104246106b636600461340f565b611959565b6103d96106c9366004613374565b611a57565b6104246106dc3660046136f3565b611a82565b6104246106ef36600461375f565b611aba565b61042f60155481565b6103d9611b27565b61042f600b5481565b6103d961071c366004613374565b611b34565b61042461072f366004613374565b611c12565b61042f611a9181565b61042461074b366004613374565b611c41565b61042f61271081565b6104246107673660046134b8565b611c70565b61042f6105dc81565b610424610783366004613374565b611cad565b6103bc610796366004613794565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6104246107d236600461340f565b611d54565b60006001600160e01b031982166380ac58cd60e01b148061080857506001600160e01b03198216635b5e139f60e01b145b8061082357506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610838906137c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610864906137c2565b80156108b15780601f10610886576101008083540402835291602001916108b1565b820191906000526020600020905b81548152906001019060200180831161089457829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109395760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061096082610beb565b9050806001600160a01b0316836001600160a01b031614156109ce5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610930565b336001600160a01b03821614806109ea57506109ea8133610796565b610a5c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610930565b610a668383611def565b505050565b610a753382611e5d565b610a915760405162461bcd60e51b8152600401610930906137fd565b610a66838383611f54565b610a6683838360405180602001604052806000815250611a82565b6006546001600160a01b03163314610ae15760405162461bcd60e51b81526004016109309061384e565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b03163314610b2d5760405162461bcd60e51b81526004016109309061384e565b8051610b4090600f9060208401906131f3565b5050565b6006546001600160a01b03163314610b6e5760405162461bcd60e51b81526004016109309061384e565b601154811015610be65760405162461bcd60e51b815260206004820152603c60248201527f5175616e74417274734e46543a205075626c69632074696d657374616d70206960448201527f73206265666f72652077686974656c6973742074696d657374616d70000000006064820152608401610930565b601255565b6000818152600260205260408120546001600160a01b0316806108235760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610930565b610c6a613277565b828152610c76816120f0565b506001600160a01b038216331415610ca05760405162461bcd60e51b815260040161093090613883565b6001600160a01b038216610cc65760405162461bcd60e51b8152600401610930906138d7565b3360009081526016602052604081208054859290610ce590849061393a565b92505081905550610d1060405180606001604052806000815260200160008152602001600081525090565b83600954610d1e9190613952565b81526127106103e8610d326105dc83613971565b610d3c9190613971565b8251610d489190613952565b610d52919061399e565b60208281018290523360009081526017909152604081208054909190610d7990849061393a565b9091555050805161271090610d91906103e890613952565b610d9b919061399e565b6040820152602081015160158054600090610db790849061393a565b9091555050600c54610dd7906001600160a01b0316335b83513090612730565b600c546040820151610df4916001600160a01b031690859061286e565b600c54600d5460208301516040840151610e30936001600160a01b03908116931691610e1f9161393a565b8451610e2b9190613971565b61286e565b60005b84811015610e805760088054906000610e4b836139b2565b9190505550610e6e610e5a3390565b6001600854610e699190613971565b612998565b80610e78816139b2565b915050610e33565b506009546040805186815260208101929092526001600160a01b0385169133917f2f00e3cdd69a77be7ed215ec7b2a36784dd158f921fca79ac29deffa353fe6ee910160405180910390a350505050565b6101f460085410610f3f5760405162461bcd60e51b815260206004820152603260248201527f5175616e74417274734e46543a204d696e696d756d20736f6c6420737570706c6044820152711e481a185cc81899595b881c995858da195960721b6064820152608401610930565b601354421015610f9d5760405162461bcd60e51b815260206004820152602360248201527f5175616e74417274734e46543a204d696e7420686173206e6f742066696e69736044820152621a195960ea1b6064820152608401610930565b336000908152601760205260409020548061100f5760405162461bcd60e51b815260206004820152602c60248201527f5175616e74417274734e46543a205573657220686173206e6f74206d696e746560448201526b6420616e7920746f6b656e7360a01b6064820152608401610930565b33600081815260176020526040812055600c54611038916001600160a01b03909116908361286e565b60405181815233907fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d06519060200160405180910390a250565b6006546001600160a01b0316331461109a5760405162461bcd60e51b81526004016109309061384e565b8281146110fb5760405162461bcd60e51b815260206004820152602960248201527f5175616e74417274734e46543a204172726179206c656e6774687320617265206044820152681b9bdd08195c5d585b60ba1b6064820152608401610930565b60005b8381101561124857600083838381811061111a5761111a6139cd565b905060200201351161117a5760405162461bcd60e51b8152602060048201526024808201527f5175616e74417274734e46543a2041697264726f7020616d6f756e74206973206044820152637a65726f60e01b6064820152608401610930565b611a9183838381811061118f5761118f6139cd565b905060200201356008546111a3919061393a565b11156111c15760405162461bcd60e51b8152600401610930906139e3565b60005b8383838181106111d6576111d66139cd565b9050602002013581101561123557600880549060006111f4836139b2565b919050555061122386868481811061120e5761120e6139cd565b9050602002016020810190610e5a919061340f565b8061122d816139b2565b9150506111c4565b5080611240816139b2565b9150506110fe565b5050505050565b6006546001600160a01b031633146112795760405162461bcd60e51b81526004016109309061384e565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b600f80546112a8906137c2565b80601f01602080910402602001604051908101604052809291908181526020018280546112d4906137c2565b80156113215780601f106112f657610100808354040283529160200191611321565b820191906000526020600020905b81548152906001019060200180831161130457829003601f168201915b505050505081565b6006546001600160a01b031633146113535760405162461bcd60e51b81526004016109309061384e565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166113e05760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610930565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146114265760405162461bcd60e51b81526004016109309061384e565b61143060006129b2565b565b6006546001600160a01b0316331461145c5760405162461bcd60e51b81526004016109309061384e565b600955565b6006546001600160a01b0316331461148b5760405162461bcd60e51b81526004016109309061384e565b601155565b606060018054610838906137c2565b6114a7613277565b8181526114b3816120f0565b5033600090815260166020526040812080548492906114d390849061393a565b925050819055506114fe60405180606001604052806000815260200160008152602001600081525090565b8260095461150c9190613952565b815261271061151d6105dc82613971565b82516115299190613952565b611533919061399e565b6020828101829052336000908152601790915260408120805490919061155a90849061393a565b909155505060208101516015805460009061157690849061393a565b9091555050600c54611591906001600160a01b031633610dce565b600c54600d54602083015183516115b9936001600160a01b03908116931691610e2b91613971565b60005b838110156115f557600880549060006115d4836139b2565b91905055506115e3610e5a3390565b806115ed816139b2565b9150506115bc565b5060095460408051858152602081019290925260009133917f2f00e3cdd69a77be7ed215ec7b2a36784dd158f921fca79ac29deffa353fe6ee91015b60405180910390a3505050565b610b40338383612a04565b611651613277565b8781526001600160a01b03871660208083019190915260408083018890526060830187905285151560808401528051601f850183900483028101830190915283815290849084908190840183828082843760009201919091525050505060a0820152600160c08201526116c3816120f0565b50336000908152601860209081526040808320805460ff191660011790556016909152812080548a92906116f890849061393a565b9250508190555061172360405180606001604052806000815260200160008152602001600081525090565b61172d8987613952565b81526127106103e86117416105dc83613971565b61174b9190613971565b82516117579190613952565b611761919061399e565b6020828101829052336000908152601790915260408120805490919061178890849061393a565b90915550508051612710906117a0906103e890613952565b6117aa919061399e565b60408201526020810151601580546000906117c690849061393a565b9091555050600c546117e1906001600160a01b031633610dce565b600c5460408201516117fe916001600160a01b0316908a9061286e565b600c54600d5460208301516040840151611829936001600160a01b03908116931691610e1f9161393a565b60005b898110156118655760088054906000611844836139b2565b9190505550611853610e5a3390565b8061185d816139b2565b91505061182c565b50604080518a8152602081018890526001600160a01b038a169133917f2f00e3cdd69a77be7ed215ec7b2a36784dd158f921fca79ac29deffa353fe6ee910160405180910390a3505050505050505050565b6006546001600160a01b031633146118e15760405162461bcd60e51b81526004016109309061384e565b60115481101580156118f4575060125481105b6119545760405162461bcd60e51b815260206004820152602b60248201527f5175616e74417274734e46543a20496e636f726563742067756172616e74656560448201526a0642074696d657374616d760ac1b6064820152608401610930565b601455565b6006546001600160a01b031633146119835760405162461bcd60e51b81526004016109309061384e565b6101f460085410156119f05760405162461bcd60e51b815260206004820152603060248201527f5175616e74417274734e46543a204d696e696d756d20736f6c6420737570706c60448201526f1e481a5cc81b9bdd081c995858da195960821b6064820152608401610930565b601580546000909155600c54611a10906001600160a01b0316838361286e565b816001600160a01b03167f6253792f68f5f86d90058ddc0bcb600478147da82de0212f4971cf298ccbf7c282604051611a4b91815260200190565b60405180910390a25050565b60078181548110611a6757600080fd5b9060005260206000200160009150905080546112a8906137c2565b611a8c3383611e5d565b611aa85760405162461bcd60e51b8152600401610930906137fd565b611ab484848484612acb565b50505050565b6006546001600160a01b03163314611ae45760405162461bcd60e51b81526004016109309061384e565b600780546001810182556000919091528151610b40917fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688019060208401906131f3565b601080546112a8906137c2565b6000818152600260205260409020546060906001600160a01b0316611bb35760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610930565b6000611bbd612afe565b90506000815111611bdd5760405180602001604052806000815250611c0b565b80611be784612b0d565b6010604051602001611bfb93929190613a37565b6040516020818303038152906040525b9392505050565b6006546001600160a01b03163314611c3c5760405162461bcd60e51b81526004016109309061384e565b600b55565b6006546001600160a01b03163314611c6b5760405162461bcd60e51b81526004016109309061384e565b600a55565b6006546001600160a01b03163314611c9a5760405162461bcd60e51b81526004016109309061384e565b8051610b409060109060208401906131f3565b6006546001600160a01b03163314611cd75760405162461bcd60e51b81526004016109309061384e565b601254811015611d4f5760405162461bcd60e51b815260206004820152603e60248201527f5175616e74417274734e46543a204d696e742066696e6973682074696d65737460448201527f616d70206973206265666f7265207075626c69632074696d657374616d7000006064820152608401610930565b601355565b6006546001600160a01b03163314611d7e5760405162461bcd60e51b81526004016109309061384e565b6001600160a01b038116611de35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610930565b611dec816129b2565b50565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611e2482610beb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611ed65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610930565b6000611ee183610beb565b9050806001600160a01b0316846001600160a01b03161480611f1c5750836001600160a01b0316611f11846108bb565b6001600160a01b0316145b80611f4c57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611f6782610beb565b6001600160a01b031614611fcb5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610930565b6001600160a01b03821661202d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610930565b612038600082611def565b6001600160a01b0383166000908152600360205260408120805460019290612061908490613971565b90915550506001600160a01b038216600090815260036020526040812080546001929061208f90849061393a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006101f4600854101561214f57601354421061214f5760405162461bcd60e51b815260206004820152601f60248201527f5175616e74417274734e46543a204d696e74206861732066696e6973686564006044820152606401610930565b60115442116121b95760405162461bcd60e51b815260206004820152603060248201527f5175616e74417274734e46543a2057686974656c697374206d696e742068617360448201526f081b9bdd081cdd185c9d1959081e595d60821b6064820152608401610930565b6012544210156125af578160c001516122205760405162461bcd60e51b815260206004820152602360248201527f5175616e74417274734e46543a204d6574686f64206973206e6f7420574c206d6044820152621a5b9d60ea1b6064820152608401610930565b630ee6b2808260600151101561228d5760405162461bcd60e51b815260206004820152602c60248201527f5175616e74417274734e46543a20556e69745072696365206973206c6573732060448201526b7468616e206d696e696d756d60a01b6064820152608401610930565b3360009081526018602052604090205460ff16156123035760405162461bcd60e51b815260206004820152602d60248201527f5175616e74417274734e46543a20557365722068617320616c7265616479206d60448201526c1a5b9d1959081dda5d1a0815d3609a1b6064820152608401610930565b6040820151825111156123775760405162461bcd60e51b815260206004820152603660248201527f5175616e74417274734e46543a204d696e7420616d6f756e742069732062696760448201527519d95c881d1a185b8815d3081b585e08185b5bdd5b9d60521b6064820152608401610930565b60208201516001600160a01b03163314156123a45760405162461bcd60e51b815260040161093090613883565b60208201516001600160a01b03166123ce5760405162461bcd60e51b8152600401610930906138d7565b602082810151604080850151606080870151608088015184516bffffffffffffffffffffffff1933851b8116828a01529690931b90951660348301526048820192909252606881019190915291151560f81b6088830152805180830360690181526089830182528051908401207f19457468657265756d205369676e6564204d6573736167653a0a33320000000060a984015260c58084018290528251808503909101815260e590930190915281519190920120600061249b8560a0015183612c0b90919063ffffffff16565b600e549091506001600160a01b038083169116146125055760405162461bcd60e51b815260206004820152602160248201527f5175616e74417274734e46543a205369676e6572206973206e6f742076616c696044820152601960fa1b6064820152608401610930565b6014544210801561251857508460800151155b1561256b57600b54600a5461252f90611a91613971565b6125399190613971565b8551600854612548919061393a565b11156125665760405162461bcd60e51b8152600401610930906139e3565b6125a7565b600a5461257a90611a91613971565b8551600854612589919061393a565b11156125a75760405162461bcd60e51b8152600401610930906139e3565b5050506126d0565b8160c00151156126015760405162461bcd60e51b815260206004820152601f60248201527f5175616e74417274734e46543a204d6574686f6420697320574c206d696e74006044820152606401610930565b600a5461261090611a91613971565b825160085461261f919061393a565b111561263d5760405162461bcd60e51b8152600401610930906139e3565b3360009081526016602052604090205461265890601e613971565b825111156126d0576040805162461bcd60e51b81526020600482015260248101919091527f5175616e74417274734e46543a20416c7265616479206d696e74656420616d6f60448201527f756e7420697320626967676572207468616e206d61784d696e74416d6f756e746064820152608401610930565b81516127285760405162461bcd60e51b815260206004820152602160248201527f5175616e74417274734e46543a204d696e7420616d6f756e74206973207a65726044820152606f60f81b6064820152608401610930565b506001919050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916127949190613afb565b6000604051808303816000865af19150503d80600081146127d1576040519150601f19603f3d011682016040523d82523d6000602084013e6127d6565b606091505b50915091508180156128005750805115806128005750808060200190518101906128009190613b17565b6128665760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604482015270185b9cd9995c919c9bdb4819985a5b1959607a1b6064820152608401610930565b505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916128ca9190613afb565b6000604051808303816000865af19150503d8060008114612907576040519150601f19603f3d011682016040523d82523d6000602084013e61290c565b606091505b50915091508180156129365750805115806129365750808060200190518101906129369190613b17565b6112485760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b6064820152608401610930565b610b40828260405180602001604052806000815250612c2f565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415612a665760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610930565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101611631565b612ad6848484611f54565b612ae284848484612c62565b611ab45760405162461bcd60e51b815260040161093090613b34565b6060600f8054610838906137c2565b606081612b315750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612b5b5780612b45816139b2565b9150612b549050600a8361399e565b9150612b35565b60008167ffffffffffffffff811115612b7657612b7661342c565b6040519080825280601f01601f191660200182016040528015612ba0576020820181803683370190505b5090505b8415611f4c57612bb5600183613971565b9150612bc2600a86613b86565b612bcd90603061393a565b60f81b818381518110612be257612be26139cd565b60200101906001600160f81b031916908160001a905350612c04600a8661399e565b9450612ba4565b6000806000612c1a8585612d60565b91509150612c2781612dd0565b509392505050565b612c398383612f8b565b612c466000848484612c62565b610a665760405162461bcd60e51b815260040161093090613b34565b60006001600160a01b0384163b15612d5557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612ca6903390899088908890600401613b9a565b6020604051808303816000875af1925050508015612ce1575060408051601f3d908101601f19168201909252612cde91810190613bd7565b60015b612d3b573d808015612d0f576040519150601f19603f3d011682016040523d82523d6000602084013e612d14565b606091505b508051612d335760405162461bcd60e51b815260040161093090613b34565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f4c565b506001949350505050565b600080825160411415612d975760208301516040840151606085015160001a612d8b878285856130cd565b94509450505050612dc9565b825160401415612dc15760208301516040840151612db68683836131ba565b935093505050612dc9565b506000905060025b9250929050565b6000816004811115612de457612de4613bf4565b1415612ded5750565b6001816004811115612e0157612e01613bf4565b1415612e4f5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610930565b6002816004811115612e6357612e63613bf4565b1415612eb15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610930565b6003816004811115612ec557612ec5613bf4565b1415612f1e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610930565b6004816004811115612f3257612f32613bf4565b1415611dec5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610930565b6001600160a01b038216612fe15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610930565b6000818152600260205260409020546001600160a01b0316156130465760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610930565b6001600160a01b038216600090815260036020526040812080546001929061306f90849061393a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561310457506000905060036131b1565b8460ff16601b1415801561311c57508460ff16601c14155b1561312d57506000905060046131b1565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613181573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166131aa576000600192509250506131b1565b9150600090505b94509492505050565b6000806001600160ff1b038316816131d760ff86901c601b61393a565b90506131e5878288856130cd565b935093505050935093915050565b8280546131ff906137c2565b90600052602060002090601f0160209004810192826132215760008555613267565b82601f1061323a57805160ff1916838001178555613267565b82800160010185558215613267579182015b8281111561326757825182559160200191906001019061324c565b506132739291506132c1565b5090565b6040518060e001604052806000815260200160006001600160a01b031681526020016000815260200160008152602001600015158152602001606081526020016000151581525090565b5b8082111561327357600081556001016132c2565b6001600160e01b031981168114611dec57600080fd5b6000602082840312156132fe57600080fd5b8135611c0b816132d6565b60005b8381101561332457818101518382015260200161330c565b83811115611ab45750506000910152565b6000815180845261334d816020860160208601613309565b601f01601f19169290920160200192915050565b602081526000611c0b6020830184613335565b60006020828403121561338657600080fd5b5035919050565b6001600160a01b0381168114611dec57600080fd5b600080604083850312156133b557600080fd5b82356133c08161338d565b946020939093013593505050565b6000806000606084860312156133e357600080fd5b83356133ee8161338d565b925060208401356133fe8161338d565b929592945050506040919091013590565b60006020828403121561342157600080fd5b8135611c0b8161338d565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561345d5761345d61342c565b604051601f8501601f19908116603f011681019082821181831017156134855761348561342c565b8160405280935085815286868601111561349e57600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156134ca57600080fd5b813567ffffffffffffffff8111156134e157600080fd5b8201601f810184136134f257600080fd5b611f4c84823560208401613442565b6000806040838503121561351457600080fd5b8235915060208301356135268161338d565b809150509250929050565b60008083601f84011261354357600080fd5b50813567ffffffffffffffff81111561355b57600080fd5b6020830191508360208260051b8501011115612dc957600080fd5b6000806000806040858703121561358c57600080fd5b843567ffffffffffffffff808211156135a457600080fd5b6135b088838901613531565b909650945060208701359150808211156135c957600080fd5b506135d687828801613531565b95989497509550505050565b8015158114611dec57600080fd5b6000806040838503121561360357600080fd5b823561360e8161338d565b91506020830135613526816135e2565b600080600080600080600060c0888a03121561363957600080fd5b87359650602088013561364b8161338d565b955060408801359450606088013593506080880135613669816135e2565b925060a088013567ffffffffffffffff8082111561368657600080fd5b818a0191508a601f83011261369a57600080fd5b8135818111156136a957600080fd5b8b60208285010111156136bb57600080fd5b60208301945080935050505092959891949750929550565b600082601f8301126136e457600080fd5b611c0b83833560208501613442565b6000806000806080858703121561370957600080fd5b84356137148161338d565b935060208501356137248161338d565b925060408501359150606085013567ffffffffffffffff81111561374757600080fd5b613753878288016136d3565b91505092959194509250565b60006020828403121561377157600080fd5b813567ffffffffffffffff81111561378857600080fd5b611f4c848285016136d3565b600080604083850312156137a757600080fd5b82356137b28161338d565b915060208301356135268161338d565b600181811c908216806137d657607f821691505b602082108114156137f757634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526034908201527f5175616e74417274734e46543a2052656665727265722063616e6e6f742062656040820152731032b8bab0b6103a379036b9b39039b2b73232b960611b606082015260800190565b6020808252602d908201527f5175616e74417274734e46543a20526566657272616c2063616e6e6f7420626560408201526c2061646472657373207a65726f60981b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561394d5761394d613924565b500190565b600081600019048311821515161561396c5761396c613924565b500290565b60008282101561398357613983613924565b500390565b634e487b7160e01b600052601260045260246000fd5b6000826139ad576139ad613988565b500490565b60006000198214156139c6576139c6613924565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60208082526034908201527f5175616e74417274734e46543a204d696e7420616d6f756e742069732062696760408201527319d95c881d1a185b881cdd5c1c1b1e481b19599d60621b606082015260800190565b600084516020613a4a8285838a01613309565b855191840191613a5d8184848a01613309565b8554920191600090600181811c9080831680613a7a57607f831692505b858310811415613a9857634e487b7160e01b85526022600452602485fd5b808015613aac5760018114613abd57613aea565b60ff19851688528388019550613aea565b60008b81526020902060005b85811015613ae25781548a820152908401908801613ac9565b505083880195505b50939b9a5050505050505050505050565b60008251613b0d818460208701613309565b9190910192915050565b600060208284031215613b2957600080fd5b8151611c0b816135e2565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082613b9557613b95613988565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613bcd90830184613335565b9695505050505050565b600060208284031215613be957600080fd5b8151611c0b816132d6565b634e487b7160e01b600052602160045260246000fdfea26469706673582212206effc0be25204d1d20a8a8122e8718dff0d08480d322bcb49d82e1b768f2aefa64736f6c634300080a00333078373834633365373132653836633830663432666364653135633739303139646433613437393231303562356530333734346365643532353363353435343333634f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000559d59f28e0f9b60802f7590c94a5f678f20c9a4000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000083eee6a9bc1a5ebb84c455b94152a67ab250d95000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000622c530000000000000000000000000000000000000000000000000000000000623047800000000000000000000000000000000000000000000000000000000062358d8000000000000000000000000000000000000000000000000000000000622ca76000000000000000000000000000000000000000000000000000000000000000215175616e74417274733a2044616c69202d20416c65676f72696120616c206d617200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000544414c4d410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007687474703a2f2f00000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103a45760003560e01c806380eae578116101e9578063b88d4fde1161010f578063d5abeb01116100ad578063de20308a1161007c578063de20308a1461076c578063e1bb861a14610775578063e985e9c514610788578063f2fde38b146107c457600080fd5b8063d5abeb0114610734578063d75116fa1461073d578063d91a424814610750578063da3ef23f1461075957600080fd5b8063c6682862116100e9578063c6682862146106fd578063c726c97c14610705578063c87b56dd1461070e578063d0ea76e81461072157600080fd5b8063b88d4fde146106ce578063be87bbbc146106e1578063bedcf003146106f457600080fd5b80639725353f11610187578063acc11c1a11610156578063acc11c1a14610682578063ad1b61ec14610695578063ad750148146106a8578063b4811636146106bb57600080fd5b80639725353f1461064a5780639ecfab9b14610653578063a0712d681461065c578063a22cb4651461066f57600080fd5b80638da5cb5b116101c35780638da5cb5b146106155780638e3fc6321461062657806395d89b411461063957806396ea8b9c1461064157600080fd5b806380eae578146105e657806383ac44e6146105f95780638c7700671461060c57600080fd5b806355f804b3116102ce578063672434821161026c5780636dec4d7b1161023b5780636dec4d7b1461058857806370a08231146105a8578063715018a6146105bb5780637c8c93b2146105c357600080fd5b806367243482146105475780636a326ab11461055a5780636c0360eb1461056d5780636c19e7831461057557600080fd5b80636352211e116102a85780636352211e146104f957806363adb3341461050c57806365d48b381461051f5780636656fc961461053f57600080fd5b806355f804b3146104ca5780635696417c146104dd57806361df7ef7146104f057600080fd5b8063238ac933116103465780633e65408a116103155780633e65408a1461049257806342842e0e1461049b5780634677a3af146104ae57806350b2a881146104b757600080fd5b8063238ac93314610451578063239c70ae1461046457806323b872dd1461046c5780633013ce291461047f57600080fd5b8063095ea7b311610382578063095ea7b3146104115780630c031e2914610426578063178a7c931461043d57806318160ddd1461044857600080fd5b806301ffc9a7146103a957806306fdde03146103d1578063081812fc146103e6575b600080fd5b6103bc6103b73660046132ec565b6107d7565b60405190151581526020015b60405180910390f35b6103d9610829565b6040516103c89190613361565b6103f96103f4366004613374565b6108bb565b6040516001600160a01b0390911681526020016103c8565b61042461041f3660046133a2565b610955565b005b61042f60145481565b6040519081526020016103c8565b61042f630ee6b28081565b61042f60085481565b600e546103f9906001600160a01b031681565b61042f601e81565b61042461047a3660046133ce565b610a6b565b600c546103f9906001600160a01b031681565b61042f60125481565b6104246104a93660046133ce565b610a9c565b61042f6101f481565b6104246104c536600461340f565b610ab7565b6104246104d83660046134b8565b610b03565b6104246104eb366004613374565b610b44565b61042f60135481565b6103f9610507366004613374565b610beb565b61042461051a366004613501565b610c62565b61042f61052d36600461340f565b60176020526000908152604090205481565b610424610ed1565b610424610555366004613576565b611070565b61042461056836600461340f565b61124f565b6103d961129b565b61042461058336600461340f565b611329565b61042f61059636600461340f565b60166020526000908152604090205481565b61042f6105b636600461340f565b611375565b6104246113fc565b6103bc6105d136600461340f565b60186020526000908152604090205460ff1681565b6104246105f4366004613374565b611432565b600d546103f9906001600160a01b031681565b61042f60095481565b6006546001600160a01b03166103f9565b610424610634366004613374565b611461565b6103d9611490565b61042f6103e881565b61042f600a5481565b61042f60115481565b61042461066a366004613374565b61149f565b61042461067d3660046135f0565b61163e565b61042461069036600461361e565b611649565b6104246106a3366004613374565b6118b7565b6104246106b636600461340f565b611959565b6103d96106c9366004613374565b611a57565b6104246106dc3660046136f3565b611a82565b6104246106ef36600461375f565b611aba565b61042f60155481565b6103d9611b27565b61042f600b5481565b6103d961071c366004613374565b611b34565b61042461072f366004613374565b611c12565b61042f611a9181565b61042461074b366004613374565b611c41565b61042f61271081565b6104246107673660046134b8565b611c70565b61042f6105dc81565b610424610783366004613374565b611cad565b6103bc610796366004613794565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6104246107d236600461340f565b611d54565b60006001600160e01b031982166380ac58cd60e01b148061080857506001600160e01b03198216635b5e139f60e01b145b8061082357506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610838906137c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610864906137c2565b80156108b15780601f10610886576101008083540402835291602001916108b1565b820191906000526020600020905b81548152906001019060200180831161089457829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109395760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061096082610beb565b9050806001600160a01b0316836001600160a01b031614156109ce5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610930565b336001600160a01b03821614806109ea57506109ea8133610796565b610a5c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610930565b610a668383611def565b505050565b610a753382611e5d565b610a915760405162461bcd60e51b8152600401610930906137fd565b610a66838383611f54565b610a6683838360405180602001604052806000815250611a82565b6006546001600160a01b03163314610ae15760405162461bcd60e51b81526004016109309061384e565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b03163314610b2d5760405162461bcd60e51b81526004016109309061384e565b8051610b4090600f9060208401906131f3565b5050565b6006546001600160a01b03163314610b6e5760405162461bcd60e51b81526004016109309061384e565b601154811015610be65760405162461bcd60e51b815260206004820152603c60248201527f5175616e74417274734e46543a205075626c69632074696d657374616d70206960448201527f73206265666f72652077686974656c6973742074696d657374616d70000000006064820152608401610930565b601255565b6000818152600260205260408120546001600160a01b0316806108235760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610930565b610c6a613277565b828152610c76816120f0565b506001600160a01b038216331415610ca05760405162461bcd60e51b815260040161093090613883565b6001600160a01b038216610cc65760405162461bcd60e51b8152600401610930906138d7565b3360009081526016602052604081208054859290610ce590849061393a565b92505081905550610d1060405180606001604052806000815260200160008152602001600081525090565b83600954610d1e9190613952565b81526127106103e8610d326105dc83613971565b610d3c9190613971565b8251610d489190613952565b610d52919061399e565b60208281018290523360009081526017909152604081208054909190610d7990849061393a565b9091555050805161271090610d91906103e890613952565b610d9b919061399e565b6040820152602081015160158054600090610db790849061393a565b9091555050600c54610dd7906001600160a01b0316335b83513090612730565b600c546040820151610df4916001600160a01b031690859061286e565b600c54600d5460208301516040840151610e30936001600160a01b03908116931691610e1f9161393a565b8451610e2b9190613971565b61286e565b60005b84811015610e805760088054906000610e4b836139b2565b9190505550610e6e610e5a3390565b6001600854610e699190613971565b612998565b80610e78816139b2565b915050610e33565b506009546040805186815260208101929092526001600160a01b0385169133917f2f00e3cdd69a77be7ed215ec7b2a36784dd158f921fca79ac29deffa353fe6ee910160405180910390a350505050565b6101f460085410610f3f5760405162461bcd60e51b815260206004820152603260248201527f5175616e74417274734e46543a204d696e696d756d20736f6c6420737570706c6044820152711e481a185cc81899595b881c995858da195960721b6064820152608401610930565b601354421015610f9d5760405162461bcd60e51b815260206004820152602360248201527f5175616e74417274734e46543a204d696e7420686173206e6f742066696e69736044820152621a195960ea1b6064820152608401610930565b336000908152601760205260409020548061100f5760405162461bcd60e51b815260206004820152602c60248201527f5175616e74417274734e46543a205573657220686173206e6f74206d696e746560448201526b6420616e7920746f6b656e7360a01b6064820152608401610930565b33600081815260176020526040812055600c54611038916001600160a01b03909116908361286e565b60405181815233907fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d06519060200160405180910390a250565b6006546001600160a01b0316331461109a5760405162461bcd60e51b81526004016109309061384e565b8281146110fb5760405162461bcd60e51b815260206004820152602960248201527f5175616e74417274734e46543a204172726179206c656e6774687320617265206044820152681b9bdd08195c5d585b60ba1b6064820152608401610930565b60005b8381101561124857600083838381811061111a5761111a6139cd565b905060200201351161117a5760405162461bcd60e51b8152602060048201526024808201527f5175616e74417274734e46543a2041697264726f7020616d6f756e74206973206044820152637a65726f60e01b6064820152608401610930565b611a9183838381811061118f5761118f6139cd565b905060200201356008546111a3919061393a565b11156111c15760405162461bcd60e51b8152600401610930906139e3565b60005b8383838181106111d6576111d66139cd565b9050602002013581101561123557600880549060006111f4836139b2565b919050555061122386868481811061120e5761120e6139cd565b9050602002016020810190610e5a919061340f565b8061122d816139b2565b9150506111c4565b5080611240816139b2565b9150506110fe565b5050505050565b6006546001600160a01b031633146112795760405162461bcd60e51b81526004016109309061384e565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b600f80546112a8906137c2565b80601f01602080910402602001604051908101604052809291908181526020018280546112d4906137c2565b80156113215780601f106112f657610100808354040283529160200191611321565b820191906000526020600020905b81548152906001019060200180831161130457829003601f168201915b505050505081565b6006546001600160a01b031633146113535760405162461bcd60e51b81526004016109309061384e565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166113e05760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610930565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146114265760405162461bcd60e51b81526004016109309061384e565b61143060006129b2565b565b6006546001600160a01b0316331461145c5760405162461bcd60e51b81526004016109309061384e565b600955565b6006546001600160a01b0316331461148b5760405162461bcd60e51b81526004016109309061384e565b601155565b606060018054610838906137c2565b6114a7613277565b8181526114b3816120f0565b5033600090815260166020526040812080548492906114d390849061393a565b925050819055506114fe60405180606001604052806000815260200160008152602001600081525090565b8260095461150c9190613952565b815261271061151d6105dc82613971565b82516115299190613952565b611533919061399e565b6020828101829052336000908152601790915260408120805490919061155a90849061393a565b909155505060208101516015805460009061157690849061393a565b9091555050600c54611591906001600160a01b031633610dce565b600c54600d54602083015183516115b9936001600160a01b03908116931691610e2b91613971565b60005b838110156115f557600880549060006115d4836139b2565b91905055506115e3610e5a3390565b806115ed816139b2565b9150506115bc565b5060095460408051858152602081019290925260009133917f2f00e3cdd69a77be7ed215ec7b2a36784dd158f921fca79ac29deffa353fe6ee91015b60405180910390a3505050565b610b40338383612a04565b611651613277565b8781526001600160a01b03871660208083019190915260408083018890526060830187905285151560808401528051601f850183900483028101830190915283815290849084908190840183828082843760009201919091525050505060a0820152600160c08201526116c3816120f0565b50336000908152601860209081526040808320805460ff191660011790556016909152812080548a92906116f890849061393a565b9250508190555061172360405180606001604052806000815260200160008152602001600081525090565b61172d8987613952565b81526127106103e86117416105dc83613971565b61174b9190613971565b82516117579190613952565b611761919061399e565b6020828101829052336000908152601790915260408120805490919061178890849061393a565b90915550508051612710906117a0906103e890613952565b6117aa919061399e565b60408201526020810151601580546000906117c690849061393a565b9091555050600c546117e1906001600160a01b031633610dce565b600c5460408201516117fe916001600160a01b0316908a9061286e565b600c54600d5460208301516040840151611829936001600160a01b03908116931691610e1f9161393a565b60005b898110156118655760088054906000611844836139b2565b9190505550611853610e5a3390565b8061185d816139b2565b91505061182c565b50604080518a8152602081018890526001600160a01b038a169133917f2f00e3cdd69a77be7ed215ec7b2a36784dd158f921fca79ac29deffa353fe6ee910160405180910390a3505050505050505050565b6006546001600160a01b031633146118e15760405162461bcd60e51b81526004016109309061384e565b60115481101580156118f4575060125481105b6119545760405162461bcd60e51b815260206004820152602b60248201527f5175616e74417274734e46543a20496e636f726563742067756172616e74656560448201526a0642074696d657374616d760ac1b6064820152608401610930565b601455565b6006546001600160a01b031633146119835760405162461bcd60e51b81526004016109309061384e565b6101f460085410156119f05760405162461bcd60e51b815260206004820152603060248201527f5175616e74417274734e46543a204d696e696d756d20736f6c6420737570706c60448201526f1e481a5cc81b9bdd081c995858da195960821b6064820152608401610930565b601580546000909155600c54611a10906001600160a01b0316838361286e565b816001600160a01b03167f6253792f68f5f86d90058ddc0bcb600478147da82de0212f4971cf298ccbf7c282604051611a4b91815260200190565b60405180910390a25050565b60078181548110611a6757600080fd5b9060005260206000200160009150905080546112a8906137c2565b611a8c3383611e5d565b611aa85760405162461bcd60e51b8152600401610930906137fd565b611ab484848484612acb565b50505050565b6006546001600160a01b03163314611ae45760405162461bcd60e51b81526004016109309061384e565b600780546001810182556000919091528151610b40917fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688019060208401906131f3565b601080546112a8906137c2565b6000818152600260205260409020546060906001600160a01b0316611bb35760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610930565b6000611bbd612afe565b90506000815111611bdd5760405180602001604052806000815250611c0b565b80611be784612b0d565b6010604051602001611bfb93929190613a37565b6040516020818303038152906040525b9392505050565b6006546001600160a01b03163314611c3c5760405162461bcd60e51b81526004016109309061384e565b600b55565b6006546001600160a01b03163314611c6b5760405162461bcd60e51b81526004016109309061384e565b600a55565b6006546001600160a01b03163314611c9a5760405162461bcd60e51b81526004016109309061384e565b8051610b409060109060208401906131f3565b6006546001600160a01b03163314611cd75760405162461bcd60e51b81526004016109309061384e565b601254811015611d4f5760405162461bcd60e51b815260206004820152603e60248201527f5175616e74417274734e46543a204d696e742066696e6973682074696d65737460448201527f616d70206973206265666f7265207075626c69632074696d657374616d7000006064820152608401610930565b601355565b6006546001600160a01b03163314611d7e5760405162461bcd60e51b81526004016109309061384e565b6001600160a01b038116611de35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610930565b611dec816129b2565b50565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611e2482610beb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611ed65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610930565b6000611ee183610beb565b9050806001600160a01b0316846001600160a01b03161480611f1c5750836001600160a01b0316611f11846108bb565b6001600160a01b0316145b80611f4c57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611f6782610beb565b6001600160a01b031614611fcb5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610930565b6001600160a01b03821661202d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610930565b612038600082611def565b6001600160a01b0383166000908152600360205260408120805460019290612061908490613971565b90915550506001600160a01b038216600090815260036020526040812080546001929061208f90849061393a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006101f4600854101561214f57601354421061214f5760405162461bcd60e51b815260206004820152601f60248201527f5175616e74417274734e46543a204d696e74206861732066696e6973686564006044820152606401610930565b60115442116121b95760405162461bcd60e51b815260206004820152603060248201527f5175616e74417274734e46543a2057686974656c697374206d696e742068617360448201526f081b9bdd081cdd185c9d1959081e595d60821b6064820152608401610930565b6012544210156125af578160c001516122205760405162461bcd60e51b815260206004820152602360248201527f5175616e74417274734e46543a204d6574686f64206973206e6f7420574c206d6044820152621a5b9d60ea1b6064820152608401610930565b630ee6b2808260600151101561228d5760405162461bcd60e51b815260206004820152602c60248201527f5175616e74417274734e46543a20556e69745072696365206973206c6573732060448201526b7468616e206d696e696d756d60a01b6064820152608401610930565b3360009081526018602052604090205460ff16156123035760405162461bcd60e51b815260206004820152602d60248201527f5175616e74417274734e46543a20557365722068617320616c7265616479206d60448201526c1a5b9d1959081dda5d1a0815d3609a1b6064820152608401610930565b6040820151825111156123775760405162461bcd60e51b815260206004820152603660248201527f5175616e74417274734e46543a204d696e7420616d6f756e742069732062696760448201527519d95c881d1a185b8815d3081b585e08185b5bdd5b9d60521b6064820152608401610930565b60208201516001600160a01b03163314156123a45760405162461bcd60e51b815260040161093090613883565b60208201516001600160a01b03166123ce5760405162461bcd60e51b8152600401610930906138d7565b602082810151604080850151606080870151608088015184516bffffffffffffffffffffffff1933851b8116828a01529690931b90951660348301526048820192909252606881019190915291151560f81b6088830152805180830360690181526089830182528051908401207f19457468657265756d205369676e6564204d6573736167653a0a33320000000060a984015260c58084018290528251808503909101815260e590930190915281519190920120600061249b8560a0015183612c0b90919063ffffffff16565b600e549091506001600160a01b038083169116146125055760405162461bcd60e51b815260206004820152602160248201527f5175616e74417274734e46543a205369676e6572206973206e6f742076616c696044820152601960fa1b6064820152608401610930565b6014544210801561251857508460800151155b1561256b57600b54600a5461252f90611a91613971565b6125399190613971565b8551600854612548919061393a565b11156125665760405162461bcd60e51b8152600401610930906139e3565b6125a7565b600a5461257a90611a91613971565b8551600854612589919061393a565b11156125a75760405162461bcd60e51b8152600401610930906139e3565b5050506126d0565b8160c00151156126015760405162461bcd60e51b815260206004820152601f60248201527f5175616e74417274734e46543a204d6574686f6420697320574c206d696e74006044820152606401610930565b600a5461261090611a91613971565b825160085461261f919061393a565b111561263d5760405162461bcd60e51b8152600401610930906139e3565b3360009081526016602052604090205461265890601e613971565b825111156126d0576040805162461bcd60e51b81526020600482015260248101919091527f5175616e74417274734e46543a20416c7265616479206d696e74656420616d6f60448201527f756e7420697320626967676572207468616e206d61784d696e74416d6f756e746064820152608401610930565b81516127285760405162461bcd60e51b815260206004820152602160248201527f5175616e74417274734e46543a204d696e7420616d6f756e74206973207a65726044820152606f60f81b6064820152608401610930565b506001919050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916127949190613afb565b6000604051808303816000865af19150503d80600081146127d1576040519150601f19603f3d011682016040523d82523d6000602084013e6127d6565b606091505b50915091508180156128005750805115806128005750808060200190518101906128009190613b17565b6128665760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604482015270185b9cd9995c919c9bdb4819985a5b1959607a1b6064820152608401610930565b505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916128ca9190613afb565b6000604051808303816000865af19150503d8060008114612907576040519150601f19603f3d011682016040523d82523d6000602084013e61290c565b606091505b50915091508180156129365750805115806129365750808060200190518101906129369190613b17565b6112485760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b6064820152608401610930565b610b40828260405180602001604052806000815250612c2f565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415612a665760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610930565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101611631565b612ad6848484611f54565b612ae284848484612c62565b611ab45760405162461bcd60e51b815260040161093090613b34565b6060600f8054610838906137c2565b606081612b315750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612b5b5780612b45816139b2565b9150612b549050600a8361399e565b9150612b35565b60008167ffffffffffffffff811115612b7657612b7661342c565b6040519080825280601f01601f191660200182016040528015612ba0576020820181803683370190505b5090505b8415611f4c57612bb5600183613971565b9150612bc2600a86613b86565b612bcd90603061393a565b60f81b818381518110612be257612be26139cd565b60200101906001600160f81b031916908160001a905350612c04600a8661399e565b9450612ba4565b6000806000612c1a8585612d60565b91509150612c2781612dd0565b509392505050565b612c398383612f8b565b612c466000848484612c62565b610a665760405162461bcd60e51b815260040161093090613b34565b60006001600160a01b0384163b15612d5557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612ca6903390899088908890600401613b9a565b6020604051808303816000875af1925050508015612ce1575060408051601f3d908101601f19168201909252612cde91810190613bd7565b60015b612d3b573d808015612d0f576040519150601f19603f3d011682016040523d82523d6000602084013e612d14565b606091505b508051612d335760405162461bcd60e51b815260040161093090613b34565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f4c565b506001949350505050565b600080825160411415612d975760208301516040840151606085015160001a612d8b878285856130cd565b94509450505050612dc9565b825160401415612dc15760208301516040840151612db68683836131ba565b935093505050612dc9565b506000905060025b9250929050565b6000816004811115612de457612de4613bf4565b1415612ded5750565b6001816004811115612e0157612e01613bf4565b1415612e4f5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610930565b6002816004811115612e6357612e63613bf4565b1415612eb15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610930565b6003816004811115612ec557612ec5613bf4565b1415612f1e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610930565b6004816004811115612f3257612f32613bf4565b1415611dec5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610930565b6001600160a01b038216612fe15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610930565b6000818152600260205260409020546001600160a01b0316156130465760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610930565b6001600160a01b038216600090815260036020526040812080546001929061306f90849061393a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561310457506000905060036131b1565b8460ff16601b1415801561311c57508460ff16601c14155b1561312d57506000905060046131b1565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613181573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166131aa576000600192509250506131b1565b9150600090505b94509492505050565b6000806001600160ff1b038316816131d760ff86901c601b61393a565b90506131e5878288856130cd565b935093505050935093915050565b8280546131ff906137c2565b90600052602060002090601f0160209004810192826132215760008555613267565b82601f1061323a57805160ff1916838001178555613267565b82800160010185558215613267579182015b8281111561326757825182559160200191906001019061324c565b506132739291506132c1565b5090565b6040518060e001604052806000815260200160006001600160a01b031681526020016000815260200160008152602001600015158152602001606081526020016000151581525090565b5b8082111561327357600081556001016132c2565b6001600160e01b031981168114611dec57600080fd5b6000602082840312156132fe57600080fd5b8135611c0b816132d6565b60005b8381101561332457818101518382015260200161330c565b83811115611ab45750506000910152565b6000815180845261334d816020860160208601613309565b601f01601f19169290920160200192915050565b602081526000611c0b6020830184613335565b60006020828403121561338657600080fd5b5035919050565b6001600160a01b0381168114611dec57600080fd5b600080604083850312156133b557600080fd5b82356133c08161338d565b946020939093013593505050565b6000806000606084860312156133e357600080fd5b83356133ee8161338d565b925060208401356133fe8161338d565b929592945050506040919091013590565b60006020828403121561342157600080fd5b8135611c0b8161338d565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561345d5761345d61342c565b604051601f8501601f19908116603f011681019082821181831017156134855761348561342c565b8160405280935085815286868601111561349e57600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156134ca57600080fd5b813567ffffffffffffffff8111156134e157600080fd5b8201601f810184136134f257600080fd5b611f4c84823560208401613442565b6000806040838503121561351457600080fd5b8235915060208301356135268161338d565b809150509250929050565b60008083601f84011261354357600080fd5b50813567ffffffffffffffff81111561355b57600080fd5b6020830191508360208260051b8501011115612dc957600080fd5b6000806000806040858703121561358c57600080fd5b843567ffffffffffffffff808211156135a457600080fd5b6135b088838901613531565b909650945060208701359150808211156135c957600080fd5b506135d687828801613531565b95989497509550505050565b8015158114611dec57600080fd5b6000806040838503121561360357600080fd5b823561360e8161338d565b91506020830135613526816135e2565b600080600080600080600060c0888a03121561363957600080fd5b87359650602088013561364b8161338d565b955060408801359450606088013593506080880135613669816135e2565b925060a088013567ffffffffffffffff8082111561368657600080fd5b818a0191508a601f83011261369a57600080fd5b8135818111156136a957600080fd5b8b60208285010111156136bb57600080fd5b60208301945080935050505092959891949750929550565b600082601f8301126136e457600080fd5b611c0b83833560208501613442565b6000806000806080858703121561370957600080fd5b84356137148161338d565b935060208501356137248161338d565b925060408501359150606085013567ffffffffffffffff81111561374757600080fd5b613753878288016136d3565b91505092959194509250565b60006020828403121561377157600080fd5b813567ffffffffffffffff81111561378857600080fd5b611f4c848285016136d3565b600080604083850312156137a757600080fd5b82356137b28161338d565b915060208301356135268161338d565b600181811c908216806137d657607f821691505b602082108114156137f757634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526034908201527f5175616e74417274734e46543a2052656665727265722063616e6e6f742062656040820152731032b8bab0b6103a379036b9b39039b2b73232b960611b606082015260800190565b6020808252602d908201527f5175616e74417274734e46543a20526566657272616c2063616e6e6f7420626560408201526c2061646472657373207a65726f60981b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561394d5761394d613924565b500190565b600081600019048311821515161561396c5761396c613924565b500290565b60008282101561398357613983613924565b500390565b634e487b7160e01b600052601260045260246000fd5b6000826139ad576139ad613988565b500490565b60006000198214156139c6576139c6613924565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60208082526034908201527f5175616e74417274734e46543a204d696e7420616d6f756e742069732062696760408201527319d95c881d1a185b881cdd5c1c1b1e481b19599d60621b606082015260800190565b600084516020613a4a8285838a01613309565b855191840191613a5d8184848a01613309565b8554920191600090600181811c9080831680613a7a57607f831692505b858310811415613a9857634e487b7160e01b85526022600452602485fd5b808015613aac5760018114613abd57613aea565b60ff19851688528388019550613aea565b60008b81526020902060005b85811015613ae25781548a820152908401908801613ac9565b505083880195505b50939b9a5050505050505050505050565b60008251613b0d818460208701613309565b9190910192915050565b600060208284031215613b2957600080fd5b8151611c0b816135e2565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082613b9557613b95613988565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613bcd90830184613335565b9695505050505050565b600060208284031215613be957600080fd5b8151611c0b816132d6565b634e487b7160e01b600052602160045260246000fdfea26469706673582212206effc0be25204d1d20a8a8122e8718dff0d08480d322bcb49d82e1b768f2aefa64736f6c634300080a0033

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

000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000559d59f28e0f9b60802f7590c94a5f678f20c9a4000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000083eee6a9bc1a5ebb84c455b94152a67ab250d95000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000622c530000000000000000000000000000000000000000000000000000000000623047800000000000000000000000000000000000000000000000000000000062358d8000000000000000000000000000000000000000000000000000000000622ca76000000000000000000000000000000000000000000000000000000000000000215175616e74417274733a2044616c69202d20416c65676f72696120616c206d617200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000544414c4d410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007687474703a2f2f00000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): QuantArts: Dali - Alegoria al mar
Arg [1] : _symbol (string): DALMA
Arg [2] : _signer (address): 0x559d59f28E0f9B60802F7590c94A5F678F20C9A4
Arg [3] : _paymentToken (address): 0xdAC17F958D2ee523a2206206994597C13D831ec7
Arg [4] : _marketingAccount (address): 0x83eee6A9bC1A5EBB84c455b94152a67aB250D950
Arg [5] : _initBaseURI (string): http://
Arg [6] : _initWhitelistStartTimestamp (uint256): 1647072000
Arg [7] : _initPublicStartTimestamp (uint256): 1647331200
Arg [8] : _initMintFinishTimestamp (uint256): 1647676800
Arg [9] : _initGuaranteedWLTimestamp (uint256): 1647093600

-----Encoded View---------------
17 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [1] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [2] : 000000000000000000000000559d59f28e0f9b60802f7590c94a5f678f20c9a4
Arg [3] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [4] : 00000000000000000000000083eee6a9bc1a5ebb84c455b94152a67ab250d950
Arg [5] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [6] : 00000000000000000000000000000000000000000000000000000000622c5300
Arg [7] : 0000000000000000000000000000000000000000000000000000000062304780
Arg [8] : 0000000000000000000000000000000000000000000000000000000062358d80
Arg [9] : 00000000000000000000000000000000000000000000000000000000622ca760
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000021
Arg [11] : 5175616e74417274733a2044616c69202d20416c65676f72696120616c206d61
Arg [12] : 7200000000000000000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [14] : 44414c4d41000000000000000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [16] : 687474703a2f2f00000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

48748:13644:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35521:305;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;35521:305:0;;;;;;;;36466:100;;;:::i;:::-;;;;;;;:::i;38025:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;38025:221:0;1528:203:1;37548:411:0;;;;;;:::i;:::-;;:::i;:::-;;49802:40;;;;;;;;;2338:25:1;;;2326:2;2311:18;49802:40:0;2192:177:1;49176:51:0;;49218:9;49176:51;;49266:30;;;;;;49520:21;;;;;-1:-1:-1;;;;;49520:21:0;;;48966:42;;49006:2;48966:42;;38775:339;;;;;;:::i;:::-;;:::i;49448:27::-;;;;;-1:-1:-1;;;;;49448:27:0;;;49683:39;;;;;;39185:185;;;;;;:::i;:::-;;:::i;48907:52::-;;48956:3;48907:52;;52331:134;;;;;;:::i;:::-;;:::i;52473:104::-;;;;;;:::i;:::-;;:::i;53224:285::-;;;;;;:::i;:::-;;:::i;49743:38::-;;;;;;36160:239;;;;;;:::i;:::-;;:::i;55555:1446::-;;;;;;:::i;:::-;;:::i;49962:50::-;;;;;;:::i;:::-;;;;;;;;;;;;;;59309:569;;;:::i;58671:631::-;;;;;;:::i;:::-;;:::i;52205:118::-;;;;;;:::i;:::-;;:::i;49548:21::-;;;:::i;52103:94::-;;;;;;:::i;:::-;;:::i;49901:54::-;;;;;;:::i;:::-;;;;;;;;;;;;;;35890:208;;;;;;:::i;:::-;;:::i;16142:103::-;;;:::i;50019:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;51528:126;;;;;;:::i;:::-;;:::i;49482:31::-;;;;;-1:-1:-1;;;;;49482:31:0;;;49303:41;;;;;;15491:87;15564:6;;-1:-1:-1;;;;;15564:6:0;15491:87;;53054:162;;;;;;:::i;:::-;;:::i;36635:104::-;;;:::i;49015:49::-;;49060:4;49015:49;;49351:43;;;;;;49620:42;;;;;;54546:1001;;;;;;:::i;:::-;;:::i;38318:155::-;;;;;;:::i;:::-;;:::i;57009:1654::-;;;;;;:::i;:::-;;:::i;52721:325::-;;;;;;:::i;:::-;;:::i;53804:356::-;;;;;;:::i;:::-;;:::i;49234:25::-;;;;;;:::i;:::-;;:::i;39441:328::-;;;;;;:::i;:::-;;:::i;51662:113::-;;;;;;:::i;:::-;;:::i;49863:31::-;;;;;;49576:37;;;:::i;49401:40::-;;;;;;54168:370;;;;;;:::i;:::-;;:::i;51953:142::-;;;;;;:::i;:::-;;:::i;48860:40::-;;48896:4;48860:40;;51783:162;;;;;;:::i;:::-;;:::i;49128:41::-;;49164:5;49128:41;;52585:128;;;;;;:::i;:::-;;:::i;49071:50::-;;49117:4;49071:50;;53517:279;;;;;;:::i;:::-;;:::i;38544:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;38665:25:0;;;38641:4;38665:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;38544:164;16400:201;;;;;;:::i;:::-;;:::i;35521:305::-;35623:4;-1:-1:-1;;;;;;35660:40:0;;-1:-1:-1;;;35660:40:0;;:105;;-1:-1:-1;;;;;;;35717:48:0;;-1:-1:-1;;;35717:48:0;35660:105;:158;;;-1:-1:-1;;;;;;;;;;28384:40:0;;;35782:36;35640:178;35521:305;-1:-1:-1;;35521:305:0:o;36466:100::-;36520:13;36553:5;36546:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36466:100;:::o;38025:221::-;38101:7;41368:16;;;:7;:16;;;;;;-1:-1:-1;;;;;41368:16:0;38121:73;;;;-1:-1:-1;;;38121:73:0;;10049:2:1;38121:73:0;;;10031:21:1;10088:2;10068:18;;;10061:30;10127:34;10107:18;;;10100:62;-1:-1:-1;;;10178:18:1;;;10171:42;10230:19;;38121:73:0;;;;;;;;;-1:-1:-1;38214:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;38214:24:0;;38025:221::o;37548:411::-;37629:13;37645:23;37660:7;37645:14;:23::i;:::-;37629:39;;37693:5;-1:-1:-1;;;;;37687:11:0;:2;-1:-1:-1;;;;;37687:11:0;;;37679:57;;;;-1:-1:-1;;;37679:57:0;;10462:2:1;37679:57:0;;;10444:21:1;10501:2;10481:18;;;10474:30;10540:34;10520:18;;;10513:62;-1:-1:-1;;;10591:18:1;;;10584:31;10632:19;;37679:57:0;10260:397:1;37679:57:0;14295:10;-1:-1:-1;;;;;37771:21:0;;;;:62;;-1:-1:-1;37796:37:0;37813:5;14295:10;38544:164;:::i;37796:37::-;37749:168;;;;-1:-1:-1;;;37749:168:0;;10864:2:1;37749:168:0;;;10846:21:1;10903:2;10883:18;;;10876:30;10942:34;10922:18;;;10915:62;11013:26;10993:18;;;10986:54;11057:19;;37749:168:0;10662:420:1;37749:168:0;37930:21;37939:2;37943:7;37930:8;:21::i;:::-;37618:341;37548:411;;:::o;38775:339::-;38970:41;14295:10;39003:7;38970:18;:41::i;:::-;38962:103;;;;-1:-1:-1;;;38962:103:0;;;;;;;:::i;:::-;39078:28;39088:4;39094:2;39098:7;39078:9;:28::i;39185:185::-;39323:39;39340:4;39346:2;39350:7;39323:39;;;;;;;;;;;;:16;:39::i;52331:134::-;15564:6;;-1:-1:-1;;;;;15564:6:0;14295:10;15711:23;15703:68;;;;-1:-1:-1;;;15703:68:0;;;;;;;:::i;:::-;52418:16:::1;:39:::0;;-1:-1:-1;;;;;;52418:39:0::1;-1:-1:-1::0;;;;;52418:39:0;;;::::1;::::0;;;::::1;::::0;;52331:134::o;52473:104::-;15564:6;;-1:-1:-1;;;;;15564:6:0;14295:10;15711:23;15703:68;;;;-1:-1:-1;;;15703:68:0;;;;;;;:::i;:::-;52548:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;52473:104:::0;:::o;53224:285::-;15564:6;;-1:-1:-1;;;;;15564:6:0;14295:10;15711:23;15703:68;;;;-1:-1:-1;;;15703:68:0;;;;;;;:::i;:::-;53355:23:::1;;53327:24;:51;;53319:124;;;::::0;-1:-1:-1;;;53319:124:0;;12068:2:1;53319:124:0::1;::::0;::::1;12050:21:1::0;12107:2;12087:18;;;12080:30;12146:34;12126:18;;;12119:62;12217:30;12197:18;;;12190:58;12265:19;;53319:124:0::1;11866:424:1::0;53319:124:0::1;53454:20;:47:::0;53224:285::o;36160:239::-;36232:7;36268:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36268:16:0;36303:19;36295:73;;;;-1:-1:-1;;;36295:73:0;;12497:2:1;36295:73:0;;;12479:21:1;12536:2;12516:18;;;12509:30;12575:34;12555:18;;;12548:62;-1:-1:-1;;;12626:18:1;;;12619:39;12675:19;;36295:73:0;12295:405:1;55555:1446:0;55638:25;;:::i;:::-;55674:29;;;55714:22;55674:4;55714:16;:22::i;:::-;-1:-1:-1;;;;;;55755:25:0;;14295:10;55755:25;;55747:90;;;;-1:-1:-1;;;55747:90:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55856:23:0;;55848:81;;;;-1:-1:-1;;;55848:81:0;;;;;;;:::i;:::-;14295:10;55940:33;;;;:19;:33;;;;;:48;;55977:11;;55940:33;:48;;55977:11;;55940:48;:::i;:::-;;;;;;;;55999:26;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;55999:26:0;56077:11;56060:14;;:28;;;;:::i;:::-;56036:52;;49164:5;49060:4;56153:31;49117:4;49164:5;56153:31;:::i;:::-;:52;;;;:::i;:::-;56128:21;;:78;;;;:::i;:::-;56127:92;;;;:::i;:::-;56099:24;;;;:120;;;14295:10;56230:29;;;;:15;:29;;;;;;:57;;:29;;;:57;;56099:120;;56230:57;:::i;:::-;;;;-1:-1:-1;;56324:21:0;;49164:5;;56324:42;;49060:4;;56324:42;:::i;:::-;56323:56;;;;:::i;:::-;56298:22;;;:81;56406:24;;;;56390:12;:40;;:12;;:40;;56406:24;;56390:40;:::i;:::-;;;;-1:-1:-1;;56473:12:0;;56441:97;;-1:-1:-1;;;;;56473:12:0;14295:10;56487:12;56516:21;;56509:4;;56441:31;:97::i;:::-;56577:12;;56602:22;;;;56549:76;;-1:-1:-1;;;;;56577:12:0;;56591:9;;56549:27;:76::i;:::-;56664:12;;56678:16;;56746:24;;;;56721:22;;;;56636:136;;-1:-1:-1;;;;;56664:12:0;;;;56678:16;;56721:49;;;:::i;:::-;56696:21;;:75;;;;:::i;:::-;56636:27;:136::i;:::-;56788:9;56783:137;56807:11;56803:1;:15;56783:137;;;56840:11;:13;;;:11;:13;;;:::i;:::-;;;;;;56868:40;56878:12;14295:10;;14215:98;56878:12;56906:1;56892:11;;:15;;;;:::i;:::-;56868:9;:40::i;:::-;56820:3;;;;:::i;:::-;;;;56783:137;;;-1:-1:-1;56978:14:0;;56935:58;;;14679:25:1;;;14735:2;14720:18;;14713:34;;;;-1:-1:-1;;;;;56935:58:0;;;14295:10;;56935:58;;14652:18:1;56935:58:0;;;;;;;55626:1375;;55555:1446;;:::o;59309:569::-;48956:3;59359:11;;:36;59351:99;;;;-1:-1:-1;;;59351:99:0;;14960:2:1;59351:99:0;;;14942:21:1;14999:2;14979:18;;;14972:30;15038:34;15018:18;;;15011:62;-1:-1:-1;;;15089:18:1;;;15082:48;15147:19;;59351:99:0;14758:414:1;59351:99:0;59488:19;;59469:15;:38;;59461:86;;;;-1:-1:-1;;;59461:86:0;;15379:2:1;59461:86:0;;;15361:21:1;15418:2;15398:18;;;15391:30;15457:34;15437:18;;;15430:62;-1:-1:-1;;;15508:18:1;;;15501:33;15551:19;;59461:86:0;15177:399:1;59461:86:0;14295:10;59558:20;59581:29;;;:15;:29;;;;;;59629:16;59621:73;;;;-1:-1:-1;;;59621:73:0;;15783:2:1;59621:73:0;;;15765:21:1;15822:2;15802:18;;;15795:30;15861:34;15841:18;;;15834:62;-1:-1:-1;;;15912:18:1;;;15905:42;15964:19;;59621:73:0;15581:408:1;59621:73:0;14295:10;59737:1;59705:29;;;:15;:29;;;;;:33;59777:12;;59749:69;;-1:-1:-1;;;;;59777:12:0;;;;59805;59749:27;:69::i;:::-;59834:36;;2338:25:1;;;14295:10:0;;59834:36;;2326:2:1;2311:18;59834:36:0;;;;;;;59340:538;59309:569::o;58671:631::-;15564:6;;-1:-1:-1;;;;;15564:6:0;14295:10;15711:23;15703:68;;;;-1:-1:-1;;;15703:68:0;;;;;;;:::i;:::-;58785:35;;::::1;58777:89;;;::::0;-1:-1:-1;;;58777:89:0;;16196:2:1;58777:89:0::1;::::0;::::1;16178:21:1::0;16235:2;16215:18;;;16208:30;16274:34;16254:18;;;16247:62;-1:-1:-1;;;16325:18:1;;;16318:39;16374:19;;58777:89:0::1;15994:405:1::0;58777:89:0::1;58882:9;58877:418;58897:21:::0;;::::1;58877:418;;;58961:1;58948:7;;58956:1;58948:10;;;;;;;:::i;:::-;;;;;;;:14;58940:63;;;::::0;-1:-1:-1;;;58940:63:0;;16738:2:1;58940:63:0::1;::::0;::::1;16720:21:1::0;16777:2;16757:18;;;16750:30;16816:34;16796:18;;;16789:62;-1:-1:-1;;;16867:18:1;;;16860:34;16911:19;;58940:63:0::1;16536:400:1::0;58940:63:0::1;48896:4;59040:7;;59048:1;59040:10;;;;;;;:::i;:::-;;;;;;;59026:11;;:24;;;;:::i;:::-;:37;;59018:102;;;;-1:-1:-1::0;;;59018:102:0::1;;;;;;;:::i;:::-;59140:9;59135:149;59159:7;;59167:1;59159:10;;;;;;;:::i;:::-;;;;;;;59155:1;:14;59135:149;;;59195:11;:13:::0;;;:11:::1;:13;::::0;::::1;:::i;:::-;;;;;;59227:41;59237:10;;59248:1;59237:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;59227:41::-;59171:3:::0;::::1;::::0;::::1;:::i;:::-;;;;59135:149;;;-1:-1:-1::0;58920:3:0;::::1;::::0;::::1;:::i;:::-;;;;58877:418;;;;58671:631:::0;;;;:::o;52205:118::-;15564:6;;-1:-1:-1;;;;;15564:6:0;14295:10;15711:23;15703:68;;;;-1:-1:-1;;;15703:68:0;;;;;;;:::i;:::-;52284:12:::1;:31:::0;;-1:-1:-1;;;;;;52284:31:0::1;-1:-1:-1::0;;;;;52284:31:0;;;::::1;::::0;;;::::1;::::0;;52205:118::o;49548:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52103:94::-;15564:6;;-1:-1:-1;;;;;15564:6:0;14295:10;15711:23;15703:68;;;;-1:-1:-1;;;15703:68:0;;;;;;;:::i;:::-;52170:6:::1;:19:::0;;-1:-1:-1;;;;;;52170:19:0::1;-1:-1:-1::0;;;;;52170:19:0;;;::::1;::::0;;;::::1;::::0;;52103:94::o;35890:208::-;35962:7;-1:-1:-1;;;;;35990:19:0;;35982:74;;;;-1:-1:-1;;;35982:74:0;;17564:2:1;35982:74:0;;;17546:21:1;17603:2;17583:18;;;17576:30;17642:34;17622:18;;;17615:62;-1:-1:-1;;;17693:18:1;;;17686:40;17743:19;;35982:74:0;17362:406:1;35982:74:0;-1:-1:-1;;;;;;36074:16:0;;;;;:9;:16;;;;;;;35890:208::o;16142:103::-;15564:6;;-1:-1:-1;;;;;15564:6:0;14295:10;15711:23;15703:68;;;;-1:-1:-1;;;15703:68:0;;;;;;;:::i;:::-;16207:30:::1;16234:1;16207:18;:30::i;:::-;16142:103::o:0;51528:126::-;15564:6;;-1:-1:-1;;;;;15564:6:0;14295:10;15711:23;15703:68;;;;-1:-1:-1;;;15703:68:0;;;;;;;:::i;:::-;51611:14:::1;:35:::0;51528:126::o;53054:162::-;15564:6;;-1:-1:-1;;;;;15564:6:0;14295:10;15711:23;15703:68;;;;-1:-1:-1;;;15703:68:0;;;;;;;:::i;:::-;53155:23:::1;:53:::0;53054:162::o;36635:104::-;36691:13;36724:7;36717:14;;;;;:::i;54546:1001::-;54601:25;;:::i;:::-;54637:29;;;54677:22;54637:4;54677:16;:22::i;:::-;-1:-1:-1;14295:10:0;54710:33;;;;:19;:33;;;;;:48;;54747:11;;54710:33;:48;;54747:11;;54710:48;:::i;:::-;;;;;;;;54769:26;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;54769:26:0;54847:11;54830:14;;:28;;;;:::i;:::-;54806:52;;49164:5;54923:31;49117:4;49164:5;54923:31;:::i;:::-;54898:21;;:57;;;;:::i;:::-;54897:71;;;;:::i;:::-;54869:24;;;;:99;;;14295:10;54979:29;;;;:15;:29;;;;;;:57;;:29;;;:57;;54869:99;;54979:57;:::i;:::-;;;;-1:-1:-1;;55063:24:0;;;;55047:12;:40;;:12;;:40;;55063:24;;55047:40;:::i;:::-;;;;-1:-1:-1;;55130:12:0;;55098:97;;-1:-1:-1;;;;;55130:12:0;14295:10;55144:12;14215:98;55098:97;55234:12;;55248:16;;55291:24;;;;55267:21;;55206:111;;-1:-1:-1;;;;;55234:12:0;;;;55248:16;;55267:48;;;:::i;55206:111::-;55333:9;55328:137;55352:11;55348:1;:15;55328:137;;;55385:11;:13;;;:11;:13;;;:::i;:::-;;;;;;55413:40;55423:12;14295:10;;14215:98;55413:40;55365:3;;;;:::i;:::-;;;;55328:137;;;-1:-1:-1;55524:14:0;;55480:59;;;14679:25:1;;;14735:2;14720:18;;14713:34;;;;55507:1:0;;14295:10;;55480:59;;14652:18:1;55480:59:0;;;;;;;;54590:957;;54546:1001;:::o;38318:155::-;38413:52;14295:10;38446:8;38456;38413:18;:52::i;57009:1654::-;57209:25;;:::i;:::-;57245:29;;;-1:-1:-1;;;;;57285:25:0;;:13;;;;:25;;;;57321:14;;;;:27;;;57359:14;;;:27;;;57397:33;;;:17;;;:33;57441:27;;;;;;;;;;;;;;;;;;;;;57458:10;;;;;;57441:27;;57458:10;;;;57441:27;;;;;;;;;-1:-1:-1;;;;57441:14:0;;;:27;57498:4;57479:16;;;:23;57513:22;57441:4;57513:16;:22::i;:::-;-1:-1:-1;14295:10:0;57546:46;;;;:32;:46;;;;;;;;:53;;-1:-1:-1;;57546:53:0;57595:4;57546:53;;;57610:19;:33;;;;;:48;;57647:11;;57546:46;57610:48;;57647:11;;57610:48;:::i;:::-;;;;;;;;57669:26;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;57669:26:0;57730:24;57743:11;57730:10;:24;:::i;:::-;57706:48;;49164:5;49060:4;57819:31;49117:4;49164:5;57819:31;:::i;:::-;:52;;;;:::i;:::-;57794:21;;:78;;;;:::i;:::-;57793:92;;;;:::i;:::-;57765:24;;;;:120;;;14295:10;57896:29;;;;:15;:29;;;;;;:57;;:29;;;:57;;57765:120;;57896:57;:::i;:::-;;;;-1:-1:-1;;57990:21:0;;49164:5;;57990:42;;49060:4;;57990:42;:::i;:::-;57989:56;;;;:::i;:::-;57964:22;;;:81;58072:24;;;;58056:12;:40;;:12;;:40;;58072:24;;58056:40;:::i;:::-;;;;-1:-1:-1;;58139:12:0;;58107:97;;-1:-1:-1;;;;;58139:12:0;14295:10;58153:12;14215:98;58107:97;58243:12;;58268:22;;;;58215:76;;-1:-1:-1;;;;;58243:12:0;;58257:9;;58215:27;:76::i;:::-;58330:12;;58344:16;;58412:24;;;;58387:22;;;;58302:136;;-1:-1:-1;;;;;58330:12:0;;;;58344:16;;58387:49;;;:::i;58302:136::-;58454:9;58449:137;58473:11;58469:1;:15;58449:137;;;58506:11;:13;;;:11;:13;;;:::i;:::-;;;;;;58534:40;58544:12;14295:10;;14215:98;58534:40;58486:3;;;;:::i;:::-;;;;58449:137;;;-1:-1:-1;58601:54:0;;;14679:25:1;;;14735:2;14720:18;;14713:34;;;-1:-1:-1;;;;;58601:54:0;;;14295:10;;58601:54;;14652:18:1;58601:54:0;;;;;;;57198:1465;;57009:1654;;;;;;;:::o;52721:325::-;15564:6;;-1:-1:-1;;;;;15564:6:0;14295:10;15711:23;15703:68;;;;-1:-1:-1;;;15703:68:0;;;;;;;:::i;:::-;52855:23:::1;;52826:25;:52;;:104;;;;;52910:20;;52882:25;:48;52826:104;52818:160;;;::::0;-1:-1:-1;;;52818:160:0;;17975:2:1;52818:160:0::1;::::0;::::1;17957:21:1::0;18014:2;17994:18;;;17987:30;18053:34;18033:18;;;18026:62;-1:-1:-1;;;18104:18:1;;;18097:41;18155:19;;52818:160:0::1;17773:407:1::0;52818:160:0::1;52989:21;:49:::0;52721:325::o;53804:356::-;15564:6;;-1:-1:-1;;;;;15564:6:0;14295:10;15711:23;15703:68;;;;-1:-1:-1;;;15703:68:0;;;;;;;:::i;:::-;48956:3:::1;53889:11;;:37;;53881:98;;;::::0;-1:-1:-1;;;53881:98:0;;18387:2:1;53881:98:0::1;::::0;::::1;18369:21:1::0;18426:2;18406:18;;;18399:30;18465:34;18445:18;;;18438:62;-1:-1:-1;;;18516:18:1;;;18509:46;18572:19;;53881:98:0::1;18185:412:1::0;53881:98:0::1;54007:12;::::0;;53990:14:::1;54030:16:::0;;;54085:12:::1;::::0;54057:54:::1;::::0;-1:-1:-1;;;;;54085:12:0::1;54099:3:::0;54007:12;54057:27:::1;:54::i;:::-;54140:3;-1:-1:-1::0;;;;;54127:25:0::1;;54145:6;54127:25;;;;2338::1::0;;2326:2;2311:18;;2192:177;54127:25:0::1;;;;;;;;53870:290;53804:356:::0;:::o;49234:25::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;39441:328::-;39616:41;14295:10;39649:7;39616:18;:41::i;:::-;39608:103;;;;-1:-1:-1;;;39608:103:0;;;;;;;:::i;:::-;39722:39;39736:4;39742:2;39746:7;39755:5;39722:13;:39::i;:::-;39441:328;;;;:::o;51662:113::-;15564:6;;-1:-1:-1;;;;;15564:6:0;14295:10;15711:23;15703:68;;;;-1:-1:-1;;;15703:68:0;;;;;;;:::i;:::-;51738:10:::1;:29:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;51738:29:0;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;49576:37::-:0;;;;;;;:::i;54168:370::-;41344:4;41368:16;;;:7;:16;;;;;;54242:13;;-1:-1:-1;;;;;41368:16:0;54267:77;;;;-1:-1:-1;;;54267:77:0;;18804:2:1;54267:77:0;;;18786:21:1;18843:2;18823:18;;;18816:30;18882:34;18862:18;;;18855:62;-1:-1:-1;;;18933:18:1;;;18926:45;18988:19;;54267:77:0;18602:411:1;54267:77:0;54355:28;54386:10;:8;:10::i;:::-;54355:41;;54445:1;54420:14;54414:28;:32;:116;;;;;;;;;;;;;;;;;54473:14;54489:19;:8;:17;:19::i;:::-;54510:13;54456:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54414:116;54407:123;54168:370;-1:-1:-1;;;54168:370:0:o;51953:142::-;15564:6;;-1:-1:-1;;;;;15564:6:0;14295:10;15711:23;15703:68;;;;-1:-1:-1;;;15703:68:0;;;;;;;:::i;:::-;52044:18:::1;:43:::0;51953:142::o;51783:162::-;15564:6;;-1:-1:-1;;;;;15564:6:0;14295:10;15711:23;15703:68;;;;-1:-1:-1;;;15703:68:0;;;;;;;:::i;:::-;51884:23:::1;:53:::0;51783:162::o;52585:128::-;15564:6;;-1:-1:-1;;;;;15564:6:0;14295:10;15711:23;15703:68;;;;-1:-1:-1;;;15703:68:0;;;;;;;:::i;:::-;52672:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;53517:279::-:0;15564:6;;-1:-1:-1;;;;;15564:6:0;14295:10;15711:23;15703:68;;;;-1:-1:-1;;;15703:68:0;;;;;;;:::i;:::-;53645:20:::1;;53618:23;:47;;53610:122;;;::::0;-1:-1:-1;;;53610:122:0;;20878:2:1;53610:122:0::1;::::0;::::1;20860:21:1::0;20917:2;20897:18;;;20890:30;20956:34;20936:18;;;20929:62;21027:32;21007:18;;;21000:60;21077:19;;53610:122:0::1;20676:426:1::0;53610:122:0::1;53743:19;:45:::0;53517:279::o;16400:201::-;15564:6;;-1:-1:-1;;;;;15564:6:0;14295:10;15711:23;15703:68;;;;-1:-1:-1;;;15703:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16489:22:0;::::1;16481:73;;;::::0;-1:-1:-1;;;16481:73:0;;21309:2:1;16481:73:0::1;::::0;::::1;21291:21:1::0;21348:2;21328:18;;;21321:30;21387:34;21367:18;;;21360:62;-1:-1:-1;;;21438:18:1;;;21431:36;21484:19;;16481:73:0::1;21107:402:1::0;16481:73:0::1;16565:28;16584:8;16565:18;:28::i;:::-;16400:201:::0;:::o;45425:174::-;45500:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;45500:29:0;-1:-1:-1;;;;;45500:29:0;;;;;;;;:24;;45554:23;45500:24;45554:14;:23::i;:::-;-1:-1:-1;;;;;45545:46:0;;;;;;;;;;;45425:174;;:::o;41573:348::-;41666:4;41368:16;;;:7;:16;;;;;;-1:-1:-1;;;;;41368:16:0;41683:73;;;;-1:-1:-1;;;41683:73:0;;21716:2:1;41683:73:0;;;21698:21:1;21755:2;21735:18;;;21728:30;21794:34;21774:18;;;21767:62;-1:-1:-1;;;21845:18:1;;;21838:42;21897:19;;41683:73:0;21514:408:1;41683:73:0;41767:13;41783:23;41798:7;41783:14;:23::i;:::-;41767:39;;41836:5;-1:-1:-1;;;;;41825:16:0;:7;-1:-1:-1;;;;;41825:16:0;;:51;;;;41869:7;-1:-1:-1;;;;;41845:31:0;:20;41857:7;41845:11;:20::i;:::-;-1:-1:-1;;;;;41845:31:0;;41825:51;:87;;;-1:-1:-1;;;;;;38665:25:0;;;38641:4;38665:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;41880:32;41817:96;41573:348;-1:-1:-1;;;;41573:348:0:o;44682:625::-;44841:4;-1:-1:-1;;;;;44814:31:0;:23;44829:7;44814:14;:23::i;:::-;-1:-1:-1;;;;;44814:31:0;;44806:81;;;;-1:-1:-1;;;44806:81:0;;22129:2:1;44806:81:0;;;22111:21:1;22168:2;22148:18;;;22141:30;22207:34;22187:18;;;22180:62;-1:-1:-1;;;22258:18:1;;;22251:35;22303:19;;44806:81:0;21927:401:1;44806:81:0;-1:-1:-1;;;;;44906:16:0;;44898:65;;;;-1:-1:-1;;;44898:65:0;;22535:2:1;44898:65:0;;;22517:21:1;22574:2;22554:18;;;22547:30;22613:34;22593:18;;;22586:62;-1:-1:-1;;;22664:18:1;;;22657:34;22708:19;;44898:65:0;22333:400:1;44898:65:0;45080:29;45097:1;45101:7;45080:8;:29::i;:::-;-1:-1:-1;;;;;45122:15:0;;;;;;:9;:15;;;;;:20;;45141:1;;45122:15;:20;;45141:1;;45122:20;:::i;:::-;;;;-1:-1:-1;;;;;;;45153:13:0;;;;;;:9;:13;;;;;:18;;45170:1;;45153:13;:18;;45170:1;;45153:18;:::i;:::-;;;;-1:-1:-1;;45182:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;45182:21:0;-1:-1:-1;;;;;45182:21:0;;;;;;;;;45221:27;;45182:16;;45221:27;;;;;;;37618:341;37548:411;;:::o;59886:2387::-;59963:4;48956:3;59983:11;;:36;59979:150;;;60062:19;;60044:15;:37;60036:81;;;;-1:-1:-1;;;60036:81:0;;22940:2:1;60036:81:0;;;22922:21:1;22979:2;22959:18;;;22952:30;23018:33;22998:18;;;22991:61;23069:18;;60036:81:0;22738:355:1;60036:81:0;60165:23;;60147:15;:41;60139:102;;;;-1:-1:-1;;;60139:102:0;;23300:2:1;60139:102:0;;;23282:21:1;23339:2;23319:18;;;23312:30;23378:34;23358:18;;;23351:62;-1:-1:-1;;;23429:18:1;;;23422:46;23485:19;;60139:102:0;23098:412:1;60139:102:0;60274:20;;60256:15;:38;60252:1915;;;60319:5;:17;;;60311:65;;;;-1:-1:-1;;;60311:65:0;;23717:2:1;60311:65:0;;;23699:21:1;23756:2;23736:18;;;23729:30;23795:34;23775:18;;;23768:62;-1:-1:-1;;;23846:18:1;;;23839:33;23889:19;;60311:65:0;23515:399:1;60311:65:0;49218:9;60399:5;:15;;;:34;;60391:91;;;;-1:-1:-1;;;60391:91:0;;24121:2:1;60391:91:0;;;24103:21:1;24160:2;24140:18;;;24133:30;24199:34;24179:18;;;24172:62;-1:-1:-1;;;24250:18:1;;;24243:42;24302:19;;60391:91:0;23919:408:1;60391:91:0;14295:10;60506:46;;;;:32;:46;;;;;;;;60505:47;60497:105;;;;-1:-1:-1;;;60497:105:0;;24534:2:1;60497:105:0;;;24516:21:1;24573:2;24553:18;;;24546:30;24612:34;24592:18;;;24585:62;-1:-1:-1;;;24663:18:1;;;24656:43;24716:19;;60497:105:0;24332:409:1;60497:105:0;60645:15;;;;60625:16;;:35;;60617:102;;;;-1:-1:-1;;;60617:102:0;;24948:2:1;60617:102:0;;;24930:21:1;24987:2;24967:18;;;24960:30;25026:34;25006:18;;;24999:62;-1:-1:-1;;;25077:18:1;;;25070:52;25139:19;;60617:102:0;24746:418:1;60617:102:0;60742:14;;;;-1:-1:-1;;;;;60742:30:0;14295:10;60742:30;;60734:95;;;;-1:-1:-1;;;60734:95:0;;;;;;;:::i;:::-;60852:14;;;;-1:-1:-1;;;;;60852:28:0;60844:86;;;;-1:-1:-1;;;60844:86:0;;;;;;;:::i;:::-;61008:14;;;;;61024:15;;;;;61041;;;;;61058:18;;;;60977:100;;-1:-1:-1;;14295:10:0;25470:15:1;;25466:24;;60977:100:0;;;25454:37:1;25525:15;;;;25521:24;;;25507:12;;;25500:46;25562:12;;;25555:28;;;;25599:12;;;25592:28;;;;25667:14;;25660:22;25655:3;25651:32;25636:13;;;25629:55;60977:100:0;;;;;;;;;25700:13:1;;;60977:100:0;;60967:111;;;;;;30473:66:1;12423:58:0;;;30461:79:1;30556:12;;;;30549:28;;;12423:58:0;;;;;;;;;;30593:12:1;;;;12423:58:0;;;12413:69;;;;;;;61162:21;61186:32;61202:5;:15;;;61186:7;:15;;:32;;;;:::i;:::-;61258:6;;61162:56;;-1:-1:-1;;;;;;61241:23:0;;;61258:6;;61241:23;61233:69;;;;-1:-1:-1;;;61233:69:0;;25926:2:1;61233:69:0;;;25908:21:1;25965:2;25945:18;;;25938:30;26004:34;25984:18;;;25977:62;-1:-1:-1;;;26055:18:1;;;26048:31;26096:19;;61233:69:0;25724:397:1;61233:69:0;61339:21;;61321:15;:39;:62;;;;;61365:5;:18;;;61364:19;61321:62;61317:434;;;61485:18;;61459:23;;61447:35;;48896:4;61447:35;:::i;:::-;:56;;;;:::i;:::-;61427:16;;61413:11;;:30;;61427:16;61413:30;:::i;:::-;:90;;61405:155;;;;-1:-1:-1;;;61405:155:0;;;;;;;:::i;:::-;61317:434;;;61655:23;;61643:35;;48896:4;61643:35;:::i;:::-;61623:16;;61609:11;;:30;;61623:16;61609:30;:::i;:::-;:69;;61601:134;;;;-1:-1:-1;;;61601:134:0;;;;;;;:::i;:::-;60296:1466;;;60252:1915;;;61792:5;:17;;;61791:18;61783:62;;;;-1:-1:-1;;;61783:62:0;;26328:2:1;61783:62:0;;;26310:21:1;26367:2;26347:18;;;26340:30;26406:33;26386:18;;;26379:61;26457:18;;61783:62:0;26126:355:1;61783:62:0;61914:23;;61902:35;;48896:4;61902:35;:::i;:::-;61882:16;;61868:11;;:30;;61882:16;61868:30;:::i;:::-;:69;;61860:134;;;;-1:-1:-1;;;61860:134:0;;;;;;;:::i;:::-;14295:10;62053:33;;;;:19;:33;;;;;;62037:49;;49006:2;62037:49;:::i;:::-;62017:16;;:69;;62009:146;;;;;-1:-1:-1;;;62009:146:0;;26688:2:1;62009:146:0;;;26670:21:1;26707:18;;;26700:30;;;;26766:34;26746:18;;;26739:62;26837:34;26817:18;;;26810:62;26889:19;;62009:146:0;26486:428:1;62009:146:0;62185:16;;62177:66;;;;-1:-1:-1;;;62177:66:0;;27121:2:1;62177:66:0;;;27103:21:1;27160:2;27140:18;;;27133:30;27199:34;27179:18;;;27172:62;-1:-1:-1;;;27250:18:1;;;27243:31;27291:19;;62177:66:0;26919:397:1;62177:66:0;-1:-1:-1;62261:4:0;;59886:2387;-1:-1:-1;59886:2387:0:o;1148:498::-;1419:51;;;-1:-1:-1;;;;;27579:15:1;;;1419:51:0;;;27561:34:1;27631:15;;;27611:18;;;27604:43;27663:18;;;;27656:34;;;1419:51:0;;;;;;;;;;27496:18:1;;;;1419:51:0;;;;;;;-1:-1:-1;;;;;1419:51:0;-1:-1:-1;;;1419:51:0;;;1408:63;;-1:-1:-1;;;;1408:10:0;;;;:63;;1419:51;1408:63;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1372:99;;;;1504:7;:57;;;;-1:-1:-1;1516:11:0;;:16;;:44;;;1547:4;1536:24;;;;;;;;;;;;:::i;:::-;1482:156;;;;-1:-1:-1;;;1482:156:0;;28432:2:1;1482:156:0;;;28414:21:1;28471:2;28451:18;;;28444:30;28510:34;28490:18;;;28483:62;-1:-1:-1;;;28561:18:1;;;28554:47;28618:19;;1482:156:0;28230:413:1;1482:156:0;1282:364;;1148:498;;;;:::o;691:449::-;923:45;;;-1:-1:-1;;;;;28840:32:1;;;923:45:0;;;28822:51:1;28889:18;;;;28882:34;;;923:45:0;;;;;;;;;;28795:18:1;;;;923:45:0;;;;;;;-1:-1:-1;;;;;923:45:0;-1:-1:-1;;;923:45:0;;;912:57;;-1:-1:-1;;;;912:10:0;;;;:57;;923:45;912:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;876:93;;;;1002:7;:57;;;;-1:-1:-1;1014:11:0;;:16;;:44;;;1045:4;1034:24;;;;;;;;;;;;:::i;:::-;980:152;;;;-1:-1:-1;;;980:152:0;;29129:2:1;980:152:0;;;29111:21:1;29168:2;29148:18;;;29141:30;29207:34;29187:18;;;29180:62;-1:-1:-1;;;29258:18:1;;;29251:43;29311:19;;980:152:0;28927:409:1;42263:110:0;42339:26;42349:2;42353:7;42339:26;;;;;;;;;;;;:9;:26::i;16761:191::-;16854:6;;;-1:-1:-1;;;;;16871:17:0;;;-1:-1:-1;;;;;;16871:17:0;;;;;;;16904:40;;16854:6;;;16871:17;16854:6;;16904:40;;16835:16;;16904:40;16824:128;16761:191;:::o;45741:315::-;45896:8;-1:-1:-1;;;;;45887:17:0;:5;-1:-1:-1;;;;;45887:17:0;;;45879:55;;;;-1:-1:-1;;;45879:55:0;;29543:2:1;45879:55:0;;;29525:21:1;29582:2;29562:18;;;29555:30;29621:27;29601:18;;;29594:55;29666:18;;45879:55:0;29341:349:1;45879:55:0;-1:-1:-1;;;;;45945:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;45945:46:0;;;;;;;;;;46007:41;;540::1;;;46007::0;;513:18:1;46007:41:0;400:187:1;40651:315:0;40808:28;40818:4;40824:2;40828:7;40808:9;:28::i;:::-;40855:48;40878:4;40884:2;40888:7;40897:5;40855:22;:48::i;:::-;40847:111;;;;-1:-1:-1;;;40847:111:0;;;;;;;:::i;62281:108::-;62341:13;62374:7;62367:14;;;;;:::i;2243:723::-;2299:13;2520:10;2516:53;;-1:-1:-1;;2547:10:0;;;;;;;;;;;;-1:-1:-1;;;2547:10:0;;;;;2243:723::o;2516:53::-;2594:5;2579:12;2635:78;2642:9;;2635:78;;2668:8;;;;:::i;:::-;;-1:-1:-1;2691:10:0;;-1:-1:-1;2699:2:0;2691:10;;:::i;:::-;;;2635:78;;;2723:19;2755:6;2745:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2745:17:0;;2723:39;;2773:154;2780:10;;2773:154;;2807:11;2817:1;2807:11;;:::i;:::-;;-1:-1:-1;2876:10:0;2884:2;2876:5;:10;:::i;:::-;2863:24;;:2;:24;:::i;:::-;2850:39;;2833:6;2840;2833:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;2833:56:0;;;;;;;;-1:-1:-1;2904:11:0;2913:2;2904:11;;:::i;:::-;;;2773:154;;8419:231;8497:7;8518:17;8537:18;8559:27;8570:4;8576:9;8559:10;:27::i;:::-;8517:69;;;;8597:18;8609:5;8597:11;:18::i;:::-;-1:-1:-1;8633:9:0;8419:231;-1:-1:-1;;;8419:231:0:o;42600:321::-;42730:18;42736:2;42740:7;42730:5;:18::i;:::-;42781:54;42812:1;42816:2;42820:7;42829:5;42781:22;:54::i;:::-;42759:154;;;;-1:-1:-1;;;42759:154:0;;;;;;;:::i;46621:799::-;46776:4;-1:-1:-1;;;;;46797:13:0;;18487:19;:23;46793:620;;46833:72;;-1:-1:-1;;;46833:72:0;;-1:-1:-1;;;;;46833:36:0;;;;;:72;;14295:10;;46884:4;;46890:7;;46899:5;;46833:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46833:72:0;;;;;;;;-1:-1:-1;;46833:72:0;;;;;;;;;;;;:::i;:::-;;;46829:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47075:13:0;;47071:272;;47118:60;;-1:-1:-1;;;47118:60:0;;;;;;;:::i;47071:272::-;47293:6;47287:13;47278:6;47274:2;47270:15;47263:38;46829:529;-1:-1:-1;;;;;;46956:51:0;-1:-1:-1;;;46956:51:0;;-1:-1:-1;46949:58:0;;46793:620;-1:-1:-1;47397:4:0;46621:799;;;;;;:::o;6309:1308::-;6390:7;6399:12;6624:9;:16;6644:2;6624:22;6620:990;;;6920:4;6905:20;;6899:27;6970:4;6955:20;;6949:27;7028:4;7013:20;;7007:27;6663:9;6999:36;7071:25;7082:4;6999:36;6899:27;6949;7071:10;:25::i;:::-;7064:32;;;;;;;;;6620:990;7118:9;:16;7138:2;7118:22;7114:496;;;7393:4;7378:20;;7372:27;7444:4;7429:20;;7423:27;7486:23;7497:4;7372:27;7423;7486:10;:23::i;:::-;7479:30;;;;;;;;7114:496;-1:-1:-1;7558:1:0;;-1:-1:-1;7562:35:0;7114:496;6309:1308;;;;;:::o;4580:643::-;4658:20;4649:5;:29;;;;;;;;:::i;:::-;;4645:571;;;4580:643;:::o;4645:571::-;4756:29;4747:5;:38;;;;;;;;:::i;:::-;;4743:473;;;4802:34;;-1:-1:-1;;;4802:34:0;;31698:2:1;4802:34:0;;;31680:21:1;31737:2;31717:18;;;31710:30;31776:26;31756:18;;;31749:54;31820:18;;4802:34:0;31496:348:1;4743:473:0;4867:35;4858:5;:44;;;;;;;;:::i;:::-;;4854:362;;;4919:41;;-1:-1:-1;;;4919:41:0;;32051:2:1;4919:41:0;;;32033:21:1;32090:2;32070:18;;;32063:30;32129:33;32109:18;;;32102:61;32180:18;;4919:41:0;31849:355:1;4854:362:0;4991:30;4982:5;:39;;;;;;;;:::i;:::-;;4978:238;;;5038:44;;-1:-1:-1;;;5038:44:0;;32411:2:1;5038:44:0;;;32393:21:1;32450:2;32430:18;;;32423:30;32489:34;32469:18;;;32462:62;-1:-1:-1;;;32540:18:1;;;32533:32;32582:19;;5038:44:0;32209:398:1;4978:238:0;5113:30;5104:5;:39;;;;;;;;:::i;:::-;;5100:116;;;5160:44;;-1:-1:-1;;;5160:44:0;;32814:2:1;5160:44:0;;;32796:21:1;32853:2;32833:18;;;32826:30;32892:34;32872:18;;;32865:62;-1:-1:-1;;;32943:18:1;;;32936:32;32985:19;;5160:44:0;32612:398:1;43257:439:0;-1:-1:-1;;;;;43337:16:0;;43329:61;;;;-1:-1:-1;;;43329:61:0;;33217:2:1;43329:61:0;;;33199:21:1;;;33236:18;;;33229:30;33295:34;33275:18;;;33268:62;33347:18;;43329:61:0;33015:356:1;43329:61:0;41344:4;41368:16;;;:7;:16;;;;;;-1:-1:-1;;;;;41368:16:0;:30;43401:58;;;;-1:-1:-1;;;43401:58:0;;33578:2:1;43401:58:0;;;33560:21:1;33617:2;33597:18;;;33590:30;33656;33636:18;;;33629:58;33704:18;;43401:58:0;33376:352:1;43401:58:0;-1:-1:-1;;;;;43530:13:0;;;;;;:9;:13;;;;;:18;;43547:1;;43530:13;:18;;43547:1;;43530:18;:::i;:::-;;;;-1:-1:-1;;43559:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;43559:21:0;-1:-1:-1;;;;;43559:21:0;;;;;;;;43598:33;;43559:16;;;43598:33;;43559:16;;43598:33;52548:21:::1;52473:104:::0;:::o;9871:1632::-;10002:7;;10936:66;10923:79;;10919:163;;;-1:-1:-1;11035:1:0;;-1:-1:-1;11039:30:0;11019:51;;10919:163;11096:1;:7;;11101:2;11096:7;;:18;;;;;11107:1;:7;;11112:2;11107:7;;11096:18;11092:102;;;-1:-1:-1;11147:1:0;;-1:-1:-1;11151:30:0;11131:51;;11092:102;11308:24;;;11291:14;11308:24;;;;;;;;;33960:25:1;;;34033:4;34021:17;;34001:18;;;33994:45;;;;34055:18;;;34048:34;;;34098:18;;;34091:34;;;11308:24:0;;33932:19:1;;11308:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;11308:24:0;;-1:-1:-1;;11308:24:0;;;-1:-1:-1;;;;;;;11347:20:0;;11343:103;;11400:1;11404:29;11384:50;;;;;;;11343:103;11466:6;-1:-1:-1;11474:20:0;;-1:-1:-1;9871:1632:0;;;;;;;;:::o;8913:344::-;9027:7;;-1:-1:-1;;;;;9073:80:0;;9027:7;9180:25;9196:3;9181:18;;;9203:2;9180:25;:::i;:::-;9164:42;;9224:25;9235:4;9241:1;9244;9247;9224:10;:25::i;:::-;9217:32;;;;;;8913:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:131::-;-1:-1:-1;;;;;1811:31:1;;1801:42;;1791:70;;1857:1;1854;1847:12;1872:315;1940:6;1948;2001:2;1989:9;1980:7;1976:23;1972:32;1969:52;;;2017:1;2014;2007:12;1969:52;2056:9;2043:23;2075:31;2100:5;2075:31;:::i;:::-;2125:5;2177:2;2162:18;;;;2149:32;;-1:-1:-1;;;1872:315:1:o;2374:456::-;2451:6;2459;2467;2520:2;2508:9;2499:7;2495:23;2491:32;2488:52;;;2536:1;2533;2526:12;2488:52;2575:9;2562:23;2594:31;2619:5;2594:31;:::i;:::-;2644:5;-1:-1:-1;2701:2:1;2686:18;;2673:32;2714:33;2673:32;2714:33;:::i;:::-;2374:456;;2766:7;;-1:-1:-1;;;2820:2:1;2805:18;;;;2792:32;;2374:456::o;2835:247::-;2894:6;2947:2;2935:9;2926:7;2922:23;2918:32;2915:52;;;2963:1;2960;2953:12;2915:52;3002:9;2989:23;3021:31;3046:5;3021:31;:::i;3087:127::-;3148:10;3143:3;3139:20;3136:1;3129:31;3179:4;3176:1;3169:15;3203:4;3200:1;3193:15;3219:632;3284:5;3314:18;3355:2;3347:6;3344:14;3341:40;;;3361:18;;:::i;:::-;3436:2;3430:9;3404:2;3490:15;;-1:-1:-1;;3486:24:1;;;3512:2;3482:33;3478:42;3466:55;;;3536:18;;;3556:22;;;3533:46;3530:72;;;3582:18;;:::i;:::-;3622:10;3618:2;3611:22;3651:6;3642:15;;3681:6;3673;3666:22;3721:3;3712:6;3707:3;3703:16;3700:25;3697:45;;;3738:1;3735;3728:12;3697:45;3788:6;3783:3;3776:4;3768:6;3764:17;3751:44;3843:1;3836:4;3827:6;3819;3815:19;3811:30;3804:41;;;;3219:632;;;;;:::o;3856:451::-;3925:6;3978:2;3966:9;3957:7;3953:23;3949:32;3946:52;;;3994:1;3991;3984:12;3946:52;4034:9;4021:23;4067:18;4059:6;4056:30;4053:50;;;4099:1;4096;4089:12;4053:50;4122:22;;4175:4;4167:13;;4163:27;-1:-1:-1;4153:55:1;;4204:1;4201;4194:12;4153:55;4227:74;4293:7;4288:2;4275:16;4270:2;4266;4262:11;4227:74;:::i;4312:315::-;4380:6;4388;4441:2;4429:9;4420:7;4416:23;4412:32;4409:52;;;4457:1;4454;4447:12;4409:52;4493:9;4480:23;4470:33;;4553:2;4542:9;4538:18;4525:32;4566:31;4591:5;4566:31;:::i;:::-;4616:5;4606:15;;;4312:315;;;;;:::o;4632:367::-;4695:8;4705:6;4759:3;4752:4;4744:6;4740:17;4736:27;4726:55;;4777:1;4774;4767:12;4726:55;-1:-1:-1;4800:20:1;;4843:18;4832:30;;4829:50;;;4875:1;4872;4865:12;4829:50;4912:4;4904:6;4900:17;4888:29;;4972:3;4965:4;4955:6;4952:1;4948:14;4940:6;4936:27;4932:38;4929:47;4926:67;;;4989:1;4986;4979:12;5004:773;5126:6;5134;5142;5150;5203:2;5191:9;5182:7;5178:23;5174:32;5171:52;;;5219:1;5216;5209:12;5171:52;5259:9;5246:23;5288:18;5329:2;5321:6;5318:14;5315:34;;;5345:1;5342;5335:12;5315:34;5384:70;5446:7;5437:6;5426:9;5422:22;5384:70;:::i;:::-;5473:8;;-1:-1:-1;5358:96:1;-1:-1:-1;5561:2:1;5546:18;;5533:32;;-1:-1:-1;5577:16:1;;;5574:36;;;5606:1;5603;5596:12;5574:36;;5645:72;5709:7;5698:8;5687:9;5683:24;5645:72;:::i;:::-;5004:773;;;;-1:-1:-1;5736:8:1;-1:-1:-1;;;;5004:773:1:o;5782:118::-;5868:5;5861:13;5854:21;5847:5;5844:32;5834:60;;5890:1;5887;5880:12;5905:382;5970:6;5978;6031:2;6019:9;6010:7;6006:23;6002:32;5999:52;;;6047:1;6044;6037:12;5999:52;6086:9;6073:23;6105:31;6130:5;6105:31;:::i;:::-;6155:5;-1:-1:-1;6212:2:1;6197:18;;6184:32;6225:30;6184:32;6225:30;:::i;6292:1068::-;6404:6;6412;6420;6428;6436;6444;6452;6505:3;6493:9;6484:7;6480:23;6476:33;6473:53;;;6522:1;6519;6512:12;6473:53;6558:9;6545:23;6535:33;;6618:2;6607:9;6603:18;6590:32;6631:31;6656:5;6631:31;:::i;:::-;6681:5;-1:-1:-1;6733:2:1;6718:18;;6705:32;;-1:-1:-1;6784:2:1;6769:18;;6756:32;;-1:-1:-1;6840:3:1;6825:19;;6812:33;6854:30;6812:33;6854:30;:::i;:::-;6903:7;-1:-1:-1;6961:3:1;6946:19;;6933:33;6985:18;7015:14;;;7012:34;;;7042:1;7039;7032:12;7012:34;7080:6;7069:9;7065:22;7055:32;;7125:7;7118:4;7114:2;7110:13;7106:27;7096:55;;7147:1;7144;7137:12;7096:55;7187:2;7174:16;7213:2;7205:6;7202:14;7199:34;;;7229:1;7226;7219:12;7199:34;7274:7;7269:2;7260:6;7256:2;7252:15;7248:24;7245:37;7242:57;;;7295:1;7292;7285:12;7242:57;7326:2;7322;7318:11;7308:21;;7348:6;7338:16;;;;;6292:1068;;;;;;;;;;:::o;7848:221::-;7890:5;7943:3;7936:4;7928:6;7924:17;7920:27;7910:55;;7961:1;7958;7951:12;7910:55;7983:80;8059:3;8050:6;8037:20;8030:4;8022:6;8018:17;7983:80;:::i;8074:665::-;8169:6;8177;8185;8193;8246:3;8234:9;8225:7;8221:23;8217:33;8214:53;;;8263:1;8260;8253:12;8214:53;8302:9;8289:23;8321:31;8346:5;8321:31;:::i;:::-;8371:5;-1:-1:-1;8428:2:1;8413:18;;8400:32;8441:33;8400:32;8441:33;:::i;:::-;8493:7;-1:-1:-1;8547:2:1;8532:18;;8519:32;;-1:-1:-1;8602:2:1;8587:18;;8574:32;8629:18;8618:30;;8615:50;;;8661:1;8658;8651:12;8615:50;8684:49;8725:7;8716:6;8705:9;8701:22;8684:49;:::i;:::-;8674:59;;;8074:665;;;;;;;:::o;8744:320::-;8812:6;8865:2;8853:9;8844:7;8840:23;8836:32;8833:52;;;8881:1;8878;8871:12;8833:52;8921:9;8908:23;8954:18;8946:6;8943:30;8940:50;;;8986:1;8983;8976:12;8940:50;9009:49;9050:7;9041:6;9030:9;9026:22;9009:49;:::i;9069:388::-;9137:6;9145;9198:2;9186:9;9177:7;9173:23;9169:32;9166:52;;;9214:1;9211;9204:12;9166:52;9253:9;9240:23;9272:31;9297:5;9272:31;:::i;:::-;9322:5;-1:-1:-1;9379:2:1;9364:18;;9351:32;9392:33;9351:32;9392:33;:::i;9462:380::-;9541:1;9537:12;;;;9584;;;9605:61;;9659:4;9651:6;9647:17;9637:27;;9605:61;9712:2;9704:6;9701:14;9681:18;9678:38;9675:161;;;9758:10;9753:3;9749:20;9746:1;9739:31;9793:4;9790:1;9783:15;9821:4;9818:1;9811:15;9675:161;;9462:380;;;:::o;11087:413::-;11289:2;11271:21;;;11328:2;11308:18;;;11301:30;11367:34;11362:2;11347:18;;11340:62;-1:-1:-1;;;11433:2:1;11418:18;;11411:47;11490:3;11475:19;;11087:413::o;11505:356::-;11707:2;11689:21;;;11726:18;;;11719:30;11785:34;11780:2;11765:18;;11758:62;11852:2;11837:18;;11505:356::o;12705:416::-;12907:2;12889:21;;;12946:2;12926:18;;;12919:30;12985:34;12980:2;12965:18;;12958:62;-1:-1:-1;;;13051:2:1;13036:18;;13029:50;13111:3;13096:19;;12705:416::o;13126:409::-;13328:2;13310:21;;;13367:2;13347:18;;;13340:30;13406:34;13401:2;13386:18;;13379:62;-1:-1:-1;;;13472:2:1;13457:18;;13450:43;13525:3;13510:19;;13126:409::o;13540:127::-;13601:10;13596:3;13592:20;13589:1;13582:31;13632:4;13629:1;13622:15;13656:4;13653:1;13646:15;13672:128;13712:3;13743:1;13739:6;13736:1;13733:13;13730:39;;;13749:18;;:::i;:::-;-1:-1:-1;13785:9:1;;13672:128::o;13805:168::-;13845:7;13911:1;13907;13903:6;13899:14;13896:1;13893:21;13888:1;13881:9;13874:17;13870:45;13867:71;;;13918:18;;:::i;:::-;-1:-1:-1;13958:9:1;;13805:168::o;13978:125::-;14018:4;14046:1;14043;14040:8;14037:34;;;14051:18;;:::i;:::-;-1:-1:-1;14088:9:1;;13978:125::o;14108:127::-;14169:10;14164:3;14160:20;14157:1;14150:31;14200:4;14197:1;14190:15;14224:4;14221:1;14214:15;14240:120;14280:1;14306;14296:35;;14311:18;;:::i;:::-;-1:-1:-1;14345:9:1;;14240:120::o;14365:135::-;14404:3;-1:-1:-1;;14425:17:1;;14422:43;;;14445:18;;:::i;:::-;-1:-1:-1;14492:1:1;14481:13;;14365:135::o;16404:127::-;16465:10;16460:3;16456:20;16453:1;16446:31;16496:4;16493:1;16486:15;16520:4;16517:1;16510:15;16941:416;17143:2;17125:21;;;17182:2;17162:18;;;17155:30;17221:34;17216:2;17201:18;;17194:62;-1:-1:-1;;;17287:2:1;17272:18;;17265:50;17347:3;17332:19;;16941:416::o;19144:1527::-;19368:3;19406:6;19400:13;19432:4;19445:51;19489:6;19484:3;19479:2;19471:6;19467:15;19445:51;:::i;:::-;19559:13;;19518:16;;;;19581:55;19559:13;19518:16;19603:15;;;19581:55;:::i;:::-;19725:13;;19658:20;;;19698:1;;19785;19807:18;;;;19860;;;;19887:93;;19965:4;19955:8;19951:19;19939:31;;19887:93;20028:2;20018:8;20015:16;19995:18;19992:40;19989:167;;;-1:-1:-1;;;20055:33:1;;20111:4;20108:1;20101:15;20141:4;20062:3;20129:17;19989:167;20172:18;20199:110;;;;20323:1;20318:328;;;;20165:481;;20199:110;-1:-1:-1;;20234:24:1;;20220:39;;20279:20;;;;-1:-1:-1;20199:110:1;;20318:328;19091:1;19084:14;;;19128:4;19115:18;;20413:1;20427:169;20441:8;20438:1;20435:15;20427:169;;;20523:14;;20508:13;;;20501:37;20566:16;;;;20458:10;;20427:169;;;20431:3;;20627:8;20620:5;20616:20;20609:27;;20165:481;-1:-1:-1;20662:3:1;;19144:1527;-1:-1:-1;;;;;;;;;;;19144:1527:1:o;27701:274::-;27830:3;27868:6;27862:13;27884:53;27930:6;27925:3;27918:4;27910:6;27906:17;27884:53;:::i;:::-;27953:16;;;;;27701:274;-1:-1:-1;;27701:274:1:o;27980:245::-;28047:6;28100:2;28088:9;28079:7;28075:23;28071:32;28068:52;;;28116:1;28113;28106:12;28068:52;28148:9;28142:16;28167:28;28189:5;28167:28;:::i;29695:414::-;29897:2;29879:21;;;29936:2;29916:18;;;29909:30;29975:34;29970:2;29955:18;;29948:62;-1:-1:-1;;;30041:2:1;30026:18;;30019:48;30099:3;30084:19;;29695:414::o;30114:112::-;30146:1;30172;30162:35;;30177:18;;:::i;:::-;-1:-1:-1;30211:9:1;;30114:112::o;30616:489::-;-1:-1:-1;;;;;30885:15:1;;;30867:34;;30937:15;;30932:2;30917:18;;30910:43;30984:2;30969:18;;30962:34;;;31032:3;31027:2;31012:18;;31005:31;;;30810:4;;31053:46;;31079:19;;31071:6;31053:46;:::i;:::-;31045:54;30616:489;-1:-1:-1;;;;;;30616:489:1:o;31110:249::-;31179:6;31232:2;31220:9;31211:7;31207:23;31203:32;31200:52;;;31248:1;31245;31238:12;31200:52;31280:9;31274:16;31299:30;31323:5;31299:30;:::i;31364:127::-;31425:10;31420:3;31416:20;31413:1;31406:31;31456:4;31453:1;31446:15;31480:4;31477:1;31470:15

Swarm Source

ipfs://6effc0be25204d1d20a8a8122e8718dff0d08480d322bcb49d82e1b768f2aefa
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.