ETH Price: $3,486.76 (+0.73%)
Gas: 4 Gwei

Token

LOLNFT (LOL)
 

Overview

Max Total Supply

18 LOL

Holders

15

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
3 LOL
0xd898ee3d8476c90aec8fef49a4038f06a078f126
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:
NFTmint

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-10-11
*/

/**
 Contract and DApp is created by: https://wsdapps.com
 TG: https://t.me/wsdapps
*/

/// SPDX-License-Identifier: MIT

pragma solidity 0.8.14;

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

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

        (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);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

/*
 * @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;
    }
}

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

/**
 * @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);
    }
}

/**
 * @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);
}

/**
 * @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);
}

/**
 * @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;
    }
}

/**
 * @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;
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

/**
 * @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);
}

/**
 * @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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //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);
    }

    /**
     * @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);
    }

    /**
     * @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 of token that is not own");
        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);
    }

    /**
     * @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 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(to).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 This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Ownable, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);
        if (_msgSender() != owner()) {
            require(!paused(), "ERC721Pausable: token transfer while paused");
        }
    }
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IBEP20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeBEP20 {
    using Address for address;

    function safeTransfer(
        IBEP20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IBEP20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IBEP20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IBEP20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IBEP20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IBEP20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

/// @title IERC2981Royalties
/// @dev Interface for the ERC2981 - Token Royalty standard
interface IERC2981Royalties {
    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _value - the sale price of the NFT asset specified by _tokenId
    /// @return _receiver - address of who should be sent the royalty payment
    /// @return _royaltyAmount - the royalty payment amount for value sale price
    function royaltyInfo(uint256 _tokenId, uint256 _value)
        external
        view
        returns (address _receiver, uint256 _royaltyAmount);
}


/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
abstract contract ERC2981PerTokenRoyalties is ERC165, IERC2981Royalties {
    struct Royalty {
        address recipient;
        uint256 value;
    }

    mapping(uint256 => Royalty) internal _royalties;

    /// @inheritdoc	ERC165
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return
            interfaceId == type(IERC2981Royalties).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /// @dev Sets token royalties
    /// @param id the token id fir which we register the royalties
    /// @param recipient recipient of the royalties
    /// @param value percentage (using 2 decimals - 10000 = 100, 0 = 0)
    function _setTokenRoyalty(
        uint256 id,
        address recipient,
        uint256 value
    ) internal {
        require(value <= 10000, "ERC2981Royalties: Too high");

        _royalties[id] = Royalty(recipient, value);
    }

    /// @inheritdoc	IERC2981Royalties
    function royaltyInfo(uint256 tokenId, uint256 value)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        Royalty memory royalty = _royalties[tokenId];
        return (royalty.recipient, (value * royalty.value) / 10000);
    }
}

contract NFTmint is ERC721, ERC721Enumerable, Ownable, ERC2981PerTokenRoyalties, ERC721Pausable {
    using Counters for Counters.Counter;
    using SafeBEP20 for IBEP20;  
    using Strings for uint256;

    Counters.Counter private _tokenIdTracker;

    uint256 public MAX_BRONZE = 15;
    uint256 public MAX_SILVER = 15;
    uint256 public MAX_GOLD = 20;
    uint256 public MAX_NFT = 50;
    uint256 public MAX_BY_MINT = 15;
	uint256 public PRICE_BRONZE = 100000000000000000;
    uint256 public PRICE_SILVER = 200000000000000000;
    uint256 public PRICE_GOLD = 400000000000000000;
    uint256 public totalSilverMinted = 0;
    uint256 public totalBronzeMinted = 0;
    uint256 public totalGoldMinted = 0;
    uint256 private contractRoyalties = 500;
    string constant ContractCreator = "https://wsdapps.com";
    bool public revealed = false;
    string public notRevealedUri;
    string public baseExtension = ".json";
    enum NFTType { BRONZE, SILVER, GOLD }

    event NonFungibleTokenRecovery(address indexed token, uint256 tokenId);
    event TokenRecovery(address indexed token, uint256 amount);
	
    string public baseTokenURI;
	
    event CreateNFT(uint256 indexed id);
	
    constructor() ERC721("LOLNFT", "LOL") {
        pause(true);
    }
	
    modifier saleIsOpen {
        require(_totalSupply() <= MAX_NFT, "Sale end");
        if (_msgSender() != owner()) {
            require(!paused(), "Pausable: paused");
        }
        _;
    }
	
    function _totalSupply() internal view returns (uint) {
        return _tokenIdTracker.current();
    }
	
    function totalMint() public view returns (uint256) {
        return _totalSupply();
    }

    function mintNFT(NFTType _nftType, uint256 _count) public payable saleIsOpen {
        uint256 total = _totalSupply();
        uint256 maxLimitBronze;
        uint256 maxLimitSilver;
        uint256 maxLimitGold;
        uint256 nftPrice;
        uint256 startId;
        uint256 endId;

        // Determine the maximum limit and price based on the NFT type
        if (_nftType == NFTType.BRONZE) {
            maxLimitBronze = MAX_BRONZE;
            nftPrice = PRICE_BRONZE;
            startId = 1;
            endId = 15;
        } else if (_nftType == NFTType.SILVER) {
            maxLimitSilver = MAX_SILVER;
            nftPrice = PRICE_SILVER;
            startId = 16;
            endId = 30;
        } else if (_nftType == NFTType.GOLD) {
            maxLimitGold = MAX_GOLD;
            nftPrice = PRICE_GOLD;
            startId = 31;
            endId = 50;
        } else {
            revert("Invalid NFT type");
        }

        require(total <= MAX_NFT, "Sale end");
        require(_count <= MAX_BY_MINT, "Exceeds number");
        require(msg.value >= nftPrice * _count, "Value below price");

        // Check if the number of NFTs to mint exceeds the limit
        if (_nftType == NFTType.BRONZE) {
            require(totalBronzeMinted + _count <= maxLimitBronze, "Bronze max limit exceeded");
        } else if (_nftType == NFTType.SILVER) {
            require(totalSilverMinted + _count <= maxLimitSilver, "Silver max limit exceeded");
        } else if (_nftType == NFTType.GOLD) {
            require(totalGoldMinted + _count <= maxLimitGold, "Gold max limit exceeded");
        }

        for (uint256 i = 0; i < _count; i++) {
            uint256 newNftId;
            if (_nftType == NFTType.BRONZE) {
                newNftId = startId + totalBronzeMinted;
                totalBronzeMinted += 1;
            } else if (_nftType == NFTType.SILVER) {
                newNftId = startId + totalSilverMinted;
                totalSilverMinted += 1;
            } else if (_nftType == NFTType.GOLD) {
                newNftId = startId + totalGoldMinted;
                totalGoldMinted += 1;
            }
            _mintAnElement(msg.sender, newNftId);
        }
    }


    function _mintAnElement(address _to, uint256 _nftId) private {
        _tokenIdTracker.increment();
        _safeMint(_to, _nftId);
        _setTokenRoyalty(_nftId, owner(), contractRoyalties);
        emit CreateNFT(_nftId);
    }

    function mintWithId(address _to, uint256 _tokenId) external onlyOwner saleIsOpen{
        require(!_exists(_tokenId), "Token ID already in use");
         if (_tokenId >= 1 && _tokenId <= 15) {
            totalBronzeMinted += 1;
        } else if (_tokenId >= 16 && _tokenId <= 30) {
            totalSilverMinted += 1;
        } else if (_tokenId >= 31 && _tokenId <= 50) {
            totalGoldMinted += 1;
        }
        _mintAnElementWithId(_to, _tokenId);
    }

    function _mintAnElementWithId(address _to, uint256 _tokenId) private {
        require(!_exists(_tokenId), "Token ID already in use");
        _safeMint(_to, _tokenId);
        _setTokenRoyalty(_tokenId, owner(), contractRoyalties);
        emit CreateNFT(_tokenId);
    } 

    /**
     * @notice Allows the owner to recover non-fungible tokens sent to the contract by mistake
     * @param _token: NFT token address
     * @param _tokenId: tokenId
     * @dev Callable by owner
     */
    function recoverNonFungibleToken(address _token, uint256 _tokenId) external onlyOwner {
        IERC721(_token).transferFrom(address(this), address(msg.sender), _tokenId);

        emit NonFungibleTokenRecovery(_token, _tokenId);
    }

    /**
     * @notice Allows the owner to recover tokens sent to the contract by mistake
     * @param _token: token address
     * @dev Callable by owner
     */
    function recoverToken(address _token) external onlyOwner {
        uint256 balance = IBEP20(_token).balanceOf(address(this));
        require(balance != 0, "Operations: Cannot recover zero balance");

        IBEP20(_token).safeTransfer(address(msg.sender), balance);

        emit TokenRecovery(_token, balance);
    }
	
    function price(NFTType _nftType, uint256 _count) public view returns (uint256) {
        uint256 basePrice;
    
        // Determine the base price based on the NFT type
        if (_nftType == NFTType.BRONZE) {
            basePrice = PRICE_BRONZE;
        } else if (_nftType == NFTType.SILVER) {
            basePrice = PRICE_SILVER;
        } else if (_nftType == NFTType.GOLD) {
            basePrice = PRICE_GOLD;
        } else {
            revert("Invalid NFT type");
        }
    
        return basePrice * _count;
    }

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

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

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

    function setRoyalties(uint256  _royalties) public onlyOwner {
        contractRoyalties = _royalties;
    }

    function updatePrice(uint256 bronzePrice, uint256 silverPrice, uint256 goldPrice) external onlyOwner {
        PRICE_BRONZE = bronzePrice;
        PRICE_SILVER = silverPrice;
        PRICE_GOLD = goldPrice;
    }

    function walletOfOwner(address _owner) external view returns (uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);
        uint256[] memory tokensId = new uint256[](tokenCount);
        for (uint256 i = 0; i < tokenCount; i++) {
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }
	
    function pause(bool val) public onlyOwner {
        if (val == true) {
            _pause();
            return;
        }
        _unpause();
    }
	
	function withdraw(uint256 amount) public onlyOwner {
		uint256 balance = address(this).balance;
        require(balance >= amount);
        _widthdraw(owner(), amount);
    }

    function withdrawAll() public onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0);
        _widthdraw(owner(), address(this).balance);
    }

    function _widthdraw(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "Transfer failed.");
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override(ERC721, ERC721Enumerable, ERC721Pausable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable, ERC2981PerTokenRoyalties) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
		
	function updateMintLimit(uint256 newLimit) external onlyOwner {
	    require(MAX_NFT >= newLimit, "Incorrect value");
        MAX_BY_MINT = newLimit;
    }
	
	function updateMaxSupply(uint256 newSupply) external onlyOwner {
	    require(newSupply >= _totalSupply(), "Incorrect value");
        MAX_NFT = newSupply;
    }

    function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );
    
    if(revealed == false) {
        return notRevealedUri;
    }

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

    //only owner
    function reveal() public onlyOwner {
      revealed = true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"uint256","name":"id","type":"uint256"}],"name":"CreateNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"NonFungibleTokenRecovery","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenRecovery","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_BRONZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BY_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_GOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SILVER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_BRONZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_GOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_SILVER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum NFTmint.NFTType","name":"_nftType","type":"uint8"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"mintWithId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum NFTmint.NFTType","name":"_nftType","type":"uint8"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"recoverNonFungibleToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_royalties","type":"uint256"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBronzeMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalGoldMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSilverMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSupply","type":"uint256"}],"name":"updateMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"updateMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bronzePrice","type":"uint256"},{"internalType":"uint256","name":"silverPrice","type":"uint256"},{"internalType":"uint256","name":"goldPrice","type":"uint256"}],"name":"updatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600f600e81905580805560146010819055603260115560129190915567016345785d8a00006013556702c68af0bb140000905567058d15e1762800006015556000601681905560178190556018556101f4601955601a805460ff1916905560c06040526005608081905264173539b7b760d91b60a09081526200008691601c919062000326565b503480156200009457600080fd5b5060408051808201825260068152651313d313919560d21b6020808301918252835180850190945260038452621313d360ea1b908401528151919291620000de9160009162000326565b508051620000f490600190602084019062000326565b505050620001116200010b6200012d60201b60201c565b62000131565b600c805460ff1916905562000127600162000183565b62000408565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a546001600160a01b03163314620001e35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b801515600103620001fb57620001f862000205565b50565b620001f8620002a0565b600c5460ff16156200024d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401620001da565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620002833390565b6040516001600160a01b03909116815260200160405180910390a1565b600c5460ff16620002f45760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401620001da565b600c805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3362000283565b8280546200033490620003cc565b90600052602060002090601f016020900481019282620003585760008555620003a3565b82601f106200037357805160ff1916838001178555620003a3565b82800160010185558215620003a3579182015b82811115620003a357825182559160200191906001019062000386565b50620003b1929150620003b5565b5090565b5b80821115620003b15760008155600101620003b6565b600181811c90821680620003e157607f821691505b6020821081036200040257634e487b7160e01b600052602260045260246000fd5b50919050565b61370380620004186000396000f3fe60806040526004361061031a5760003560e01c8063715018a6116101ab578063b88d4fde116100f7578063d547cfb711610095578063f103b4331161006f578063f103b433146108ef578063f2c4ce1e1461090f578063f2fde38b1461092f578063fa2a31031461094f57600080fd5b8063d547cfb714610871578063e01d55c514610886578063e985e9c5146108a657600080fd5b8063c87b56dd116100d1578063c87b56dd146107fb578063cc6c10ba1461081b578063cd66439a1461083b578063ce28d79e1461085b57600080fd5b8063b88d4fde146107a6578063bb0fd147146107c6578063c6682862146107e657600080fd5b80639be65a6011610164578063a475b5dd1161013e578063a475b5dd1461074f578063aa3ff85814610764578063ac1730a11461077a578063ad18eb261461079057600080fd5b80639be65a60146106f9578063a14b541314610719578063a22cb4651461072f57600080fd5b8063715018a614610670578063853828b6146106855780638ad5de281461069a5780638da5cb5b146106b05780638ea1441c146106ce57806395d89b41146106e457600080fd5b80632ef03adc1161026a57806351830227116102235780635c975abb116101fd5780635c975abb146106025780636352211e1461061a5780636fdaddf11461063a57806370a082311461065057600080fd5b806351830227146105b357806355f804b3146105cd57806359a7715a146105ed57600080fd5b80632ef03adc146104fd5780632f745c591461051057806342842e0e14610530578063438b6300146105505780634e035e691461057d5780634f6ccce71461059357600080fd5b80630c83c032116102d757806323b872dd116102b157806323b872dd1461045e5780632a55205a1461047e5780632b80183f146104bd5780632e1a7d4d146104dd57600080fd5b80630c83c032146104055780630f4361291461042957806318160ddd1461044957600080fd5b806301ffc9a71461031f57806302329a291461035457806306fdde0314610376578063081812fc14610398578063081c8c44146103d0578063095ea7b3146103e5575b600080fd5b34801561032b57600080fd5b5061033f61033a366004612f2b565b610965565b60405190151581526020015b60405180910390f35b34801561036057600080fd5b5061037461036f366004612f56565b610976565b005b34801561038257600080fd5b5061038b6109c6565b60405161034b9190612fcb565b3480156103a457600080fd5b506103b86103b3366004612fde565b610a58565b6040516001600160a01b03909116815260200161034b565b3480156103dc57600080fd5b5061038b610ae0565b3480156103f157600080fd5b50610374610400366004613013565b610b6e565b34801561041157600080fd5b5061041b60135481565b60405190815260200161034b565b34801561043557600080fd5b5061037461044436600461303d565b610c83565b34801561045557600080fd5b5060085461041b565b34801561046a57600080fd5b50610374610479366004613069565b610cbb565b34801561048a57600080fd5b5061049e6104993660046130a5565b610cec565b604080516001600160a01b03909316835260208301919091520161034b565b3480156104c957600080fd5b506103746104d8366004612fde565b610d45565b3480156104e957600080fd5b506103746104f8366004612fde565b610d74565b61037461050b3660046130c7565b610dcb565b34801561051c57600080fd5b5061041b61052b366004613013565b611213565b34801561053c57600080fd5b5061037461054b366004613069565b6112a9565b34801561055c57600080fd5b5061057061056b3660046130e9565b6112c4565b60405161034b9190613104565b34801561058957600080fd5b5061041b60145481565b34801561059f57600080fd5b5061041b6105ae366004612fde565b611366565b3480156105bf57600080fd5b50601a5461033f9060ff1681565b3480156105d957600080fd5b506103746105e83660046131d4565b6113f9565b3480156105f957600080fd5b5061041b611436565b34801561060e57600080fd5b50600c5460ff1661033f565b34801561062657600080fd5b506103b8610635366004612fde565b611445565b34801561064657600080fd5b5061041b60115481565b34801561065c57600080fd5b5061041b61066b3660046130e9565b6114bc565b34801561067c57600080fd5b50610374611543565b34801561069157600080fd5b50610374611579565b3480156106a657600080fd5b5061041b60125481565b3480156106bc57600080fd5b50600a546001600160a01b03166103b8565b3480156106da57600080fd5b5061041b60185481565b3480156106f057600080fd5b5061038b6115c9565b34801561070557600080fd5b506103746107143660046130e9565b6115d8565b34801561072557600080fd5b5061041b60165481565b34801561073b57600080fd5b5061037461074a36600461321d565b61172a565b34801561075b57600080fd5b506103746117ee565b34801561077057600080fd5b5061041b600e5481565b34801561078657600080fd5b5061041b60105481565b34801561079c57600080fd5b5061041b60155481565b3480156107b257600080fd5b506103746107c1366004613254565b611827565b3480156107d257600080fd5b506103746107e1366004613013565b61185f565b3480156107f257600080fd5b5061038b61192a565b34801561080757600080fd5b5061038b610816366004612fde565b611937565b34801561082757600080fd5b5061041b6108363660046130c7565b611aa6565b34801561084757600080fd5b50610374610856366004613013565b611b1c565b34801561086757600080fd5b5061041b60175481565b34801561087d57600080fd5b5061038b611c8d565b34801561089257600080fd5b506103746108a1366004612fde565b611c9a565b3480156108b257600080fd5b5061033f6108c13660046132d0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108fb57600080fd5b5061037461090a366004612fde565b611d0d565b34801561091b57600080fd5b5061037461092a3660046131d4565b611d85565b34801561093b57600080fd5b5061037461094a3660046130e9565b611dc2565b34801561095b57600080fd5b5061041b600f5481565b600061097082611e5a565b92915050565b600a546001600160a01b031633146109a95760405162461bcd60e51b81526004016109a090613303565b60405180910390fd5b8015156001036109be576109bb611e7f565b50565b6109bb611ef4565b6060600080546109d590613338565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0190613338565b8015610a4e5780601f10610a2357610100808354040283529160200191610a4e565b820191906000526020600020905b815481529060010190602001808311610a3157829003601f168201915b5050505050905090565b6000610a6382611f6e565b610ac45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109a0565b506000908152600460205260409020546001600160a01b031690565b601b8054610aed90613338565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1990613338565b8015610b665780601f10610b3b57610100808354040283529160200191610b66565b820191906000526020600020905b815481529060010190602001808311610b4957829003601f168201915b505050505081565b6000610b7982611445565b9050806001600160a01b0316836001600160a01b031603610be65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109a0565b336001600160a01b0382161480610c025750610c0281336108c1565b610c745760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109a0565b610c7e8383611f8b565b505050565b600a546001600160a01b03163314610cad5760405162461bcd60e51b81526004016109a090613303565b601392909255601455601555565b610cc53382611ff9565b610ce15760405162461bcd60e51b81526004016109a090613372565b610c7e8383836120df565b6000828152600b60209081526040808320815180830190925280546001600160a01b0316808352600190910154928201839052839261271090610d2f90876133d9565b610d39919061340e565b92509250509250929050565b600a546001600160a01b03163314610d6f5760405162461bcd60e51b81526004016109a090613303565b601955565b600a546001600160a01b03163314610d9e5760405162461bcd60e51b81526004016109a090613303565b4781811015610dac57600080fd5b610dc7610dc1600a546001600160a01b031690565b8361228a565b5050565b601154610dd6612320565b1115610df45760405162461bcd60e51b81526004016109a090613422565b600a546001600160a01b03163314610e2957600c5460ff1615610e295760405162461bcd60e51b81526004016109a090613444565b6000610e33612320565b90506000808080808080896002811115610e4f57610e4f61346e565b03610e6a575050600e5460135490945090506001600f610f03565b6001896002811115610e7e57610e7e61346e565b03610e99575050600f5460145490935090506010601e610f03565b6002896002811115610ead57610ead61346e565b03610ec85750506010546015549092509050601f6032610f03565b60405162461bcd60e51b815260206004820152601060248201526f496e76616c6964204e4654207479706560801b60448201526064016109a0565b601154871115610f255760405162461bcd60e51b81526004016109a090613422565b601254881115610f685760405162461bcd60e51b815260206004820152600e60248201526d22bc31b2b2b23990373ab6b132b960911b60448201526064016109a0565b610f7288846133d9565b341015610fb55760405162461bcd60e51b815260206004820152601160248201527056616c75652062656c6f7720707269636560781b60448201526064016109a0565b6000896002811115610fc957610fc961346e565b03611030578588601754610fdd9190613484565b111561102b5760405162461bcd60e51b815260206004820152601960248201527f42726f6e7a65206d6178206c696d69742065786365656465640000000000000060448201526064016109a0565b61111c565b60018960028111156110445761104461346e565b036110a65784886016546110589190613484565b111561102b5760405162461bcd60e51b815260206004820152601960248201527f53696c766572206d6178206c696d69742065786365656465640000000000000060448201526064016109a0565b60028960028111156110ba576110ba61346e565b0361111c5783886018546110ce9190613484565b111561111c5760405162461bcd60e51b815260206004820152601760248201527f476f6c64206d6178206c696d697420657863656564656400000000000000000060448201526064016109a0565b60005b88811015611207576000808b600281111561113c5761113c61346e565b0361116e5760175461114e9085613484565b90506001601760008282546111639190613484565b909155506111ea9050565b60018b60028111156111825761118261346e565b036111a9576016546111949085613484565b90506001601660008282546111639190613484565b60028b60028111156111bd576111bd61346e565b036111ea576018546111cf9085613484565b90506001601860008282546111e49190613484565b90915550505b6111f4338261232b565b50806111ff8161349c565b91505061111f565b50505050505050505050565b600061121e836114bc565b82106112805760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109a0565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610c7e83838360405180602001604052806000815250611827565b606060006112d1836114bc565b905060008167ffffffffffffffff8111156112ee576112ee613148565b604051908082528060200260200182016040528015611317578160200160208202803683370190505b50905060005b8281101561135e5761132f8582611213565b828281518110611341576113416134b5565b6020908102919091010152806113568161349c565b91505061131d565b509392505050565b600061137160085490565b82106113d45760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109a0565b600882815481106113e7576113e76134b5565b90600052602060002001549050919050565b600a546001600160a01b031633146114235760405162461bcd60e51b81526004016109a090613303565b8051610dc790601d906020840190612e7c565b6000611440612320565b905090565b6000818152600260205260408120546001600160a01b0316806109705760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109a0565b60006001600160a01b0382166115275760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109a0565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331461156d5760405162461bcd60e51b81526004016109a090613303565b6115776000612390565b565b600a546001600160a01b031633146115a35760405162461bcd60e51b81526004016109a090613303565b47806115ae57600080fd5b6109bb6115c3600a546001600160a01b031690565b4761228a565b6060600180546109d590613338565b600a546001600160a01b031633146116025760405162461bcd60e51b81526004016109a090613303565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611649573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166d91906134cb565b9050806000036116cf5760405162461bcd60e51b815260206004820152602760248201527f4f7065726174696f6e733a2043616e6e6f74207265636f766572207a65726f2060448201526662616c616e636560c81b60648201526084016109a0565b6116e36001600160a01b03831633836123e2565b816001600160a01b03167f14f11966a996e0629572e51064726d2057a80fbd34efc066682c06a71dbb6e988260405161171e91815260200190565b60405180910390a25050565b336001600160a01b038316036117825760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109a0565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146118185760405162461bcd60e51b81526004016109a090613303565b601a805460ff19166001179055565b6118313383611ff9565b61184d5760405162461bcd60e51b81526004016109a090613372565b61185984848484612434565b50505050565b600a546001600160a01b031633146118895760405162461bcd60e51b81526004016109a090613303565b6040516323b872dd60e01b8152306004820152336024820152604481018290526001600160a01b038316906323b872dd90606401600060405180830381600087803b1580156118d757600080fd5b505af11580156118eb573d6000803e3d6000fd5b50505050816001600160a01b03167f861c3ea25dbda3af0bf5d258ba8582c0276c9446b1479e817be3f1b4a89acf918260405161171e91815260200190565b601c8054610aed90613338565b606061194282611f6e565b6119a65760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109a0565b601a5460ff161515600003611a4757601b80546119c290613338565b80601f01602080910402602001604051908101604052809291908181526020018280546119ee90613338565b8015611a3b5780601f10611a1057610100808354040283529160200191611a3b565b820191906000526020600020905b815481529060010190602001808311611a1e57829003601f168201915b50505050509050919050565b6000611a51612467565b90506000815111611a715760405180602001604052806000815250611a9f565b80611a7b84612476565b601c604051602001611a8f939291906134e4565b6040516020818303038152906040525b9392505050565b60008080846002811115611abc57611abc61346e565b03611aca5750601354611b0a565b6001846002811115611ade57611ade61346e565b03611aec5750601454611b0a565b6002846002811115611b0057611b0061346e565b03610ec857506015545b611b1483826133d9565b949350505050565b600a546001600160a01b03163314611b465760405162461bcd60e51b81526004016109a090613303565b601154611b51612320565b1115611b6f5760405162461bcd60e51b81526004016109a090613422565b600a546001600160a01b03163314611ba457600c5460ff1615611ba45760405162461bcd60e51b81526004016109a090613444565b611bad81611f6e565b15611bf45760405162461bcd60e51b8152602060048201526017602482015276546f6b656e20494420616c726561647920696e2075736560481b60448201526064016109a0565b60018110158015611c065750600f8111155b15611c2957600160176000828254611c1e9190613484565b90915550611c839050565b60108110158015611c3b5750601e8111155b15611c5357600160166000828254611c1e9190613484565b601f8110158015611c65575060328111155b15611c8357600160186000828254611c7d9190613484565b90915550505b610dc78282612577565b601d8054610aed90613338565b600a546001600160a01b03163314611cc45760405162461bcd60e51b81526004016109a090613303565b806011541015611d085760405162461bcd60e51b815260206004820152600f60248201526e496e636f72726563742076616c756560881b60448201526064016109a0565b601255565b600a546001600160a01b03163314611d375760405162461bcd60e51b81526004016109a090613303565b611d3f612320565b811015611d805760405162461bcd60e51b815260206004820152600f60248201526e496e636f72726563742076616c756560881b60448201526064016109a0565b601155565b600a546001600160a01b03163314611daf5760405162461bcd60e51b81526004016109a090613303565b8051610dc790601b906020840190612e7c565b600a546001600160a01b03163314611dec5760405162461bcd60e51b81526004016109a090613303565b6001600160a01b038116611e515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109a0565b6109bb81612390565b60006001600160e01b0319821663152a902d60e11b14806109705750610970826125c7565b600c5460ff1615611ea25760405162461bcd60e51b81526004016109a090613444565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ed73390565b6040516001600160a01b03909116815260200160405180910390a1565b600c5460ff16611f3d5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016109a0565b600c805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611ed7565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611fc082611445565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061200482611f6e565b6120655760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109a0565b600061207083611445565b9050806001600160a01b0316846001600160a01b031614806120ab5750836001600160a01b03166120a084610a58565b6001600160a01b0316145b80611b1457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611b14565b826001600160a01b03166120f282611445565b6001600160a01b03161461215a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109a0565b6001600160a01b0382166121bc5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109a0565b6121c78383836125ec565b6121d2600082611f8b565b6001600160a01b03831660009081526003602052604081208054600192906121fb9084906135a7565b90915550506001600160a01b0382166000908152600360205260408120805460019290612229908490613484565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146122d7576040519150601f19603f3d011682016040523d82523d6000602084013e6122dc565b606091505b5050905080610c7e5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016109a0565b6000611440600d5490565b612339600d80546001019055565b61234382826125f7565b61236181612359600a546001600160a01b031690565b601954612611565b60405181907ffc8f2896a026fe67cf7750939518a86f80d8740522b220a53c353e741f706fd590600090a25050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610c7e9084906126ab565b61243f8484846120df565b61244b8484848461277d565b6118595760405162461bcd60e51b81526004016109a0906135be565b6060601d80546109d590613338565b60608160000361249d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156124c757806124b18161349c565b91506124c09050600a8361340e565b91506124a1565b60008167ffffffffffffffff8111156124e2576124e2613148565b6040519080825280601f01601f19166020018201604052801561250c576020820181803683370190505b5090505b8415611b14576125216001836135a7565b915061252e600a86613610565b612539906030613484565b60f81b81838151811061254e5761254e6134b5565b60200101906001600160f81b031916908160001a905350612570600a8661340e565b9450612510565b61258081611f6e565b156123395760405162461bcd60e51b8152602060048201526017602482015276546f6b656e20494420616c726561647920696e2075736560481b60448201526064016109a0565b60006001600160e01b0319821663780e9d6360e01b148061097057506109708261287e565b610c7e8383836128ce565b610dc7828260405180602001604052806000815250612952565b6127108111156126635760405162461bcd60e51b815260206004820152601a60248201527f45524332393831526f79616c746965733a20546f6f206869676800000000000060448201526064016109a0565b6040805180820182526001600160a01b03938416815260208082019384526000958652600b90529320925183546001600160a01b031916921691909117825551600190910155565b6000612700826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166129859092919063ffffffff16565b805190915015610c7e578080602001905181019061271e9190613624565b610c7e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016109a0565b60006001600160a01b0384163b1561287357604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906127c1903390899088908890600401613641565b6020604051808303816000875af19250505080156127fc575060408051601f3d908101601f191682019092526127f99181019061367e565b60015b612859573d80801561282a576040519150601f19603f3d011682016040523d82523d6000602084013e61282f565b606091505b5080516000036128515760405162461bcd60e51b81526004016109a0906135be565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b14565b506001949350505050565b60006001600160e01b031982166380ac58cd60e01b14806128af57506001600160e01b03198216635b5e139f60e01b145b8061097057506301ffc9a760e01b6001600160e01b0319831614610970565b6128d9838383612994565b600a546001600160a01b03163314610c7e57600c5460ff1615610c7e5760405162461bcd60e51b815260206004820152602b60248201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760448201526a1a1a5b19481c185d5cd95960aa1b60648201526084016109a0565b61295c8383612a4c565b612969600084848461277d565b610c7e5760405162461bcd60e51b81526004016109a0906135be565b6060611b148484600085612b8b565b6001600160a01b0383166129ef576129ea81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612a12565b816001600160a01b0316836001600160a01b031614612a1257612a128382612cb3565b6001600160a01b038216612a2957610c7e81612d50565b826001600160a01b0316826001600160a01b031614610c7e57610c7e8282612dff565b6001600160a01b038216612aa25760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109a0565b612aab81611f6e565b15612af85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109a0565b612b04600083836125ec565b6001600160a01b0382166000908152600360205260408120805460019290612b2d908490613484565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606082471015612bec5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016109a0565b843b612c3a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109a0565b600080866001600160a01b03168587604051612c56919061369b565b60006040518083038185875af1925050503d8060008114612c93576040519150601f19603f3d011682016040523d82523d6000602084013e612c98565b606091505b5091509150612ca8828286612e43565b979650505050505050565b60006001612cc0846114bc565b612cca91906135a7565b600083815260076020526040902054909150808214612d1d576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612d62906001906135a7565b60008381526009602052604081205460088054939450909284908110612d8a57612d8a6134b5565b906000526020600020015490508060088381548110612dab57612dab6134b5565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612de357612de36136b7565b6001900381819060005260206000200160009055905550505050565b6000612e0a836114bc565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60608315612e52575081611a9f565b825115612e625782518084602001fd5b8160405162461bcd60e51b81526004016109a09190612fcb565b828054612e8890613338565b90600052602060002090601f016020900481019282612eaa5760008555612ef0565b82601f10612ec357805160ff1916838001178555612ef0565b82800160010185558215612ef0579182015b82811115612ef0578251825591602001919060010190612ed5565b50612efc929150612f00565b5090565b5b80821115612efc5760008155600101612f01565b6001600160e01b0319811681146109bb57600080fd5b600060208284031215612f3d57600080fd5b8135611a9f81612f15565b80151581146109bb57600080fd5b600060208284031215612f6857600080fd5b8135611a9f81612f48565b60005b83811015612f8e578181015183820152602001612f76565b838111156118595750506000910152565b60008151808452612fb7816020860160208601612f73565b601f01601f19169290920160200192915050565b602081526000611a9f6020830184612f9f565b600060208284031215612ff057600080fd5b5035919050565b80356001600160a01b038116811461300e57600080fd5b919050565b6000806040838503121561302657600080fd5b61302f83612ff7565b946020939093013593505050565b60008060006060848603121561305257600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561307e57600080fd5b61308784612ff7565b925061309560208501612ff7565b9150604084013590509250925092565b600080604083850312156130b857600080fd5b50508035926020909101359150565b600080604083850312156130da57600080fd5b82356003811061302f57600080fd5b6000602082840312156130fb57600080fd5b611a9f82612ff7565b6020808252825182820181905260009190848201906040850190845b8181101561313c57835183529284019291840191600101613120565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561317957613179613148565b604051601f8501601f19908116603f011681019082821181831017156131a1576131a1613148565b816040528093508581528686860111156131ba57600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156131e657600080fd5b813567ffffffffffffffff8111156131fd57600080fd5b8201601f8101841361320e57600080fd5b611b148482356020840161315e565b6000806040838503121561323057600080fd5b61323983612ff7565b9150602083013561324981612f48565b809150509250929050565b6000806000806080858703121561326a57600080fd5b61327385612ff7565b935061328160208601612ff7565b925060408501359150606085013567ffffffffffffffff8111156132a457600080fd5b8501601f810187136132b557600080fd5b6132c48782356020840161315e565b91505092959194509250565b600080604083850312156132e357600080fd5b6132ec83612ff7565b91506132fa60208401612ff7565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061334c57607f821691505b60208210810361336c57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156133f3576133f36133c3565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261341d5761341d6133f8565b500490565b60208082526008908201526714d85b1948195b9960c21b604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b634e487b7160e01b600052602160045260246000fd5b60008219821115613497576134976133c3565b500190565b6000600182016134ae576134ae6133c3565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156134dd57600080fd5b5051919050565b6000845160206134f78285838a01612f73565b85519184019161350a8184848a01612f73565b8554920191600090600181811c908083168061352757607f831692505b858310810361354457634e487b7160e01b85526022600452602485fd5b808015613558576001811461356957613596565b60ff19851688528388019550613596565b60008b81526020902060005b8581101561358e5781548a820152908401908801613575565b505083880195505b50939b9a5050505050505050505050565b6000828210156135b9576135b96133c3565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008261361f5761361f6133f8565b500690565b60006020828403121561363657600080fd5b8151611a9f81612f48565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061367490830184612f9f565b9695505050505050565b60006020828403121561369057600080fd5b8151611a9f81612f15565b600082516136ad818460208701612f73565b9190910192915050565b634e487b7160e01b600052603160045260246000fdfea264697066735822122085aae503aae0c03838e76a20dcf42abd218080a2e6d9b784b272b8375f8d121064736f6c634300080e0033

Deployed Bytecode

0x60806040526004361061031a5760003560e01c8063715018a6116101ab578063b88d4fde116100f7578063d547cfb711610095578063f103b4331161006f578063f103b433146108ef578063f2c4ce1e1461090f578063f2fde38b1461092f578063fa2a31031461094f57600080fd5b8063d547cfb714610871578063e01d55c514610886578063e985e9c5146108a657600080fd5b8063c87b56dd116100d1578063c87b56dd146107fb578063cc6c10ba1461081b578063cd66439a1461083b578063ce28d79e1461085b57600080fd5b8063b88d4fde146107a6578063bb0fd147146107c6578063c6682862146107e657600080fd5b80639be65a6011610164578063a475b5dd1161013e578063a475b5dd1461074f578063aa3ff85814610764578063ac1730a11461077a578063ad18eb261461079057600080fd5b80639be65a60146106f9578063a14b541314610719578063a22cb4651461072f57600080fd5b8063715018a614610670578063853828b6146106855780638ad5de281461069a5780638da5cb5b146106b05780638ea1441c146106ce57806395d89b41146106e457600080fd5b80632ef03adc1161026a57806351830227116102235780635c975abb116101fd5780635c975abb146106025780636352211e1461061a5780636fdaddf11461063a57806370a082311461065057600080fd5b806351830227146105b357806355f804b3146105cd57806359a7715a146105ed57600080fd5b80632ef03adc146104fd5780632f745c591461051057806342842e0e14610530578063438b6300146105505780634e035e691461057d5780634f6ccce71461059357600080fd5b80630c83c032116102d757806323b872dd116102b157806323b872dd1461045e5780632a55205a1461047e5780632b80183f146104bd5780632e1a7d4d146104dd57600080fd5b80630c83c032146104055780630f4361291461042957806318160ddd1461044957600080fd5b806301ffc9a71461031f57806302329a291461035457806306fdde0314610376578063081812fc14610398578063081c8c44146103d0578063095ea7b3146103e5575b600080fd5b34801561032b57600080fd5b5061033f61033a366004612f2b565b610965565b60405190151581526020015b60405180910390f35b34801561036057600080fd5b5061037461036f366004612f56565b610976565b005b34801561038257600080fd5b5061038b6109c6565b60405161034b9190612fcb565b3480156103a457600080fd5b506103b86103b3366004612fde565b610a58565b6040516001600160a01b03909116815260200161034b565b3480156103dc57600080fd5b5061038b610ae0565b3480156103f157600080fd5b50610374610400366004613013565b610b6e565b34801561041157600080fd5b5061041b60135481565b60405190815260200161034b565b34801561043557600080fd5b5061037461044436600461303d565b610c83565b34801561045557600080fd5b5060085461041b565b34801561046a57600080fd5b50610374610479366004613069565b610cbb565b34801561048a57600080fd5b5061049e6104993660046130a5565b610cec565b604080516001600160a01b03909316835260208301919091520161034b565b3480156104c957600080fd5b506103746104d8366004612fde565b610d45565b3480156104e957600080fd5b506103746104f8366004612fde565b610d74565b61037461050b3660046130c7565b610dcb565b34801561051c57600080fd5b5061041b61052b366004613013565b611213565b34801561053c57600080fd5b5061037461054b366004613069565b6112a9565b34801561055c57600080fd5b5061057061056b3660046130e9565b6112c4565b60405161034b9190613104565b34801561058957600080fd5b5061041b60145481565b34801561059f57600080fd5b5061041b6105ae366004612fde565b611366565b3480156105bf57600080fd5b50601a5461033f9060ff1681565b3480156105d957600080fd5b506103746105e83660046131d4565b6113f9565b3480156105f957600080fd5b5061041b611436565b34801561060e57600080fd5b50600c5460ff1661033f565b34801561062657600080fd5b506103b8610635366004612fde565b611445565b34801561064657600080fd5b5061041b60115481565b34801561065c57600080fd5b5061041b61066b3660046130e9565b6114bc565b34801561067c57600080fd5b50610374611543565b34801561069157600080fd5b50610374611579565b3480156106a657600080fd5b5061041b60125481565b3480156106bc57600080fd5b50600a546001600160a01b03166103b8565b3480156106da57600080fd5b5061041b60185481565b3480156106f057600080fd5b5061038b6115c9565b34801561070557600080fd5b506103746107143660046130e9565b6115d8565b34801561072557600080fd5b5061041b60165481565b34801561073b57600080fd5b5061037461074a36600461321d565b61172a565b34801561075b57600080fd5b506103746117ee565b34801561077057600080fd5b5061041b600e5481565b34801561078657600080fd5b5061041b60105481565b34801561079c57600080fd5b5061041b60155481565b3480156107b257600080fd5b506103746107c1366004613254565b611827565b3480156107d257600080fd5b506103746107e1366004613013565b61185f565b3480156107f257600080fd5b5061038b61192a565b34801561080757600080fd5b5061038b610816366004612fde565b611937565b34801561082757600080fd5b5061041b6108363660046130c7565b611aa6565b34801561084757600080fd5b50610374610856366004613013565b611b1c565b34801561086757600080fd5b5061041b60175481565b34801561087d57600080fd5b5061038b611c8d565b34801561089257600080fd5b506103746108a1366004612fde565b611c9a565b3480156108b257600080fd5b5061033f6108c13660046132d0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108fb57600080fd5b5061037461090a366004612fde565b611d0d565b34801561091b57600080fd5b5061037461092a3660046131d4565b611d85565b34801561093b57600080fd5b5061037461094a3660046130e9565b611dc2565b34801561095b57600080fd5b5061041b600f5481565b600061097082611e5a565b92915050565b600a546001600160a01b031633146109a95760405162461bcd60e51b81526004016109a090613303565b60405180910390fd5b8015156001036109be576109bb611e7f565b50565b6109bb611ef4565b6060600080546109d590613338565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0190613338565b8015610a4e5780601f10610a2357610100808354040283529160200191610a4e565b820191906000526020600020905b815481529060010190602001808311610a3157829003601f168201915b5050505050905090565b6000610a6382611f6e565b610ac45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109a0565b506000908152600460205260409020546001600160a01b031690565b601b8054610aed90613338565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1990613338565b8015610b665780601f10610b3b57610100808354040283529160200191610b66565b820191906000526020600020905b815481529060010190602001808311610b4957829003601f168201915b505050505081565b6000610b7982611445565b9050806001600160a01b0316836001600160a01b031603610be65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109a0565b336001600160a01b0382161480610c025750610c0281336108c1565b610c745760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109a0565b610c7e8383611f8b565b505050565b600a546001600160a01b03163314610cad5760405162461bcd60e51b81526004016109a090613303565b601392909255601455601555565b610cc53382611ff9565b610ce15760405162461bcd60e51b81526004016109a090613372565b610c7e8383836120df565b6000828152600b60209081526040808320815180830190925280546001600160a01b0316808352600190910154928201839052839261271090610d2f90876133d9565b610d39919061340e565b92509250509250929050565b600a546001600160a01b03163314610d6f5760405162461bcd60e51b81526004016109a090613303565b601955565b600a546001600160a01b03163314610d9e5760405162461bcd60e51b81526004016109a090613303565b4781811015610dac57600080fd5b610dc7610dc1600a546001600160a01b031690565b8361228a565b5050565b601154610dd6612320565b1115610df45760405162461bcd60e51b81526004016109a090613422565b600a546001600160a01b03163314610e2957600c5460ff1615610e295760405162461bcd60e51b81526004016109a090613444565b6000610e33612320565b90506000808080808080896002811115610e4f57610e4f61346e565b03610e6a575050600e5460135490945090506001600f610f03565b6001896002811115610e7e57610e7e61346e565b03610e99575050600f5460145490935090506010601e610f03565b6002896002811115610ead57610ead61346e565b03610ec85750506010546015549092509050601f6032610f03565b60405162461bcd60e51b815260206004820152601060248201526f496e76616c6964204e4654207479706560801b60448201526064016109a0565b601154871115610f255760405162461bcd60e51b81526004016109a090613422565b601254881115610f685760405162461bcd60e51b815260206004820152600e60248201526d22bc31b2b2b23990373ab6b132b960911b60448201526064016109a0565b610f7288846133d9565b341015610fb55760405162461bcd60e51b815260206004820152601160248201527056616c75652062656c6f7720707269636560781b60448201526064016109a0565b6000896002811115610fc957610fc961346e565b03611030578588601754610fdd9190613484565b111561102b5760405162461bcd60e51b815260206004820152601960248201527f42726f6e7a65206d6178206c696d69742065786365656465640000000000000060448201526064016109a0565b61111c565b60018960028111156110445761104461346e565b036110a65784886016546110589190613484565b111561102b5760405162461bcd60e51b815260206004820152601960248201527f53696c766572206d6178206c696d69742065786365656465640000000000000060448201526064016109a0565b60028960028111156110ba576110ba61346e565b0361111c5783886018546110ce9190613484565b111561111c5760405162461bcd60e51b815260206004820152601760248201527f476f6c64206d6178206c696d697420657863656564656400000000000000000060448201526064016109a0565b60005b88811015611207576000808b600281111561113c5761113c61346e565b0361116e5760175461114e9085613484565b90506001601760008282546111639190613484565b909155506111ea9050565b60018b60028111156111825761118261346e565b036111a9576016546111949085613484565b90506001601660008282546111639190613484565b60028b60028111156111bd576111bd61346e565b036111ea576018546111cf9085613484565b90506001601860008282546111e49190613484565b90915550505b6111f4338261232b565b50806111ff8161349c565b91505061111f565b50505050505050505050565b600061121e836114bc565b82106112805760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109a0565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610c7e83838360405180602001604052806000815250611827565b606060006112d1836114bc565b905060008167ffffffffffffffff8111156112ee576112ee613148565b604051908082528060200260200182016040528015611317578160200160208202803683370190505b50905060005b8281101561135e5761132f8582611213565b828281518110611341576113416134b5565b6020908102919091010152806113568161349c565b91505061131d565b509392505050565b600061137160085490565b82106113d45760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109a0565b600882815481106113e7576113e76134b5565b90600052602060002001549050919050565b600a546001600160a01b031633146114235760405162461bcd60e51b81526004016109a090613303565b8051610dc790601d906020840190612e7c565b6000611440612320565b905090565b6000818152600260205260408120546001600160a01b0316806109705760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109a0565b60006001600160a01b0382166115275760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109a0565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331461156d5760405162461bcd60e51b81526004016109a090613303565b6115776000612390565b565b600a546001600160a01b031633146115a35760405162461bcd60e51b81526004016109a090613303565b47806115ae57600080fd5b6109bb6115c3600a546001600160a01b031690565b4761228a565b6060600180546109d590613338565b600a546001600160a01b031633146116025760405162461bcd60e51b81526004016109a090613303565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611649573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166d91906134cb565b9050806000036116cf5760405162461bcd60e51b815260206004820152602760248201527f4f7065726174696f6e733a2043616e6e6f74207265636f766572207a65726f2060448201526662616c616e636560c81b60648201526084016109a0565b6116e36001600160a01b03831633836123e2565b816001600160a01b03167f14f11966a996e0629572e51064726d2057a80fbd34efc066682c06a71dbb6e988260405161171e91815260200190565b60405180910390a25050565b336001600160a01b038316036117825760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109a0565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146118185760405162461bcd60e51b81526004016109a090613303565b601a805460ff19166001179055565b6118313383611ff9565b61184d5760405162461bcd60e51b81526004016109a090613372565b61185984848484612434565b50505050565b600a546001600160a01b031633146118895760405162461bcd60e51b81526004016109a090613303565b6040516323b872dd60e01b8152306004820152336024820152604481018290526001600160a01b038316906323b872dd90606401600060405180830381600087803b1580156118d757600080fd5b505af11580156118eb573d6000803e3d6000fd5b50505050816001600160a01b03167f861c3ea25dbda3af0bf5d258ba8582c0276c9446b1479e817be3f1b4a89acf918260405161171e91815260200190565b601c8054610aed90613338565b606061194282611f6e565b6119a65760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109a0565b601a5460ff161515600003611a4757601b80546119c290613338565b80601f01602080910402602001604051908101604052809291908181526020018280546119ee90613338565b8015611a3b5780601f10611a1057610100808354040283529160200191611a3b565b820191906000526020600020905b815481529060010190602001808311611a1e57829003601f168201915b50505050509050919050565b6000611a51612467565b90506000815111611a715760405180602001604052806000815250611a9f565b80611a7b84612476565b601c604051602001611a8f939291906134e4565b6040516020818303038152906040525b9392505050565b60008080846002811115611abc57611abc61346e565b03611aca5750601354611b0a565b6001846002811115611ade57611ade61346e565b03611aec5750601454611b0a565b6002846002811115611b0057611b0061346e565b03610ec857506015545b611b1483826133d9565b949350505050565b600a546001600160a01b03163314611b465760405162461bcd60e51b81526004016109a090613303565b601154611b51612320565b1115611b6f5760405162461bcd60e51b81526004016109a090613422565b600a546001600160a01b03163314611ba457600c5460ff1615611ba45760405162461bcd60e51b81526004016109a090613444565b611bad81611f6e565b15611bf45760405162461bcd60e51b8152602060048201526017602482015276546f6b656e20494420616c726561647920696e2075736560481b60448201526064016109a0565b60018110158015611c065750600f8111155b15611c2957600160176000828254611c1e9190613484565b90915550611c839050565b60108110158015611c3b5750601e8111155b15611c5357600160166000828254611c1e9190613484565b601f8110158015611c65575060328111155b15611c8357600160186000828254611c7d9190613484565b90915550505b610dc78282612577565b601d8054610aed90613338565b600a546001600160a01b03163314611cc45760405162461bcd60e51b81526004016109a090613303565b806011541015611d085760405162461bcd60e51b815260206004820152600f60248201526e496e636f72726563742076616c756560881b60448201526064016109a0565b601255565b600a546001600160a01b03163314611d375760405162461bcd60e51b81526004016109a090613303565b611d3f612320565b811015611d805760405162461bcd60e51b815260206004820152600f60248201526e496e636f72726563742076616c756560881b60448201526064016109a0565b601155565b600a546001600160a01b03163314611daf5760405162461bcd60e51b81526004016109a090613303565b8051610dc790601b906020840190612e7c565b600a546001600160a01b03163314611dec5760405162461bcd60e51b81526004016109a090613303565b6001600160a01b038116611e515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109a0565b6109bb81612390565b60006001600160e01b0319821663152a902d60e11b14806109705750610970826125c7565b600c5460ff1615611ea25760405162461bcd60e51b81526004016109a090613444565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ed73390565b6040516001600160a01b03909116815260200160405180910390a1565b600c5460ff16611f3d5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016109a0565b600c805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611ed7565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611fc082611445565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061200482611f6e565b6120655760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109a0565b600061207083611445565b9050806001600160a01b0316846001600160a01b031614806120ab5750836001600160a01b03166120a084610a58565b6001600160a01b0316145b80611b1457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611b14565b826001600160a01b03166120f282611445565b6001600160a01b03161461215a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109a0565b6001600160a01b0382166121bc5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109a0565b6121c78383836125ec565b6121d2600082611f8b565b6001600160a01b03831660009081526003602052604081208054600192906121fb9084906135a7565b90915550506001600160a01b0382166000908152600360205260408120805460019290612229908490613484565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146122d7576040519150601f19603f3d011682016040523d82523d6000602084013e6122dc565b606091505b5050905080610c7e5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016109a0565b6000611440600d5490565b612339600d80546001019055565b61234382826125f7565b61236181612359600a546001600160a01b031690565b601954612611565b60405181907ffc8f2896a026fe67cf7750939518a86f80d8740522b220a53c353e741f706fd590600090a25050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610c7e9084906126ab565b61243f8484846120df565b61244b8484848461277d565b6118595760405162461bcd60e51b81526004016109a0906135be565b6060601d80546109d590613338565b60608160000361249d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156124c757806124b18161349c565b91506124c09050600a8361340e565b91506124a1565b60008167ffffffffffffffff8111156124e2576124e2613148565b6040519080825280601f01601f19166020018201604052801561250c576020820181803683370190505b5090505b8415611b14576125216001836135a7565b915061252e600a86613610565b612539906030613484565b60f81b81838151811061254e5761254e6134b5565b60200101906001600160f81b031916908160001a905350612570600a8661340e565b9450612510565b61258081611f6e565b156123395760405162461bcd60e51b8152602060048201526017602482015276546f6b656e20494420616c726561647920696e2075736560481b60448201526064016109a0565b60006001600160e01b0319821663780e9d6360e01b148061097057506109708261287e565b610c7e8383836128ce565b610dc7828260405180602001604052806000815250612952565b6127108111156126635760405162461bcd60e51b815260206004820152601a60248201527f45524332393831526f79616c746965733a20546f6f206869676800000000000060448201526064016109a0565b6040805180820182526001600160a01b03938416815260208082019384526000958652600b90529320925183546001600160a01b031916921691909117825551600190910155565b6000612700826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166129859092919063ffffffff16565b805190915015610c7e578080602001905181019061271e9190613624565b610c7e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016109a0565b60006001600160a01b0384163b1561287357604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906127c1903390899088908890600401613641565b6020604051808303816000875af19250505080156127fc575060408051601f3d908101601f191682019092526127f99181019061367e565b60015b612859573d80801561282a576040519150601f19603f3d011682016040523d82523d6000602084013e61282f565b606091505b5080516000036128515760405162461bcd60e51b81526004016109a0906135be565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b14565b506001949350505050565b60006001600160e01b031982166380ac58cd60e01b14806128af57506001600160e01b03198216635b5e139f60e01b145b8061097057506301ffc9a760e01b6001600160e01b0319831614610970565b6128d9838383612994565b600a546001600160a01b03163314610c7e57600c5460ff1615610c7e5760405162461bcd60e51b815260206004820152602b60248201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760448201526a1a1a5b19481c185d5cd95960aa1b60648201526084016109a0565b61295c8383612a4c565b612969600084848461277d565b610c7e5760405162461bcd60e51b81526004016109a0906135be565b6060611b148484600085612b8b565b6001600160a01b0383166129ef576129ea81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612a12565b816001600160a01b0316836001600160a01b031614612a1257612a128382612cb3565b6001600160a01b038216612a2957610c7e81612d50565b826001600160a01b0316826001600160a01b031614610c7e57610c7e8282612dff565b6001600160a01b038216612aa25760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109a0565b612aab81611f6e565b15612af85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109a0565b612b04600083836125ec565b6001600160a01b0382166000908152600360205260408120805460019290612b2d908490613484565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606082471015612bec5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016109a0565b843b612c3a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109a0565b600080866001600160a01b03168587604051612c56919061369b565b60006040518083038185875af1925050503d8060008114612c93576040519150601f19603f3d011682016040523d82523d6000602084013e612c98565b606091505b5091509150612ca8828286612e43565b979650505050505050565b60006001612cc0846114bc565b612cca91906135a7565b600083815260076020526040902054909150808214612d1d576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612d62906001906135a7565b60008381526009602052604081205460088054939450909284908110612d8a57612d8a6134b5565b906000526020600020015490508060088381548110612dab57612dab6134b5565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612de357612de36136b7565b6001900381819060005260206000200160009055905550505050565b6000612e0a836114bc565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60608315612e52575081611a9f565b825115612e625782518084602001fd5b8160405162461bcd60e51b81526004016109a09190612fcb565b828054612e8890613338565b90600052602060002090601f016020900481019282612eaa5760008555612ef0565b82601f10612ec357805160ff1916838001178555612ef0565b82800160010185558215612ef0579182015b82811115612ef0578251825591602001919060010190612ed5565b50612efc929150612f00565b5090565b5b80821115612efc5760008155600101612f01565b6001600160e01b0319811681146109bb57600080fd5b600060208284031215612f3d57600080fd5b8135611a9f81612f15565b80151581146109bb57600080fd5b600060208284031215612f6857600080fd5b8135611a9f81612f48565b60005b83811015612f8e578181015183820152602001612f76565b838111156118595750506000910152565b60008151808452612fb7816020860160208601612f73565b601f01601f19169290920160200192915050565b602081526000611a9f6020830184612f9f565b600060208284031215612ff057600080fd5b5035919050565b80356001600160a01b038116811461300e57600080fd5b919050565b6000806040838503121561302657600080fd5b61302f83612ff7565b946020939093013593505050565b60008060006060848603121561305257600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561307e57600080fd5b61308784612ff7565b925061309560208501612ff7565b9150604084013590509250925092565b600080604083850312156130b857600080fd5b50508035926020909101359150565b600080604083850312156130da57600080fd5b82356003811061302f57600080fd5b6000602082840312156130fb57600080fd5b611a9f82612ff7565b6020808252825182820181905260009190848201906040850190845b8181101561313c57835183529284019291840191600101613120565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561317957613179613148565b604051601f8501601f19908116603f011681019082821181831017156131a1576131a1613148565b816040528093508581528686860111156131ba57600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156131e657600080fd5b813567ffffffffffffffff8111156131fd57600080fd5b8201601f8101841361320e57600080fd5b611b148482356020840161315e565b6000806040838503121561323057600080fd5b61323983612ff7565b9150602083013561324981612f48565b809150509250929050565b6000806000806080858703121561326a57600080fd5b61327385612ff7565b935061328160208601612ff7565b925060408501359150606085013567ffffffffffffffff8111156132a457600080fd5b8501601f810187136132b557600080fd5b6132c48782356020840161315e565b91505092959194509250565b600080604083850312156132e357600080fd5b6132ec83612ff7565b91506132fa60208401612ff7565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061334c57607f821691505b60208210810361336c57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156133f3576133f36133c3565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261341d5761341d6133f8565b500490565b60208082526008908201526714d85b1948195b9960c21b604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b634e487b7160e01b600052602160045260246000fd5b60008219821115613497576134976133c3565b500190565b6000600182016134ae576134ae6133c3565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156134dd57600080fd5b5051919050565b6000845160206134f78285838a01612f73565b85519184019161350a8184848a01612f73565b8554920191600090600181811c908083168061352757607f831692505b858310810361354457634e487b7160e01b85526022600452602485fd5b808015613558576001811461356957613596565b60ff19851688528388019550613596565b60008b81526020902060005b8581101561358e5781548a820152908401908801613575565b505083880195505b50939b9a5050505050505050505050565b6000828210156135b9576135b96133c3565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008261361f5761361f6133f8565b500690565b60006020828403121561363657600080fd5b8151611a9f81612f48565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061367490830184612f9f565b9695505050505050565b60006020828403121561369057600080fd5b8151611a9f81612f15565b600082516136ad818460208701612f73565b9190910192915050565b634e487b7160e01b600052603160045260246000fdfea264697066735822122085aae503aae0c03838e76a20dcf42abd218080a2e6d9b784b272b8375f8d121064736f6c634300080e0033

Deployed Bytecode Sourcemap

54875:9712:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63444:205;;;;;;;;;;-1:-1:-1;63444:205:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;63444:205:0;;;;;;;;62472:154;;;;;;;;;;-1:-1:-1;62472:154:0;;;;;:::i;:::-;;:::i;:::-;;27221:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;28780:221::-;;;;;;;;;;-1:-1:-1;28780:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2061:32:1;;;2043:51;;2031:2;2016:18;28780:221:0;1897:203:1;55749:28:0;;;;;;;;;;;;;:::i;28303:411::-;;;;;;;;;;-1:-1:-1;28303:411:0;;;;;:::i;:::-;;:::i;55316:48::-;;;;;;;;;;;;;;;;;;;2688:25:1;;;2676:2;2661:18;55316:48:0;2542:177:1;61890:216:0;;;;;;;;;;-1:-1:-1;61890:216:0;;;;;:::i;:::-;;:::i;39857:113::-;;;;;;;;;;-1:-1:-1;39945:10:0;:17;39857:113;;29670:339;;;;;;;;;;-1:-1:-1;29670:339:0;;;;;:::i;:::-;;:::i;54568:300::-;;;;;;;;;;-1:-1:-1;54568:300:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3823:32:1;;;3805:51;;3887:2;3872:18;;3865:34;;;;3778:18;54568:300:0;3631:274:1;61773:109:0;;;;;;;;;;-1:-1:-1;61773:109:0;;;;;:::i;:::-;;:::i;62632:178::-;;;;;;;;;;-1:-1:-1;62632:178:0;;;;;:::i;:::-;;:::i;56598:2260::-;;;;;;:::i;:::-;;:::i;39525:256::-;;;;;;;;;;-1:-1:-1;39525:256:0;;;;;:::i;:::-;;:::i;30080:185::-;;;;;;;;;;-1:-1:-1;30080:185:0;;;;;:::i;:::-;;:::i;62114:349::-;;;;;;;;;;-1:-1:-1;62114:349:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;55371:48::-;;;;;;;;;;;;;;;;40047:233;;;;;;;;;;-1:-1:-1;40047:233:0;;;;;:::i;:::-;;:::i;55714:28::-;;;;;;;;;;-1:-1:-1;55714:28:0;;;;;;;;61530:101;;;;;;;;;;-1:-1:-1;61530:101:0;;;;;:::i;:::-;;:::i;56499:91::-;;;;;;;;;;;;;:::i;13201:86::-;;;;;;;;;;-1:-1:-1;13272:7:0;;;;13201:86;;26915:239;;;;;;;;;;-1:-1:-1;26915:239:0;;;;;:::i;:::-;;:::i;55247:27::-;;;;;;;;;;;;;;;;26645:208;;;;;;;;;;-1:-1:-1;26645:208:0;;;;;:::i;:::-;;:::i;11589:94::-;;;;;;;;;;;;;:::i;62818:182::-;;;;;;;;;;;;;:::i;55281:31::-;;;;;;;;;;;;;;;;10938:87;;;;;;;;;;-1:-1:-1;11011:6:0;;-1:-1:-1;;;;;11011:6:0;10938:87;;55565:34;;;;;;;;;;;;;;;;27390:104;;;;;;;;;;;;;:::i;60521:326::-;;;;;;;;;;-1:-1:-1;60521:326:0;;;;;:::i;:::-;;:::i;55479:36::-;;;;;;;;;;;;;;;;29073:295;;;;;;;;;;-1:-1:-1;29073:295:0;;;;;:::i;:::-;;:::i;64517:67::-;;;;;;;;;;;;;:::i;55138:30::-;;;;;;;;;;;;;;;;55212:28;;;;;;;;;;;;;;;;55426:46;;;;;;;;;;;;;;;;30336:328;;;;;;;;;;-1:-1:-1;30336:328:0;;;;;:::i;:::-;;:::i;60105:239::-;;;;;;;;;;-1:-1:-1;60105:239:0;;;;;:::i;:::-;;:::i;55784:37::-;;;;;;;;;;;;;:::i;63992:499::-;;;;;;;;;;-1:-1:-1;63992:499:0;;;;;:::i;:::-;;:::i;60856:548::-;;;;;;;;;;-1:-1:-1;60856:548:0;;;;;:::i;:::-;;:::i;59112:480::-;;;;;;;;;;-1:-1:-1;59112:480:0;;;;;:::i;:::-;;:::i;55522:36::-;;;;;;;;;;;;;;;;56018:26;;;;;;;;;;;;;:::i;63656:158::-;;;;;;;;;;-1:-1:-1;63656:158:0;;;;;:::i;:::-;;:::i;29439:164::-;;;;;;;;;;-1:-1:-1;29439:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;29560:25:0;;;29536:4;29560:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29439:164;63820;;;;;;;;;;-1:-1:-1;63820:164:0;;;;;:::i;:::-;;:::i;61639:126::-;;;;;;;;;;-1:-1:-1;61639:126:0;;;;;:::i;:::-;;:::i;11838:192::-;;;;;;;;;;-1:-1:-1;11838:192:0;;;;;:::i;:::-;;:::i;55175:30::-;;;;;;;;;;;;;;;;63444:205;63581:4;63605:36;63629:11;63605:23;:36::i;:::-;63598:43;63444:205;-1:-1:-1;;63444:205:0:o;62472:154::-;11011:6;;-1:-1:-1;;;;;11011:6:0;8570:10;11158:23;11150:68;;;;-1:-1:-1;;;11150:68:0;;;;;;;:::i;:::-;;;;;;;;;62529:11;::::1;;62536:4;62529:11:::0;62525:73:::1;;62557:8;:6;:8::i;:::-;62472:154:::0;:::o;62525:73::-:1;62608:10;:8;:10::i;27221:100::-:0;27275:13;27308:5;27301:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27221:100;:::o;28780:221::-;28856:7;28884:16;28892:7;28884;:16::i;:::-;28876:73;;;;-1:-1:-1;;;28876:73:0;;8509:2:1;28876:73:0;;;8491:21:1;8548:2;8528:18;;;8521:30;8587:34;8567:18;;;8560:62;-1:-1:-1;;;8638:18:1;;;8631:42;8690:19;;28876:73:0;8307:408:1;28876:73:0;-1:-1:-1;28969:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;28969:24:0;;28780:221::o;55749:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28303:411::-;28384:13;28400:23;28415:7;28400:14;:23::i;:::-;28384:39;;28448:5;-1:-1:-1;;;;;28442:11:0;:2;-1:-1:-1;;;;;28442:11:0;;28434:57;;;;-1:-1:-1;;;28434:57:0;;8922:2:1;28434:57:0;;;8904:21:1;8961:2;8941:18;;;8934:30;9000:34;8980:18;;;8973:62;-1:-1:-1;;;9051:18:1;;;9044:31;9092:19;;28434:57:0;8720:397:1;28434:57:0;8570:10;-1:-1:-1;;;;;28526:21:0;;;;:62;;-1:-1:-1;28551:37:0;28568:5;8570:10;29439:164;:::i;28551:37::-;28504:168;;;;-1:-1:-1;;;28504:168:0;;9324:2:1;28504:168:0;;;9306:21:1;9363:2;9343:18;;;9336:30;9402:34;9382:18;;;9375:62;9473:26;9453:18;;;9446:54;9517:19;;28504:168:0;9122:420:1;28504:168:0;28685:21;28694:2;28698:7;28685:8;:21::i;:::-;28373:341;28303:411;;:::o;61890:216::-;11011:6;;-1:-1:-1;;;;;11011:6:0;8570:10;11158:23;11150:68;;;;-1:-1:-1;;;11150:68:0;;;;;;;:::i;:::-;62002:12:::1;:26:::0;;;;62039:12:::1;:26:::0;62076:10:::1;:22:::0;61890:216::o;29670:339::-;29865:41;8570:10;29898:7;29865:18;:41::i;:::-;29857:103;;;;-1:-1:-1;;;29857:103:0;;;;;;;:::i;:::-;29973:28;29983:4;29989:2;29993:7;29973:9;:28::i;54568:300::-;54689:16;54771:19;;;:10;:19;;;;;;;;54746:44;;;;;;;;;;-1:-1:-1;;;;;54746:44:0;;;;;;;;;;;;;;;54689:16;;54854:5;;54829:21;;:5;:21;:::i;:::-;54828:31;;;;:::i;:::-;54801:59;;;;;54568:300;;;;;:::o;61773:109::-;11011:6;;-1:-1:-1;;;;;11011:6:0;8570:10;11158:23;11150:68;;;;-1:-1:-1;;;11150:68:0;;;;;;;:::i;:::-;61844:17:::1;:30:::0;61773:109::o;62632:178::-;11011:6;;-1:-1:-1;;;;;11011:6:0;8570:10;11158:23;11150:68;;;;-1:-1:-1;;;11150:68:0;;;;;;;:::i;:::-;62706:21:::1;62746:17:::0;;::::1;;62738:26;;;::::0;::::1;;62775:27;62786:7;11011:6:::0;;-1:-1:-1;;;;;11011:6:0;;10938:87;62786:7:::1;62795:6;62775:10;:27::i;:::-;62683:127;62632:178:::0;:::o;56598:2260::-;56233:7;;56215:14;:12;:14::i;:::-;:25;;56207:46;;;;-1:-1:-1;;;56207:46:0;;;;;;;:::i;:::-;11011:6;;-1:-1:-1;;;;;11011:6:0;8570:10;56268:23;56264:94;;13272:7;;;;56316:9;56308:38;;;;-1:-1:-1;;;56308:38:0;;;;;;;:::i;:::-;56686:13:::1;56702:14;:12;:14::i;:::-;56686:30:::0;-1:-1:-1;56727:22:0::1;::::0;;;;;;56979:8:::1;:26;;;;;;;;:::i;:::-;::::0;56975:590:::1;;-1:-1:-1::0;;57039:10:0::1;::::0;57075:12:::1;::::0;57039:10;;-1:-1:-1;57075:12:0;-1:-1:-1;57112:1:0::1;57136:2;56975:590;;;57172:14;57160:8;:26;;;;;;;;:::i;:::-;::::0;57156:409:::1;;-1:-1:-1::0;;57220:10:0::1;::::0;57256:12:::1;::::0;57220:10;;-1:-1:-1;57256:12:0;-1:-1:-1;57293:2:0::1;57318;57156:409;;;57354:12;57342:8;:24;;;;;;;;:::i;:::-;::::0;57338:227:::1;;-1:-1:-1::0;;57398:8:0::1;::::0;57432:10:::1;::::0;57398:8;;-1:-1:-1;57432:10:0;-1:-1:-1;57467:2:0::1;57492;57338:227;;;57527:26;::::0;-1:-1:-1;;;57527:26:0;;11542:2:1;57527:26:0::1;::::0;::::1;11524:21:1::0;11581:2;11561:18;;;11554:30;-1:-1:-1;;;11600:18:1;;;11593:46;11656:18;;57527:26:0::1;11340:340:1::0;57338:227:0::1;57594:7;;57585:5;:16;;57577:37;;;;-1:-1:-1::0;;;57577:37:0::1;;;;;;;:::i;:::-;57643:11;;57633:6;:21;;57625:48;;;::::0;-1:-1:-1;;;57625:48:0;;11887:2:1;57625:48:0::1;::::0;::::1;11869:21:1::0;11926:2;11906:18;;;11899:30;-1:-1:-1;;;11945:18:1;;;11938:44;11999:18;;57625:48:0::1;11685:338:1::0;57625:48:0::1;57705:17;57716:6:::0;57705:8;:17:::1;:::i;:::-;57692:9;:30;;57684:60;;;::::0;-1:-1:-1;;;57684:60:0;;12230:2:1;57684:60:0::1;::::0;::::1;12212:21:1::0;12269:2;12249:18;;;12242:30;-1:-1:-1;;;12288:18:1;;;12281:47;12345:18;;57684:60:0::1;12028:341:1::0;57684:60:0::1;57839:14;57827:8;:26;;;;;;;;:::i;:::-;::::0;57823:427:::1;;57908:14;57898:6;57878:17;;:26;;;;:::i;:::-;:44;;57870:82;;;::::0;-1:-1:-1;;;57870:82:0;;12709:2:1;57870:82:0::1;::::0;::::1;12691:21:1::0;12748:2;12728:18;;;12721:30;12787:27;12767:18;;;12760:55;12832:18;;57870:82:0::1;12507:349:1::0;57870:82:0::1;57823:427;;;57986:14;57974:8;:26;;;;;;;;:::i;:::-;::::0;57970:280:::1;;58055:14;58045:6;58025:17;;:26;;;;:::i;:::-;:44;;58017:82;;;::::0;-1:-1:-1;;;58017:82:0;;13063:2:1;58017:82:0::1;::::0;::::1;13045:21:1::0;13102:2;13082:18;;;13075:30;13141:27;13121:18;;;13114:55;13186:18;;58017:82:0::1;12861:349:1::0;57970:280:0::1;58133:12;58121:8;:24;;;;;;;;:::i;:::-;::::0;58117:133:::1;;58198:12;58188:6;58170:15;;:24;;;;:::i;:::-;:40;;58162:76;;;::::0;-1:-1:-1;;;58162:76:0;;13417:2:1;58162:76:0::1;::::0;::::1;13399:21:1::0;13456:2;13436:18;;;13429:30;13495:25;13475:18;;;13468:53;13538:18;;58162:76:0::1;13215:347:1::0;58162:76:0::1;58267:9;58262:589;58286:6;58282:1;:10;58262:589;;;58314:16;::::0;58349:8:::1;:26;;;;;;;;:::i;:::-;::::0;58345:444:::1;;58417:17;::::0;58407:27:::1;::::0;:7;:27:::1;:::i;:::-;58396:38;;58474:1;58453:17;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;58345:444:0::1;::::0;-1:-1:-1;58345:444:0::1;;58513:14;58501:8;:26;;;;;;;;:::i;:::-;::::0;58497:292:::1;;58569:17;::::0;58559:27:::1;::::0;:7;:27:::1;:::i;:::-;58548:38;;58626:1;58605:17;;:22;;;;;;;:::i;58497:292::-;58665:12;58653:8;:24;;;;;;;;:::i;:::-;::::0;58649:140:::1;;58719:15;::::0;58709:25:::1;::::0;:7;:25:::1;:::i;:::-;58698:36;;58772:1;58753:15;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;58649:140:0::1;58803:36;58818:10;58830:8;58803:14;:36::i;:::-;-1:-1:-1::0;58294:3:0;::::1;::::0;::::1;:::i;:::-;;;;58262:589;;;;56675:2183;;;;;;;56598:2260:::0;;:::o;39525:256::-;39622:7;39658:23;39675:5;39658:16;:23::i;:::-;39650:5;:31;39642:87;;;;-1:-1:-1;;;39642:87:0;;13909:2:1;39642:87:0;;;13891:21:1;13948:2;13928:18;;;13921:30;13987:34;13967:18;;;13960:62;-1:-1:-1;;;14038:18:1;;;14031:41;14089:19;;39642:87:0;13707:407:1;39642:87:0;-1:-1:-1;;;;;;39747:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;39525:256::o;30080:185::-;30218:39;30235:4;30241:2;30245:7;30218:39;;;;;;;;;;;;:16;:39::i;62114:349::-;62176:16;62205:18;62226:17;62236:6;62226:9;:17::i;:::-;62205:38;;62254:25;62296:10;62282:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62282:25:0;;62254:53;;62323:9;62318:112;62342:10;62338:1;:14;62318:112;;;62388:30;62408:6;62416:1;62388:19;:30::i;:::-;62374:8;62383:1;62374:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;62354:3;;;;:::i;:::-;;;;62318:112;;;-1:-1:-1;62447:8:0;62114:349;-1:-1:-1;;;62114:349:0:o;40047:233::-;40122:7;40158:30;39945:10;:17;;39857:113;40158:30;40150:5;:38;40142:95;;;;-1:-1:-1;;;40142:95:0;;14453:2:1;40142:95:0;;;14435:21:1;14492:2;14472:18;;;14465:30;14531:34;14511:18;;;14504:62;-1:-1:-1;;;14582:18:1;;;14575:42;14634:19;;40142:95:0;14251:408:1;40142:95:0;40255:10;40266:5;40255:17;;;;;;;;:::i;:::-;;;;;;;;;40248:24;;40047:233;;;:::o;61530:101::-;11011:6;;-1:-1:-1;;;;;11011:6:0;8570:10;11158:23;11150:68;;;;-1:-1:-1;;;11150:68:0;;;;;;;:::i;:::-;61601:22;;::::1;::::0;:12:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;56499:91::-:0;56541:7;56568:14;:12;:14::i;:::-;56561:21;;56499:91;:::o;26915:239::-;26987:7;27023:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27023:16:0;;27050:73;;;;-1:-1:-1;;;27050:73:0;;14866:2:1;27050:73:0;;;14848:21:1;14905:2;14885:18;;;14878:30;14944:34;14924:18;;;14917:62;-1:-1:-1;;;14995:18:1;;;14988:39;15044:19;;27050:73:0;14664:405:1;26645:208:0;26717:7;-1:-1:-1;;;;;26745:19:0;;26737:74;;;;-1:-1:-1;;;26737:74:0;;15276:2:1;26737:74:0;;;15258:21:1;15315:2;15295:18;;;15288:30;15354:34;15334:18;;;15327:62;-1:-1:-1;;;15405:18:1;;;15398:40;15455:19;;26737:74:0;15074:406:1;26737:74:0;-1:-1:-1;;;;;;26829:16:0;;;;;:9;:16;;;;;;;26645:208::o;11589:94::-;11011:6;;-1:-1:-1;;;;;11011:6:0;8570:10;11158:23;11150:68;;;;-1:-1:-1;;;11150:68:0;;;;;;;:::i;:::-;11654:21:::1;11672:1;11654:9;:21::i;:::-;11589:94::o:0;62818:182::-;11011:6;;-1:-1:-1;;;;;11011:6:0;8570:10;11158:23;11150:68;;;;-1:-1:-1;;;11150:68:0;;;;;;;:::i;:::-;62887:21:::1;62927:11:::0;62919:20:::1;;;::::0;::::1;;62950:42;62961:7;11011:6:::0;;-1:-1:-1;;;;;11011:6:0;;10938:87;62961:7:::1;62970:21;62950:10;:42::i;27390:104::-:0;27446:13;27479:7;27472:14;;;;;:::i;60521:326::-;11011:6;;-1:-1:-1;;;;;11011:6:0;8570:10;11158:23;11150:68;;;;-1:-1:-1;;;11150:68:0;;;;;;;:::i;:::-;60607:39:::1;::::0;-1:-1:-1;;;60607:39:0;;60640:4:::1;60607:39;::::0;::::1;2043:51:1::0;60589:15:0::1;::::0;-1:-1:-1;;;;;60607:24:0;::::1;::::0;::::1;::::0;2016:18:1;;60607:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60589:57;;60665:7;60676:1;60665:12:::0;60657:64:::1;;;::::0;-1:-1:-1;;;60657:64:0;;15876:2:1;60657:64:0::1;::::0;::::1;15858:21:1::0;15915:2;15895:18;;;15888:30;15954:34;15934:18;;;15927:62;-1:-1:-1;;;16005:18:1;;;15998:37;16052:19;;60657:64:0::1;15674:403:1::0;60657:64:0::1;60734:57;-1:-1:-1::0;;;;;60734:27:0;::::1;60770:10;60783:7:::0;60734:27:::1;:57::i;:::-;60823:6;-1:-1:-1::0;;;;;60809:30:0::1;;60831:7;60809:30;;;;2688:25:1::0;;2676:2;2661:18;;2542:177;60809:30:0::1;;;;;;;;60578:269;60521:326:::0;:::o;29073:295::-;8570:10;-1:-1:-1;;;;;29176:24:0;;;29168:62;;;;-1:-1:-1;;;29168:62:0;;16284:2:1;29168:62:0;;;16266:21:1;16323:2;16303:18;;;16296:30;16362:27;16342:18;;;16335:55;16407:18;;29168:62:0;16082:349:1;29168:62:0;8570:10;29243:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;29243:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;29243:53:0;;;;;;;;;;29312:48;;540:41:1;;;29243:42:0;;8570:10;29312:48;;513:18:1;29312:48:0;;;;;;;29073:295;;:::o;64517:67::-;11011:6;;-1:-1:-1;;;;;11011:6:0;8570:10;11158:23;11150:68;;;;-1:-1:-1;;;11150:68:0;;;;;;;:::i;:::-;64561:8:::1;:15:::0;;-1:-1:-1;;64561:15:0::1;64572:4;64561:15;::::0;;64517:67::o;30336:328::-;30511:41;8570:10;30544:7;30511:18;:41::i;:::-;30503:103;;;;-1:-1:-1;;;30503:103:0;;;;;;;:::i;:::-;30617:39;30631:4;30637:2;30641:7;30650:5;30617:13;:39::i;:::-;30336:328;;;;:::o;60105:239::-;11011:6;;-1:-1:-1;;;;;11011:6:0;8570:10;11158:23;11150:68;;;;-1:-1:-1;;;11150:68:0;;;;;;;:::i;:::-;60202:74:::1;::::0;-1:-1:-1;;;60202:74:0;;60239:4:::1;60202:74;::::0;::::1;16676:34:1::0;60254:10:0::1;16726:18:1::0;;;16719:43;16778:18;;;16771:34;;;-1:-1:-1;;;;;60202:28:0;::::1;::::0;::::1;::::0;16611:18:1;;60202:74:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;60319:6;-1:-1:-1::0;;;;;60294:42:0::1;;60327:8;60294:42;;;;2688:25:1::0;;2676:2;2661:18;;2542:177;55784:37:0;;;;;;;:::i;63992:499::-;64090:13;64131:16;64139:7;64131;:16::i;:::-;64115:97;;;;-1:-1:-1;;;64115:97:0;;17018:2:1;64115:97:0;;;17000:21:1;17057:2;17037:18;;;17030:30;17096:34;17076:18;;;17069:62;-1:-1:-1;;;17147:18:1;;;17140:45;17202:19;;64115:97:0;16816:411:1;64115:97:0;64228:8;;;;:17;;:8;:17;64225:62;;64265:14;64258:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63992:499;;;:::o;64225:62::-;64295:28;64326:10;:8;:10::i;:::-;64295:41;;64381:1;64356:14;64350:28;:32;:133;;;;;;;;;;;;;;;;;64418:14;64434:18;:7;:16;:18::i;:::-;64454:13;64401:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64350:133;64343:140;63992:499;-1:-1:-1;;;63992:499:0:o;60856:548::-;60926:7;;;61043:8;:26;;;;;;;;:::i;:::-;;61039:316;;-1:-1:-1;61098:12:0;;61039:316;;;61144:14;61132:8;:26;;;;;;;;:::i;:::-;;61128:227;;-1:-1:-1;61187:12:0;;61128:227;;;61233:12;61221:8;:24;;;;;;;;:::i;:::-;;61217:138;;-1:-1:-1;61274:10:0;;61217:138;61378:18;61390:6;61378:9;:18;:::i;:::-;61371:25;60856:548;-1:-1:-1;;;;60856:548:0:o;59112:480::-;11011:6;;-1:-1:-1;;;;;11011:6:0;8570:10;11158:23;11150:68;;;;-1:-1:-1;;;11150:68:0;;;;;;;:::i;:::-;56233:7:::1;;56215:14;:12;:14::i;:::-;:25;;56207:46;;;;-1:-1:-1::0;;;56207:46:0::1;;;;;;;:::i;:::-;11011:6:::0;;-1:-1:-1;;;;;11011:6:0;8570:10;56268:23:::1;56264:94;;13272:7:::0;;;;56316:9:::1;56308:38;;;;-1:-1:-1::0;;;56308:38:0::1;;;;;;;:::i;:::-;59212:17:::2;59220:8;59212:7;:17::i;:::-;59211:18;59203:54;;;::::0;-1:-1:-1;;;59203:54:0;;19092:2:1;59203:54:0::2;::::0;::::2;19074:21:1::0;19131:2;19111:18;;;19104:30;-1:-1:-1;;;19150:18:1;;;19143:53;19213:18;;59203:54:0::2;18890:347:1::0;59203:54:0::2;59285:1;59273:8;:13;;:31;;;;;59302:2;59290:8;:14;;59273:31;59269:270;;;59342:1;59321:17;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;59269:270:0::2;::::0;-1:-1:-1;59269:270:0::2;;59377:2;59365:8;:14;;:32;;;;;59395:2;59383:8;:14;;59365:32;59361:178;;;59435:1;59414:17;;:22;;;;;;;:::i;59361:178::-;59470:2;59458:8;:14;;:32;;;;;59488:2;59476:8;:14;;59458:32;59454:85;;;59526:1;59507:15;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;59454:85:0::2;59549:35;59570:3;59575:8;59549:20;:35::i;56018:26::-:0;;;;;;;:::i;63656:158::-;11011:6;;-1:-1:-1;;;;;11011:6:0;8570:10;11158:23;11150:68;;;;-1:-1:-1;;;11150:68:0;;;;;;;:::i;:::-;63745:8:::1;63734:7;;:19;;63726:47;;;::::0;-1:-1:-1;;;63726:47:0;;19444:2:1;63726:47:0::1;::::0;::::1;19426:21:1::0;19483:2;19463:18;;;19456:30;-1:-1:-1;;;19502:18:1;;;19495:45;19557:18;;63726:47:0::1;19242:339:1::0;63726:47:0::1;63784:11;:22:::0;63656:158::o;63820:164::-;11011:6;;-1:-1:-1;;;;;11011:6:0;8570:10;11158:23;11150:68;;;;-1:-1:-1;;;11150:68:0;;;;;;;:::i;:::-;63912:14:::1;:12;:14::i;:::-;63899:9;:27;;63891:55;;;::::0;-1:-1:-1;;;63891:55:0;;19444:2:1;63891:55:0::1;::::0;::::1;19426:21:1::0;19483:2;19463:18;;;19456:30;-1:-1:-1;;;19502:18:1;;;19495:45;19557:18;;63891:55:0::1;19242:339:1::0;63891:55:0::1;63957:7;:19:::0;63820:164::o;61639:126::-;11011:6;;-1:-1:-1;;;;;11011:6:0;8570:10;11158:23;11150:68;;;;-1:-1:-1;;;11150:68:0;;;;;;;:::i;:::-;61725:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;11838:192::-:0;11011:6;;-1:-1:-1;;;;;11011:6:0;8570:10;11158:23;11150:68;;;;-1:-1:-1;;;11150:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11927:22:0;::::1;11919:73;;;::::0;-1:-1:-1;;;11919:73:0;;19788:2:1;11919:73:0::1;::::0;::::1;19770:21:1::0;19827:2;19807:18;;;19800:30;19866:34;19846:18;;;19839:62;-1:-1:-1;;;19917:18:1;;;19910:36;19963:19;;11919:73:0::1;19586:402:1::0;11919:73:0::1;12003:19;12013:8;12003:9;:19::i;53759:283::-:0;53889:4;-1:-1:-1;;;;;;53931:50:0;;-1:-1:-1;;;53931:50:0;;:103;;;53998:36;54022:11;53998:23;:36::i;14001:118::-;13272:7;;;;13526:9;13518:38;;;;-1:-1:-1;;;13518:38:0;;;;;;;:::i;:::-;14061:7:::1;:14:::0;;-1:-1:-1;;14061:14:0::1;14071:4;14061:14;::::0;;14091:20:::1;14098:12;8570:10:::0;;8490:98;14098:12:::1;14091:20;::::0;-1:-1:-1;;;;;2061:32:1;;;2043:51;;2031:2;2016:18;14091:20:0::1;;;;;;;14001:118::o:0;14260:120::-;13272:7;;;;13796:41;;;;-1:-1:-1;;;13796:41:0;;20195:2:1;13796:41:0;;;20177:21:1;20234:2;20214:18;;;20207:30;-1:-1:-1;;;20253:18:1;;;20246:50;20313:18;;13796:41:0;19993:344:1;13796:41:0;14319:7:::1;:15:::0;;-1:-1:-1;;14319:15:0::1;::::0;;14350:22:::1;8570:10:::0;14359:12:::1;8490:98:::0;32174:127;32239:4;32263:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32263:16:0;:30;;;32174:127::o;36156:174::-;36231:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;36231:29:0;-1:-1:-1;;;;;36231:29:0;;;;;;;;:24;;36285:23;36231:24;36285:14;:23::i;:::-;-1:-1:-1;;;;;36276:46:0;;;;;;;;;;;36156:174;;:::o;32468:348::-;32561:4;32586:16;32594:7;32586;:16::i;:::-;32578:73;;;;-1:-1:-1;;;32578:73:0;;20544:2:1;32578:73:0;;;20526:21:1;20583:2;20563:18;;;20556:30;20622:34;20602:18;;;20595:62;-1:-1:-1;;;20673:18:1;;;20666:42;20725:19;;32578:73:0;20342:408:1;32578:73:0;32662:13;32678:23;32693:7;32678:14;:23::i;:::-;32662:39;;32731:5;-1:-1:-1;;;;;32720:16:0;:7;-1:-1:-1;;;;;32720:16:0;;:51;;;;32764:7;-1:-1:-1;;;;;32740:31:0;:20;32752:7;32740:11;:20::i;:::-;-1:-1:-1;;;;;32740:31:0;;32720:51;:87;;;-1:-1:-1;;;;;;29560:25:0;;;29536:4;29560:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;32775:32;29439:164;35460:578;35619:4;-1:-1:-1;;;;;35592:31:0;:23;35607:7;35592:14;:23::i;:::-;-1:-1:-1;;;;;35592:31:0;;35584:85;;;;-1:-1:-1;;;35584:85:0;;20957:2:1;35584:85:0;;;20939:21:1;20996:2;20976:18;;;20969:30;21035:34;21015:18;;;21008:62;-1:-1:-1;;;21086:18:1;;;21079:39;21135:19;;35584:85:0;20755:405:1;35584:85:0;-1:-1:-1;;;;;35688:16:0;;35680:65;;;;-1:-1:-1;;;35680:65:0;;21367:2:1;35680:65:0;;;21349:21:1;21406:2;21386:18;;;21379:30;21445:34;21425:18;;;21418:62;-1:-1:-1;;;21496:18:1;;;21489:34;21540:19;;35680:65:0;21165:400:1;35680:65:0;35758:39;35779:4;35785:2;35789:7;35758:20;:39::i;:::-;35862:29;35879:1;35883:7;35862:8;:29::i;:::-;-1:-1:-1;;;;;35904:15:0;;;;;;:9;:15;;;;;:20;;35923:1;;35904:15;:20;;35923:1;;35904:20;:::i;:::-;;;;-1:-1:-1;;;;;;;35935:13:0;;;;;;:9;:13;;;;;:18;;35952:1;;35935:13;:18;;35952:1;;35935:18;:::i;:::-;;;;-1:-1:-1;;35964:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35964:21:0;-1:-1:-1;;;;;35964:21:0;;;;;;;;;36003:27;;35964:16;;36003:27;;;;;;;35460:578;;;:::o;63008:181::-;63083:12;63101:8;-1:-1:-1;;;;;63101:13:0;63122:7;63101:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63082:52;;;63153:7;63145:36;;;;-1:-1:-1;;;63145:36:0;;22112:2:1;63145:36:0;;;22094:21:1;22151:2;22131:18;;;22124:30;-1:-1:-1;;;22170:18:1;;;22163:46;22226:18;;63145:36:0;21910:340:1;56386:104:0;56433:4;56457:25;:15;9527:14;;9435:114;58868:236;58940:27;:15;9646:19;;9664:1;9646:19;;;9557:127;58940:27;58978:22;58988:3;58993:6;58978:9;:22::i;:::-;59011:52;59028:6;59036:7;11011:6;;-1:-1:-1;;;;;11011:6:0;;10938:87;59036:7;59045:17;;59011:16;:52::i;:::-;59079:17;;59089:6;;59079:17;;;;;58868:236;;:::o;12038:173::-;12113:6;;;-1:-1:-1;;;;;12130:17:0;;;-1:-1:-1;;;;;;12130:17:0;;;;;;;12163:40;;12113:6;;;12130:17;12113:6;;12163:40;;12094:16;;12163:40;12083:128;12038:173;:::o;49433:211::-;49577:58;;;-1:-1:-1;;;;;3823:32:1;;49577:58:0;;;3805:51:1;3872:18;;;;3865:34;;;49577:58:0;;;;;;;;;;3778:18:1;;;;49577:58:0;;;;;;;;-1:-1:-1;;;;;49577:58:0;-1:-1:-1;;;49577:58:0;;;49550:86;;49570:5;;49550:19;:86::i;31546:315::-;31703:28;31713:4;31719:2;31723:7;31703:9;:28::i;:::-;31750:48;31773:4;31779:2;31783:7;31792:5;31750:22;:48::i;:::-;31742:111;;;;-1:-1:-1;;;31742:111:0;;;;;;;:::i;61412:113::-;61472:13;61505:12;61498:19;;;;;:::i;14613:723::-;14669:13;14890:5;14899:1;14890:10;14886:53;;-1:-1:-1;;14917:10:0;;;;;;;;;;;;-1:-1:-1;;;14917:10:0;;;;;14613:723::o;14886:53::-;14964:5;14949:12;15005:78;15012:9;;15005:78;;15038:8;;;;:::i;:::-;;-1:-1:-1;15061:10:0;;-1:-1:-1;15069:2:0;15061:10;;:::i;:::-;;;15005:78;;;15093:19;15125:6;15115:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15115:17:0;;15093:39;;15143:154;15150:10;;15143:154;;15177:11;15187:1;15177:11;;:::i;:::-;;-1:-1:-1;15246:10:0;15254:2;15246:5;:10;:::i;:::-;15233:24;;:2;:24;:::i;:::-;15220:39;;15203:6;15210;15203:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;15203:56:0;;;;;;;;-1:-1:-1;15274:11:0;15283:2;15274:11;;:::i;:::-;;;15143:154;;59600:277;59689:17;59697:8;59689:7;:17::i;:::-;59688:18;59680:54;;;;-1:-1:-1;;;59680:54:0;;19092:2:1;59680:54:0;;;19074:21:1;19131:2;19111:18;;;19104:30;-1:-1:-1;;;19150:18:1;;;19143:53;19213:18;;59680:54:0;18890:347:1;39217:224:0;39319:4;-1:-1:-1;;;;;;39343:50:0;;-1:-1:-1;;;39343:50:0;;:90;;;39397:36;39421:11;39397:23;:36::i;63197:239::-;63383:45;63410:4;63416:2;63420:7;63383:26;:45::i;33158:110::-;33234:26;33244:2;33248:7;33234:26;;;;;;;;;;;;:9;:26::i;54279:242::-;54422:5;54413;:14;;54405:53;;;;-1:-1:-1;;;54405:53:0;;22993:2:1;54405:53:0;;;22975:21:1;23032:2;23012:18;;;23005:30;23071:28;23051:18;;;23044:56;23117:18;;54405:53:0;22791:350:1;54405:53:0;54488:25;;;;;;;;-1:-1:-1;;;;;54488:25:0;;;;;;;;;;;;-1:-1:-1;54471:14:0;;;:10;:14;;;;:42;;;;-1:-1:-1;;;;;;54471:42:0;;;;;;;;;;-1:-1:-1;54471:42:0;;;;54279:242::o;52006:716::-;52430:23;52456:69;52484:4;52456:69;;;;;;;;;;;;;;;;;52464:5;-1:-1:-1;;;;;52456:27:0;;;:69;;;;;:::i;:::-;52540:17;;52430:95;;-1:-1:-1;52540:21:0;52536:179;;52637:10;52626:30;;;;;;;;;;;;:::i;:::-;52618:85;;;;-1:-1:-1;;;52618:85:0;;23598:2:1;52618:85:0;;;23580:21:1;23637:2;23617:18;;;23610:30;23676:34;23656:18;;;23649:62;-1:-1:-1;;;23727:18:1;;;23720:40;23777:19;;52618:85:0;23396:406:1;36895:803:0;37050:4;-1:-1:-1;;;;;37071:13:0;;1160:20;1208:8;37067:624;;37107:72;;-1:-1:-1;;;37107:72:0;;-1:-1:-1;;;;;37107:36:0;;;;;:72;;8570:10;;37158:4;;37164:7;;37173:5;;37107:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37107:72:0;;;;;;;;-1:-1:-1;;37107:72:0;;;;;;;;;;;;:::i;:::-;;;37103:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37353:6;:13;37370:1;37353:18;37349:272;;37396:60;;-1:-1:-1;;;37396:60:0;;;;;;;:::i;37349:272::-;37571:6;37565:13;37556:6;37552:2;37548:15;37541:38;37103:533;-1:-1:-1;;;;;;37230:55:0;-1:-1:-1;;;37230:55:0;;-1:-1:-1;37223:62:0;;37067:624;-1:-1:-1;37675:4:0;36895:803;;;;;;:::o;26276:305::-;26378:4;-1:-1:-1;;;;;;26415:40:0;;-1:-1:-1;;;26415:40:0;;:105;;-1:-1:-1;;;;;;;26472:48:0;;-1:-1:-1;;;26472:48:0;26415:105;:158;;;-1:-1:-1;;;;;;;;;;18791:40:0;;;26537:36;18682:157;45859:328;46003:45;46030:4;46036:2;46040:7;46003:26;:45::i;:::-;11011:6;;-1:-1:-1;;;;;11011:6:0;8570:10;46063:23;46059:121;;13272:7;;;;46111:9;46103:65;;;;-1:-1:-1;;;46103:65:0;;24757:2:1;46103:65:0;;;24739:21:1;24796:2;24776:18;;;24769:30;24835:34;24815:18;;;24808:62;-1:-1:-1;;;24886:18:1;;;24879:41;24937:19;;46103:65:0;24555:407:1;33495:321:0;33625:18;33631:2;33635:7;33625:5;:18::i;:::-;33676:54;33707:1;33711:2;33715:7;33724:5;33676:22;:54::i;:::-;33654:154;;;;-1:-1:-1;;;33654:154:0;;;;;;;:::i;3643:229::-;3780:12;3812:52;3834:6;3842:4;3848:1;3851:12;3812:21;:52::i;40893:589::-;-1:-1:-1;;;;;41099:18:0;;41095:187;;41134:40;41166:7;42309:10;:17;;42282:24;;;;:15;:24;;;;;:44;;;42337:24;;;;;;;;;;;;42205:164;41134:40;41095:187;;;41204:2;-1:-1:-1;;;;;41196:10:0;:4;-1:-1:-1;;;;;41196:10:0;;41192:90;;41223:47;41256:4;41262:7;41223:32;:47::i;:::-;-1:-1:-1;;;;;41296:16:0;;41292:183;;41329:45;41366:7;41329:36;:45::i;41292:183::-;41402:4;-1:-1:-1;;;;;41396:10:0;:2;-1:-1:-1;;;;;41396:10:0;;41392:83;;41423:40;41451:2;41455:7;41423:27;:40::i;34152:382::-;-1:-1:-1;;;;;34232:16:0;;34224:61;;;;-1:-1:-1;;;34224:61:0;;25169:2:1;34224:61:0;;;25151:21:1;;;25188:18;;;25181:30;25247:34;25227:18;;;25220:62;25299:18;;34224:61:0;24967:356:1;34224:61:0;34305:16;34313:7;34305;:16::i;:::-;34304:17;34296:58;;;;-1:-1:-1;;;34296:58:0;;25530:2:1;34296:58:0;;;25512:21:1;25569:2;25549:18;;;25542:30;25608;25588:18;;;25581:58;25656:18;;34296:58:0;25328:352:1;34296:58:0;34367:45;34396:1;34400:2;34404:7;34367:20;:45::i;:::-;-1:-1:-1;;;;;34425:13:0;;;;;;:9;:13;;;;;:18;;34442:1;;34425:13;:18;;34442:1;;34425:18;:::i;:::-;;;;-1:-1:-1;;34454:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34454:21:0;-1:-1:-1;;;;;34454:21:0;;;;;;;;34493:33;;34454:16;;;34493:33;;34454:16;;34493:33;34152:382;;:::o;4763:511::-;4933:12;4991:5;4966:21;:30;;4958:81;;;;-1:-1:-1;;;4958:81:0;;25887:2:1;4958:81:0;;;25869:21:1;25926:2;25906:18;;;25899:30;25965:34;25945:18;;;25938:62;-1:-1:-1;;;26016:18:1;;;26009:36;26062:19;;4958:81:0;25685:402:1;4958:81:0;1160:20;;5050:60;;;;-1:-1:-1;;;5050:60:0;;26294:2:1;5050:60:0;;;26276:21:1;26333:2;26313:18;;;26306:30;26372:31;26352:18;;;26345:59;26421:18;;5050:60:0;26092:353:1;5050:60:0;5124:12;5138:23;5165:6;-1:-1:-1;;;;;5165:11:0;5184:5;5191:4;5165:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5123:73;;;;5214:52;5232:7;5241:10;5253:12;5214:17;:52::i;:::-;5207:59;4763:511;-1:-1:-1;;;;;;;4763:511:0:o;42996:988::-;43262:22;43312:1;43287:22;43304:4;43287:16;:22::i;:::-;:26;;;;:::i;:::-;43324:18;43345:26;;;:17;:26;;;;;;43262:51;;-1:-1:-1;43478:28:0;;;43474:328;;-1:-1:-1;;;;;43545:18:0;;43523:19;43545:18;;;:12;:18;;;;;;;;:34;;;;;;;;;43596:30;;;;;;:44;;;43713:30;;:17;:30;;;;;:43;;;43474:328;-1:-1:-1;43898:26:0;;;;:17;:26;;;;;;;;43891:33;;;-1:-1:-1;;;;;43942:18:0;;;;;:12;:18;;;;;:34;;;;;;;43935:41;42996:988::o;44279:1079::-;44557:10;:17;44532:22;;44557:21;;44577:1;;44557:21;:::i;:::-;44589:18;44610:24;;;:15;:24;;;;;;44983:10;:26;;44532:46;;-1:-1:-1;44610:24:0;;44532:46;;44983:26;;;;;;:::i;:::-;;;;;;;;;44961:48;;45047:11;45022:10;45033;45022:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;45127:28;;;:15;:28;;;;;;;:41;;;45299:24;;;;;45292:31;45334:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;44350:1008;;;44279:1079;:::o;41783:221::-;41868:14;41885:20;41902:2;41885:16;:20::i;:::-;-1:-1:-1;;;;;41916:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;41961:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;41783:221:0:o;7232:712::-;7382:12;7411:7;7407:530;;;-1:-1:-1;7442:10:0;7435:17;;7407:530;7556:17;;:21;7552:374;;7754:10;7748:17;7815:15;7802:10;7798:2;7794:19;7787:44;7552:374;7897:12;7890:20;;-1:-1:-1;;;7890:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::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:118::-;678:5;671:13;664:21;657:5;654:32;644:60;;700:1;697;690:12;715:241;771:6;824:2;812:9;803:7;799:23;795:32;792:52;;;840:1;837;830:12;792:52;879:9;866:23;898:28;920:5;898:28;:::i;961:258::-;1033:1;1043:113;1057:6;1054:1;1051:13;1043:113;;;1133:11;;;1127:18;1114:11;;;1107:39;1079:2;1072:10;1043:113;;;1174:6;1171:1;1168:13;1165:48;;;-1:-1:-1;;1209:1:1;1191:16;;1184:27;961:258::o;1224:::-;1266:3;1304:5;1298:12;1331:6;1326:3;1319:19;1347:63;1403:6;1396:4;1391:3;1387:14;1380:4;1373:5;1369:16;1347:63;:::i;:::-;1464:2;1443:15;-1:-1:-1;;1439:29:1;1430:39;;;;1471:4;1426:50;;1224:258;-1:-1:-1;;1224:258:1:o;1487:220::-;1636:2;1625:9;1618:21;1599:4;1656:45;1697:2;1686:9;1682:18;1674:6;1656:45;:::i;1712:180::-;1771:6;1824:2;1812:9;1803:7;1799:23;1795:32;1792:52;;;1840:1;1837;1830:12;1792:52;-1:-1:-1;1863:23:1;;1712:180;-1:-1:-1;1712:180:1:o;2105:173::-;2173:20;;-1:-1:-1;;;;;2222:31:1;;2212:42;;2202:70;;2268:1;2265;2258:12;2202:70;2105:173;;;:::o;2283:254::-;2351:6;2359;2412:2;2400:9;2391:7;2387:23;2383:32;2380:52;;;2428:1;2425;2418:12;2380:52;2451:29;2470:9;2451:29;:::i;:::-;2441:39;2527:2;2512:18;;;;2499:32;;-1:-1:-1;;;2283:254:1:o;2724:316::-;2801:6;2809;2817;2870:2;2858:9;2849:7;2845:23;2841:32;2838:52;;;2886:1;2883;2876:12;2838:52;-1:-1:-1;;2909:23:1;;;2979:2;2964:18;;2951:32;;-1:-1:-1;3030:2:1;3015:18;;;3002:32;;2724:316;-1:-1:-1;2724:316:1:o;3045:328::-;3122:6;3130;3138;3191:2;3179:9;3170:7;3166:23;3162:32;3159:52;;;3207:1;3204;3197:12;3159:52;3230:29;3249:9;3230:29;:::i;:::-;3220:39;;3278:38;3312:2;3301:9;3297:18;3278:38;:::i;:::-;3268:48;;3363:2;3352:9;3348:18;3335:32;3325:42;;3045:328;;;;;:::o;3378:248::-;3446:6;3454;3507:2;3495:9;3486:7;3482:23;3478:32;3475:52;;;3523:1;3520;3513:12;3475:52;-1:-1:-1;;3546:23:1;;;3616:2;3601:18;;;3588:32;;-1:-1:-1;3378:248:1:o;3910:336::-;3990:6;3998;4051:2;4039:9;4030:7;4026:23;4022:32;4019:52;;;4067:1;4064;4057:12;4019:52;4106:9;4093:23;4145:1;4138:5;4135:12;4125:40;;4161:1;4158;4151:12;4251:186;4310:6;4363:2;4351:9;4342:7;4338:23;4334:32;4331:52;;;4379:1;4376;4369:12;4331:52;4402:29;4421:9;4402:29;:::i;4442:632::-;4613:2;4665:21;;;4735:13;;4638:18;;;4757:22;;;4584:4;;4613:2;4836:15;;;;4810:2;4795:18;;;4584:4;4879:169;4893:6;4890:1;4887:13;4879:169;;;4954:13;;4942:26;;5023:15;;;;4988:12;;;;4915:1;4908:9;4879:169;;;-1:-1:-1;5065:3:1;;4442:632;-1:-1:-1;;;;;;4442:632:1:o;5079:127::-;5140:10;5135:3;5131:20;5128:1;5121:31;5171:4;5168:1;5161:15;5195:4;5192:1;5185:15;5211:632;5276:5;5306:18;5347:2;5339:6;5336:14;5333:40;;;5353:18;;:::i;:::-;5428:2;5422:9;5396:2;5482:15;;-1:-1:-1;;5478:24:1;;;5504:2;5474:33;5470:42;5458:55;;;5528:18;;;5548:22;;;5525:46;5522:72;;;5574:18;;:::i;:::-;5614:10;5610:2;5603:22;5643:6;5634:15;;5673:6;5665;5658:22;5713:3;5704:6;5699:3;5695:16;5692:25;5689:45;;;5730:1;5727;5720:12;5689:45;5780:6;5775:3;5768:4;5760:6;5756:17;5743:44;5835:1;5828:4;5819:6;5811;5807:19;5803:30;5796:41;;;;5211:632;;;;;:::o;5848:451::-;5917:6;5970:2;5958:9;5949:7;5945:23;5941:32;5938:52;;;5986:1;5983;5976:12;5938:52;6026:9;6013:23;6059:18;6051:6;6048:30;6045:50;;;6091:1;6088;6081:12;6045:50;6114:22;;6167:4;6159:13;;6155:27;-1:-1:-1;6145:55:1;;6196:1;6193;6186:12;6145:55;6219:74;6285:7;6280:2;6267:16;6262:2;6258;6254:11;6219:74;:::i;6304:315::-;6369:6;6377;6430:2;6418:9;6409:7;6405:23;6401:32;6398:52;;;6446:1;6443;6436:12;6398:52;6469:29;6488:9;6469:29;:::i;:::-;6459:39;;6548:2;6537:9;6533:18;6520:32;6561:28;6583:5;6561:28;:::i;:::-;6608:5;6598:15;;;6304:315;;;;;:::o;6624:667::-;6719:6;6727;6735;6743;6796:3;6784:9;6775:7;6771:23;6767:33;6764:53;;;6813:1;6810;6803:12;6764:53;6836:29;6855:9;6836:29;:::i;:::-;6826:39;;6884:38;6918:2;6907:9;6903:18;6884:38;:::i;:::-;6874:48;;6969:2;6958:9;6954:18;6941:32;6931:42;;7024:2;7013:9;7009:18;6996:32;7051:18;7043:6;7040:30;7037:50;;;7083:1;7080;7073:12;7037:50;7106:22;;7159:4;7151:13;;7147:27;-1:-1:-1;7137:55:1;;7188:1;7185;7178:12;7137:55;7211:74;7277:7;7272:2;7259:16;7254:2;7250;7246:11;7211:74;:::i;:::-;7201:84;;;6624:667;;;;;;;:::o;7296:260::-;7364:6;7372;7425:2;7413:9;7404:7;7400:23;7396:32;7393:52;;;7441:1;7438;7431:12;7393:52;7464:29;7483:9;7464:29;:::i;:::-;7454:39;;7512:38;7546:2;7535:9;7531:18;7512:38;:::i;:::-;7502:48;;7296:260;;;;;:::o;7561:356::-;7763:2;7745:21;;;7782:18;;;7775:30;7841:34;7836:2;7821:18;;7814:62;7908:2;7893:18;;7561:356::o;7922:380::-;8001:1;7997:12;;;;8044;;;8065:61;;8119:4;8111:6;8107:17;8097:27;;8065:61;8172:2;8164:6;8161:14;8141:18;8138:38;8135:161;;8218:10;8213:3;8209:20;8206:1;8199:31;8253:4;8250:1;8243:15;8281:4;8278:1;8271:15;8135:161;;7922:380;;;:::o;9547:413::-;9749:2;9731:21;;;9788:2;9768:18;;;9761:30;9827:34;9822:2;9807:18;;9800:62;-1:-1:-1;;;9893:2:1;9878:18;;9871:47;9950:3;9935:19;;9547:413::o;9965:127::-;10026:10;10021:3;10017:20;10014:1;10007:31;10057:4;10054:1;10047:15;10081:4;10078:1;10071:15;10097:168;10137:7;10203:1;10199;10195:6;10191:14;10188:1;10185:21;10180:1;10173:9;10166:17;10162:45;10159:71;;;10210:18;;:::i;:::-;-1:-1:-1;10250:9:1;;10097:168::o;10270:127::-;10331:10;10326:3;10322:20;10319:1;10312:31;10362:4;10359:1;10352:15;10386:4;10383:1;10376:15;10402:120;10442:1;10468;10458:35;;10473:18;;:::i;:::-;-1:-1:-1;10507:9:1;;10402:120::o;10527:331::-;10729:2;10711:21;;;10768:1;10748:18;;;10741:29;-1:-1:-1;;;10801:2:1;10786:18;;10779:38;10849:2;10834:18;;10527:331::o;10863:340::-;11065:2;11047:21;;;11104:2;11084:18;;;11077:30;-1:-1:-1;;;11138:2:1;11123:18;;11116:46;11194:2;11179:18;;10863:340::o;11208:127::-;11269:10;11264:3;11260:20;11257:1;11250:31;11300:4;11297:1;11290:15;11324:4;11321:1;11314:15;12374:128;12414:3;12445:1;12441:6;12438:1;12435:13;12432:39;;;12451:18;;:::i;:::-;-1:-1:-1;12487:9:1;;12374:128::o;13567:135::-;13606:3;13627:17;;;13624:43;;13647:18;;:::i;:::-;-1:-1:-1;13694:1:1;13683:13;;13567:135::o;14119:127::-;14180:10;14175:3;14171:20;14168:1;14161:31;14211:4;14208:1;14201:15;14235:4;14232:1;14225:15;15485:184;15555:6;15608:2;15596:9;15587:7;15583:23;15579:32;15576:52;;;15624:1;15621;15614:12;15576:52;-1:-1:-1;15647:16:1;;15485:184;-1:-1:-1;15485:184:1:o;17358:1527::-;17582:3;17620:6;17614:13;17646:4;17659:51;17703:6;17698:3;17693:2;17685:6;17681:15;17659:51;:::i;:::-;17773:13;;17732:16;;;;17795:55;17773:13;17732:16;17817:15;;;17795:55;:::i;:::-;17939:13;;17872:20;;;17912:1;;17999;18021:18;;;;18074;;;;18101:93;;18179:4;18169:8;18165:19;18153:31;;18101:93;18242:2;18232:8;18229:16;18209:18;18206:40;18203:167;;-1:-1:-1;;;18269:33:1;;18325:4;18322:1;18315:15;18355:4;18276:3;18343:17;18203:167;18386:18;18413:110;;;;18537:1;18532:328;;;;18379:481;;18413:110;-1:-1:-1;;18448:24:1;;18434:39;;18493:20;;;;-1:-1:-1;18413:110:1;;18532:328;17305:1;17298:14;;;17342:4;17329:18;;18627:1;18641:169;18655:8;18652:1;18649:15;18641:169;;;18737:14;;18722:13;;;18715:37;18780:16;;;;18672:10;;18641:169;;;18645:3;;18841:8;18834:5;18830:20;18823:27;;18379:481;-1:-1:-1;18876:3:1;;17358:1527;-1:-1:-1;;;;;;;;;;;17358:1527:1:o;21570:125::-;21610:4;21638:1;21635;21632:8;21629:34;;;21643:18;;:::i;:::-;-1:-1:-1;21680:9:1;;21570:125::o;22255:414::-;22457:2;22439:21;;;22496:2;22476:18;;;22469:30;22535:34;22530:2;22515:18;;22508:62;-1:-1:-1;;;22601:2:1;22586:18;;22579:48;22659:3;22644:19;;22255:414::o;22674:112::-;22706:1;22732;22722:35;;22737:18;;:::i;:::-;-1:-1:-1;22771:9:1;;22674:112::o;23146:245::-;23213:6;23266:2;23254:9;23245:7;23241:23;23237:32;23234:52;;;23282:1;23279;23272:12;23234:52;23314:9;23308:16;23333:28;23355:5;23333:28;:::i;23807:489::-;-1:-1:-1;;;;;24076:15:1;;;24058:34;;24128:15;;24123:2;24108:18;;24101:43;24175:2;24160:18;;24153:34;;;24223:3;24218:2;24203:18;;24196:31;;;24001:4;;24244:46;;24270:19;;24262:6;24244:46;:::i;:::-;24236:54;23807:489;-1:-1:-1;;;;;;23807:489:1:o;24301:249::-;24370:6;24423:2;24411:9;24402:7;24398:23;24394:32;24391:52;;;24439:1;24436;24429:12;24391:52;24471:9;24465:16;24490:30;24514:5;24490:30;:::i;26450:274::-;26579:3;26617:6;26611:13;26633:53;26679:6;26674:3;26667:4;26659:6;26655:17;26633:53;:::i;:::-;26702:16;;;;;26450:274;-1:-1:-1;;26450:274:1:o;26729:127::-;26790:10;26785:3;26781:20;26778:1;26771:31;26821:4;26818:1;26811:15;26845:4;26842:1;26835:15

Swarm Source

ipfs://85aae503aae0c03838e76a20dcf42abd218080a2e6d9b784b272b8375f8d1210
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.