ETH Price: $3,517.88 (+4.87%)
Gas: 7.8 Gwei

Token

Zitto and Gatito (ZIGA)
 

Overview

Max Total Supply

222 ZIGA

Holders

155

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 ZIGA
0x1c72efb9bf062bbed604fc9a34a2623704b6dadd
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Spaceship's Cat (Zitto & Gatito) by Mikidozan AKA Dozan11 & Kenji Yanobe.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ZITTOGATITO

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-12
*/

//SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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




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

pragma solidity ^0.8.0;

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




// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}



pragma solidity ^0.8.7;


abstract contract MerkleProof {
    bytes32 internal _wlMerkleRoot;

    function _setWlMerkleRoot(bytes32 merkleRoot_) internal virtual {
        _wlMerkleRoot = merkleRoot_;
    }

    function isWhitelisted(address address_, bytes32[] memory proof_) public view returns (bool) {
        bytes32 _leaf = keccak256(abi.encodePacked(address_));
        for (uint256 i = 0; i < proof_.length; i++) {
            _leaf = _leaf < proof_[i] ? keccak256(abi.encodePacked(_leaf, proof_[i])) : keccak256(abi.encodePacked(proof_[i], _leaf));
        }
        return _leaf == _wlMerkleRoot;
    }
}




// OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides a set of functions to operate with Base64 strings.
 *
 * _Available since v4.5._
 */
library Base64 {
    /**
     * @dev Base64 Encoding/Decoding Table
     */
    string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /**
     * @dev Converts a `bytes` to its Bytes64 `string` representation.
     */
    function encode(bytes memory data) internal pure returns (string memory) {
        /**
         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
         */
        if (data.length == 0) return "";

        // Loads the table into memory
        string memory table = _TABLE;

        // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
        // and split into 4 numbers of 6 bits.
        // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
        // - `data.length + 2`  -> Round up
        // - `/ 3`              -> Number of 3-bytes chunks
        // - `4 *`              -> 4 characters for each chunk
        string memory result = new string(4 * ((data.length + 2) / 3));

        /// @solidity memory-safe-assembly
        assembly {
            // Prepare the lookup table (skip the first "length" byte)
            let tablePtr := add(table, 1)

            // Prepare result pointer, jump over length
            let resultPtr := add(result, 32)

            // Run over the input, 3 bytes at a time
            for {
                let dataPtr := data
                let endPtr := add(data, mload(data))
            } lt(dataPtr, endPtr) {

            } {
                // Advance 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // To write each character, shift the 3 bytes (18 bits) chunk
                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
                // and apply logical AND with 0x3F which is the number of
                // the previous character in the ASCII table prior to the Base64 Table
                // The result is then added to the table to get the character to write,
                // and finally write it in the result pointer but with a left shift
                // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits

                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance
            }

            // When data `bytes` is not exactly 3 bytes long
            // it is padded with `=` characters at the end
            switch mod(mload(data), 3)
            case 1 {
                mstore8(sub(resultPtr, 1), 0x3d)
                mstore8(sub(resultPtr, 2), 0x3d)
            }
            case 2 {
                mstore8(sub(resultPtr, 1), 0x3d)
            }
        }

        return result;
    }
}




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

pragma solidity ^0.8.0;

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




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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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




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

pragma solidity ^0.8.0;


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

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

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




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

pragma solidity ^0.8.4;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




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

pragma solidity ^0.8.0;


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




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

pragma solidity ^0.8.0;


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




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

pragma solidity ^0.8.0;



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

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

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

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

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

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

        return (royalty.receiver, royaltyAmount);
    }

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

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

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

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

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

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

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




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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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




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

pragma solidity ^0.8.0;

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

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




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

pragma solidity ^0.8.4;







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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr) if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner) if(!isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}




// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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


pragma solidity ^0.8.9;

abstract contract Operable is Context {
    mapping(address => bool) _operators;

    modifier onlyOperator() {
        _checkOperatorRole(_msgSender());
        _;
    }

    function isOperator(address _operator) public view returns (bool) {
        return _operators[_operator];
    }

    function _grantOperatorRole(address _candidate) internal {
        require(
            !_operators[_candidate],
            string(
                abi.encodePacked(
                    "account ",
                    Strings.toHexString(uint160(_msgSender()), 20),
                    " is already has an operator role"
                )
            )
        );
        _operators[_candidate] = true;
    }

    function _revokeOperatorRole(address _candidate) internal {
        _checkOperatorRole(_candidate);
        delete _operators[_candidate];
    }

    function _checkOperatorRole(address _operator) internal view {
        require(
            _operators[_operator],
            string(
                abi.encodePacked(
                    "account ",
                    Strings.toHexString(uint160(_msgSender()), 20),
                    " is not an operator"
                )
            )
        );
    }
}

pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

pragma solidity ^0.8.13;


/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);
    bool public operatorFilteringEnabled = true;

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0 && operatorFilteringEnabled) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0 && operatorFilteringEnabled) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }
}


pragma solidity ^0.8.13;
/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}



pragma solidity ^0.8.7;
/*
╔════╗╔╗─╔╗────╔═══╗──╔╗─╔╗
╚══╗═╠╝╚╦╝╚╗───║╔═╗║─╔╝╚╦╝╚╗
──╔╝╔╬╗╔╩╗╔╬══╗║║─╚╬═╩╗╔╬╗╔╬══╗
─╔╝╔╝╠╣║─║║║╔╗║&║╔═╣╔╗║║╠╣║║╔╗║
╔╝═╚═╣║╚╗║╚╣╚╝║║╚╩═║╔╗║╚╣║╚╣╚╝║
╚════╩╩═╝╚═╩══╝╚═══╩╝╚╩═╩╩═╩══╝
Zitto & Gattito
*/
contract ZITTOGATITO is Ownable, ERC721A, ReentrancyGuard, MerkleProof, ERC2981, DefaultOperatorFilterer, Operable {
  //Project Settings
  uint256 public wlMintPrice = 0.222 ether;
  uint256 public psMintPrice = 0.333 ether;
  uint256 public maxMintsPerWL = 1;
  uint256 public maxMintsPerPS = 1;
  uint256 public maxSupply = 222;
  address internal _withdrawWallet;
  address internal _aa;
  address internal _bb;
  address internal _cc;
  address internal _dd;
  address internal _ee;
  address internal _ff;

  uint256 internal _aaPerc;
  uint256 internal _bbPerc;
  uint256 internal _ccPerc;
  uint256 internal _ddPerc;
  uint256 internal _eePerc;
  uint256 internal _ffPerc;

  //URI
  string internal hiddenURI;
  string internal _baseTokenURI;
  string public _baseExtension = ".json";

  //flags
  bool public isWlSaleEnabled;
  bool public isPublicSaleEnabled;
  bool public revealed = false;
  address public deployer;

  //mint records.
  mapping(address => uint256) internal _wlMinted;
  mapping(address => uint256) internal _psMinted;

  constructor (
    address _royaltyReceiver,
    uint96 _royaltyFraction,
    address _aaAdd,
    uint256 _aaPercAdd   
  ) ERC721A ("Zitto and Gatito","ZIGA") {
    deployer = msg.sender;
    // _withdrawWallet = deployer;
    _grantOperatorRole(msg.sender);
    _setDefaultRoyalty(_royaltyReceiver,_royaltyFraction);
    _aa = _aaAdd;
    _aaPerc = _aaPercAdd;
  }
  //start from 1.adjust.
  function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
  }
  //set Default Royalty._feeNumerator 500 = 5% Royalty
  function setDefaultRoyalty(address _receiver, uint96 _feeNumerator) external virtual onlyOperator {
      _setDefaultRoyalty(_receiver, _feeNumerator);
  }
  //for ERC2981
  function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, ERC2981) returns (bool) {
    return super.supportsInterface(interfaceId);
  }
  //for ERC2981 Opensea
  function contractURI() external view virtual returns (string memory) {
        return _formatContractURI();
  }
  //make contractURI
  function _formatContractURI() internal view returns (string memory) {
    (address receiver, uint256 royaltyFraction) = royaltyInfo(0,_feeDenominator());//tokenid=0
    return string(
      abi.encodePacked(
        "data:application/json;base64,",
        Base64.encode(
          bytes(
            abi.encodePacked(
                '{"seller_fee_basis_points":', Strings.toString(royaltyFraction),
                ', "fee_recipient":"', Strings.toHexString(uint256(uint160(receiver)), 20), '"}'
            )
          )
        )
      )
    );
  }
  
  /**
    @dev set owner's wallet.withdraw to this wallet.only operator.
  */
  function setWithdrawWallet(address _owner) external virtual onlyOperator {
    _withdrawWallet = _owner;
  }
  /**
    @dev set aa's wallet and fraction.withdraw to this wallet.only operator.
    */
  function setWallet__aa(address _owner,uint256 _perc) external virtual onlyOperator {
    _aa = _owner;
    _aaPerc = _perc;
  }

  /**
    @dev set bb's wallet and fraction.withdraw to this wallet.only operator.
    */
  function setWallet__bb(address _owner,uint256 _perc) external virtual onlyOperator {
    _bb = _owner;
    _bbPerc = _perc;
  }

  /**
    @dev set cc's wallet and fraction.withdraw to this wallet.only operator.
    */
  function setWallet__cc(address _owner,uint256 _perc) external virtual onlyOperator {
    _cc = _owner;
    _ccPerc = _perc;
  }

  /**
    @dev set dd's wallet and fraction.withdraw to this wallet.only operator.
    */
  function setWallet__dd(address _owner,uint256 _perc) external virtual onlyOperator {
    _dd = _owner;
    _ddPerc = _perc;
  }

  /**
    @dev set ee's wallet and fraction.withdraw to this wallet.only operator.
    */
  function setWallet__ee(address _owner,uint256 _perc) external virtual onlyOperator {
    _ee = _owner;
    _eePerc = _perc;
  }

  /**
    @dev set ff's wallet and fraction.withdraw to this wallet.only operator.
    */
  function setWallet__ff(address _owner,uint256 _perc) external virtual onlyOperator {
    _ff = _owner;
    _ffPerc = _perc;
  }

  /**
    @dev set aa's wallet address.withdraw to this wallet.only operator.
    */
  function setWallet_aa_Address(address _owner) external virtual onlyOperator {
    _aa = _owner;
  }

  /**
    @dev set bb's wallet address.withdraw to this wallet.only operator.
    */
  function setWallet_bb_Address(address _owner) external virtual onlyOperator {
    _bb = _owner;
  }

  /**
    @dev set cc's wallet address.withdraw to this wallet.only operator.
    */
  function setWallet_cc_Address(address _owner) external virtual onlyOperator {
    _cc = _owner;
  }

  /**
    @dev set dd's wallet address.withdraw to this wallet.only operator.
    */
  function setWallet_dd_Address(address _owner) external virtual onlyOperator {
    _dd = _owner;
  }

  /**
    @dev set ee's wallet address.withdraw to this wallet.only operator.
    */
  function setWallet_ee_Address(address _owner) external virtual onlyOperator {
    _ee = _owner;
  }

  /**
    @dev set ff's wallet address.withdraw to this wallet.only operator.
    */
  function setWallet_ff_Address(address _owner) external virtual onlyOperator {
    _ff = _owner;
  }

  /**
    @dev set aa's wallet fraction.withdraw to this wallet.only operator.
    */
  function setWallet_aa_Perc(uint256 _perc) external virtual onlyOperator {
    _aaPerc = _perc;
  }

  /**
    @dev set bb's wallet fraction.withdraw to this wallet.only operator.
    */
  function setWallet_bb_Perc(uint256 _perc) external virtual onlyOperator {
    _bbPerc = _perc;
  }

  /**
    @dev set cc's wallet fraction.withdraw to this wallet.only operator.
    */
  function setWallet_cc_Perc(uint256 _perc) external virtual onlyOperator {
    _ccPerc = _perc;
  }

  /**
    @dev set dd's wallet fraction.withdraw to this wallet.only operator.
    */
  function setWallet_dd_Perc(uint256 _perc) external virtual onlyOperator {
    _ddPerc = _perc;
  }

  /**
    @dev set ee's wallet fraction.withdraw to this wallet.only operator.
    */
  function setWallet_ee_Perc(uint256 _perc) external virtual onlyOperator {
    _eePerc = _perc;
  }

  /**
    @dev set ff's wallet fraction.withdraw to this wallet.only operator.
    */
  function setWallet_ff_Perc(uint256 _perc) external virtual onlyOperator {
    _ffPerc = _perc;
  }

  function setDeployer(address _deployer) external virtual onlyOperator {
    deployer = _deployer;
  }

  //set maxSupply.only operator.
  function setMaxSupply(uint256 _maxSupply) external virtual onlyOperator {
    require(totalSupply() <= _maxSupply, "Lower than _currentIndex.");
    maxSupply = _maxSupply;
  }

  // SET PRICES.
  function setWlPrice(uint256 newPrice) external virtual onlyOperator {
    wlMintPrice = newPrice;
  }
  function setPsPrice(uint256 newPrice) external virtual onlyOperator {
    psMintPrice = newPrice;
  }

  //set reveal.only operator.
  function setReveal(bool newRevealStatus) external virtual onlyOperator {
    revealed = newRevealStatus;
  }
  //return _isRevealed()
  function _isRevealed() internal view virtual returns (bool){
    return revealed;
  }
  

  // GET MINTED COUNT.
  function wlMinted(address _address) external view virtual returns (uint256){
    return _wlMinted[_address];
  }
  function psMinted(address _address) external view virtual returns (uint256){
    return _psMinted[_address];
  }

  // SET MAX MINTS.
  function setWlMaxMints(uint256 _max) external virtual onlyOperator {
    maxMintsPerWL = _max;
  }
  function setPsMaxMints(uint256 _max) external virtual onlyOperator {
    maxMintsPerPS = _max;
  }

  // SET SALES ENABLE.
  function setWhitelistSaleEnable(bool bool_) external virtual onlyOperator {
    isWlSaleEnabled = bool_;
  }
  function setPublicSaleEnable(bool bool_) external virtual onlyOperator {
    isPublicSaleEnabled = bool_;
  }

  // SET MERKLE ROOT.
  function setWlMerkleRoot(bytes32 merkleRoot_) external virtual onlyOperator {
    _setWlMerkleRoot(merkleRoot_);
  }

  //set HiddenBaseURI.only operator.
  function setHiddenURI(string memory uri_) external virtual onlyOperator {
    hiddenURI = uri_;
  }

  //return _currentIndex
  function getCurrentIndex() external view virtual returns (uint256){
    return _currentIndex;
  }

  //set BaseURI at after reveal. only owner.
  function setBaseURI(string memory uri_) external virtual onlyOperator {
    _baseTokenURI = uri_;
  }


  function setBaseExtension(string memory _newBaseExtension) external onlyOperator
  {
    _baseExtension = _newBaseExtension;
  }

  //retuen BaseURI.internal.
  function _currentBaseURI() internal view returns (string memory){
    return _baseTokenURI;
  }


  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
    require(_exists(_tokenId), "URI query for nonexistent token");
    if(_isRevealed()){
        return string(abi.encodePacked(_currentBaseURI(), Strings.toString(_tokenId), _baseExtension));
    }
    return hiddenURI;
  }

  //owner mint.transfer to _address.only operator.
  function ownerMint(uint256 _amount, address _address) external virtual onlyOperator { 
    require((_amount + totalSupply()) <= (maxSupply), "No more NFTs");
    _safeMint(_address, _amount);
  }


  //WL mint.
  function whitelistMint(uint256 _amount, bytes32[] memory proof_) external payable virtual nonReentrant {
    require(isWlSaleEnabled, "whitelistMint is Paused");
    require(isWhitelisted(msg.sender, proof_), "You are not whitelisted!");
    require(maxMintsPerWL >= _amount, "whitelistMint: Over max mints per wallet");
    require(maxMintsPerWL >= _wlMinted[msg.sender] + _amount, "You have no whitelistMint left");
    require(msg.value == wlMintPrice * _amount, "ETH value is not correct");
    require((_amount + totalSupply()) <= (maxSupply), "No more NFTs");
    _wlMinted[msg.sender] += _amount;
    _safeMint(msg.sender, _amount);
  }
  
  //Public mint.
  function publicMint(uint256 _amount) external payable virtual nonReentrant {
    require(isPublicSaleEnabled, "publicMint is Paused");
    require(maxMintsPerPS >= _amount, "publicMint: Over max mints per wallet");
    require(maxMintsPerPS >= _psMinted[msg.sender] + _amount, "You have no publicMint left");
    require(msg.value == psMintPrice * _amount, "ETH value is not correct");
    require((_amount + totalSupply()) <= (maxSupply), "No more NFTs");
    _psMinted[msg.sender] += _amount;
    _safeMint(msg.sender, _amount);
  }

  //burn
  function burn(uint256 tokenId) external virtual {
    _burn(tokenId, true);
  }

  //receive.
  function receiveToDeb() external payable virtual nonReentrant {
      require(msg.value > 0, "ETH value is not correct");
  }

  /**
    @dev widraw ETH from this contract.only operator. 
    */
  function withdraw() external payable virtual onlyOperator nonReentrant{
    require((_aa != address(0) && _aaPerc != 0) || _aa == address(0),"please set withdraw Address_aa and percentage.");
    require((_bb != address(0) && _bbPerc != 0) || _bb == address(0),"please set withdraw Address_bb and percentage.");
    require((_cc != address(0) && _ccPerc != 0) || _cc == address(0),"please set withdraw Address_cc and percentage.");
    require((_dd != address(0) && _ddPerc != 0) || _dd == address(0),"please set withdraw Address_dd and percentage.");
    require((_ee != address(0) && _eePerc != 0) || _ee == address(0),"please set withdraw Address_ee and percentage.");
    require((_ff != address(0) && _ffPerc != 0) || _ff == address(0),"please set withdraw Address_ff and percentage.");

    uint256 _ethBalance = address(this).balance;
    bool os;
    if(_aa != address(0)){//if _aa has.
        (os, ) = payable(_aa).call{value: (_ethBalance * _aaPerc/10000)}("");
        require(os, "Failed to withdraw_aa Ether");
    }
    if(_bb != address(0)){//if _bb has.
        (os, ) = payable(_bb).call{value: (_ethBalance * _bbPerc/10000)}("");
        require(os, "Failed to withdraw_bb Ether");
    }
    if(_cc != address(0)){//if _cc has.
        (os, ) = payable(_cc).call{value: (_ethBalance * _ccPerc/10000)}("");
        require(os, "Failed to withdraw_cc Ether");
    }
    if(_dd != address(0)){//if _dd has.
        (os, ) = payable(_dd).call{value: (_ethBalance * _ddPerc/10000)}("");
        require(os, "Failed to withdraw_dd Ether");
    }
    if(_ee != address(0)){//if _ee has.
        (os, ) = payable(_ee).call{value: (_ethBalance * _eePerc/10000)}("");
        require(os, "Failed to withdraw_ee Ether");
    }
    if(_ff != address(0)){//if _ff has.
        (os, ) = payable(_ff).call{value: (_ethBalance * _ffPerc/10000)}("");
        require(os, "Failed to withdraw_ff Ether");
    }

    _ethBalance = address(this).balance;
    if(_withdrawWallet != address(0)){//if _withdrawWallet has.
        (os, ) = payable(_withdrawWallet).call{value: (_ethBalance)}("");
    }else{
        (os, ) = payable(owner()).call{value: (_ethBalance)}("");
    }
    require(os, "Failed to withdraw Ether");
  }


  //return wallet owned tokenids.
  function walletOfOwner(address _address) external view virtual returns (uint256[] memory) {
    uint256 ownerTokenCount = balanceOf(_address);
    uint256[] memory tokenIds = new uint256[](ownerTokenCount);
    //search from all tonkenid. so spend high gas values.attention.
    uint256 tokenindex = 0;
    for (uint256 i = _startTokenId(); i < _currentIndex; i++) {
      if(_address == this.tryOwnerOf(i)) tokenIds[tokenindex++] = i;
    }
    return tokenIds;
  }

  //try catch vaersion ownerOf. support burned tokenid.
  function tryOwnerOf(uint256 tokenId) external view  virtual returns (address) {
    try this.ownerOf(tokenId) returns (address _address) {
      return(_address);
    } catch {
        return (address(0));//return 0x0 if error.
    }
  }

    /**
     * @notice Set the state of the OpenSea operator filter
     * @param value Flag indicating if the operator filter should be applied to transfers and approvals
     */
    function setOperatorFilteringEnabled(bool value) external onlyOperator {
        operatorFilteringEnabled = value;
    }

    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }

    /**
        @dev Operable Role
     */
    function grantOperatorRole(address _candidate) external onlyOwner {
        _grantOperatorRole(_candidate);
    }

    function revokeOperatorRole(address _candidate) external onlyOwner {
        _revokeOperatorRole(_candidate);
    }
}
//CODE.BY.FRICKLIK

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_royaltyReceiver","type":"address"},{"internalType":"uint96","name":"_royaltyFraction","type":"uint96"},{"internalType":"address","name":"_aaAdd","type":"address"},{"internalType":"uint256","name":"_aaPercAdd","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_candidate","type":"address"}],"name":"grantOperatorRole","outputs":[],"stateMutability":"nonpayable","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":"address","name":"_operator","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWlSaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilteringEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"psMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"psMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"receiveToDeb","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_candidate","type":"address"}],"name":"revokeOperatorRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_deployer","type":"address"}],"name":"setDeployer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setHiddenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setOperatorFilteringEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setPsMaxMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPsPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setPublicSaleEnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newRevealStatus","type":"bool"}],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"setWallet__aa","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"setWallet__bb","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"setWallet__cc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"setWallet__dd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"setWallet__ee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"setWallet__ff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setWallet_aa_Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"setWallet_aa_Perc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setWallet_bb_Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"setWallet_bb_Perc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setWallet_cc_Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"setWallet_cc_Perc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setWallet_dd_Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"setWallet_dd_Perc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setWallet_ee_Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"setWallet_ee_Perc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setWallet_ff_Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"setWallet_ff_Perc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setWhitelistSaleEnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setWithdrawWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setWlMaxMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setWlMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setWlPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tryOwnerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"wlMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"wlMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

600d805460ff19166001908117909155670314b3d2e4230000600f5567049f0dbc56348000601055601181905560125560de60135560c06040526005608090815264173539b7b760d91b60a0526023906200005b90826200074c565b506024805462ff0000191690553480156200007557600080fd5b50604051620052b7380380620052b7833981016040819052620000989162000835565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280601081526020016f5a6974746f20616e642047617469746f60801b815250604051806040016040528060048152602001635a49474160e01b8152506200010f62000109620002e260201b60201c565b620002e6565b60036200011d83826200074c565b5060046200012c82826200074c565b50600180815560095550506daaeb6d7670e522a718067333cd4e3b156200027c578015620001ca57604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015620001ab57600080fd5b505af1158015620001c0573d6000803e3d6000fd5b505050506200027c565b6001600160a01b038216156200021b5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440162000190565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200026257600080fd5b505af115801562000277573d6000803e3d6000fd5b505050505b5050602480546301000000600160b81b031916336301000000810291909117909155620002a99062000336565b620002b58484620003e4565b601580546001600160a01b0319166001600160a01b039390931692909217909155601b5550620009bf9050565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381166000908152600e602052604090205460ff161562000374336001600160a01b03166014620004e560201b62002cc41760201c565b604051602001620003869190620008bb565b60405160208183030381529060405290620003bf5760405162461bcd60e51b8152600401620003b6919062000914565b60405180910390fd5b506001600160a01b03166000908152600e60205260409020805460ff19166001179055565b6127106001600160601b0382161115620004545760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401620003b6565b6001600160a01b038216620004ac5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401620003b6565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600b55565b60606000620004f68360026200095f565b6200050390600262000979565b6001600160401b038111156200051d576200051d620006a7565b6040519080825280601f01601f19166020018201604052801562000548576020820181803683370190505b509050600360fc1b816000815181106200056657620005666200098f565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106200059857620005986200098f565b60200101906001600160f81b031916908160001a9053506000620005be8460026200095f565b620005cb90600162000979565b90505b60018111156200064d576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106200060357620006036200098f565b1a60f81b8282815181106200061c576200061c6200098f565b60200101906001600160f81b031916908160001a90535060049490941c936200064581620009a5565b9050620005ce565b5083156200069e5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401620003b6565b90505b92915050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620006d257607f821691505b602082108103620006f357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200074757600081815260208120601f850160051c81016020861015620007225750805b601f850160051c820191505b8181101562000743578281556001016200072e565b5050505b505050565b81516001600160401b03811115620007685762000768620006a7565b6200078081620007798454620006bd565b84620006f9565b602080601f831160018114620007b857600084156200079f5750858301515b600019600386901b1c1916600185901b17855562000743565b600085815260208120601f198616915b82811015620007e957888601518255948401946001909101908401620007c8565b5085821015620008085787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80516001600160a01b03811681146200083057600080fd5b919050565b600080600080608085870312156200084c57600080fd5b620008578562000818565b60208601519094506001600160601b03811681146200087557600080fd5b9250620008856040860162000818565b6060959095015193969295505050565b60005b83811015620008b257818101518382015260200162000898565b50506000910152565b67030b1b1b7bab73a160c51b815260008251620008e081600885016020870162000895565b7f20697320616c72656164792068617320616e206f70657261746f7220726f6c656008939091019283015250602801919050565b60208152600082518060208401526200093581604085016020870162000895565b601f01601f19169190910160400192915050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417620006a157620006a162000949565b80820180821115620006a157620006a162000949565b634e487b7160e01b600052603260045260246000fd5b600081620009b757620009b762000949565b506000190190565b6148e880620009cf6000396000f3fe6080604052600436106104735760003560e01c806378a923801161024a578063b7c0b8e811610139578063d5d1328f116100b6578063e985e9c51161007a578063e985e9c514610dc6578063f2fde38b14610e0f578063f777070d14610e2f578063fb796e6c14610e4f578063fc639cb814610e6957600080fd5b8063d5d1328f14610d2a578063d5f3948814610d4a578063d78be71c14610d71578063da3ef23f14610d91578063e8a3d48514610db157600080fd5b8063c87b56dd116100fd578063c87b56dd14610ca1578063cbac2c4114610cc1578063d2cab05614610ce1578063d52c57e014610cf4578063d5abeb0114610d1457600080fd5b8063b7c0b8e814610c01578063b88d4fde14610c21578063bbaac02f14610c41578063bc44aa7b14610c61578063c3faf72414610c8157600080fd5b8063942958f4116101c75780639da9778c1161018b5780639da9778c14610b79578063a22cb46514610b81578063a355fd2914610ba1578063ac3a1e7714610bc1578063b219f7d714610be157600080fd5b8063942958f414610ad857806395d89b4114610b0e5780639621473514610b23578063962c167b14610b435780639970cc2914610b6357600080fd5b80638d57b01b1161020e5780638d57b01b14610a3a5780638da5cb5b14610a5a5780638dd07d0f14610a785780638ddb3d6514610a985780639373f43214610ab857600080fd5b806378a9238014610984578063813779ef146109ba578063830b3a64146109da5780638ac1e161146109fa5780638bec504014610a1a57600080fd5b80632db115441161036657806355f804b3116102e35780636d70f7ae116102a75780636d70f7ae146108d65780636f8b44b01461090f57806370a082311461092f578063715018a61461094f578063719eaef81461096457600080fd5b806355f804b31461083657806357767870146108565780635822768b146108765780635a23dd99146108965780636352211e146108b657600080fd5b806342454db91161032a57806342454db91461079357806342842e0e146107a957806342966c68146107c9578063438b6300146107e9578063518302271461081657600080fd5b80632db1154414610717578063319134171461072a5780633ccfd60b1461074a5780634009920d1461075257806341f434341461077157600080fd5b80631a09cfe2116103f457806327ac0c58116103b857806327ac0c581461066257806327d22615146106825780632a3f300c146106a25780632a55205a146106c25780632c4e9fc61461070157600080fd5b80631a09cfe2146105d757806321616b59146105ed578063235dfa501461060d57806323b872dd1461062d5780632672c9021461064d57600080fd5b80630ba205b71161043b5780630ba205b7146105495780630d9005ae1461056957806318160ddd14610588578063189f3de11461059d57806319d580a8146105b757600080fd5b806301ffc9a71461047857806304634d8d146104ad57806306fdde03146104cf578063081812fc146104f1578063095ea7b314610529575b600080fd5b34801561048457600080fd5b50610498610493366004613e0c565b610e89565b60405190151581526020015b60405180910390f35b3480156104b957600080fd5b506104cd6104c8366004613e3e565b610e9a565b005b3480156104db57600080fd5b506104e4610eb1565b6040516104a49190613ed3565b3480156104fd57600080fd5b5061051161050c366004613ee6565b610f43565b6040516001600160a01b0390911681526020016104a4565b34801561053557600080fd5b506104cd610544366004613eff565b610f87565b34801561055557600080fd5b506104cd610564366004613f2b565b611065565b34801561057557600080fd5b506001545b6040519081526020016104a4565b34801561059457600080fd5b5061057a611090565b3480156105a957600080fd5b506024546104989060ff1681565b3480156105c357600080fd5b506104cd6105d2366004613eff565b61109e565b3480156105e357600080fd5b5061057a60125481565b3480156105f957600080fd5b506104cd610608366004613f2b565b6110cd565b34801561061957600080fd5b506104cd610628366004613eff565b6110f8565b34801561063957600080fd5b506104cd610648366004613f48565b611127565b34801561065957600080fd5b506104e4611210565b34801561066e57600080fd5b506104cd61067d366004613f2b565b61129e565b34801561068e57600080fd5b506104cd61069d366004613eff565b6112b2565b3480156106ae57600080fd5b506104cd6106bd366004613f97565b6112e1565b3480156106ce57600080fd5b506106e26106dd366004613fb4565b611306565b604080516001600160a01b0390931683526020830191909152016104a4565b34801561070d57600080fd5b5061057a600f5481565b6104cd610725366004613ee6565b6113b2565b34801561073657600080fd5b506104cd610745366004613ee6565b611589565b6104cd611597565b34801561075e57600080fd5b5060245461049890610100900460ff1681565b34801561077d57600080fd5b506105116daaeb6d7670e522a718067333cd4e81565b34801561079f57600080fd5b5061057a60105481565b3480156107b557600080fd5b506104cd6107c4366004613f48565b611f3a565b3480156107d557600080fd5b506104cd6107e4366004613ee6565b612018565b3480156107f557600080fd5b50610809610804366004613f2b565b612023565b6040516104a49190613fd6565b34801561082257600080fd5b506024546104989062010000900460ff1681565b34801561084257600080fd5b506104cd6108513660046140b7565b612146565b34801561086257600080fd5b506104cd610871366004613ee6565b61215b565b34801561088257600080fd5b506104cd610891366004613eff565b612169565b3480156108a257600080fd5b506104986108b136600461417e565b612198565b3480156108c257600080fd5b506105116108d1366004613ee6565b6122bc565b3480156108e257600080fd5b506104986108f1366004613f2b565b6001600160a01b03166000908152600e602052604090205460ff1690565b34801561091b57600080fd5b506104cd61092a366004613ee6565b6122ce565b34801561093b57600080fd5b5061057a61094a366004613f2b565b612333565b34801561095b57600080fd5b506104cd612381565b34801561097057600080fd5b506104cd61097f366004613ee6565b612395565b34801561099057600080fd5b5061057a61099f366004613f2b565b6001600160a01b031660009081526025602052604090205490565b3480156109c657600080fd5b506104cd6109d5366004613ee6565b6123a3565b3480156109e657600080fd5b506105116109f5366004613ee6565b6123b1565b348015610a0657600080fd5b506104cd610a15366004613ee6565b612418565b348015610a2657600080fd5b506104cd610a35366004613eff565b61242a565b348015610a4657600080fd5b506104cd610a55366004613ee6565b612459565b348015610a6657600080fd5b506000546001600160a01b0316610511565b348015610a8457600080fd5b506104cd610a93366004613ee6565b612467565b348015610aa457600080fd5b506104cd610ab3366004613ee6565b612475565b348015610ac457600080fd5b506104cd610ad3366004613f2b565b612483565b348015610ae457600080fd5b5061057a610af3366004613f2b565b6001600160a01b031660009081526026602052604090205490565b348015610b1a57600080fd5b506104e46124ae565b348015610b2f57600080fd5b506104cd610b3e366004613f2b565b6124bd565b348015610b4f57600080fd5b506104cd610b5e366004613eff565b6124f2565b348015610b6f57600080fd5b5061057a60115481565b6104cd612521565b348015610b8d57600080fd5b506104cd610b9c3660046141cd565b61256c565b348015610bad57600080fd5b506104cd610bbc366004613f97565b612640565b348015610bcd57600080fd5b506104cd610bdc366004613f2b565b612663565b348015610bed57600080fd5b506104cd610bfc366004613f2b565b61268e565b348015610c0d57600080fd5b506104cd610c1c366004613f97565b61269f565b348015610c2d57600080fd5b506104cd610c3c3660046141fb565b6126bb565b348015610c4d57600080fd5b506104cd610c5c3660046140b7565b6127a7565b348015610c6d57600080fd5b506104cd610c7c366004613f2b565b6127bc565b348015610c8d57600080fd5b506104cd610c9c366004613f97565b6127e7565b348015610cad57600080fd5b506104e4610cbc366004613ee6565b612803565b348015610ccd57600080fd5b506104cd610cdc366004613ee6565b612938565b6104cd610cef36600461427a565b612946565b348015610d0057600080fd5b506104cd610d0f3660046142aa565b612b72565b348015610d2057600080fd5b5061057a60135481565b348015610d3657600080fd5b506104cd610d45366004613f2b565b612bb8565b348015610d5657600080fd5b5060245461051190630100000090046001600160a01b031681565b348015610d7d57600080fd5b506104cd610d8c366004613ee6565b612be3565b348015610d9d57600080fd5b506104cd610dac3660046140b7565b612bf1565b348015610dbd57600080fd5b506104e4612c06565b348015610dd257600080fd5b50610498610de13660046142cf565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b348015610e1b57600080fd5b506104cd610e2a366004613f2b565b612c15565b348015610e3b57600080fd5b506104cd610e4a366004613f2b565b612c8b565b348015610e5b57600080fd5b50600d546104989060ff1681565b348015610e7557600080fd5b506104cd610e84366004613ee6565b612cb6565b6000610e9482612e66565b92915050565b610ea333612e8b565b610ead8282612ef9565b5050565b606060038054610ec0906142fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610eec906142fd565b8015610f395780601f10610f0e57610100808354040283529160200191610f39565b820191906000526020600020905b815481529060010190602001808311610f1c57829003601f168201915b5050505050905090565b6000610f4e82612ff6565b610f6b576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b15801590610fa85750600d5460ff165b1561105657604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611005573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110299190614337565b61105657604051633b79c77360e21b81526001600160a01b03821660048201526024015b60405180910390fd5b611060838361302f565b505050565b61106e33612e8b565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b600254600154036000190190565b6110a733612e8b565b601780546001600160a01b0319166001600160a01b039390931692909217909155601d55565b6110d633612e8b565b601980546001600160a01b0319166001600160a01b0392909216919091179055565b61110133612e8b565b601980546001600160a01b0319166001600160a01b039390931692909217909155601f55565b826daaeb6d7670e522a718067333cd4e3b158015906111485750600d5460ff165b156111ff57336001600160a01b0382160361116d576111688484846130b0565b61120a565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156111bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e09190614337565b6111ff57604051633b79c77360e21b815233600482015260240161104d565b61120a8484846130b0565b50505050565b6023805461121d906142fd565b80601f0160208091040260200160405190810160405280929190818152602001828054611249906142fd565b80156112965780601f1061126b57610100808354040283529160200191611296565b820191906000526020600020905b81548152906001019060200180831161127957829003601f168201915b505050505081565b6112a66130bb565b6112af81613115565b50565b6112bb33612e8b565b601680546001600160a01b0319166001600160a01b039390931692909217909155601c55565b6112ea33612e8b565b60248054911515620100000262ff000019909216919091179055565b6000828152600c602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b031692820192909252829161137b575060408051808201909152600b546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101516000906127109061139a906001600160601b03168761436a565b6113a49190614397565b915196919550909350505050565b6002600954036113d45760405162461bcd60e51b815260040161104d906143ab565b6002600955602454610100900460ff166114275760405162461bcd60e51b81526020600482015260146024820152731c1d589b1a58d35a5b9d081a5cc814185d5cd95960621b604482015260640161104d565b8060125410156114875760405162461bcd60e51b815260206004820152602560248201527f7075626c69634d696e743a204f766572206d6178206d696e7473207065722077604482015264185b1b195d60da1b606482015260840161104d565b336000908152602660205260409020546114a29082906143e2565b60125410156114f35760405162461bcd60e51b815260206004820152601b60248201527f596f752068617665206e6f207075626c69634d696e74206c6566740000000000604482015260640161104d565b80601054611501919061436a565b341461151f5760405162461bcd60e51b815260040161104d906143f5565b60135461152a611090565b61153490836143e2565b11156115525760405162461bcd60e51b815260040161104d9061442c565b33600090815260266020526040812080548392906115719084906143e2565b909155506115819050338261319d565b506001600955565b61159233612e8b565b601e55565b6115a033612e8b565b6002600954036115c25760405162461bcd60e51b815260040161104d906143ab565b60026009556015546001600160a01b0316158015906115e25750601b5415155b806115f657506015546001600160a01b0316155b6116595760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6161206160448201526d3732103832b931b2b73a30b3b29760911b606482015260840161104d565b6016546001600160a01b0316158015906116745750601c5415155b8061168857506016546001600160a01b0316155b6116eb5760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6262206160448201526d3732103832b931b2b73a30b3b29760911b606482015260840161104d565b6017546001600160a01b0316158015906117065750601d5415155b8061171a57506017546001600160a01b0316155b61177d5760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6363206160448201526d3732103832b931b2b73a30b3b29760911b606482015260840161104d565b6018546001600160a01b0316158015906117985750601e5415155b806117ac57506018546001600160a01b0316155b61180f5760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6464206160448201526d3732103832b931b2b73a30b3b29760911b606482015260840161104d565b6019546001600160a01b03161580159061182a5750601f5415155b8061183e57506019546001600160a01b0316155b6118a15760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6565206160448201526d3732103832b931b2b73a30b3b29760911b606482015260840161104d565b601a546001600160a01b0316158015906118bc575060205415155b806118d05750601a546001600160a01b0316155b6119335760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6666206160448201526d3732103832b931b2b73a30b3b29760911b606482015260840161104d565b60155447906000906001600160a01b031615611a0757601554601b546001600160a01b039091169061271090611969908561436a565b6119739190614397565b604051600081818185875af1925050503d80600081146119af576040519150601f19603f3d011682016040523d82523d6000602084013e6119b4565b606091505b50508091505080611a075760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f61612045746865720000000000604482015260640161104d565b6016546001600160a01b031615611ad657601654601c546001600160a01b039091169061271090611a38908561436a565b611a429190614397565b604051600081818185875af1925050503d8060008114611a7e576040519150601f19603f3d011682016040523d82523d6000602084013e611a83565b606091505b50508091505080611ad65760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f62622045746865720000000000604482015260640161104d565b6017546001600160a01b031615611ba557601754601d546001600160a01b039091169061271090611b07908561436a565b611b119190614397565b604051600081818185875af1925050503d8060008114611b4d576040519150601f19603f3d011682016040523d82523d6000602084013e611b52565b606091505b50508091505080611ba55760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f63632045746865720000000000604482015260640161104d565b6018546001600160a01b031615611c7457601854601e546001600160a01b039091169061271090611bd6908561436a565b611be09190614397565b604051600081818185875af1925050503d8060008114611c1c576040519150601f19603f3d011682016040523d82523d6000602084013e611c21565b606091505b50508091505080611c745760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f64642045746865720000000000604482015260640161104d565b6019546001600160a01b031615611d4357601954601f546001600160a01b039091169061271090611ca5908561436a565b611caf9190614397565b604051600081818185875af1925050503d8060008114611ceb576040519150601f19603f3d011682016040523d82523d6000602084013e611cf0565b606091505b50508091505080611d435760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f65652045746865720000000000604482015260640161104d565b601a546001600160a01b031615611e1257601a546020546001600160a01b039091169061271090611d74908561436a565b611d7e9190614397565b604051600081818185875af1925050503d8060008114611dba576040519150601f19603f3d011682016040523d82523d6000602084013e611dbf565b606091505b50508091505080611e125760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f66662045746865720000000000604482015260640161104d565b6014544792506001600160a01b031615611e83576014546040516001600160a01b03909116908390600081818185875af1925050503d8060008114611e73576040519150601f19603f3d011682016040523d82523d6000602084013e611e78565b606091505b505080915050611ee4565b6000546001600160a01b03166001600160a01b03168260405160006040518083038185875af1925050503d8060008114611ed9576040519150601f19603f3d011682016040523d82523d6000602084013e611ede565b606091505b50909150505b80611f315760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f2077697468647261772045746865720000000000000000604482015260640161104d565b50506001600955565b826daaeb6d7670e522a718067333cd4e3b15801590611f5b5750600d5460ff165b1561200d57336001600160a01b03821603611f7b576111688484846131b7565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611fca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fee9190614337565b61200d57604051633b79c77360e21b815233600482015260240161104d565b61120a8484846131b7565b6112af8160016131d2565b6060600061203083612333565b90506000816001600160401b0381111561204c5761204c61401a565b604051908082528060200260200182016040528015612075578160200160208202803683370190505b509050600060015b60015481101561213c576040516320c2ce9960e21b815260048101829052309063830b3a6490602401602060405180830381865afa1580156120c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e79190614452565b6001600160a01b0316866001600160a01b03160361212a5780838361210b8161446f565b94508151811061211d5761211d614488565b6020026020010181815250505b806121348161446f565b91505061207d565b5090949350505050565b61214f33612e8b565b6022610ead82826144ec565b61216433612e8b565b601c55565b61217233612e8b565b601880546001600160a01b0319166001600160a01b039390931692909217909155601e55565b6040516bffffffffffffffffffffffff19606084901b166020820152600090819060340160405160208183030381529060405280519060200120905060005b83518110156122b0578381815181106121f2576121f2614488565b602002602001015182106122505783818151811061221257612212614488565b602002602001015182604051602001612235929190918252602082015260400190565b6040516020818303038152906040528051906020012061229c565b8184828151811061226357612263614488565b6020026020010151604051602001612285929190918252602082015260400190565b604051602081830303815290604052805190602001205b9150806122a88161446f565b9150506121d7565b50600a54149392505050565b60006122c782613386565b5192915050565b6122d733612e8b565b806122e0611090565b111561232e5760405162461bcd60e51b815260206004820152601960248201527f4c6f776572207468616e205f63757272656e74496e6465782e00000000000000604482015260640161104d565b601355565b60006001600160a01b03821661235c576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b6123896130bb565b61239360006134a8565b565b61239e33612e8b565b601155565b6123ac33612e8b565b601255565b6040516331a9108f60e11b8152600481018290526000903090636352211e90602401602060405180830381865afa92505050801561240c575060408051601f3d908101601f1916820190925261240991810190614452565b60015b610e9457506000919050565b61242133612e8b565b6112af81600a55565b61243333612e8b565b601580546001600160a01b0319166001600160a01b039390931692909217909155601b55565b61246233612e8b565b601d55565b61247033612e8b565b600f55565b61247e33612e8b565b601b55565b61248c33612e8b565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b606060048054610ec0906142fd565b6124c633612e8b565b602480546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b6124fb33612e8b565b601a80546001600160a01b0319166001600160a01b039390931692909217909155602055565b6002600954036125435760405162461bcd60e51b815260040161104d906143ab565b6002600955346125655760405162461bcd60e51b815260040161104d906143f5565b6001600955565b816daaeb6d7670e522a718067333cd4e3b1580159061258d5750600d5460ff165b1561263657604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156125ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061260e9190614337565b61263657604051633b79c77360e21b81526001600160a01b038216600482015260240161104d565b61106083836134f8565b61264933612e8b565b602480549115156101000261ff0019909216919091179055565b61266c33612e8b565b601a80546001600160a01b0319166001600160a01b0392909216919091179055565b6126966130bb565b6112af8161358d565b6126a833612e8b565b600d805460ff1916911515919091179055565b836daaeb6d7670e522a718067333cd4e3b158015906126dc5750600d5460ff165b1561279457336001600160a01b03821603612702576126fd858585856135b7565b6127a0565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612751573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127759190614337565b61279457604051633b79c77360e21b815233600482015260240161104d565b6127a0858585856135b7565b5050505050565b6127b033612e8b565b6021610ead82826144ec565b6127c533612e8b565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6127f033612e8b565b6024805460ff1916911515919091179055565b606061280e82612ff6565b61285a5760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00604482015260640161104d565b60245462010000900460ff16156128a6576128736135fb565b61287c8361360a565b6023604051602001612890939291906145ab565b6040516020818303038152906040529050919050565b602180546128b3906142fd565b80601f01602080910402602001604051908101604052809291908181526020018280546128df906142fd565b801561292c5780601f106129015761010080835404028352916020019161292c565b820191906000526020600020905b81548152906001019060200180831161290f57829003601f168201915b50505050509050919050565b61294133612e8b565b601f55565b6002600954036129685760405162461bcd60e51b815260040161104d906143ab565b600260095560245460ff166129bf5760405162461bcd60e51b815260206004820152601760248201527f77686974656c6973744d696e7420697320506175736564000000000000000000604482015260640161104d565b6129c93382612198565b612a155760405162461bcd60e51b815260206004820152601860248201527f596f7520617265206e6f742077686974656c6973746564210000000000000000604482015260640161104d565b816011541015612a785760405162461bcd60e51b815260206004820152602860248201527f77686974656c6973744d696e743a204f766572206d6178206d696e74732070656044820152671c881dd85b1b195d60c21b606482015260840161104d565b33600090815260256020526040902054612a939083906143e2565b6011541015612ae45760405162461bcd60e51b815260206004820152601e60248201527f596f752068617665206e6f2077686974656c6973744d696e74206c6566740000604482015260640161104d565b81600f54612af2919061436a565b3414612b105760405162461bcd60e51b815260040161104d906143f5565b601354612b1b611090565b612b2590846143e2565b1115612b435760405162461bcd60e51b815260040161104d9061442c565b3360009081526025602052604081208054849290612b629084906143e2565b90915550611f319050338361319d565b612b7b33612e8b565b601354612b86611090565b612b9090846143e2565b1115612bae5760405162461bcd60e51b815260040161104d9061442c565b610ead818361319d565b612bc133612e8b565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b612bec33612e8b565b601055565b612bfa33612e8b565b6023610ead82826144ec565b6060612c10613712565b905090565b612c1d6130bb565b6001600160a01b038116612c825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161104d565b6112af816134a8565b612c9433612e8b565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b612cbf33612e8b565b602055565b60606000612cd383600261436a565b612cde9060026143e2565b6001600160401b03811115612cf557612cf561401a565b6040519080825280601f01601f191660200182016040528015612d1f576020820181803683370190505b509050600360fc1b81600081518110612d3a57612d3a614488565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612d6957612d69614488565b60200101906001600160f81b031916908160001a9053506000612d8d84600261436a565b612d989060016143e2565b90505b6001811115612e10576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612dcc57612dcc614488565b1a60f81b828281518110612de257612de2614488565b60200101906001600160f81b031916908160001a90535060049490941c93612e098161464b565b9050612d9b565b508315612e5f5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161104d565b9392505050565b60006001600160e01b0319821663152a902d60e11b1480610e945750610e9482613792565b6001600160a01b0381166000908152600e602052604090205460ff16612ebc335b6001600160a01b03166014612cc4565b604051602001612ecc9190614662565b60405160208183030381529060405290610ead5760405162461bcd60e51b815260040161104d9190613ed3565b6127106001600160601b0382161115612f675760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b606482015260840161104d565b6001600160a01b038216612fbd5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640161104d565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600b55565b60008160011115801561300a575060015482105b8015610e94575050600090815260056020526040902054600160e01b900460ff161590565b600061303a826122bc565b9050806001600160a01b0316836001600160a01b03160361306e5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216146130a5576130888133610de1565b6130a5576040516367d9dca160e11b815260040160405180910390fd5b6110608383836137e2565b61106083838361383e565b6000546001600160a01b031633146123935760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161104d565b6001600160a01b0381166000908152600e602052604090205460ff161561313b33612eac565b60405160200161314b91906146af565b604051602081830303815290604052906131785760405162461bcd60e51b815260040161104d9190613ed3565b506001600160a01b03166000908152600e60205260409020805460ff19166001179055565b610ead828260405180602001604052806000815250613a17565b611060838383604051806020016040528060008152506126bb565b60006131dd83613386565b80519091508215613243576000336001600160a01b038316148061320657506132068233610de1565b8061322157503361321686610f43565b6001600160a01b0316145b90508061324157604051632ce44b5f60e11b815260040160405180910390fd5b505b61324f600085836137e2565b6001600160a01b0380821660008181526006602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526005909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b17855591890180845292208054919490911661334d57600154821461334d57805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b03841690600080516020614893833981519152908390a450506002805460010190555050565b6040805160608101825260008082526020820181905291810191909152818060011161348f5760015481101561348f57600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529061348d5780516001600160a01b031615613424579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215613488579392505050565b613424565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b336001600160a01b038316036135215760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61359681612e8b565b6001600160a01b03166000908152600e60205260409020805460ff19169055565b6135c284848461383e565b6001600160a01b0383163b1561120a576135de84848484613bb9565b61120a576040516368d2bf6b60e11b815260040160405180910390fd5b606060228054610ec0906142fd565b6060816000036136315750506040805180820190915260018152600360fc1b602082015290565b8160005b811561365b57806136458161446f565b91506136549050600a83614397565b9150613635565b6000816001600160401b038111156136755761367561401a565b6040519080825280601f01601f19166020018201604052801561369f576020820181803683370190505b5090505b841561370a576136b4600183614706565b91506136c1600a86614719565b6136cc9060306143e2565b60f81b8183815181106136e1576136e1614488565b60200101906001600160f81b031916908160001a905350613703600a86614397565b94506136a3565b949350505050565b606060008061372381612710611306565b9150915061376c6137338261360a565b613747846001600160a01b03166014612cc4565b60405160200161375892919061472d565b604051602081830303815290604052613ca4565b60405160200161377c91906147b3565b6040516020818303038152906040529250505090565b60006001600160e01b031982166380ac58cd60e01b14806137c357506001600160e01b03198216635b5e139f60e01b145b80610e9457506301ffc9a760e01b6001600160e01b0319831614610e94565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061384982613386565b9050836001600160a01b031681600001516001600160a01b0316146138805760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061389e575061389e8533610de1565b806138b95750336138ae84610f43565b6001600160a01b0316145b9050806138d957604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661390057604051633a954ecd60e21b815260040160405180910390fd5b61390c600084876137e2565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166139e05760015482146139e057805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b031660008051602061489383398151915260405160405180910390a46127a0565b6001546001600160a01b038416613a4057604051622e076360e81b815260040160405180910390fd5b82600003613a615760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600590925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15613b77575b60405182906001600160a01b03881690600090600080516020614893833981519152908290a4613b406000878480600101955087613bb9565b613b5d576040516368d2bf6b60e11b815260040160405180910390fd5b808210613b07578260015414613b7257600080fd5b613baa565b5b6040516001830192906001600160a01b03881690600090600080516020614893833981519152908290a4808210613b78575b5060015561120a600085838684565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290613bee9033908990889088906004016147f8565b6020604051808303816000875af1925050508015613c29575060408051601f3d908101601f19168201909252613c2691810190614835565b60015b613c87573d808015613c57576040519150601f19603f3d011682016040523d82523d6000602084013e613c5c565b606091505b508051600003613c7f576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60608151600003613cc357505060408051602081019091526000815290565b60006040518060600160405280604081526020016148536040913990506000600384516002613cf291906143e2565b613cfc9190614397565b613d0790600461436a565b6001600160401b03811115613d1e57613d1e61401a565b6040519080825280601f01601f191660200182016040528015613d48576020820181803683370190505b509050600182016020820185865187015b80821015613db4576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250613d59565b5050600386510660018114613dd05760028114613de357613deb565b603d6001830353603d6002830353613deb565b603d60018303535b509195945050505050565b6001600160e01b0319811681146112af57600080fd5b600060208284031215613e1e57600080fd5b8135612e5f81613df6565b6001600160a01b03811681146112af57600080fd5b60008060408385031215613e5157600080fd5b8235613e5c81613e29565b915060208301356001600160601b0381168114613e7857600080fd5b809150509250929050565b60005b83811015613e9e578181015183820152602001613e86565b50506000910152565b60008151808452613ebf816020860160208601613e83565b601f01601f19169290920160200192915050565b602081526000612e5f6020830184613ea7565b600060208284031215613ef857600080fd5b5035919050565b60008060408385031215613f1257600080fd5b8235613f1d81613e29565b946020939093013593505050565b600060208284031215613f3d57600080fd5b8135612e5f81613e29565b600080600060608486031215613f5d57600080fd5b8335613f6881613e29565b92506020840135613f7881613e29565b929592945050506040919091013590565b80151581146112af57600080fd5b600060208284031215613fa957600080fd5b8135612e5f81613f89565b60008060408385031215613fc757600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b8181101561400e57835183529284019291840191600101613ff2565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156140585761405861401a565b604052919050565b60006001600160401b038311156140795761407961401a565b61408c601f8401601f1916602001614030565b90508281528383830111156140a057600080fd5b828260208301376000602084830101529392505050565b6000602082840312156140c957600080fd5b81356001600160401b038111156140df57600080fd5b8201601f810184136140f057600080fd5b61370a84823560208401614060565b600082601f83011261411057600080fd5b813560206001600160401b0382111561412b5761412b61401a565b8160051b61413a828201614030565b928352848101820192828101908785111561415457600080fd5b83870192505b848310156141735782358252918301919083019061415a565b979650505050505050565b6000806040838503121561419157600080fd5b823561419c81613e29565b915060208301356001600160401b038111156141b757600080fd5b6141c3858286016140ff565b9150509250929050565b600080604083850312156141e057600080fd5b82356141eb81613e29565b91506020830135613e7881613f89565b6000806000806080858703121561421157600080fd5b843561421c81613e29565b9350602085013561422c81613e29565b92506040850135915060608501356001600160401b0381111561424e57600080fd5b8501601f8101871361425f57600080fd5b61426e87823560208401614060565b91505092959194509250565b6000806040838503121561428d57600080fd5b8235915060208301356001600160401b038111156141b757600080fd5b600080604083850312156142bd57600080fd5b823591506020830135613e7881613e29565b600080604083850312156142e257600080fd5b82356142ed81613e29565b91506020830135613e7881613e29565b600181811c9082168061431157607f821691505b60208210810361433157634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561434957600080fd5b8151612e5f81613f89565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610e9457610e94614354565b634e487b7160e01b600052601260045260246000fd5b6000826143a6576143a6614381565b500490565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b80820180821115610e9457610e94614354565b60208082526018908201527f4554482076616c7565206973206e6f7420636f72726563740000000000000000604082015260600190565b6020808252600c908201526b4e6f206d6f7265204e46547360a01b604082015260600190565b60006020828403121561446457600080fd5b8151612e5f81613e29565b60006001820161448157614481614354565b5060010190565b634e487b7160e01b600052603260045260246000fd5b601f82111561106057600081815260208120601f850160051c810160208610156144c55750805b601f850160051c820191505b818110156144e4578281556001016144d1565b505050505050565b81516001600160401b038111156145055761450561401a565b6145198161451384546142fd565b8461449e565b602080601f83116001811461454e57600084156145365750858301515b600019600386901b1c1916600185901b1785556144e4565b600085815260208120601f198616915b8281101561457d5788860151825594840194600190910190840161455e565b508582101561459b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000845160206145be8285838a01613e83565b8551918401916145d18184848a01613e83565b85549201916000906145e2816142fd565b600182811680156145fa576001811461460f5761463b565b60ff198416875282151583028701945061463b565b896000528560002060005b848110156146335781548982015290830190870161461a565b505082870194505b50929a9950505050505050505050565b60008161465a5761465a614354565b506000190190565b67030b1b1b7bab73a160c51b815260008251614685816008850160208701613e83565b721034b9903737ba1030b71037b832b930ba37b960691b6008939091019283015250601b01919050565b67030b1b1b7bab73a160c51b8152600082516146d2816008850160208701613e83565b7f20697320616c72656164792068617320616e206f70657261746f7220726f6c656008939091019283015250602801919050565b81810381811115610e9457610e94614354565b60008261472857614728614381565b500690565b7f7b2273656c6c65725f6665655f62617369735f706f696e7473223a000000000081526000835161476581601b850160208801613e83565b721610113332b2afb932b1b4b834b2b73a111d1160691b601b91840191820152835161479881602e840160208801613e83565b61227d60f01b602e9290910191820152603001949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516147eb81601d850160208701613e83565b91909101601d0192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061482b90830184613ea7565b9695505050505050565b60006020828403121561484757600080fd5b8151612e5f81613df656fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220d3055fd19f6c631e0d3912d1d66c9abb0649659fb815368bff8115a589a6726364736f6c63430008110033000000000000000000000000d3b5181851a7d69b62aa47bb766c25a323a7056300000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000637d25d0769f747b2742a04d249802da8539597000000000000000000000000000000000000000000000000000000000000005dc

Deployed Bytecode

0x6080604052600436106104735760003560e01c806378a923801161024a578063b7c0b8e811610139578063d5d1328f116100b6578063e985e9c51161007a578063e985e9c514610dc6578063f2fde38b14610e0f578063f777070d14610e2f578063fb796e6c14610e4f578063fc639cb814610e6957600080fd5b8063d5d1328f14610d2a578063d5f3948814610d4a578063d78be71c14610d71578063da3ef23f14610d91578063e8a3d48514610db157600080fd5b8063c87b56dd116100fd578063c87b56dd14610ca1578063cbac2c4114610cc1578063d2cab05614610ce1578063d52c57e014610cf4578063d5abeb0114610d1457600080fd5b8063b7c0b8e814610c01578063b88d4fde14610c21578063bbaac02f14610c41578063bc44aa7b14610c61578063c3faf72414610c8157600080fd5b8063942958f4116101c75780639da9778c1161018b5780639da9778c14610b79578063a22cb46514610b81578063a355fd2914610ba1578063ac3a1e7714610bc1578063b219f7d714610be157600080fd5b8063942958f414610ad857806395d89b4114610b0e5780639621473514610b23578063962c167b14610b435780639970cc2914610b6357600080fd5b80638d57b01b1161020e5780638d57b01b14610a3a5780638da5cb5b14610a5a5780638dd07d0f14610a785780638ddb3d6514610a985780639373f43214610ab857600080fd5b806378a9238014610984578063813779ef146109ba578063830b3a64146109da5780638ac1e161146109fa5780638bec504014610a1a57600080fd5b80632db115441161036657806355f804b3116102e35780636d70f7ae116102a75780636d70f7ae146108d65780636f8b44b01461090f57806370a082311461092f578063715018a61461094f578063719eaef81461096457600080fd5b806355f804b31461083657806357767870146108565780635822768b146108765780635a23dd99146108965780636352211e146108b657600080fd5b806342454db91161032a57806342454db91461079357806342842e0e146107a957806342966c68146107c9578063438b6300146107e9578063518302271461081657600080fd5b80632db1154414610717578063319134171461072a5780633ccfd60b1461074a5780634009920d1461075257806341f434341461077157600080fd5b80631a09cfe2116103f457806327ac0c58116103b857806327ac0c581461066257806327d22615146106825780632a3f300c146106a25780632a55205a146106c25780632c4e9fc61461070157600080fd5b80631a09cfe2146105d757806321616b59146105ed578063235dfa501461060d57806323b872dd1461062d5780632672c9021461064d57600080fd5b80630ba205b71161043b5780630ba205b7146105495780630d9005ae1461056957806318160ddd14610588578063189f3de11461059d57806319d580a8146105b757600080fd5b806301ffc9a71461047857806304634d8d146104ad57806306fdde03146104cf578063081812fc146104f1578063095ea7b314610529575b600080fd5b34801561048457600080fd5b50610498610493366004613e0c565b610e89565b60405190151581526020015b60405180910390f35b3480156104b957600080fd5b506104cd6104c8366004613e3e565b610e9a565b005b3480156104db57600080fd5b506104e4610eb1565b6040516104a49190613ed3565b3480156104fd57600080fd5b5061051161050c366004613ee6565b610f43565b6040516001600160a01b0390911681526020016104a4565b34801561053557600080fd5b506104cd610544366004613eff565b610f87565b34801561055557600080fd5b506104cd610564366004613f2b565b611065565b34801561057557600080fd5b506001545b6040519081526020016104a4565b34801561059457600080fd5b5061057a611090565b3480156105a957600080fd5b506024546104989060ff1681565b3480156105c357600080fd5b506104cd6105d2366004613eff565b61109e565b3480156105e357600080fd5b5061057a60125481565b3480156105f957600080fd5b506104cd610608366004613f2b565b6110cd565b34801561061957600080fd5b506104cd610628366004613eff565b6110f8565b34801561063957600080fd5b506104cd610648366004613f48565b611127565b34801561065957600080fd5b506104e4611210565b34801561066e57600080fd5b506104cd61067d366004613f2b565b61129e565b34801561068e57600080fd5b506104cd61069d366004613eff565b6112b2565b3480156106ae57600080fd5b506104cd6106bd366004613f97565b6112e1565b3480156106ce57600080fd5b506106e26106dd366004613fb4565b611306565b604080516001600160a01b0390931683526020830191909152016104a4565b34801561070d57600080fd5b5061057a600f5481565b6104cd610725366004613ee6565b6113b2565b34801561073657600080fd5b506104cd610745366004613ee6565b611589565b6104cd611597565b34801561075e57600080fd5b5060245461049890610100900460ff1681565b34801561077d57600080fd5b506105116daaeb6d7670e522a718067333cd4e81565b34801561079f57600080fd5b5061057a60105481565b3480156107b557600080fd5b506104cd6107c4366004613f48565b611f3a565b3480156107d557600080fd5b506104cd6107e4366004613ee6565b612018565b3480156107f557600080fd5b50610809610804366004613f2b565b612023565b6040516104a49190613fd6565b34801561082257600080fd5b506024546104989062010000900460ff1681565b34801561084257600080fd5b506104cd6108513660046140b7565b612146565b34801561086257600080fd5b506104cd610871366004613ee6565b61215b565b34801561088257600080fd5b506104cd610891366004613eff565b612169565b3480156108a257600080fd5b506104986108b136600461417e565b612198565b3480156108c257600080fd5b506105116108d1366004613ee6565b6122bc565b3480156108e257600080fd5b506104986108f1366004613f2b565b6001600160a01b03166000908152600e602052604090205460ff1690565b34801561091b57600080fd5b506104cd61092a366004613ee6565b6122ce565b34801561093b57600080fd5b5061057a61094a366004613f2b565b612333565b34801561095b57600080fd5b506104cd612381565b34801561097057600080fd5b506104cd61097f366004613ee6565b612395565b34801561099057600080fd5b5061057a61099f366004613f2b565b6001600160a01b031660009081526025602052604090205490565b3480156109c657600080fd5b506104cd6109d5366004613ee6565b6123a3565b3480156109e657600080fd5b506105116109f5366004613ee6565b6123b1565b348015610a0657600080fd5b506104cd610a15366004613ee6565b612418565b348015610a2657600080fd5b506104cd610a35366004613eff565b61242a565b348015610a4657600080fd5b506104cd610a55366004613ee6565b612459565b348015610a6657600080fd5b506000546001600160a01b0316610511565b348015610a8457600080fd5b506104cd610a93366004613ee6565b612467565b348015610aa457600080fd5b506104cd610ab3366004613ee6565b612475565b348015610ac457600080fd5b506104cd610ad3366004613f2b565b612483565b348015610ae457600080fd5b5061057a610af3366004613f2b565b6001600160a01b031660009081526026602052604090205490565b348015610b1a57600080fd5b506104e46124ae565b348015610b2f57600080fd5b506104cd610b3e366004613f2b565b6124bd565b348015610b4f57600080fd5b506104cd610b5e366004613eff565b6124f2565b348015610b6f57600080fd5b5061057a60115481565b6104cd612521565b348015610b8d57600080fd5b506104cd610b9c3660046141cd565b61256c565b348015610bad57600080fd5b506104cd610bbc366004613f97565b612640565b348015610bcd57600080fd5b506104cd610bdc366004613f2b565b612663565b348015610bed57600080fd5b506104cd610bfc366004613f2b565b61268e565b348015610c0d57600080fd5b506104cd610c1c366004613f97565b61269f565b348015610c2d57600080fd5b506104cd610c3c3660046141fb565b6126bb565b348015610c4d57600080fd5b506104cd610c5c3660046140b7565b6127a7565b348015610c6d57600080fd5b506104cd610c7c366004613f2b565b6127bc565b348015610c8d57600080fd5b506104cd610c9c366004613f97565b6127e7565b348015610cad57600080fd5b506104e4610cbc366004613ee6565b612803565b348015610ccd57600080fd5b506104cd610cdc366004613ee6565b612938565b6104cd610cef36600461427a565b612946565b348015610d0057600080fd5b506104cd610d0f3660046142aa565b612b72565b348015610d2057600080fd5b5061057a60135481565b348015610d3657600080fd5b506104cd610d45366004613f2b565b612bb8565b348015610d5657600080fd5b5060245461051190630100000090046001600160a01b031681565b348015610d7d57600080fd5b506104cd610d8c366004613ee6565b612be3565b348015610d9d57600080fd5b506104cd610dac3660046140b7565b612bf1565b348015610dbd57600080fd5b506104e4612c06565b348015610dd257600080fd5b50610498610de13660046142cf565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b348015610e1b57600080fd5b506104cd610e2a366004613f2b565b612c15565b348015610e3b57600080fd5b506104cd610e4a366004613f2b565b612c8b565b348015610e5b57600080fd5b50600d546104989060ff1681565b348015610e7557600080fd5b506104cd610e84366004613ee6565b612cb6565b6000610e9482612e66565b92915050565b610ea333612e8b565b610ead8282612ef9565b5050565b606060038054610ec0906142fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610eec906142fd565b8015610f395780601f10610f0e57610100808354040283529160200191610f39565b820191906000526020600020905b815481529060010190602001808311610f1c57829003601f168201915b5050505050905090565b6000610f4e82612ff6565b610f6b576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b15801590610fa85750600d5460ff165b1561105657604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611005573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110299190614337565b61105657604051633b79c77360e21b81526001600160a01b03821660048201526024015b60405180910390fd5b611060838361302f565b505050565b61106e33612e8b565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b600254600154036000190190565b6110a733612e8b565b601780546001600160a01b0319166001600160a01b039390931692909217909155601d55565b6110d633612e8b565b601980546001600160a01b0319166001600160a01b0392909216919091179055565b61110133612e8b565b601980546001600160a01b0319166001600160a01b039390931692909217909155601f55565b826daaeb6d7670e522a718067333cd4e3b158015906111485750600d5460ff165b156111ff57336001600160a01b0382160361116d576111688484846130b0565b61120a565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156111bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e09190614337565b6111ff57604051633b79c77360e21b815233600482015260240161104d565b61120a8484846130b0565b50505050565b6023805461121d906142fd565b80601f0160208091040260200160405190810160405280929190818152602001828054611249906142fd565b80156112965780601f1061126b57610100808354040283529160200191611296565b820191906000526020600020905b81548152906001019060200180831161127957829003601f168201915b505050505081565b6112a66130bb565b6112af81613115565b50565b6112bb33612e8b565b601680546001600160a01b0319166001600160a01b039390931692909217909155601c55565b6112ea33612e8b565b60248054911515620100000262ff000019909216919091179055565b6000828152600c602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b031692820192909252829161137b575060408051808201909152600b546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101516000906127109061139a906001600160601b03168761436a565b6113a49190614397565b915196919550909350505050565b6002600954036113d45760405162461bcd60e51b815260040161104d906143ab565b6002600955602454610100900460ff166114275760405162461bcd60e51b81526020600482015260146024820152731c1d589b1a58d35a5b9d081a5cc814185d5cd95960621b604482015260640161104d565b8060125410156114875760405162461bcd60e51b815260206004820152602560248201527f7075626c69634d696e743a204f766572206d6178206d696e7473207065722077604482015264185b1b195d60da1b606482015260840161104d565b336000908152602660205260409020546114a29082906143e2565b60125410156114f35760405162461bcd60e51b815260206004820152601b60248201527f596f752068617665206e6f207075626c69634d696e74206c6566740000000000604482015260640161104d565b80601054611501919061436a565b341461151f5760405162461bcd60e51b815260040161104d906143f5565b60135461152a611090565b61153490836143e2565b11156115525760405162461bcd60e51b815260040161104d9061442c565b33600090815260266020526040812080548392906115719084906143e2565b909155506115819050338261319d565b506001600955565b61159233612e8b565b601e55565b6115a033612e8b565b6002600954036115c25760405162461bcd60e51b815260040161104d906143ab565b60026009556015546001600160a01b0316158015906115e25750601b5415155b806115f657506015546001600160a01b0316155b6116595760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6161206160448201526d3732103832b931b2b73a30b3b29760911b606482015260840161104d565b6016546001600160a01b0316158015906116745750601c5415155b8061168857506016546001600160a01b0316155b6116eb5760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6262206160448201526d3732103832b931b2b73a30b3b29760911b606482015260840161104d565b6017546001600160a01b0316158015906117065750601d5415155b8061171a57506017546001600160a01b0316155b61177d5760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6363206160448201526d3732103832b931b2b73a30b3b29760911b606482015260840161104d565b6018546001600160a01b0316158015906117985750601e5415155b806117ac57506018546001600160a01b0316155b61180f5760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6464206160448201526d3732103832b931b2b73a30b3b29760911b606482015260840161104d565b6019546001600160a01b03161580159061182a5750601f5415155b8061183e57506019546001600160a01b0316155b6118a15760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6565206160448201526d3732103832b931b2b73a30b3b29760911b606482015260840161104d565b601a546001600160a01b0316158015906118bc575060205415155b806118d05750601a546001600160a01b0316155b6119335760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6666206160448201526d3732103832b931b2b73a30b3b29760911b606482015260840161104d565b60155447906000906001600160a01b031615611a0757601554601b546001600160a01b039091169061271090611969908561436a565b6119739190614397565b604051600081818185875af1925050503d80600081146119af576040519150601f19603f3d011682016040523d82523d6000602084013e6119b4565b606091505b50508091505080611a075760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f61612045746865720000000000604482015260640161104d565b6016546001600160a01b031615611ad657601654601c546001600160a01b039091169061271090611a38908561436a565b611a429190614397565b604051600081818185875af1925050503d8060008114611a7e576040519150601f19603f3d011682016040523d82523d6000602084013e611a83565b606091505b50508091505080611ad65760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f62622045746865720000000000604482015260640161104d565b6017546001600160a01b031615611ba557601754601d546001600160a01b039091169061271090611b07908561436a565b611b119190614397565b604051600081818185875af1925050503d8060008114611b4d576040519150601f19603f3d011682016040523d82523d6000602084013e611b52565b606091505b50508091505080611ba55760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f63632045746865720000000000604482015260640161104d565b6018546001600160a01b031615611c7457601854601e546001600160a01b039091169061271090611bd6908561436a565b611be09190614397565b604051600081818185875af1925050503d8060008114611c1c576040519150601f19603f3d011682016040523d82523d6000602084013e611c21565b606091505b50508091505080611c745760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f64642045746865720000000000604482015260640161104d565b6019546001600160a01b031615611d4357601954601f546001600160a01b039091169061271090611ca5908561436a565b611caf9190614397565b604051600081818185875af1925050503d8060008114611ceb576040519150601f19603f3d011682016040523d82523d6000602084013e611cf0565b606091505b50508091505080611d435760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f65652045746865720000000000604482015260640161104d565b601a546001600160a01b031615611e1257601a546020546001600160a01b039091169061271090611d74908561436a565b611d7e9190614397565b604051600081818185875af1925050503d8060008114611dba576040519150601f19603f3d011682016040523d82523d6000602084013e611dbf565b606091505b50508091505080611e125760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f66662045746865720000000000604482015260640161104d565b6014544792506001600160a01b031615611e83576014546040516001600160a01b03909116908390600081818185875af1925050503d8060008114611e73576040519150601f19603f3d011682016040523d82523d6000602084013e611e78565b606091505b505080915050611ee4565b6000546001600160a01b03166001600160a01b03168260405160006040518083038185875af1925050503d8060008114611ed9576040519150601f19603f3d011682016040523d82523d6000602084013e611ede565b606091505b50909150505b80611f315760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f2077697468647261772045746865720000000000000000604482015260640161104d565b50506001600955565b826daaeb6d7670e522a718067333cd4e3b15801590611f5b5750600d5460ff165b1561200d57336001600160a01b03821603611f7b576111688484846131b7565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611fca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fee9190614337565b61200d57604051633b79c77360e21b815233600482015260240161104d565b61120a8484846131b7565b6112af8160016131d2565b6060600061203083612333565b90506000816001600160401b0381111561204c5761204c61401a565b604051908082528060200260200182016040528015612075578160200160208202803683370190505b509050600060015b60015481101561213c576040516320c2ce9960e21b815260048101829052309063830b3a6490602401602060405180830381865afa1580156120c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e79190614452565b6001600160a01b0316866001600160a01b03160361212a5780838361210b8161446f565b94508151811061211d5761211d614488565b6020026020010181815250505b806121348161446f565b91505061207d565b5090949350505050565b61214f33612e8b565b6022610ead82826144ec565b61216433612e8b565b601c55565b61217233612e8b565b601880546001600160a01b0319166001600160a01b039390931692909217909155601e55565b6040516bffffffffffffffffffffffff19606084901b166020820152600090819060340160405160208183030381529060405280519060200120905060005b83518110156122b0578381815181106121f2576121f2614488565b602002602001015182106122505783818151811061221257612212614488565b602002602001015182604051602001612235929190918252602082015260400190565b6040516020818303038152906040528051906020012061229c565b8184828151811061226357612263614488565b6020026020010151604051602001612285929190918252602082015260400190565b604051602081830303815290604052805190602001205b9150806122a88161446f565b9150506121d7565b50600a54149392505050565b60006122c782613386565b5192915050565b6122d733612e8b565b806122e0611090565b111561232e5760405162461bcd60e51b815260206004820152601960248201527f4c6f776572207468616e205f63757272656e74496e6465782e00000000000000604482015260640161104d565b601355565b60006001600160a01b03821661235c576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b6123896130bb565b61239360006134a8565b565b61239e33612e8b565b601155565b6123ac33612e8b565b601255565b6040516331a9108f60e11b8152600481018290526000903090636352211e90602401602060405180830381865afa92505050801561240c575060408051601f3d908101601f1916820190925261240991810190614452565b60015b610e9457506000919050565b61242133612e8b565b6112af81600a55565b61243333612e8b565b601580546001600160a01b0319166001600160a01b039390931692909217909155601b55565b61246233612e8b565b601d55565b61247033612e8b565b600f55565b61247e33612e8b565b601b55565b61248c33612e8b565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b606060048054610ec0906142fd565b6124c633612e8b565b602480546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b6124fb33612e8b565b601a80546001600160a01b0319166001600160a01b039390931692909217909155602055565b6002600954036125435760405162461bcd60e51b815260040161104d906143ab565b6002600955346125655760405162461bcd60e51b815260040161104d906143f5565b6001600955565b816daaeb6d7670e522a718067333cd4e3b1580159061258d5750600d5460ff165b1561263657604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156125ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061260e9190614337565b61263657604051633b79c77360e21b81526001600160a01b038216600482015260240161104d565b61106083836134f8565b61264933612e8b565b602480549115156101000261ff0019909216919091179055565b61266c33612e8b565b601a80546001600160a01b0319166001600160a01b0392909216919091179055565b6126966130bb565b6112af8161358d565b6126a833612e8b565b600d805460ff1916911515919091179055565b836daaeb6d7670e522a718067333cd4e3b158015906126dc5750600d5460ff165b1561279457336001600160a01b03821603612702576126fd858585856135b7565b6127a0565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612751573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127759190614337565b61279457604051633b79c77360e21b815233600482015260240161104d565b6127a0858585856135b7565b5050505050565b6127b033612e8b565b6021610ead82826144ec565b6127c533612e8b565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6127f033612e8b565b6024805460ff1916911515919091179055565b606061280e82612ff6565b61285a5760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00604482015260640161104d565b60245462010000900460ff16156128a6576128736135fb565b61287c8361360a565b6023604051602001612890939291906145ab565b6040516020818303038152906040529050919050565b602180546128b3906142fd565b80601f01602080910402602001604051908101604052809291908181526020018280546128df906142fd565b801561292c5780601f106129015761010080835404028352916020019161292c565b820191906000526020600020905b81548152906001019060200180831161290f57829003601f168201915b50505050509050919050565b61294133612e8b565b601f55565b6002600954036129685760405162461bcd60e51b815260040161104d906143ab565b600260095560245460ff166129bf5760405162461bcd60e51b815260206004820152601760248201527f77686974656c6973744d696e7420697320506175736564000000000000000000604482015260640161104d565b6129c93382612198565b612a155760405162461bcd60e51b815260206004820152601860248201527f596f7520617265206e6f742077686974656c6973746564210000000000000000604482015260640161104d565b816011541015612a785760405162461bcd60e51b815260206004820152602860248201527f77686974656c6973744d696e743a204f766572206d6178206d696e74732070656044820152671c881dd85b1b195d60c21b606482015260840161104d565b33600090815260256020526040902054612a939083906143e2565b6011541015612ae45760405162461bcd60e51b815260206004820152601e60248201527f596f752068617665206e6f2077686974656c6973744d696e74206c6566740000604482015260640161104d565b81600f54612af2919061436a565b3414612b105760405162461bcd60e51b815260040161104d906143f5565b601354612b1b611090565b612b2590846143e2565b1115612b435760405162461bcd60e51b815260040161104d9061442c565b3360009081526025602052604081208054849290612b629084906143e2565b90915550611f319050338361319d565b612b7b33612e8b565b601354612b86611090565b612b9090846143e2565b1115612bae5760405162461bcd60e51b815260040161104d9061442c565b610ead818361319d565b612bc133612e8b565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b612bec33612e8b565b601055565b612bfa33612e8b565b6023610ead82826144ec565b6060612c10613712565b905090565b612c1d6130bb565b6001600160a01b038116612c825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161104d565b6112af816134a8565b612c9433612e8b565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b612cbf33612e8b565b602055565b60606000612cd383600261436a565b612cde9060026143e2565b6001600160401b03811115612cf557612cf561401a565b6040519080825280601f01601f191660200182016040528015612d1f576020820181803683370190505b509050600360fc1b81600081518110612d3a57612d3a614488565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612d6957612d69614488565b60200101906001600160f81b031916908160001a9053506000612d8d84600261436a565b612d989060016143e2565b90505b6001811115612e10576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612dcc57612dcc614488565b1a60f81b828281518110612de257612de2614488565b60200101906001600160f81b031916908160001a90535060049490941c93612e098161464b565b9050612d9b565b508315612e5f5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161104d565b9392505050565b60006001600160e01b0319821663152a902d60e11b1480610e945750610e9482613792565b6001600160a01b0381166000908152600e602052604090205460ff16612ebc335b6001600160a01b03166014612cc4565b604051602001612ecc9190614662565b60405160208183030381529060405290610ead5760405162461bcd60e51b815260040161104d9190613ed3565b6127106001600160601b0382161115612f675760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b606482015260840161104d565b6001600160a01b038216612fbd5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640161104d565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600b55565b60008160011115801561300a575060015482105b8015610e94575050600090815260056020526040902054600160e01b900460ff161590565b600061303a826122bc565b9050806001600160a01b0316836001600160a01b03160361306e5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216146130a5576130888133610de1565b6130a5576040516367d9dca160e11b815260040160405180910390fd5b6110608383836137e2565b61106083838361383e565b6000546001600160a01b031633146123935760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161104d565b6001600160a01b0381166000908152600e602052604090205460ff161561313b33612eac565b60405160200161314b91906146af565b604051602081830303815290604052906131785760405162461bcd60e51b815260040161104d9190613ed3565b506001600160a01b03166000908152600e60205260409020805460ff19166001179055565b610ead828260405180602001604052806000815250613a17565b611060838383604051806020016040528060008152506126bb565b60006131dd83613386565b80519091508215613243576000336001600160a01b038316148061320657506132068233610de1565b8061322157503361321686610f43565b6001600160a01b0316145b90508061324157604051632ce44b5f60e11b815260040160405180910390fd5b505b61324f600085836137e2565b6001600160a01b0380821660008181526006602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526005909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b17855591890180845292208054919490911661334d57600154821461334d57805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b03841690600080516020614893833981519152908390a450506002805460010190555050565b6040805160608101825260008082526020820181905291810191909152818060011161348f5760015481101561348f57600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529061348d5780516001600160a01b031615613424579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215613488579392505050565b613424565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b336001600160a01b038316036135215760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61359681612e8b565b6001600160a01b03166000908152600e60205260409020805460ff19169055565b6135c284848461383e565b6001600160a01b0383163b1561120a576135de84848484613bb9565b61120a576040516368d2bf6b60e11b815260040160405180910390fd5b606060228054610ec0906142fd565b6060816000036136315750506040805180820190915260018152600360fc1b602082015290565b8160005b811561365b57806136458161446f565b91506136549050600a83614397565b9150613635565b6000816001600160401b038111156136755761367561401a565b6040519080825280601f01601f19166020018201604052801561369f576020820181803683370190505b5090505b841561370a576136b4600183614706565b91506136c1600a86614719565b6136cc9060306143e2565b60f81b8183815181106136e1576136e1614488565b60200101906001600160f81b031916908160001a905350613703600a86614397565b94506136a3565b949350505050565b606060008061372381612710611306565b9150915061376c6137338261360a565b613747846001600160a01b03166014612cc4565b60405160200161375892919061472d565b604051602081830303815290604052613ca4565b60405160200161377c91906147b3565b6040516020818303038152906040529250505090565b60006001600160e01b031982166380ac58cd60e01b14806137c357506001600160e01b03198216635b5e139f60e01b145b80610e9457506301ffc9a760e01b6001600160e01b0319831614610e94565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061384982613386565b9050836001600160a01b031681600001516001600160a01b0316146138805760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061389e575061389e8533610de1565b806138b95750336138ae84610f43565b6001600160a01b0316145b9050806138d957604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661390057604051633a954ecd60e21b815260040160405180910390fd5b61390c600084876137e2565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166139e05760015482146139e057805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b031660008051602061489383398151915260405160405180910390a46127a0565b6001546001600160a01b038416613a4057604051622e076360e81b815260040160405180910390fd5b82600003613a615760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600590925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15613b77575b60405182906001600160a01b03881690600090600080516020614893833981519152908290a4613b406000878480600101955087613bb9565b613b5d576040516368d2bf6b60e11b815260040160405180910390fd5b808210613b07578260015414613b7257600080fd5b613baa565b5b6040516001830192906001600160a01b03881690600090600080516020614893833981519152908290a4808210613b78575b5060015561120a600085838684565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290613bee9033908990889088906004016147f8565b6020604051808303816000875af1925050508015613c29575060408051601f3d908101601f19168201909252613c2691810190614835565b60015b613c87573d808015613c57576040519150601f19603f3d011682016040523d82523d6000602084013e613c5c565b606091505b508051600003613c7f576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60608151600003613cc357505060408051602081019091526000815290565b60006040518060600160405280604081526020016148536040913990506000600384516002613cf291906143e2565b613cfc9190614397565b613d0790600461436a565b6001600160401b03811115613d1e57613d1e61401a565b6040519080825280601f01601f191660200182016040528015613d48576020820181803683370190505b509050600182016020820185865187015b80821015613db4576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250613d59565b5050600386510660018114613dd05760028114613de357613deb565b603d6001830353603d6002830353613deb565b603d60018303535b509195945050505050565b6001600160e01b0319811681146112af57600080fd5b600060208284031215613e1e57600080fd5b8135612e5f81613df6565b6001600160a01b03811681146112af57600080fd5b60008060408385031215613e5157600080fd5b8235613e5c81613e29565b915060208301356001600160601b0381168114613e7857600080fd5b809150509250929050565b60005b83811015613e9e578181015183820152602001613e86565b50506000910152565b60008151808452613ebf816020860160208601613e83565b601f01601f19169290920160200192915050565b602081526000612e5f6020830184613ea7565b600060208284031215613ef857600080fd5b5035919050565b60008060408385031215613f1257600080fd5b8235613f1d81613e29565b946020939093013593505050565b600060208284031215613f3d57600080fd5b8135612e5f81613e29565b600080600060608486031215613f5d57600080fd5b8335613f6881613e29565b92506020840135613f7881613e29565b929592945050506040919091013590565b80151581146112af57600080fd5b600060208284031215613fa957600080fd5b8135612e5f81613f89565b60008060408385031215613fc757600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b8181101561400e57835183529284019291840191600101613ff2565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156140585761405861401a565b604052919050565b60006001600160401b038311156140795761407961401a565b61408c601f8401601f1916602001614030565b90508281528383830111156140a057600080fd5b828260208301376000602084830101529392505050565b6000602082840312156140c957600080fd5b81356001600160401b038111156140df57600080fd5b8201601f810184136140f057600080fd5b61370a84823560208401614060565b600082601f83011261411057600080fd5b813560206001600160401b0382111561412b5761412b61401a565b8160051b61413a828201614030565b928352848101820192828101908785111561415457600080fd5b83870192505b848310156141735782358252918301919083019061415a565b979650505050505050565b6000806040838503121561419157600080fd5b823561419c81613e29565b915060208301356001600160401b038111156141b757600080fd5b6141c3858286016140ff565b9150509250929050565b600080604083850312156141e057600080fd5b82356141eb81613e29565b91506020830135613e7881613f89565b6000806000806080858703121561421157600080fd5b843561421c81613e29565b9350602085013561422c81613e29565b92506040850135915060608501356001600160401b0381111561424e57600080fd5b8501601f8101871361425f57600080fd5b61426e87823560208401614060565b91505092959194509250565b6000806040838503121561428d57600080fd5b8235915060208301356001600160401b038111156141b757600080fd5b600080604083850312156142bd57600080fd5b823591506020830135613e7881613e29565b600080604083850312156142e257600080fd5b82356142ed81613e29565b91506020830135613e7881613e29565b600181811c9082168061431157607f821691505b60208210810361433157634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561434957600080fd5b8151612e5f81613f89565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610e9457610e94614354565b634e487b7160e01b600052601260045260246000fd5b6000826143a6576143a6614381565b500490565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b80820180821115610e9457610e94614354565b60208082526018908201527f4554482076616c7565206973206e6f7420636f72726563740000000000000000604082015260600190565b6020808252600c908201526b4e6f206d6f7265204e46547360a01b604082015260600190565b60006020828403121561446457600080fd5b8151612e5f81613e29565b60006001820161448157614481614354565b5060010190565b634e487b7160e01b600052603260045260246000fd5b601f82111561106057600081815260208120601f850160051c810160208610156144c55750805b601f850160051c820191505b818110156144e4578281556001016144d1565b505050505050565b81516001600160401b038111156145055761450561401a565b6145198161451384546142fd565b8461449e565b602080601f83116001811461454e57600084156145365750858301515b600019600386901b1c1916600185901b1785556144e4565b600085815260208120601f198616915b8281101561457d5788860151825594840194600190910190840161455e565b508582101561459b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000845160206145be8285838a01613e83565b8551918401916145d18184848a01613e83565b85549201916000906145e2816142fd565b600182811680156145fa576001811461460f5761463b565b60ff198416875282151583028701945061463b565b896000528560002060005b848110156146335781548982015290830190870161461a565b505082870194505b50929a9950505050505050505050565b60008161465a5761465a614354565b506000190190565b67030b1b1b7bab73a160c51b815260008251614685816008850160208701613e83565b721034b9903737ba1030b71037b832b930ba37b960691b6008939091019283015250601b01919050565b67030b1b1b7bab73a160c51b8152600082516146d2816008850160208701613e83565b7f20697320616c72656164792068617320616e206f70657261746f7220726f6c656008939091019283015250602801919050565b81810381811115610e9457610e94614354565b60008261472857614728614381565b500690565b7f7b2273656c6c65725f6665655f62617369735f706f696e7473223a000000000081526000835161476581601b850160208801613e83565b721610113332b2afb932b1b4b834b2b73a111d1160691b601b91840191820152835161479881602e840160208801613e83565b61227d60f01b602e9290910191820152603001949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516147eb81601d850160208701613e83565b91909101601d0192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061482b90830184613ea7565b9695505050505050565b60006020828403121561484757600080fd5b8151612e5f81613df656fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220d3055fd19f6c631e0d3912d1d66c9abb0649659fb815368bff8115a589a6726364736f6c63430008110033

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

000000000000000000000000d3b5181851a7d69b62aa47bb766c25a323a7056300000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000637d25d0769f747b2742a04d249802da8539597000000000000000000000000000000000000000000000000000000000000005dc

-----Decoded View---------------
Arg [0] : _royaltyReceiver (address): 0xD3B5181851A7D69B62Aa47bb766C25A323a70563
Arg [1] : _royaltyFraction (uint96): 1000
Arg [2] : _aaAdd (address): 0x637d25D0769f747B2742A04d249802dA85395970
Arg [3] : _aaPercAdd (uint256): 1500

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000d3b5181851a7d69b62aa47bb766c25a323a70563
Arg [1] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [2] : 000000000000000000000000637d25d0769f747b2742a04d249802da85395970
Arg [3] : 00000000000000000000000000000000000000000000000000000000000005dc


Deployed Bytecode Sourcemap

66647:15855:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68480:165;;;;;;;;;;-1:-1:-1;68480:165:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;68480:165:0;;;;;;;;68302:157;;;;;;;;;;-1:-1:-1;68302:157:0;;;;;:::i;:::-;;:::i;:::-;;40833:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;42345:204::-;;;;;;;;;;-1:-1:-1;42345:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2273:32:1;;;2255:51;;2243:2;2228:18;42345:204:0;2109:203:1;81462:157:0;;;;;;;;;;-1:-1:-1;81462:157:0;;;;;:::i;:::-;;:::i;71630:101::-;;;;;;;;;;-1:-1:-1;71630:101:0;;;;;:::i;:::-;;:::i;75193:99::-;;;;;;;;;;-1:-1:-1;75273:13:0;;75193:99;;;3035:25:1;;;3023:2;3008:18;75193:99:0;2889:177:1;36958:312:0;;;;;;;;;;;;;:::i;67482:27::-;;;;;;;;;;-1:-1:-1;67482:27:0;;;;;;;;70134:130;;;;;;;;;;-1:-1:-1;70134:130:0;;;;;:::i;:::-;;:::i;66916:32::-;;;;;;;;;;;;;;;;71825:101;;;;;;;;;;-1:-1:-1;71825:101:0;;;;;:::i;:::-;;:::i;70592:130::-;;;;;;;;;;-1:-1:-1;70592:130:0;;;;;:::i;:::-;;:::i;81627:163::-;;;;;;;;;;-1:-1:-1;81627:163:0;;;;;:::i;:::-;;:::i;67426:38::-;;;;;;;;;;;;;:::i;82259:115::-;;;;;;;;;;-1:-1:-1;82259:115:0;;;;;:::i;:::-;;:::i;69905:130::-;;;;;;;;;;-1:-1:-1;69905:130:0;;;;;:::i;:::-;;:::i;73890:110::-;;;;;;;;;;-1:-1:-1;73890:110:0;;;;;:::i;:::-;;:::i;28869:442::-;;;;;;;;;;-1:-1:-1;28869:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4346:32:1;;;4328:51;;4410:2;4395:18;;4388:34;;;;4301:18;28869:442:0;4154:274:1;66789:40:0;;;;;;;;;;;;;;;;77005:542;;;;;;:::i;:::-;;:::i;72801:100::-;;;;;;;;;;-1:-1:-1;72801:100:0;;;;;:::i;:::-;;:::i;77868:2264::-;;;:::i;67514:31::-;;;;;;;;;;-1:-1:-1;67514:31:0;;;;;;;;;;;63329:143;;;;;;;;;;;;63429:42;63329:143;;66834:40;;;;;;;;;;;;;;;;81798:171;;;;;;;;;;-1:-1:-1;81798:171:0;;;;;:::i;:::-;;:::i;77563:81::-;;;;;;;;;;-1:-1:-1;77563:81:0;;;;;:::i;:::-;;:::i;80175:475::-;;;;;;;;;;-1:-1:-1;80175:475:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;67550:28::-;;;;;;;;;;-1:-1:-1;67550:28:0;;;;;;;;;;;75344:103;;;;;;;;;;-1:-1:-1;75344:103:0;;;;;:::i;:::-;;:::i;72411:100::-;;;;;;;;;;-1:-1:-1;72411:100:0;;;;;:::i;:::-;;:::i;70363:130::-;;;;;;;;;;-1:-1:-1;70363:130:0;;;;;:::i;:::-;;:::i;12123:407::-;;;;;;;;;;-1:-1:-1;12123:407:0;;;;;:::i;:::-;;:::i;40641:125::-;;;;;;;;;;-1:-1:-1;40641:125:0;;;;;:::i;:::-;;:::i;59405:113::-;;;;;;;;;;-1:-1:-1;59405:113:0;;;;;:::i;:::-;-1:-1:-1;;;;;59489:21:0;59465:4;59489:21;;;:10;:21;;;;;;;;;59405:113;73440:179;;;;;;;;;;-1:-1:-1;73440:179:0;;;;;:::i;:::-;;:::i;38087:206::-;;;;;;;;;;-1:-1:-1;38087:206:0;;;;;:::i;:::-;;:::i;58375:103::-;;;;;;;;;;;;;:::i;74410:100::-;;;;;;;;;;-1:-1:-1;74410:100:0;;;;;:::i;:::-;;:::i;74151:114::-;;;;;;;;;;-1:-1:-1;74151:114:0;;;;;:::i;:::-;-1:-1:-1;;;;;74240:19:0;74218:7;74240:19;;;:9;:19;;;;;;;74151:114;74514:100;;;;;;;;;;-1:-1:-1;74514:100:0;;;;;:::i;:::-;;:::i;80713:243::-;;;;;;;;;;-1:-1:-1;80713:243:0;;;;;:::i;:::-;;:::i;74898:118::-;;;;;;;;;;-1:-1:-1;74898:118:0;;;;;:::i;:::-;;:::i;69676:130::-;;;;;;;;;;-1:-1:-1;69676:130:0;;;;;:::i;:::-;;:::i;72606:100::-;;;;;;;;;;-1:-1:-1;72606:100:0;;;;;:::i;:::-;;:::i;57727:87::-;;;;;;;;;;-1:-1:-1;57773:7:0;57800:6;-1:-1:-1;;;;;57800:6:0;57727:87;;73643:103;;;;;;;;;;-1:-1:-1;73643:103:0;;;;;:::i;:::-;;:::i;72216:100::-;;;;;;;;;;-1:-1:-1;72216:100:0;;;;;:::i;:::-;;:::i;69469:110::-;;;;;;;;;;-1:-1:-1;69469:110:0;;;;;:::i;:::-;;:::i;74269:114::-;;;;;;;;;;-1:-1:-1;74269:114:0;;;;;:::i;:::-;-1:-1:-1;;;;;74358:19:0;74336:7;74358:19;;;:9;:19;;;;;;;74269:114;41002:104;;;;;;;;;;;;;:::i;73297:103::-;;;;;;;;;;-1:-1:-1;73297:103:0;;;;;:::i;:::-;;:::i;70821:130::-;;;;;;;;;;-1:-1:-1;70821:130:0;;;;;:::i;:::-;;:::i;66879:32::-;;;;;;;;;;;;;;;;77664:127;;;:::i;81278:176::-;;;;;;;;;;-1:-1:-1;81278:176:0;;;;;:::i;:::-;;:::i;74758:111::-;;;;;;;;;;-1:-1:-1;74758:111:0;;;;;:::i;:::-;;:::i;72020:101::-;;;;;;;;;;-1:-1:-1;72020:101:0;;;;;:::i;:::-;;:::i;82382:117::-;;;;;;;;;;-1:-1:-1;82382:117:0;;;;;:::i;:::-;;:::i;81148:122::-;;;;;;;;;;-1:-1:-1;81148:122:0;;;;;:::i;:::-;;:::i;81977:228::-;;;;;;;;;;-1:-1:-1;81977:228:0;;;;;:::i;:::-;;:::i;75060:101::-;;;;;;;;;;-1:-1:-1;75060:101:0;;;;;:::i;:::-;;:::i;71240:::-;;;;;;;;;;-1:-1:-1;71240:101:0;;;;;:::i;:::-;;:::i;74644:110::-;;;;;;;;;;-1:-1:-1;74644:110:0;;;;;:::i;:::-;;:::i;75727:322::-;;;;;;;;;;-1:-1:-1;75727:322:0;;;;;:::i;:::-;;:::i;72996:100::-;;;;;;;;;;-1:-1:-1;72996:100:0;;;;;:::i;:::-;;:::i;76327:652::-;;;;;;:::i;:::-;;:::i;76107:198::-;;;;;;;;;;-1:-1:-1;76107:198:0;;;;;:::i;:::-;;:::i;66953:30::-;;;;;;;;;;;;;;;;71435:101;;;;;;;;;;-1:-1:-1;71435:101:0;;;;;:::i;:::-;;:::i;67583:23::-;;;;;;;;;;-1:-1:-1;67583:23:0;;;;;;;-1:-1:-1;;;;;67583:23:0;;;73750:103;;;;;;;;;;-1:-1:-1;73750:103:0;;;;;:::i;:::-;;:::i;75455:131::-;;;;;;;;;;-1:-1:-1;75455:131:0;;;;;:::i;:::-;;:::i;68674:113::-;;;;;;;;;;;;;:::i;42979:164::-;;;;;;;;;;-1:-1:-1;42979:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;43100:25:0;;;43076:4;43100:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;42979:164;58633:201;;;;;;;;;;-1:-1:-1;58633:201:0;;;;;:::i;:::-;;:::i;71045:101::-;;;;;;;;;;-1:-1:-1;71045:101:0;;;;;:::i;:::-;;:::i;63277:43::-;;;;;;;;;;-1:-1:-1;63277:43:0;;;;;;;;73191:100;;;;;;;;;;-1:-1:-1;73191:100:0;;;;;:::i;:::-;;:::i;68480:165::-;68583:4;68603:36;68627:11;68603:23;:36::i;:::-;68596:43;68480:165;-1:-1:-1;;68480:165:0:o;68302:157::-;59345:32;34773:10;59345:18;:32::i;:::-;68409:44:::1;68428:9;68439:13;68409:18;:44::i;:::-;68302:157:::0;;:::o;40833:100::-;40887:13;40920:5;40913:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40833:100;:::o;42345:204::-;42413:7;42438:16;42446:7;42438;:16::i;:::-;42433:64;;42463:34;;-1:-1:-1;;;42463:34:0;;;;;;;;;;;42433:64;-1:-1:-1;42517:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;42517:24:0;;42345:204::o;81462:157::-;81558:8;63429:42;65351:45;:49;;;;:77;;-1:-1:-1;65404:24:0;;;;65351:77;65347:253;;;65450:67;;-1:-1:-1;;;65450:67:0;;65501:4;65450:67;;;10898:34:1;-1:-1:-1;;;;;10968:15:1;;10948:18;;;10941:43;63429:42:0;;65450;;10833:18:1;;65450:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65445:144;;65545:28;;-1:-1:-1;;;65545:28:0;;-1:-1:-1;;;;;2273:32:1;;65545:28:0;;;2255:51:1;2228:18;;65545:28:0;;;;;;;;65445:144;81579:32:::1;81593:8;81603:7;81579:13;:32::i;:::-;81462:157:::0;;;:::o;71630:101::-;59345:32;34773:10;59345:18;:32::i;:::-;71713:3:::1;:12:::0;;-1:-1:-1;;;;;;71713:12:0::1;-1:-1:-1::0;;;;;71713:12:0;;;::::1;::::0;;;::::1;::::0;;71630:101::o;36958:312::-;37221:12;;68235:1;37205:13;:28;-1:-1:-1;;37205:46:0;;36958:312::o;70134:130::-;59345:32;34773:10;59345:18;:32::i;:::-;70224:3:::1;:12:::0;;-1:-1:-1;;;;;;70224:12:0::1;-1:-1:-1::0;;;;;70224:12:0;;;::::1;::::0;;;::::1;::::0;;;70243:7:::1;:15:::0;70134:130::o;71825:101::-;59345:32;34773:10;59345:18;:32::i;:::-;71908:3:::1;:12:::0;;-1:-1:-1;;;;;;71908:12:0::1;-1:-1:-1::0;;;;;71908:12:0;;;::::1;::::0;;;::::1;::::0;;71825:101::o;70592:130::-;59345:32;34773:10;59345:18;:32::i;:::-;70682:3:::1;:12:::0;;-1:-1:-1;;;;;;70682:12:0::1;-1:-1:-1::0;;;;;70682:12:0;;;::::1;::::0;;;::::1;::::0;;;70701:7:::1;:15:::0;70592:130::o;81627:163::-;81728:4;63429:42;64577:45;:49;;;;:77;;-1:-1:-1;64630:24:0;;;;64577:77;64573:567;;;64894:10;-1:-1:-1;;;;;64886:18:0;;;64882:85;;81745:37:::1;81764:4;81770:2;81774:7;81745:18;:37::i;:::-;64945:7:::0;;64882:85;64986:69;;-1:-1:-1;;;64986:69:0;;65037:4;64986:69;;;10898:34:1;65044:10:0;10948:18:1;;;10941:43;63429:42:0;;64986;;10833:18:1;;64986:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64981:148;;65083:30;;-1:-1:-1;;;65083:30:0;;65102:10;65083:30;;;2255:51:1;2228:18;;65083:30:0;2109:203:1;64981:148:0;81745:37:::1;81764:4;81770:2;81774:7;81745:18;:37::i;:::-;81627:163:::0;;;;:::o;67426:38::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;82259:115::-;57613:13;:11;:13::i;:::-;82336:30:::1;82355:10;82336:18;:30::i;:::-;82259:115:::0;:::o;69905:130::-;59345:32;34773:10;59345:18;:32::i;:::-;69995:3:::1;:12:::0;;-1:-1:-1;;;;;;69995:12:0::1;-1:-1:-1::0;;;;;69995:12:0;;;::::1;::::0;;;::::1;::::0;;;70014:7:::1;:15:::0;69905:130::o;73890:110::-;59345:32;34773:10;59345:18;:32::i;:::-;73968:8:::1;:26:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;73968:26:0;;::::1;::::0;;;::::1;::::0;;73890:110::o;28869:442::-;28966:7;29024:27;;;:17;:27;;;;;;;;28995:56;;;;;;;;;-1:-1:-1;;;;;28995:56:0;;;;;-1:-1:-1;;;28995:56:0;;;-1:-1:-1;;;;;28995:56:0;;;;;;;;28966:7;;29064:92;;-1:-1:-1;29115:29:0;;;;;;;;;29125:19;29115:29;-1:-1:-1;;;;;29115:29:0;;;;-1:-1:-1;;;29115:29:0;;-1:-1:-1;;;;;29115:29:0;;;;;29064:92;29206:23;;;;29168:21;;29677:5;;29193:36;;-1:-1:-1;;;;;29193:36:0;:10;:36;:::i;:::-;29192:58;;;;:::i;:::-;29271:16;;;;;-1:-1:-1;28869:442:0;;-1:-1:-1;;;;28869:442:0:o;77005:542::-;33117:1;33715:7;;:19;33707:63;;;;-1:-1:-1;;;33707:63:0;;;;;;;:::i;:::-;33117:1;33848:7;:18;77095:19:::1;::::0;::::1;::::0;::::1;;;77087:52;;;::::0;-1:-1:-1;;;77087:52:0;;12369:2:1;77087:52:0::1;::::0;::::1;12351:21:1::0;12408:2;12388:18;;;12381:30;-1:-1:-1;;;12427:18:1;;;12420:50;12487:18;;77087:52:0::1;12167:344:1::0;77087:52:0::1;77171:7;77154:13;;:24;;77146:74;;;::::0;-1:-1:-1;;;77146:74:0;;12718:2:1;77146:74:0::1;::::0;::::1;12700:21:1::0;12757:2;12737:18;;;12730:30;12796:34;12776:18;;;12769:62;-1:-1:-1;;;12847:18:1;;;12840:35;12892:19;;77146:74:0::1;12516:401:1::0;77146:74:0::1;77262:10;77252:21;::::0;;;:9:::1;:21;::::0;;;;;:31:::1;::::0;77276:7;;77252:31:::1;:::i;:::-;77235:13;;:48;;77227:88;;;::::0;-1:-1:-1;;;77227:88:0;;13254:2:1;77227:88:0::1;::::0;::::1;13236:21:1::0;13293:2;13273:18;;;13266:30;13332:29;13312:18;;;13305:57;13379:18;;77227:88:0::1;13052:351:1::0;77227:88:0::1;77357:7;77343:11;;:21;;;;:::i;:::-;77330:9;:34;77322:71;;;;-1:-1:-1::0;;;77322:71:0::1;;;;;;;:::i;:::-;77438:9;;77419:13;:11;:13::i;:::-;77409:23;::::0;:7;:23:::1;:::i;:::-;77408:40;;77400:65;;;;-1:-1:-1::0;;;77400:65:0::1;;;;;;;:::i;:::-;77482:10;77472:21;::::0;;;:9:::1;:21;::::0;;;;:32;;77497:7;;77472:21;:32:::1;::::0;77497:7;;77472:32:::1;:::i;:::-;::::0;;;-1:-1:-1;77511:30:0::1;::::0;-1:-1:-1;77521:10:0::1;77533:7:::0;77511:9:::1;:30::i;:::-;-1:-1:-1::0;33073:1:0;34027:7;:22;77005:542::o;72801:100::-;59345:32;34773:10;59345:18;:32::i;:::-;72880:7:::1;:15:::0;72801:100::o;77868:2264::-;59345:32;34773:10;59345:18;:32::i;:::-;33117:1:::1;33715:7;;:19:::0;33707:63:::1;;;;-1:-1:-1::0;;;33707:63:0::1;;;;;;;:::i;:::-;33117:1;33848:7;:18:::0;77954:3:::2;::::0;-1:-1:-1;;;;;77954:3:0::2;:17:::0;;::::2;::::0;:33:::2;;-1:-1:-1::0;77975:7:0::2;::::0;:12;::::2;77954:33;77953:56;;;-1:-1:-1::0;77992:3:0::2;::::0;-1:-1:-1;;;;;77992:3:0::2;:17:::0;77953:56:::2;77945:114;;;::::0;-1:-1:-1;;;77945:114:0;;14304:2:1;77945:114:0::2;::::0;::::2;14286:21:1::0;14343:2;14323:18;;;14316:30;14382:34;14362:18;;;14355:62;-1:-1:-1;;;14433:18:1;;;14426:44;14487:19;;77945:114:0::2;14102:410:1::0;77945:114:0::2;78075:3;::::0;-1:-1:-1;;;;;78075:3:0::2;:17:::0;;::::2;::::0;:33:::2;;-1:-1:-1::0;78096:7:0::2;::::0;:12;::::2;78075:33;78074:56;;;-1:-1:-1::0;78113:3:0::2;::::0;-1:-1:-1;;;;;78113:3:0::2;:17:::0;78074:56:::2;78066:114;;;::::0;-1:-1:-1;;;78066:114:0;;14719:2:1;78066:114:0::2;::::0;::::2;14701:21:1::0;14758:2;14738:18;;;14731:30;14797:34;14777:18;;;14770:62;-1:-1:-1;;;14848:18:1;;;14841:44;14902:19;;78066:114:0::2;14517:410:1::0;78066:114:0::2;78196:3;::::0;-1:-1:-1;;;;;78196:3:0::2;:17:::0;;::::2;::::0;:33:::2;;-1:-1:-1::0;78217:7:0::2;::::0;:12;::::2;78196:33;78195:56;;;-1:-1:-1::0;78234:3:0::2;::::0;-1:-1:-1;;;;;78234:3:0::2;:17:::0;78195:56:::2;78187:114;;;::::0;-1:-1:-1;;;78187:114:0;;15134:2:1;78187:114:0::2;::::0;::::2;15116:21:1::0;15173:2;15153:18;;;15146:30;15212:34;15192:18;;;15185:62;-1:-1:-1;;;15263:18:1;;;15256:44;15317:19;;78187:114:0::2;14932:410:1::0;78187:114:0::2;78317:3;::::0;-1:-1:-1;;;;;78317:3:0::2;:17:::0;;::::2;::::0;:33:::2;;-1:-1:-1::0;78338:7:0::2;::::0;:12;::::2;78317:33;78316:56;;;-1:-1:-1::0;78355:3:0::2;::::0;-1:-1:-1;;;;;78355:3:0::2;:17:::0;78316:56:::2;78308:114;;;::::0;-1:-1:-1;;;78308:114:0;;15549:2:1;78308:114:0::2;::::0;::::2;15531:21:1::0;15588:2;15568:18;;;15561:30;15627:34;15607:18;;;15600:62;-1:-1:-1;;;15678:18:1;;;15671:44;15732:19;;78308:114:0::2;15347:410:1::0;78308:114:0::2;78438:3;::::0;-1:-1:-1;;;;;78438:3:0::2;:17:::0;;::::2;::::0;:33:::2;;-1:-1:-1::0;78459:7:0::2;::::0;:12;::::2;78438:33;78437:56;;;-1:-1:-1::0;78476:3:0::2;::::0;-1:-1:-1;;;;;78476:3:0::2;:17:::0;78437:56:::2;78429:114;;;::::0;-1:-1:-1;;;78429:114:0;;15964:2:1;78429:114:0::2;::::0;::::2;15946:21:1::0;16003:2;15983:18;;;15976:30;16042:34;16022:18;;;16015:62;-1:-1:-1;;;16093:18:1;;;16086:44;16147:19;;78429:114:0::2;15762:410:1::0;78429:114:0::2;78559:3;::::0;-1:-1:-1;;;;;78559:3:0::2;:17:::0;;::::2;::::0;:33:::2;;-1:-1:-1::0;78580:7:0::2;::::0;:12;::::2;78559:33;78558:56;;;-1:-1:-1::0;78597:3:0::2;::::0;-1:-1:-1;;;;;78597:3:0::2;:17:::0;78558:56:::2;78550:114;;;::::0;-1:-1:-1;;;78550:114:0;;16379:2:1;78550:114:0::2;::::0;::::2;16361:21:1::0;16418:2;16398:18;;;16391:30;16457:34;16437:18;;;16430:62;-1:-1:-1;;;16508:18:1;;;16501:44;16562:19;;78550:114:0::2;16177:410:1::0;78550:114:0::2;78740:3;::::0;78695:21:::2;::::0;78673:19:::2;::::0;-1:-1:-1;;;;;78740:3:0::2;:17:::0;78737:174:::2;;78799:3;::::0;78831:7:::2;::::0;-1:-1:-1;;;;;78799:3:0;;::::2;::::0;78839:5:::2;::::0;78817:21:::2;::::0;:11;:21:::2;:::i;:::-;:27;;;;:::i;:::-;78791:59;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78782:68;;;;;78869:2;78861:42;;;::::0;-1:-1:-1;;;78861:42:0;;17004:2:1;78861:42:0::2;::::0;::::2;16986:21:1::0;17043:2;17023:18;;;17016:30;17082:29;17062:18;;;17055:57;17129:18;;78861:42:0::2;16802:351:1::0;78861:42:0::2;78920:3;::::0;-1:-1:-1;;;;;78920:3:0::2;:17:::0;78917:174:::2;;78979:3;::::0;79011:7:::2;::::0;-1:-1:-1;;;;;78979:3:0;;::::2;::::0;79019:5:::2;::::0;78997:21:::2;::::0;:11;:21:::2;:::i;:::-;:27;;;;:::i;:::-;78971:59;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78962:68;;;;;79049:2;79041:42;;;::::0;-1:-1:-1;;;79041:42:0;;17360:2:1;79041:42:0::2;::::0;::::2;17342:21:1::0;17399:2;17379:18;;;17372:30;17438:29;17418:18;;;17411:57;17485:18;;79041:42:0::2;17158:351:1::0;79041:42:0::2;79100:3;::::0;-1:-1:-1;;;;;79100:3:0::2;:17:::0;79097:174:::2;;79159:3;::::0;79191:7:::2;::::0;-1:-1:-1;;;;;79159:3:0;;::::2;::::0;79199:5:::2;::::0;79177:21:::2;::::0;:11;:21:::2;:::i;:::-;:27;;;;:::i;:::-;79151:59;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79142:68;;;;;79229:2;79221:42;;;::::0;-1:-1:-1;;;79221:42:0;;17716:2:1;79221:42:0::2;::::0;::::2;17698:21:1::0;17755:2;17735:18;;;17728:30;17794:29;17774:18;;;17767:57;17841:18;;79221:42:0::2;17514:351:1::0;79221:42:0::2;79280:3;::::0;-1:-1:-1;;;;;79280:3:0::2;:17:::0;79277:174:::2;;79339:3;::::0;79371:7:::2;::::0;-1:-1:-1;;;;;79339:3:0;;::::2;::::0;79379:5:::2;::::0;79357:21:::2;::::0;:11;:21:::2;:::i;:::-;:27;;;;:::i;:::-;79331:59;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79322:68;;;;;79409:2;79401:42;;;::::0;-1:-1:-1;;;79401:42:0;;18072:2:1;79401:42:0::2;::::0;::::2;18054:21:1::0;18111:2;18091:18;;;18084:30;18150:29;18130:18;;;18123:57;18197:18;;79401:42:0::2;17870:351:1::0;79401:42:0::2;79460:3;::::0;-1:-1:-1;;;;;79460:3:0::2;:17:::0;79457:174:::2;;79519:3;::::0;79551:7:::2;::::0;-1:-1:-1;;;;;79519:3:0;;::::2;::::0;79559:5:::2;::::0;79537:21:::2;::::0;:11;:21:::2;:::i;:::-;:27;;;;:::i;:::-;79511:59;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79502:68;;;;;79589:2;79581:42;;;::::0;-1:-1:-1;;;79581:42:0;;18428:2:1;79581:42:0::2;::::0;::::2;18410:21:1::0;18467:2;18447:18;;;18440:30;18506:29;18486:18;;;18479:57;18553:18;;79581:42:0::2;18226:351:1::0;79581:42:0::2;79640:3;::::0;-1:-1:-1;;;;;79640:3:0::2;:17:::0;79637:174:::2;;79699:3;::::0;79731:7:::2;::::0;-1:-1:-1;;;;;79699:3:0;;::::2;::::0;79739:5:::2;::::0;79717:21:::2;::::0;:11;:21:::2;:::i;:::-;:27;;;;:::i;:::-;79691:59;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79682:68;;;;;79769:2;79761:42;;;::::0;-1:-1:-1;;;79761:42:0;;18784:2:1;79761:42:0::2;::::0;::::2;18766:21:1::0;18823:2;18803:18;;;18796:30;18862:29;18842:18;;;18835:57;18909:18;;79761:42:0::2;18582:351:1::0;79761:42:0::2;79864:15;::::0;79833:21:::2;::::0;-1:-1:-1;;;;;;79864:15:0::2;:29:::0;79861:220:::2;;79947:15;::::0;79939:55:::2;::::0;-1:-1:-1;;;;;79947:15:0;;::::2;::::0;79977:11;;79939:55:::2;::::0;;;79977:11;79947:15;79939:55:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79930:64;;;;;79861:220;;;57773:7:::0;57800:6;-1:-1:-1;;;;;57800:6:0;-1:-1:-1;;;;;80026:21:0::2;80056:11;80026:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;80017:56:0;;-1:-1:-1;;79861:220:0::2;80095:2;80087:39;;;::::0;-1:-1:-1;;;80087:39:0;;19140:2:1;80087:39:0::2;::::0;::::2;19122:21:1::0;19179:2;19159:18;;;19152:30;19218:26;19198:18;;;19191:54;19262:18;;80087:39:0::2;18938:348:1::0;80087:39:0::2;-1:-1:-1::0;;33073:1:0::1;34027:7;:22:::0;77868:2264::o;81798:171::-;81903:4;63429:42;64577:45;:49;;;;:77;;-1:-1:-1;64630:24:0;;;;64577:77;64573:567;;;64894:10;-1:-1:-1;;;;;64886:18:0;;;64882:85;;81920:41:::1;81943:4;81949:2;81953:7;81920:22;:41::i;64882:85::-:0;64986:69;;-1:-1:-1;;;64986:69:0;;65037:4;64986:69;;;10898:34:1;65044:10:0;10948:18:1;;;10941:43;63429:42:0;;64986;;10833:18:1;;64986:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64981:148;;65083:30;;-1:-1:-1;;;65083:30:0;;65102:10;65083:30;;;2255:51:1;2228:18;;65083:30:0;2109:203:1;64981:148:0;81920:41:::1;81943:4;81949:2;81953:7;81920:22;:41::i;77563:81::-:0;77618:20;77624:7;77633:4;77618:5;:20::i;80175:475::-;80247:16;80272:23;80298:19;80308:8;80298:9;:19::i;:::-;80272:45;;80324:25;80366:15;-1:-1:-1;;;;;80352:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;80352:30:0;-1:-1:-1;80324:58:0;-1:-1:-1;80458:18:0;68235:1;80487:136;80525:13;;80521:1;:17;80487:136;;;80569:18;;-1:-1:-1;;;80569:18:0;;;;;3035:25:1;;;80569:4:0;;:15;;3008:18:1;;80569::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;80557:30:0;:8;-1:-1:-1;;;;;80557:30:0;;80554:61;;80614:1;80589:8;80598:12;;;;:::i;:::-;;;80589:22;;;;;;;;:::i;:::-;;;;;;:26;;;;;80554:61;80540:3;;;;:::i;:::-;;;;80487:136;;;-1:-1:-1;80636:8:0;;80175:475;-1:-1:-1;;;;80175:475:0:o;75344:103::-;59345:32;34773:10;59345:18;:32::i;:::-;75421:13:::1;:20;75437:4:::0;75421:13;:20:::1;:::i;72411:100::-:0;59345:32;34773:10;59345:18;:32::i;:::-;72490:7:::1;:15:::0;72411:100::o;70363:130::-;59345:32;34773:10;59345:18;:32::i;:::-;70453:3:::1;:12:::0;;-1:-1:-1;;;;;;70453:12:0::1;-1:-1:-1::0;;;;;70453:12:0;;;::::1;::::0;;;::::1;::::0;;;70472:7:::1;:15:::0;70363:130::o;12123:407::-;12253:26;;-1:-1:-1;;22172:2:1;22168:15;;;22164:53;12253:26:0;;;22152:66:1;12210:4:0;;;;22234:12:1;;12253:26:0;;;;;;;;;;;;12243:37;;;;;;12227:53;;12296:9;12291:192;12315:6;:13;12311:1;:17;12291:192;;;12366:6;12373:1;12366:9;;;;;;;;:::i;:::-;;;;;;;12358:5;:17;:113;;12453:6;12460:1;12453:9;;;;;;;;:::i;:::-;;;;;;;12464:5;12436:34;;;;;;;;22414:19:1;;;22458:2;22449:12;;22442:28;22495:2;22486:12;;22257:247;12436:34:0;;;;;;;;;;;;;12426:45;;;;;;12358:113;;;12405:5;12412:6;12419:1;12412:9;;;;;;;;:::i;:::-;;;;;;;12388:34;;;;;;;;22414:19:1;;;22458:2;22449:12;;22442:28;22495:2;22486:12;;22257:247;12388:34:0;;;;;;;;;;;;;12378:45;;;;;;12358:113;12350:121;-1:-1:-1;12330:3:0;;;;:::i;:::-;;;;12291:192;;;-1:-1:-1;12509:13:0;;12500:22;;12123:407;-1:-1:-1;;;12123:407:0:o;40641:125::-;40705:7;40732:21;40745:7;40732:12;:21::i;:::-;:26;;40641:125;-1:-1:-1;;40641:125:0:o;73440:179::-;59345:32;34773:10;59345:18;:32::i;:::-;73544:10:::1;73527:13;:11;:13::i;:::-;:27;;73519:65;;;::::0;-1:-1:-1;;;73519:65:0;;22711:2:1;73519:65:0::1;::::0;::::1;22693:21:1::0;22750:2;22730:18;;;22723:30;22789:27;22769:18;;;22762:55;22834:18;;73519:65:0::1;22509:349:1::0;73519:65:0::1;73591:9;:22:::0;73440:179::o;38087:206::-;38151:7;-1:-1:-1;;;;;38175:19:0;;38171:60;;38203:28;;-1:-1:-1;;;38203:28:0;;;;;;;;;;;38171:60;-1:-1:-1;;;;;;38257:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;38257:27:0;;38087:206::o;58375:103::-;57613:13;:11;:13::i;:::-;58440:30:::1;58467:1;58440:18;:30::i;:::-;58375:103::o:0;74410:100::-;59345:32;34773:10;59345:18;:32::i;:::-;74484:13:::1;:20:::0;74410:100::o;74514:::-;59345:32;34773:10;59345:18;:32::i;:::-;74588:13:::1;:20:::0;74514:100::o;80713:243::-;80802:21;;-1:-1:-1;;;80802:21:0;;;;;3035:25:1;;;80782:7:0;;80802:4;;:12;;3008:18:1;;80802:21:0;;;;;;;;;;;;;;;;;;-1:-1:-1;80802:21:0;;;;;;;;-1:-1:-1;;80802:21:0;;;;;;;;;;;;:::i;:::-;;;80798:153;;-1:-1:-1;80918:1:0;;80713:243;-1:-1:-1;80713:243:0:o;74898:118::-;59345:32;34773:10;59345:18;:32::i;:::-;74981:29:::1;74998:11;12080:13:::0;:27;12005:110;69676:130;59345:32;34773:10;59345:18;:32::i;:::-;69766:3:::1;:12:::0;;-1:-1:-1;;;;;;69766:12:0::1;-1:-1:-1::0;;;;;69766:12:0;;;::::1;::::0;;;::::1;::::0;;;69785:7:::1;:15:::0;69676:130::o;72606:100::-;59345:32;34773:10;59345:18;:32::i;:::-;72685:7:::1;:15:::0;72606:100::o;73643:103::-;59345:32;34773:10;59345:18;:32::i;:::-;73718:11:::1;:22:::0;73643:103::o;72216:100::-;59345:32;34773:10;59345:18;:32::i;:::-;72295:7:::1;:15:::0;72216:100::o;69469:110::-;59345:32;34773:10;59345:18;:32::i;:::-;69549:15:::1;:24:::0;;-1:-1:-1;;;;;;69549:24:0::1;-1:-1:-1::0;;;;;69549:24:0;;;::::1;::::0;;;::::1;::::0;;69469:110::o;41002:104::-;41058:13;41091:7;41084:14;;;;;:::i;73297:103::-;59345:32;34773:10;59345:18;:32::i;:::-;73374:8:::1;:20:::0;;-1:-1:-1;;;;;73374:20:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;73374:20:0;;::::1;::::0;;;::::1;::::0;;73297:103::o;70821:130::-;59345:32;34773:10;59345:18;:32::i;:::-;70911:3:::1;:12:::0;;-1:-1:-1;;;;;;70911:12:0::1;-1:-1:-1::0;;;;;70911:12:0;;;::::1;::::0;;;::::1;::::0;;;70930:7:::1;:15:::0;70821:130::o;77664:127::-;33117:1;33715:7;;:19;33707:63;;;;-1:-1:-1;;;33707:63:0;;;;;;;:::i;:::-;33117:1;33848:7;:18;77743:9:::1;77735:50;;;;-1:-1:-1::0;;;77735:50:0::1;;;;;;;:::i;:::-;33073:1:::0;34027:7;:22;77664:127::o;81278:176::-;81382:8;63429:42;65351:45;:49;;;;:77;;-1:-1:-1;65404:24:0;;;;65351:77;65347:253;;;65450:67;;-1:-1:-1;;;65450:67:0;;65501:4;65450:67;;;10898:34:1;-1:-1:-1;;;;;10968:15:1;;10948:18;;;10941:43;63429:42:0;;65450;;10833:18:1;;65450:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65445:144;;65545:28;;-1:-1:-1;;;65545:28:0;;-1:-1:-1;;;;;2273:32:1;;65545:28:0;;;2255:51:1;2228:18;;65545:28:0;2109:203:1;65445:144:0;81403:43:::1;81427:8;81437;81403:23;:43::i;74758:111::-:0;59345:32;34773:10;59345:18;:32::i;:::-;74836:19:::1;:27:::0;;;::::1;;;;-1:-1:-1::0;;74836:27:0;;::::1;::::0;;;::::1;::::0;;74758:111::o;72020:101::-;59345:32;34773:10;59345:18;:32::i;:::-;72103:3:::1;:12:::0;;-1:-1:-1;;;;;;72103:12:0::1;-1:-1:-1::0;;;;;72103:12:0;;;::::1;::::0;;;::::1;::::0;;72020:101::o;82382:117::-;57613:13;:11;:13::i;:::-;82460:31:::1;82480:10;82460:19;:31::i;81148:122::-:0;59345:32;34773:10;59345:18;:32::i;:::-;81230:24:::1;:32:::0;;-1:-1:-1;;81230:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;81148:122::o;81977:228::-;82128:4;63429:42;64577:45;:49;;;;:77;;-1:-1:-1;64630:24:0;;;;64577:77;64573:567;;;64894:10;-1:-1:-1;;;;;64886:18:0;;;64882:85;;82150:47:::1;82173:4;82179:2;82183:7;82192:4;82150:22;:47::i;:::-;64945:7:::0;;64882:85;64986:69;;-1:-1:-1;;;64986:69:0;;65037:4;64986:69;;;10898:34:1;65044:10:0;10948:18:1;;;10941:43;63429:42:0;;64986;;10833:18:1;;64986:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64981:148;;65083:30;;-1:-1:-1;;;65083:30:0;;65102:10;65083:30;;;2255:51:1;2228:18;;65083:30:0;2109:203:1;64981:148:0;82150:47:::1;82173:4;82179:2;82183:7;82192:4;82150:22;:47::i;:::-;81977:228:::0;;;;;:::o;75060:101::-;59345:32;34773:10;59345:18;:32::i;:::-;75139:9:::1;:16;75151:4:::0;75139:9;:16:::1;:::i;71240:101::-:0;59345:32;34773:10;59345:18;:32::i;:::-;71323:3:::1;:12:::0;;-1:-1:-1;;;;;;71323:12:0::1;-1:-1:-1::0;;;;;71323:12:0;;;::::1;::::0;;;::::1;::::0;;71240:101::o;74644:110::-;59345:32;34773:10;59345:18;:32::i;:::-;74725:15:::1;:23:::0;;-1:-1:-1;;74725:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;74644:110::o;75727:322::-;75801:13;75831:17;75839:8;75831:7;:17::i;:::-;75823:61;;;;-1:-1:-1;;;75823:61:0;;23065:2:1;75823:61:0;;;23047:21:1;23104:2;23084:18;;;23077:30;23143:33;23123:18;;;23116:61;23194:18;;75823:61:0;22863:355:1;75823:61:0;74103:8;;;;;;;75891:130;;;75950:17;:15;:17::i;:::-;75969:26;75986:8;75969:16;:26::i;:::-;75997:14;75933:79;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75919:94;;75727:322;;;:::o;75891:130::-;76034:9;76027:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75727:322;;;:::o;72996:100::-;59345:32;34773:10;59345:18;:32::i;:::-;73075:7:::1;:15:::0;72996:100::o;76327:652::-;33117:1;33715:7;;:19;33707:63;;;;-1:-1:-1;;;33707:63:0;;;;;;;:::i;:::-;33117:1;33848:7;:18;76445:15:::1;::::0;::::1;;76437:51;;;::::0;-1:-1:-1;;;76437:51:0;;24686:2:1;76437:51:0::1;::::0;::::1;24668:21:1::0;24725:2;24705:18;;;24698:30;24764:25;24744:18;;;24737:53;24807:18;;76437:51:0::1;24484:347:1::0;76437:51:0::1;76503:33;76517:10;76529:6;76503:13;:33::i;:::-;76495:70;;;::::0;-1:-1:-1;;;76495:70:0;;25038:2:1;76495:70:0::1;::::0;::::1;25020:21:1::0;25077:2;25057:18;;;25050:30;25116:26;25096:18;;;25089:54;25160:18;;76495:70:0::1;24836:348:1::0;76495:70:0::1;76597:7;76580:13;;:24;;76572:77;;;::::0;-1:-1:-1;;;76572:77:0;;25391:2:1;76572:77:0::1;::::0;::::1;25373:21:1::0;25430:2;25410:18;;;25403:30;25469:34;25449:18;;;25442:62;-1:-1:-1;;;25520:18:1;;;25513:38;25568:19;;76572:77:0::1;25189:404:1::0;76572:77:0::1;76691:10;76681:21;::::0;;;:9:::1;:21;::::0;;;;;:31:::1;::::0;76705:7;;76681:31:::1;:::i;:::-;76664:13;;:48;;76656:91;;;::::0;-1:-1:-1;;;76656:91:0;;25800:2:1;76656:91:0::1;::::0;::::1;25782:21:1::0;25839:2;25819:18;;;25812:30;25878:32;25858:18;;;25851:60;25928:18;;76656:91:0::1;25598:354:1::0;76656:91:0::1;76789:7;76775:11;;:21;;;;:::i;:::-;76762:9;:34;76754:71;;;;-1:-1:-1::0;;;76754:71:0::1;;;;;;;:::i;:::-;76870:9;;76851:13;:11;:13::i;:::-;76841:23;::::0;:7;:23:::1;:::i;:::-;76840:40;;76832:65;;;;-1:-1:-1::0;;;76832:65:0::1;;;;;;;:::i;:::-;76914:10;76904:21;::::0;;;:9:::1;:21;::::0;;;;:32;;76929:7;;76904:21;:32:::1;::::0;76929:7;;76904:32:::1;:::i;:::-;::::0;;;-1:-1:-1;76943:30:0::1;::::0;-1:-1:-1;76953:10:0::1;76965:7:::0;76943:9:::1;:30::i;76107:198::-:0;59345:32;34773:10;59345:18;:32::i;:::-;76237:9:::1;;76218:13;:11;:13::i;:::-;76208:23;::::0;:7;:23:::1;:::i;:::-;76207:40;;76199:65;;;;-1:-1:-1::0;;;76199:65:0::1;;;;;;;:::i;:::-;76271:28;76281:8;76291:7;76271:9;:28::i;71435:101::-:0;59345:32;34773:10;59345:18;:32::i;:::-;71518:3:::1;:12:::0;;-1:-1:-1;;;;;;71518:12:0::1;-1:-1:-1::0;;;;;71518:12:0;;;::::1;::::0;;;::::1;::::0;;71435:101::o;73750:103::-;59345:32;34773:10;59345:18;:32::i;:::-;73825:11:::1;:22:::0;73750:103::o;75455:131::-;59345:32;34773:10;59345:18;:32::i;:::-;75546:14:::1;:34;75563:17:::0;75546:14;:34:::1;:::i;68674:113::-:0;68728:13;68761:20;:18;:20::i;:::-;68754:27;;68674:113;:::o;58633:201::-;57613:13;:11;:13::i;:::-;-1:-1:-1;;;;;58722:22:0;::::1;58714:73;;;::::0;-1:-1:-1;;;58714:73:0;;26159:2:1;58714:73:0::1;::::0;::::1;26141:21:1::0;26198:2;26178:18;;;26171:30;26237:34;26217:18;;;26210:62;-1:-1:-1;;;26288:18:1;;;26281:36;26334:19;;58714:73:0::1;25957:402:1::0;58714:73:0::1;58798:28;58817:8;58798:18;:28::i;71045:101::-:0;59345:32;34773:10;59345:18;:32::i;:::-;71128:3:::1;:12:::0;;-1:-1:-1;;;;;;71128:12:0::1;-1:-1:-1::0;;;;;71128:12:0;;;::::1;::::0;;;::::1;::::0;;71045:101::o;73191:100::-;59345:32;34773:10;59345:18;:32::i;:::-;73270:7:::1;:15:::0;73191:100::o;11130:451::-;11205:13;11231:19;11263:10;11267:6;11263:1;:10;:::i;:::-;:14;;11276:1;11263:14;:::i;:::-;-1:-1:-1;;;;;11253:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11253:25:0;;11231:47;;-1:-1:-1;;;11289:6:0;11296:1;11289:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;11289:15:0;;;;;;;;;-1:-1:-1;;;11315:6:0;11322:1;11315:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;11315:15:0;;;;;;;;-1:-1:-1;11346:9:0;11358:10;11362:6;11358:1;:10;:::i;:::-;:14;;11371:1;11358:14;:::i;:::-;11346:26;;11341:135;11378:1;11374;:5;11341:135;;;-1:-1:-1;;;11426:5:0;11434:3;11426:11;11413:25;;;;;;;:::i;:::-;;;;11401:6;11408:1;11401:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;11401:37:0;;;;;;;;-1:-1:-1;11463:1:0;11453:11;;;;;11381:3;;;:::i;:::-;;;11341:135;;;-1:-1:-1;11494:10:0;;11486:55;;;;-1:-1:-1;;;11486:55:0;;26707:2:1;11486:55:0;;;26689:21:1;;;26726:18;;;26719:30;26785:34;26765:18;;;26758:62;26837:18;;11486:55:0;26505:356:1;11486:55:0;11566:6;11130:451;-1:-1:-1;;;11130:451:0:o;28599:215::-;28701:4;-1:-1:-1;;;;;;28725:41:0;;-1:-1:-1;;;28725:41:0;;:81;;;28770:36;28794:11;28770:23;:36::i;60110:370::-;-1:-1:-1;;;;;60204:21:0;;;;;;:10;:21;;;;;;;;60337:46;34773:10;60365:12;-1:-1:-1;;;;;60337:46:0;60380:2;60337:19;:46::i;:::-;60265:181;;;;;;;;:::i;:::-;;;;;;;;;;;;;60182:290;;;;;-1:-1:-1;;;60182:290:0;;;;;;;;:::i;29961:332::-;29677:5;-1:-1:-1;;;;;30064:33:0;;;;30056:88;;;;-1:-1:-1;;;30056:88:0;;27684:2:1;30056:88:0;;;27666:21:1;27723:2;27703:18;;;27696:30;27762:34;27742:18;;;27735:62;-1:-1:-1;;;27813:18:1;;;27806:40;27863:19;;30056:88:0;27482:406:1;30056:88:0;-1:-1:-1;;;;;30163:22:0;;30155:60;;;;-1:-1:-1;;;30155:60:0;;28095:2:1;30155:60:0;;;28077:21:1;28134:2;28114:18;;;28107:30;28173:27;28153:18;;;28146:55;28218:18;;30155:60:0;27893:349:1;30155:60:0;30250:35;;;;;;;;;-1:-1:-1;;;;;30250:35:0;;;;;;-1:-1:-1;;;;;30250:35:0;;;;;;;;;;-1:-1:-1;;;30228:57:0;;;;:19;:57;29961:332::o;44332:174::-;44389:4;44432:7;68235:1;44413:26;;:53;;;;;44453:13;;44443:7;:23;44413:53;:85;;;;-1:-1:-1;;44471:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;44471:27:0;;;;44470:28;;44332:174::o;41899:380::-;41980:13;41996:24;42012:7;41996:15;:24::i;:::-;41980:40;;42041:5;-1:-1:-1;;;;;42035:11:0;:2;-1:-1:-1;;;;;42035:11:0;;42031:48;;42055:24;;-1:-1:-1;;;42055:24:0;;;;;;;;;;;42031:48;34773:10;-1:-1:-1;;;;;42096:21:0;;;42092:139;;42123:37;42140:5;34773:10;42979:164;:::i;42123:37::-;42119:112;;42184:35;;-1:-1:-1;;;42184:35:0;;;;;;;;;;;42119:112;42243:28;42252:2;42256:7;42265:5;42243:8;:28::i;43210:170::-;43344:28;43354:4;43360:2;43364:7;43344:9;:28::i;57892:132::-;57773:7;57800:6;-1:-1:-1;;;;;57800:6:0;34773:10;57956:23;57948:68;;;;-1:-1:-1;;;57948:68:0;;28449:2:1;57948:68:0;;;28431:21:1;;;28468:18;;;28461:30;28527:34;28507:18;;;28500:62;28579:18;;57948:68:0;28247:356:1;59526:421:0;-1:-1:-1;;;;;59617:22:0;;;;;;:10;:22;;;;;;;;59616:23;59751:46;34773:10;59779:12;34693:98;59751:46;59679:194;;;;;;;;:::i;:::-;;;;;;;;;;;;;59594:305;;;;;-1:-1:-1;;;59594:305:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;59910:22:0;;;;;:10;:22;;;;;:29;;-1:-1:-1;;59910:29:0;59935:4;59910:29;;;59526:421::o;44590:104::-;44659:27;44669:2;44673:8;44659:27;;;;;;;;;;;;:9;:27::i;43451:185::-;43589:39;43606:4;43612:2;43616:7;43589:39;;;;;;;;;;;;:16;:39::i;51028:2408::-;51108:35;51146:21;51159:7;51146:12;:21::i;:::-;51195:18;;51108:59;;-1:-1:-1;51226:290:0;;;;51260:22;34773:10;-1:-1:-1;;;;;51286:20:0;;;;:77;;-1:-1:-1;51327:36:0;51344:4;34773:10;42979:164;:::i;51327:36::-;51286:134;;;-1:-1:-1;34773:10:0;51384:20;51396:7;51384:11;:20::i;:::-;-1:-1:-1;;;;;51384:36:0;;51286:134;51260:161;;51443:17;51438:66;;51469:35;;-1:-1:-1;;;51469:35:0;;;;;;;;;;;51438:66;51245:271;51226:290;51644:35;51661:1;51665:7;51674:4;51644:8;:35::i;:::-;-1:-1:-1;;;;;52009:18:0;;;51975:31;52009:18;;;:12;:18;;;;;;;;52042:24;;-1:-1:-1;;;;;;;;;;52042:24:0;;;;;;;;;-1:-1:-1;;52042:24:0;;;;52081:29;;;;;52065:1;52081:29;;;;;;;;-1:-1:-1;;52081:29:0;;;;;;;;;;52243:20;;;:11;:20;;;;;;52278;;-1:-1:-1;;;;52346:15:0;52313:49;;;-1:-1:-1;;;52313:49:0;-1:-1:-1;;;;;;52313:49:0;;;;;;;;;;52377:22;-1:-1:-1;;;52377:22:0;;;52669:11;;;52729:24;;;;;52772:13;;52009:18;;52729:24;;52772:13;52768:384;;52982:13;;52967:11;:28;52963:174;;53020:20;;53089:28;;;;-1:-1:-1;;;;;53063:54:0;-1:-1:-1;;;53063:54:0;-1:-1:-1;;;;;;53063:54:0;;;-1:-1:-1;;;;;53020:20:0;;53063:54;;;;52963:174;-1:-1:-1;;53180:35:0;;53207:7;;-1:-1:-1;53203:1:0;;-1:-1:-1;;;;;;53180:35:0;;;-1:-1:-1;;;;;;;;;;;53180:35:0;53203:1;;53180:35;-1:-1:-1;;53403:12:0;:14;;;;;;-1:-1:-1;;51028:2408:0:o;39468:1111::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;39579:7:0;;68235:1;39628:23;39624:888;;39664:13;;39657:4;:20;39653:859;;;39698:31;39732:17;;;:11;:17;;;;;;;;;39698:51;;;;;;;;;-1:-1:-1;;;;;39698:51:0;;;;-1:-1:-1;;;39698:51:0;;-1:-1:-1;;;;;39698:51:0;;;;;;;;-1:-1:-1;;;39698:51:0;;;;;;;;;;;;;;39768:729;;39818:14;;-1:-1:-1;;;;;39818:28:0;;39814:101;;39882:9;39468:1111;-1:-1:-1;;;39468:1111:0:o;39814:101::-;-1:-1:-1;;;40257:6:0;40302:17;;;;:11;:17;;;;;;;;;40290:29;;;;;;;;;-1:-1:-1;;;;;40290:29:0;;;;;-1:-1:-1;;;40290:29:0;;-1:-1:-1;;;;;40290:29:0;;;;;;;;-1:-1:-1;;;40290:29:0;;;;;;;;;;;;;40350:28;40346:109;;40418:9;39468:1111;-1:-1:-1;;;39468:1111:0:o;40346:109::-;40217:261;;;39679:833;39653:859;40540:31;;-1:-1:-1;;;40540:31:0;;;;;;;;;;;58994:191;59068:16;59087:6;;-1:-1:-1;;;;;59104:17:0;;;-1:-1:-1;;;;;;59104:17:0;;;;;;59137:40;;59087:6;;;;;;;59137:40;;59068:16;59137:40;59057:128;58994:191;:::o;42621:287::-;34773:10;-1:-1:-1;;;;;42720:24:0;;;42716:54;;42753:17;;-1:-1:-1;;;42753:17:0;;;;;;;;;;;42716:54;34773:10;42783:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;42783:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;42783:53:0;;;;;;;;;;42852:48;;540:41:1;;;42783:42:0;;34773:10;42852:48;;513:18:1;42852:48:0;;;;;;;42621:287;;:::o;59955:147::-;60024:30;60043:10;60024:18;:30::i;:::-;-1:-1:-1;;;;;60072:22:0;;;;;:10;:22;;;;;60065:29;;-1:-1:-1;;60065:29:0;;;59955:147::o;43707:370::-;43874:28;43884:4;43890:2;43894:7;43874:9;:28::i;:::-;-1:-1:-1;;;;;43917:13:0;;1435:19;:23;43913:157;;43938:56;43969:4;43975:2;43979:7;43988:5;43938:30;:56::i;:::-;43934:136;;44018:40;;-1:-1:-1;;;44018:40:0;;;;;;;;;;;75622:97;75672:13;75700;75693:20;;;;;:::i;9829:723::-;9885:13;10106:5;10115:1;10106:10;10102:53;;-1:-1:-1;;10133:10:0;;;;;;;;;;;;-1:-1:-1;;;10133:10:0;;;;;9829:723::o;10102:53::-;10180:5;10165:12;10221:78;10228:9;;10221:78;;10254:8;;;;:::i;:::-;;-1:-1:-1;10277:10:0;;-1:-1:-1;10285:2:0;10277:10;;:::i;:::-;;;10221:78;;;10309:19;10341:6;-1:-1:-1;;;;;10331:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10331:17:0;;10309:39;;10359:154;10366:10;;10359:154;;10393:11;10403:1;10393:11;;:::i;:::-;;-1:-1:-1;10462:10:0;10470:2;10462:5;:10;:::i;:::-;10449:24;;:2;:24;:::i;:::-;10436:39;;10419:6;10426;10419:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;10419:56:0;;;;;;;;-1:-1:-1;10490:11:0;10499:2;10490:11;;:::i;:::-;;;10359:154;;;10537:6;9829:723;-1:-1:-1;;;;9829:723:0:o;68813:567::-;68866:13;68889:16;;68934:32;68889:16;29677:5;68934:11;:32::i;:::-;68888:78;;;;69075:283;69187:33;69204:15;69187:16;:33::i;:::-;69262:51;69298:8;-1:-1:-1;;;;;69282:26:0;69310:2;69262:19;:51::i;:::-;69121:213;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69075:13;:283::i;:::-;69006:361;;;;;;;;:::i;:::-;;;;;;;;;;;;;68984:390;;;;68813:567;:::o;37718:305::-;37820:4;-1:-1:-1;;;;;;37857:40:0;;-1:-1:-1;;;37857:40:0;;:105;;-1:-1:-1;;;;;;;37914:48:0;;-1:-1:-1;;;37914:48:0;37857:105;:158;;;-1:-1:-1;;;;;;;;;;26373:40:0;;;37979:36;26264:157;53554:196;53669:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;53669:29:0;-1:-1:-1;;;;;53669:29:0;;;;;;;;;53714:28;;53669:24;;53714:28;;;;;;;53554:196;;;:::o;48502:2130::-;48617:35;48655:21;48668:7;48655:12;:21::i;:::-;48617:59;;48715:4;-1:-1:-1;;;;;48693:26:0;:13;:18;;;-1:-1:-1;;;;;48693:26:0;;48689:67;;48728:28;;-1:-1:-1;;;48728:28:0;;;;;;;;;;;48689:67;48769:22;34773:10;-1:-1:-1;;;;;48795:20:0;;;;:73;;-1:-1:-1;48832:36:0;48849:4;34773:10;42979:164;:::i;48832:36::-;48795:126;;;-1:-1:-1;34773:10:0;48885:20;48897:7;48885:11;:20::i;:::-;-1:-1:-1;;;;;48885:36:0;;48795:126;48769:153;;48940:17;48935:66;;48966:35;;-1:-1:-1;;;48966:35:0;;;;;;;;;;;48935:66;-1:-1:-1;;;;;49016:16:0;;49012:52;;49041:23;;-1:-1:-1;;;49041:23:0;;;;;;;;;;;49012:52;49185:35;49202:1;49206:7;49215:4;49185:8;:35::i;:::-;-1:-1:-1;;;;;49516:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;49516:31:0;;;-1:-1:-1;;;;;49516:31:0;;;-1:-1:-1;;49516:31:0;;;;;;;49562:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;49562:29:0;;;;;;;;;;;49642:20;;;:11;:20;;;;;;49677:18;;-1:-1:-1;;;;;;49710:49:0;;;;-1:-1:-1;;;49743:15:0;49710:49;;;;;;;;;;50033:11;;50093:24;;;;;50136:13;;49642:20;;50093:24;;50136:13;50132:384;;50346:13;;50331:11;:28;50327:174;;50384:20;;50453:28;;;;-1:-1:-1;;;;;50427:54:0;-1:-1:-1;;;50427:54:0;-1:-1:-1;;;;;;50427:54:0;;;-1:-1:-1;;;;;50384:20:0;;50427:54;;;;50327:174;49491:1036;;;50563:7;50559:2;-1:-1:-1;;;;;50544:27:0;50553:4;-1:-1:-1;;;;;50544:27:0;-1:-1:-1;;;;;;;;;;;50544:27:0;;;;;;;;;50582:42;81627:163;45067:1749;45213:13;;-1:-1:-1;;;;;45241:16:0;;45237:48;;45266:19;;-1:-1:-1;;;45266:19:0;;;;;;;;;;;45237:48;45300:8;45312:1;45300:13;45296:44;;45322:18;;-1:-1:-1;;;45322:18:0;;;;;;;;;;;45296:44;-1:-1:-1;;;;;45691:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;45750:49:0;;-1:-1:-1;;;;;45691:44:0;;;;;;;45750:49;;;;-1:-1:-1;;45691:44:0;;;;;;45750:49;;;;;;;;;;;;;;;;45816:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;45866:66:0;;;-1:-1:-1;;;45916:15:0;45866:66;;;;;;;;;;;;;45816:25;;46013:23;;;;1435:19;:23;46053:631;;46093:313;46124:38;;46149:12;;-1:-1:-1;;;;;46124:38:0;;;46141:1;;-1:-1:-1;;;;;;;;;;;46124:38:0;46141:1;;46124:38;46190:69;46229:1;46233:2;46237:14;;;;;;46253:5;46190:30;:69::i;:::-;46185:174;;46295:40;;-1:-1:-1;;;46295:40:0;;;;;;;;;;;46185:174;46401:3;46386:12;:18;46093:313;;46487:12;46470:13;;:29;46466:43;;46501:8;;;46466:43;46053:631;;;46550:119;46581:40;;46606:14;;;;;-1:-1:-1;;;;;46581:40:0;;;46598:1;;-1:-1:-1;;;;;;;;;;;46581:40:0;46598:1;;46581:40;46664:3;46649:12;:18;46550:119;;46053:631;-1:-1:-1;46698:13:0;:28;46748:60;46777:1;46781:2;46785:12;46799:8;46748:60;:::i;54242:667::-;54426:72;;-1:-1:-1;;;54426:72:0;;54405:4;;-1:-1:-1;;;;;54426:36:0;;;;;:72;;34773:10;;54477:4;;54483:7;;54492:5;;54426:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54426:72:0;;;;;;;;-1:-1:-1;;54426:72:0;;;;;;;;;;;;:::i;:::-;;;54422:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54660:6;:13;54677:1;54660:18;54656:235;;54706:40;;-1:-1:-1;;;54706:40:0;;;;;;;;;;;54656:235;54849:6;54843:13;54834:6;54830:2;54826:15;54819:38;54422:480;-1:-1:-1;;;;;;54545:55:0;-1:-1:-1;;;54545:55:0;;-1:-1:-1;54242:667:0;;;;;;:::o;13034:3097::-;13092:13;13329:4;:11;13344:1;13329:16;13325:31;;-1:-1:-1;;13347:9:0;;;;;;;;;-1:-1:-1;13347:9:0;;;13034:3097::o;13325:31::-;13409:19;13431:6;;;;;;;;;;;;;;;;;13409:28;;13848:20;13907:1;13888:4;:11;13902:1;13888:15;;;;:::i;:::-;13887:21;;;;:::i;:::-;13882:27;;:1;:27;:::i;:::-;-1:-1:-1;;;;;13871:39:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13871:39:0;;13848:62;;14090:1;14083:5;14079:13;14194:2;14186:6;14182:15;14305:4;14357;14351:11;14345:4;14341:22;14267:1432;14391:6;14382:7;14379:19;14267:1432;;;14497:1;14488:7;14484:15;14473:26;;14536:7;14530:14;15189:4;15181:5;15177:2;15173:14;15169:25;15159:8;15155:40;15149:47;15138:9;15130:67;15243:1;15232:9;15228:17;15215:30;;15335:4;15327:5;15323:2;15319:14;15315:25;15305:8;15301:40;15295:47;15284:9;15276:67;15389:1;15378:9;15374:17;15361:30;;15480:4;15472:5;15469:1;15465:13;15461:24;15451:8;15447:39;15441:46;15430:9;15422:66;15534:1;15523:9;15519:17;15506:30;;15617:4;15610:5;15606:16;15596:8;15592:31;15586:38;15575:9;15567:58;;15671:1;15660:9;15656:17;15643:30;;14267:1432;;;14271:107;;15861:1;15854:4;15848:11;15844:19;15882:1;15877:123;;;;16019:1;16014:73;;;;15837:250;;15877:123;15930:4;15926:1;15915:9;15911:17;15903:32;15980:4;15976:1;15965:9;15961:17;15953:32;15877:123;;16014:73;16067:4;16063:1;16052:9;16048:17;16040:32;15837:250;-1:-1:-1;16117:6:0;;13034:3097;-1:-1:-1;;;;;13034:3097:0: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:131::-;-1:-1:-1;;;;;667:31:1;;657:42;;647:70;;713:1;710;703:12;728:435;795:6;803;856:2;844:9;835:7;831:23;827:32;824:52;;;872:1;869;862:12;824:52;911:9;898:23;930:31;955:5;930:31;:::i;:::-;980:5;-1:-1:-1;1037:2:1;1022:18;;1009:32;-1:-1:-1;;;;;1072:40:1;;1060:53;;1050:81;;1127:1;1124;1117:12;1050:81;1150:7;1140:17;;;728:435;;;;;:::o;1168:250::-;1253:1;1263:113;1277:6;1274:1;1271:13;1263:113;;;1353:11;;;1347:18;1334:11;;;1327:39;1299:2;1292:10;1263:113;;;-1:-1:-1;;1410:1:1;1392:16;;1385:27;1168:250::o;1423:271::-;1465:3;1503:5;1497:12;1530:6;1525:3;1518:19;1546:76;1615:6;1608:4;1603:3;1599:14;1592:4;1585:5;1581:16;1546:76;:::i;:::-;1676:2;1655:15;-1:-1:-1;;1651:29:1;1642:39;;;;1683:4;1638:50;;1423:271;-1:-1:-1;;1423:271:1:o;1699:220::-;1848:2;1837:9;1830:21;1811:4;1868:45;1909:2;1898:9;1894:18;1886:6;1868:45;:::i;1924:180::-;1983:6;2036:2;2024:9;2015:7;2011:23;2007:32;2004:52;;;2052:1;2049;2042:12;2004:52;-1:-1:-1;2075:23:1;;1924:180;-1:-1:-1;1924:180:1:o;2317:315::-;2385:6;2393;2446:2;2434:9;2425:7;2421:23;2417:32;2414:52;;;2462:1;2459;2452:12;2414:52;2501:9;2488:23;2520:31;2545:5;2520:31;:::i;:::-;2570:5;2622:2;2607:18;;;;2594:32;;-1:-1:-1;;;2317:315:1:o;2637:247::-;2696:6;2749:2;2737:9;2728:7;2724:23;2720:32;2717:52;;;2765:1;2762;2755:12;2717:52;2804:9;2791:23;2823:31;2848:5;2823:31;:::i;3071:456::-;3148:6;3156;3164;3217:2;3205:9;3196:7;3192:23;3188:32;3185:52;;;3233:1;3230;3223:12;3185:52;3272:9;3259:23;3291:31;3316:5;3291:31;:::i;:::-;3341:5;-1:-1:-1;3398:2:1;3383:18;;3370:32;3411:33;3370:32;3411:33;:::i;:::-;3071:456;;3463:7;;-1:-1:-1;;;3517:2:1;3502:18;;;;3489:32;;3071:456::o;3532:118::-;3618:5;3611:13;3604:21;3597:5;3594:32;3584:60;;3640:1;3637;3630:12;3655:241;3711:6;3764:2;3752:9;3743:7;3739:23;3735:32;3732:52;;;3780:1;3777;3770:12;3732:52;3819:9;3806:23;3838:28;3860:5;3838:28;:::i;3901:248::-;3969:6;3977;4030:2;4018:9;4009:7;4005:23;4001:32;3998:52;;;4046:1;4043;4036:12;3998:52;-1:-1:-1;;4069:23:1;;;4139:2;4124:18;;;4111:32;;-1:-1:-1;3901:248:1:o;4673:632::-;4844:2;4896:21;;;4966:13;;4869:18;;;4988:22;;;4815:4;;4844:2;5067:15;;;;5041:2;5026:18;;;4815:4;5110:169;5124:6;5121:1;5118:13;5110:169;;;5185:13;;5173:26;;5254:15;;;;5219:12;;;;5146:1;5139:9;5110:169;;;-1:-1:-1;5296:3:1;;4673:632;-1:-1:-1;;;;;;4673:632:1:o;5310:127::-;5371:10;5366:3;5362:20;5359:1;5352:31;5402:4;5399:1;5392:15;5426:4;5423:1;5416:15;5442:275;5513:2;5507:9;5578:2;5559:13;;-1:-1:-1;;5555:27:1;5543:40;;-1:-1:-1;;;;;5598:34:1;;5634:22;;;5595:62;5592:88;;;5660:18;;:::i;:::-;5696:2;5689:22;5442:275;;-1:-1:-1;5442:275:1:o;5722:407::-;5787:5;-1:-1:-1;;;;;5813:6:1;5810:30;5807:56;;;5843:18;;:::i;:::-;5881:57;5926:2;5905:15;;-1:-1:-1;;5901:29:1;5932:4;5897:40;5881:57;:::i;:::-;5872:66;;5961:6;5954:5;5947:21;6001:3;5992:6;5987:3;5983:16;5980:25;5977:45;;;6018:1;6015;6008:12;5977:45;6067:6;6062:3;6055:4;6048:5;6044:16;6031:43;6121:1;6114:4;6105:6;6098:5;6094:18;6090:29;6083:40;5722:407;;;;;:::o;6134:451::-;6203:6;6256:2;6244:9;6235:7;6231:23;6227:32;6224:52;;;6272:1;6269;6262:12;6224:52;6312:9;6299:23;-1:-1:-1;;;;;6337:6:1;6334:30;6331:50;;;6377:1;6374;6367:12;6331:50;6400:22;;6453:4;6445:13;;6441:27;-1:-1:-1;6431:55:1;;6482:1;6479;6472:12;6431:55;6505:74;6571:7;6566:2;6553:16;6548:2;6544;6540:11;6505:74;:::i;6590:712::-;6644:5;6697:3;6690:4;6682:6;6678:17;6674:27;6664:55;;6715:1;6712;6705:12;6664:55;6751:6;6738:20;6777:4;-1:-1:-1;;;;;6796:2:1;6793:26;6790:52;;;6822:18;;:::i;:::-;6868:2;6865:1;6861:10;6891:28;6915:2;6911;6907:11;6891:28;:::i;:::-;6953:15;;;7023;;;7019:24;;;6984:12;;;;7055:15;;;7052:35;;;7083:1;7080;7073:12;7052:35;7119:2;7111:6;7107:15;7096:26;;7131:142;7147:6;7142:3;7139:15;7131:142;;;7213:17;;7201:30;;7164:12;;;;7251;;;;7131:142;;;7291:5;6590:712;-1:-1:-1;;;;;;;6590:712:1:o;7307:483::-;7400:6;7408;7461:2;7449:9;7440:7;7436:23;7432:32;7429:52;;;7477:1;7474;7467:12;7429:52;7516:9;7503:23;7535:31;7560:5;7535:31;:::i;:::-;7585:5;-1:-1:-1;7641:2:1;7626:18;;7613:32;-1:-1:-1;;;;;7657:30:1;;7654:50;;;7700:1;7697;7690:12;7654:50;7723:61;7776:7;7767:6;7756:9;7752:22;7723:61;:::i;:::-;7713:71;;;7307:483;;;;;:::o;7980:382::-;8045:6;8053;8106:2;8094:9;8085:7;8081:23;8077:32;8074:52;;;8122:1;8119;8112:12;8074:52;8161:9;8148:23;8180:31;8205:5;8180:31;:::i;:::-;8230:5;-1:-1:-1;8287:2:1;8272:18;;8259:32;8300:30;8259:32;8300:30;:::i;8367:795::-;8462:6;8470;8478;8486;8539:3;8527:9;8518:7;8514:23;8510:33;8507:53;;;8556:1;8553;8546:12;8507:53;8595:9;8582:23;8614:31;8639:5;8614:31;:::i;:::-;8664:5;-1:-1:-1;8721:2:1;8706:18;;8693:32;8734:33;8693:32;8734:33;:::i;:::-;8786:7;-1:-1:-1;8840:2:1;8825:18;;8812:32;;-1:-1:-1;8895:2:1;8880:18;;8867:32;-1:-1:-1;;;;;8911:30:1;;8908:50;;;8954:1;8951;8944:12;8908:50;8977:22;;9030:4;9022:13;;9018:27;-1:-1:-1;9008:55:1;;9059:1;9056;9049:12;9008:55;9082:74;9148:7;9143:2;9130:16;9125:2;9121;9117:11;9082:74;:::i;:::-;9072:84;;;8367:795;;;;;;;:::o;9167:416::-;9260:6;9268;9321:2;9309:9;9300:7;9296:23;9292:32;9289:52;;;9337:1;9334;9327:12;9289:52;9373:9;9360:23;9350:33;;9434:2;9423:9;9419:18;9406:32;-1:-1:-1;;;;;9453:6:1;9450:30;9447:50;;;9493:1;9490;9483:12;9588:315;9656:6;9664;9717:2;9705:9;9696:7;9692:23;9688:32;9685:52;;;9733:1;9730;9723:12;9685:52;9769:9;9756:23;9746:33;;9829:2;9818:9;9814:18;9801:32;9842:31;9867:5;9842:31;:::i;9908:388::-;9976:6;9984;10037:2;10025:9;10016:7;10012:23;10008:32;10005:52;;;10053:1;10050;10043:12;10005:52;10092:9;10079:23;10111:31;10136:5;10111:31;:::i;:::-;10161:5;-1:-1:-1;10218:2:1;10203:18;;10190:32;10231:33;10190:32;10231:33;:::i;10301:380::-;10380:1;10376:12;;;;10423;;;10444:61;;10498:4;10490:6;10486:17;10476:27;;10444:61;10551:2;10543:6;10540:14;10520:18;10517:38;10514:161;;10597:10;10592:3;10588:20;10585:1;10578:31;10632:4;10629:1;10622:15;10660:4;10657:1;10650:15;10514:161;;10301:380;;;:::o;10995:245::-;11062:6;11115:2;11103:9;11094:7;11090:23;11086:32;11083:52;;;11131:1;11128;11121:12;11083:52;11163:9;11157:16;11182:28;11204:5;11182:28;:::i;11245:127::-;11306:10;11301:3;11297:20;11294:1;11287:31;11337:4;11334:1;11327:15;11361:4;11358:1;11351:15;11377:168;11450:9;;;11481;;11498:15;;;11492:22;;11478:37;11468:71;;11519:18;;:::i;11550:127::-;11611:10;11606:3;11602:20;11599:1;11592:31;11642:4;11639:1;11632:15;11666:4;11663:1;11656:15;11682:120;11722:1;11748;11738:35;;11753:18;;:::i;:::-;-1:-1:-1;11787:9:1;;11682:120::o;11807:355::-;12009:2;11991:21;;;12048:2;12028:18;;;12021:30;12087:33;12082:2;12067:18;;12060:61;12153:2;12138:18;;11807:355::o;12922:125::-;12987:9;;;13008:10;;;13005:36;;;13021:18;;:::i;13408:348::-;13610:2;13592:21;;;13649:2;13629:18;;;13622:30;13688:26;13683:2;13668:18;;13661:54;13747:2;13732:18;;13408:348::o;13761:336::-;13963:2;13945:21;;;14002:2;13982:18;;;13975:30;-1:-1:-1;;;14036:2:1;14021:18;;14014:42;14088:2;14073:18;;13761:336::o;19291:251::-;19361:6;19414:2;19402:9;19393:7;19389:23;19385:32;19382:52;;;19430:1;19427;19420:12;19382:52;19462:9;19456:16;19481:31;19506:5;19481:31;:::i;19547:135::-;19586:3;19607:17;;;19604:43;;19627:18;;:::i;:::-;-1:-1:-1;19674:1:1;19663:13;;19547:135::o;19687:127::-;19748:10;19743:3;19739:20;19736:1;19729:31;19779:4;19776:1;19769:15;19803:4;19800:1;19793:15;19945:545;20047:2;20042:3;20039:11;20036:448;;;20083:1;20108:5;20104:2;20097:17;20153:4;20149:2;20139:19;20223:2;20211:10;20207:19;20204:1;20200:27;20194:4;20190:38;20259:4;20247:10;20244:20;20241:47;;;-1:-1:-1;20282:4:1;20241:47;20337:2;20332:3;20328:12;20325:1;20321:20;20315:4;20311:31;20301:41;;20392:82;20410:2;20403:5;20400:13;20392:82;;;20455:17;;;20436:1;20425:13;20392:82;;;20396:3;;;19945:545;;;:::o;20666:1352::-;20792:3;20786:10;-1:-1:-1;;;;;20811:6:1;20808:30;20805:56;;;20841:18;;:::i;:::-;20870:97;20960:6;20920:38;20952:4;20946:11;20920:38;:::i;:::-;20914:4;20870:97;:::i;:::-;21022:4;;21086:2;21075:14;;21103:1;21098:663;;;;21805:1;21822:6;21819:89;;;-1:-1:-1;21874:19:1;;;21868:26;21819:89;-1:-1:-1;;20623:1:1;20619:11;;;20615:24;20611:29;20601:40;20647:1;20643:11;;;20598:57;21921:81;;21068:944;;21098:663;19892:1;19885:14;;;19929:4;19916:18;;-1:-1:-1;;21134:20:1;;;21252:236;21266:7;21263:1;21260:14;21252:236;;;21355:19;;;21349:26;21334:42;;21447:27;;;;21415:1;21403:14;;;;21282:19;;21252:236;;;21256:3;21516:6;21507:7;21504:19;21501:201;;;21577:19;;;21571:26;-1:-1:-1;;21660:1:1;21656:14;;;21672:3;21652:24;21648:37;21644:42;21629:58;21614:74;;21501:201;-1:-1:-1;;;;;21748:1:1;21732:14;;;21728:22;21715:36;;-1:-1:-1;20666:1352:1:o;23223:1256::-;23447:3;23485:6;23479:13;23511:4;23524:64;23581:6;23576:3;23571:2;23563:6;23559:15;23524:64;:::i;:::-;23651:13;;23610:16;;;;23673:68;23651:13;23610:16;23708:15;;;23673:68;:::i;:::-;23830:13;;23763:20;;;23803:1;;23868:36;23830:13;23868:36;:::i;:::-;23923:1;23940:18;;;23967:141;;;;24122:1;24117:337;;;;23933:521;;23967:141;-1:-1:-1;;24002:24:1;;23988:39;;24079:16;;24072:24;24058:39;;24047:51;;;-1:-1:-1;23967:141:1;;24117:337;24148:6;24145:1;24138:17;24196:2;24193:1;24183:16;24221:1;24235:169;24249:8;24246:1;24243:15;24235:169;;;24331:14;;24316:13;;;24309:37;24374:16;;;;24266:10;;24235:169;;;24239:3;;24435:8;24428:5;24424:20;24417:27;;23933:521;-1:-1:-1;24470:3:1;;23223:1256;-1:-1:-1;;;;;;;;;;23223:1256:1:o;26364:136::-;26403:3;26431:5;26421:39;;26440:18;;:::i;:::-;-1:-1:-1;;;26476:18:1;;26364:136::o;26866:611::-;-1:-1:-1;;;27224:3:1;27217:23;27199:3;27269:6;27263:13;27285:74;27352:6;27348:1;27343:3;27339:11;27332:4;27324:6;27320:17;27285:74;:::i;:::-;-1:-1:-1;;;27418:1:1;27378:16;;;;27410:10;;;27403:41;-1:-1:-1;27468:2:1;27460:11;;26866:611;-1:-1:-1;26866:611:1:o;28608:624::-;-1:-1:-1;;;28966:3:1;28959:23;28941:3;29011:6;29005:13;29027:74;29094:6;29090:1;29085:3;29081:11;29074:4;29066:6;29062:17;29027:74;:::i;:::-;29164:34;29160:1;29120:16;;;;29152:10;;;29145:54;-1:-1:-1;29223:2:1;29215:11;;28608:624;-1:-1:-1;28608:624:1:o;29237:128::-;29304:9;;;29325:11;;;29322:37;;;29339:18;;:::i;29370:112::-;29402:1;29428;29418:35;;29433:18;;:::i;:::-;-1:-1:-1;29467:9:1;;29370:112::o;29487:1050::-;29999:66;29994:3;29987:79;29969:3;30095:6;30089:13;30111:75;30179:6;30174:2;30169:3;30165:12;30158:4;30150:6;30146:17;30111:75;:::i;:::-;-1:-1:-1;;;30245:2:1;30205:16;;;30237:11;;;30230:71;30326:13;;30348:76;30326:13;30410:2;30402:11;;30395:4;30383:17;;30348:76;:::i;:::-;-1:-1:-1;;;30484:2:1;30443:17;;;;30476:11;;;30469:35;30528:2;30520:11;;29487:1050;-1:-1:-1;;;;29487:1050:1:o;30542:461::-;30804:31;30799:3;30792:44;30774:3;30865:6;30859:13;30881:75;30949:6;30944:2;30939:3;30935:12;30928:4;30920:6;30916:17;30881:75;:::i;:::-;30976:16;;;;30994:2;30972:25;;30542:461;-1:-1:-1;;30542:461:1:o;31008:489::-;-1:-1:-1;;;;;31277:15:1;;;31259:34;;31329:15;;31324:2;31309:18;;31302:43;31376:2;31361:18;;31354:34;;;31424:3;31419:2;31404:18;;31397:31;;;31202:4;;31445:46;;31471:19;;31463:6;31445:46;:::i;:::-;31437:54;31008:489;-1:-1:-1;;;;;;31008:489:1:o;31502:249::-;31571:6;31624:2;31612:9;31603:7;31599:23;31595:32;31592:52;;;31640:1;31637;31630:12;31592:52;31672:9;31666:16;31691:30;31715:5;31691:30;:::i

Swarm Source

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