ETH Price: $2,339.20 (-0.13%)

Token

Mona Lisa Original (Mona Lisa)
 

Overview

Max Total Supply

330 Mona Lisa

Holders

230

Market

Volume (24H)

0.96 ETH

Min Price (24H)

$725.15 @ 0.310000 ETH

Max Price (24H)

$771.94 @ 0.330000 ETH
Filtered by Token Holder
elmonx.eth
Balance
0 Mona Lisa
0x59de7273191e6bf1907d614e94ecfbe8e5fb7318
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Mona Lisa c.1503-6 (oil on panel) is a half-length portrait painting created by the Italian Renaissance master Leonardo da Vinci. A true masterpiece of Renaissance art, renowned for its technical mastery, enigmatic smile, and timeless beauty.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Mona_Lisa_Original

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-23
*/

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


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/common/ERC2981.sol


// 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];
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (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
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

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

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

// File: MonaLisa330.sol



pragma solidity ^0.8.0;






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

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

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

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    /**
     * @dev Transfers `tokenId` 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 payable;

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

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

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

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

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _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 {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

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

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

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

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

    /**
     * Sets the auxiliary 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 virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    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, _toString(tokenId))) : '';
    }

    /**
     * @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, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @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) public payable virtual override {
        address owner = ownerOf(tokenId);

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

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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 {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @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 memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

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

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @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 for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, 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.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

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

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

    /**
     * @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 {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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 {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

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

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * 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 _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}


/// @notice Optimized and flexible operator filterer to abide to OpenSea's
/// mandatory on-chain royalty enforcement in order for new collections to
/// receive royalties.
/// For more information, see:
/// See: https://github.com/ProjectOpenSea/operator-filter-registry
abstract contract OperatorFilterer {
    /// @dev The default OpenSea operator blocklist subscription.
    address internal constant _DEFAULT_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;

    /// @dev The OpenSea operator filter registry.
    address internal constant _OPERATOR_FILTER_REGISTRY = 0x000000000000AAeB6D7670E522A718067333cd4E;

    /// @dev Registers the current contract to OpenSea's operator filter,
    /// and subscribe to the default OpenSea operator blocklist.
    /// Note: Will not revert nor update existing settings for repeated registration.
    function _registerForOperatorFiltering() internal virtual {
        _registerForOperatorFiltering(_DEFAULT_SUBSCRIPTION, true);
    }

    /// @dev Registers the current contract to OpenSea's operator filter.
    /// Note: Will not revert nor update existing settings for repeated registration.
    function _registerForOperatorFiltering(address subscriptionOrRegistrantToCopy, bool subscribe) internal virtual {
        /// @solidity memory-safe-assembly
        assembly {
            let functionSelector := 0x7d3e3dbe // `registerAndSubscribe(address,address)`.

            // Clean the upper 96 bits of `subscriptionOrRegistrantToCopy` in case they are dirty.
            subscriptionOrRegistrantToCopy := shr(96, shl(96, subscriptionOrRegistrantToCopy))
            // prettier-ignore
            for {} iszero(subscribe) {} {
                if iszero(subscriptionOrRegistrantToCopy) {
                    functionSelector := 0x4420e486 // `register(address)`.
                    break
                }
                functionSelector := 0xa0af2903 // `registerAndCopyEntries(address,address)`.
                break
            }
            // Store the function selector.
            mstore(0x00, shl(224, functionSelector))
            // Store the `address(this)`.
            mstore(0x04, address())
            // Store the `subscriptionOrRegistrantToCopy`.
            mstore(0x24, subscriptionOrRegistrantToCopy)
            // Register into the registry.
            pop(call(gas(), _OPERATOR_FILTER_REGISTRY, 0, 0x00, 0x44, 0x00, 0x00))
            // Restore the part of the free memory pointer that was overwritten,
            // which is guaranteed to be zero, because of Solidity's memory size limits.
            mstore(0x24, 0)
        }
    }

    /// @dev Modifier to guard a function and revert if `from` is a blocked operator.
    /// Can be turned on / off via `enabled`.
    /// For gas efficiency, you can use tight variable packing to efficiently read / write
    /// the boolean value for `enabled`.
    modifier onlyAllowedOperator(address from, bool enabled) virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // This code prioritizes runtime gas costs on a chain with the registry.
            // As such, we will not use `extcodesize`, but rather abuse the behavior
            // of `staticcall` returning 1 when called on an empty / missing contract,
            // to avoid reverting when a chain does not have the registry.

            if enabled {
                // Check if `from` is not equal to `msg.sender`,
                // discarding the upper 96 bits of `from` in case they are dirty.
                if iszero(eq(shr(96, shl(96, from)), caller())) {
                    // Store the function selector of `isOperatorAllowed(address,address)`,
                    // shifted left by 6 bytes, which is enough for 8tb of memory.
                    // We waste 6-3 = 3 bytes to save on 6 runtime gas (PUSH1 0x224 SHL).
                    mstore(0x00, 0xc6171134001122334455)
                    // Store the `address(this)`.
                    mstore(0x1a, address())
                    // Store the `msg.sender`.
                    mstore(0x3a, caller())

                    // `isOperatorAllowed` always returns true if it does not revert.
                    if iszero(staticcall(gas(), _OPERATOR_FILTER_REGISTRY, 0x16, 0x44, 0x00, 0x00)) {
                        // Bubble up the revert if the staticcall reverts.
                        returndatacopy(0x00, 0x00, returndatasize())
                        revert(0x00, returndatasize())
                    }

                    // We'll skip checking if `from` is inside the blacklist.
                    // Even though that can block transferring out of wrapper contracts,
                    // we don't want tokens to be stuck.

                    // Restore the part of the free memory pointer that was overwritten,
                    // which is guaranteed to be zero, if less than 8tb of memory is used.
                    mstore(0x3a, 0)
                }
            }
        }
        _;
    }

    /// @dev Modifier to guard a function from approving a blocked operator.
    /// Can be turned on / off via `enabled`.
    /// For efficiency, you can use tight variable packing to efficiently read / write
    /// the boolean value for `enabled`.
    modifier onlyAllowedOperatorApproval(address operator, bool enabled) virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // For more information on the optimization techniques used,
            // see the comments in `onlyAllowedOperator`.

            if enabled {
                // Store the function selector of `isOperatorAllowed(address,address)`,
                mstore(0x00, 0xc6171134001122334455)
                // Store the `address(this)`.
                mstore(0x1a, address())
                // Store the `operator`, discarding the upper 96 bits in case they are dirty.
                mstore(0x3a, shr(96, shl(96, operator)))

                // `isOperatorAllowed` always returns true if it does not revert.
                if iszero(staticcall(gas(), _OPERATOR_FILTER_REGISTRY, 0x16, 0x44, 0x00, 0x00)) {
                    // Bubble up the revert if the staticcall reverts.
                    returndatacopy(0x00, 0x00, returndatasize())
                    revert(0x00, returndatasize())
                }

                // Restore the part of the free memory pointer that was overwritten.
                mstore(0x3a, 0)
            }
        }
        _;
    }
}

error AlreadyReservedTokens();
error CallerNotOffsetter();
error FunctionLocked();
error InsufficientValue();
error InsufficientMints();
error InsufficientSupply();
error InvalidSignature();
error NoContractMinting();
error ProvenanceHashAlreadySet();
error ProvenanceHashNotSet();
error TokenOffsetAlreadySet();
error TokenOffsetNotSet();
error WithdrawFailed();

interface Offsetable { function setOffset(uint256 randomness) external; }


contract Mona_Lisa_Original is ERC721A, ERC2981, OperatorFilterer, Ownable {
    using ECDSA for bytes32;

    string private _baseTokenURI;
    string public baseExtension = ".json";
    uint256 public constant RESERVED = 150;
    uint256 public SEC_RESERVED = 0;
    uint256 public constant MAX_SUPPLY = 330;    
    uint256 public MAX_MINT_PER_ACCOUNT = 5;
    uint256 public MINT_START_TIME = 1677387600; // Sun Feb 26 2023 05:00:00 GMT+0000
    uint256 public mintPrice = 0.11 ether;
    string public provenanceHash;
    bool public operatorFilteringEnabled;
    mapping(bytes4 => bool) public functionLocked;
    mapping(address => uint) public userNftCount;

    constructor(
        address _royaltyReceiver,
        uint96 _royaltyFraction
    )
        ERC721A("Mona Lisa Original", "Mona Lisa")
    {

        _registerForOperatorFiltering();
        operatorFilteringEnabled = true;

        _setDefaultRoyalty(_royaltyReceiver, _royaltyFraction);
    }

    /**
     * @notice Modifier applied to functions that will be disabled when they're no longer needed
     */
    modifier lockable() {
        if (functionLocked[msg.sig]) revert FunctionLocked();
        _;
    }

    /**
     * @inheritdoc ERC721A
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721A, ERC2981)
        returns (bool)
    {
        return
            ERC721A.supportsInterface(interfaceId)
            || ERC2981.supportsInterface(interfaceId);
    }

    /**
     * @notice Override ERC721A _baseURI function to use base URI pattern
     */
    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }

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

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

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


    /**
     * @notice Return the number of tokens an address has minted
     * @param account Address to return the number of tokens minted for
     */
    function numberMinted(address account) external view returns (uint256) {
        return _numberMinted(account);
    }

    /**
     * @notice Lock a function so that it can no longer be called
     * @dev WARNING: THIS CANNOT BE UNDONE
     * @param id Function signature
     */
    function lockFunction(bytes4 id) external onlyOwner {
        functionLocked[id] = true;
    }

    /**
     * @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 lockable onlyOwner {
        operatorFilteringEnabled = value;
    }

    /**
     * @notice Set new royalties settings for the collection
     * @param receiver Address to receive royalties
     * @param royaltyFraction Royalty fee respective to fee denominator (10_000)
     */
    function setRoyalties(address receiver, uint96 royaltyFraction) external onlyOwner {
        _setDefaultRoyalty(receiver, royaltyFraction);
    }


    /**
     * @notice Set token metadata base URI
     * @param _newBaseURI New base URI
     */
    function setBaseURI(string calldata _newBaseURI) external lockable onlyOwner {
        _baseTokenURI = _newBaseURI;
    }

    /**
     * @notice Set provenance hash for the collection
     * @param _provenanceHash New hash of the metadata
     */
    function setProvenanceHash(string calldata _provenanceHash) external lockable onlyOwner {
        if (bytes(provenanceHash).length != 0) revert ProvenanceHashAlreadySet();

        provenanceHash = _provenanceHash;
    }


    /**
     * @notice Mint `RESERVED` amount of tokens to an address
     * @param to Address to send the reserved tokens
     */
    function reserve(address to) external lockable onlyOwner {
        if (_totalMinted() >= RESERVED) revert AlreadyReservedTokens();
        _mint(to, RESERVED);
    }

    function secondaryReserve(address to) external lockable onlyOwner {
        require(_totalMinted() + SEC_RESERVED <= MAX_SUPPLY , "Exceeds Maximum Supply" );
        _mint(to, SEC_RESERVED);
    }

    function mintForAll(uint256 amount, bool _isUK) external payable {
        require(block.timestamp >= MINT_START_TIME, "Minting is not yet open.");
        require(amount <= MAX_MINT_PER_ACCOUNT, "Amount Exceeds Maximum Mints Allowed Per Account.");
        require(userNftCount[msg.sender] + amount <= MAX_MINT_PER_ACCOUNT, "You can not mint more than Max Mint Limit.");
        require(_totalMinted() + amount <= MAX_SUPPLY , "Exceeds Maximum Supply" );
        uint totalCost = amount * mintPrice;
        if (_isUK == true) {
            totalCost = totalCost * 120 / 100; // add 20% VAT tax for UK
        }        
        require( msg.value >= totalCost, "Ether sent is not correct." );
        _mint(msg.sender, amount);
        userNftCount[msg.sender] += amount;
        if (msg.value > totalCost) {
            payable(msg.sender).transfer(msg.value - totalCost);
        }
    }

    function setMintPrice(uint256 _newPrice) external onlyOwner() {
        mintPrice = _newPrice;
    }

    function setSecondaryReserve(uint256 amount) external onlyOwner() {
        SEC_RESERVED = amount;
    }
    
    function setMintStartTime(uint256 unixtimestamp) external onlyOwner() {
        MINT_START_TIME = unixtimestamp;
    }

    function setMaxMintPerAccount(uint256 accounts) external onlyOwner() {
        MAX_MINT_PER_ACCOUNT = accounts;
    }


 

    /**
     * @notice Withdraw all ETH sent to the contract
     */
    function withdraw() external onlyOwner {
        (bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
        if (!success) revert WithdrawFailed();
    }

    /**
     * @notice Override to enforce OpenSea's operator filter requirement to receive collection royalties
     * @inheritdoc ERC721A
     */
    function setApprovalForAll(address operator, bool approved)
        public
        override
        onlyAllowedOperatorApproval(operator, operatorFilteringEnabled)
    {
        super.setApprovalForAll(operator, approved);
    }

    /**
     * @notice Override to enforce OpenSea's operator filter requirement to receive collection royalties
     * @inheritdoc ERC721A
     */
    function approve(address operator, uint256 tokenId)
        public
        payable
        override
        onlyAllowedOperatorApproval(operator, operatorFilteringEnabled)
    {
        super.approve(operator, tokenId);
    }

    /**
     * @notice Override to enforce OpenSea's operator filter requirement to receive collection royalties
     * @inheritdoc ERC721A
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable override onlyAllowedOperator(from, operatorFilteringEnabled) {
        super.transferFrom(from, to, tokenId);
    }

    /**
     * @notice Override to enforce OpenSea's operator filter requirement to receive collection royalties
     * @inheritdoc ERC721A
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable override onlyAllowedOperator(from, operatorFilteringEnabled) {
        super.safeTransferFrom(from, to, tokenId);
    }

    /**
     * @notice Override to enforce OpenSea's operator filter requirement to receive collection royalties
     * @inheritdoc ERC721A
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public payable override onlyAllowedOperator(from, operatorFilteringEnabled) {
        super.safeTransferFrom(from, to, tokenId, data);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_royaltyReceiver","type":"address"},{"internalType":"uint96","name":"_royaltyFraction","type":"uint96"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyReservedTokens","type":"error"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"FunctionLocked","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"ProvenanceHashAlreadySet","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"},{"inputs":[],"name":"WithdrawFailed","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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":"MAX_MINT_PER_ACCOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_START_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SEC_RESERVED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"functionLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"id","type":"bytes4"}],"name":"lockFunction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"_isUK","type":"bool"}],"name":"mintForAll","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenanceHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"reserve","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":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"secondaryReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"accounts","type":"uint256"}],"name":"setMaxMintPerAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"unixtimestamp","type":"uint256"}],"name":"setMintStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setOperatorFilteringEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"royaltyFraction","type":"uint96"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSecondaryReserve","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userNftCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c90816200004a919062000732565b506000600d556005600e556363fae750600f55670186cc6acd4b00006010553480156200007657600080fd5b5060405162004f7538038062004f7583398181016040528101906200009c9190620008cc565b6040518060400160405280601281526020017f4d6f6e61204c697361204f726967696e616c00000000000000000000000000008152506040518060400160405280600981526020017f4d6f6e61204c6973610000000000000000000000000000000000000000000000815250816002908162000119919062000732565b5080600390816200012b919062000732565b506200013c620001a960201b60201c565b60008190555050506200016462000158620001b260201b60201c565b620001ba60201b60201c565b620001746200028060201b60201c565b6001601260006101000a81548160ff021916908315150217905550620001a18282620002a960201b60201c565b505062000a2e565b60006001905090565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002a7733cc6cdda760b79bafa08df41ecfa224f810dceb660016200044c60201b60201c565b565b620002b9620004ae60201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156200031a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000311906200099a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200038c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003839062000a0c565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b637d3e3dbe8260601b60601c9250816200047b57826200047357634420e48690506200047b565b63a0af290390505b8060e01b600052306004528260245260008060446000806daaeb6d7670e522a718067333cd4e5af1506000602452505050565b6000612710905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200053a57607f821691505b60208210810362000550576200054f620004f2565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005ba7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200057b565b620005c686836200057b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620006136200060d6200060784620005de565b620005e8565b620005de565b9050919050565b6000819050919050565b6200062f83620005f2565b620006476200063e826200061a565b84845462000588565b825550505050565b600090565b6200065e6200064f565b6200066b81848462000624565b505050565b5b8181101562000693576200068760008262000654565b60018101905062000671565b5050565b601f821115620006e257620006ac8162000556565b620006b7846200056b565b81016020851015620006c7578190505b620006df620006d6856200056b565b83018262000670565b50505b505050565b600082821c905092915050565b60006200070760001984600802620006e7565b1980831691505092915050565b6000620007228383620006f4565b9150826002028217905092915050565b6200073d82620004b8565b67ffffffffffffffff811115620007595762000758620004c3565b5b62000765825462000521565b6200077282828562000697565b600060209050601f831160018114620007aa576000841562000795578287015190505b620007a1858262000714565b86555062000811565b601f198416620007ba8662000556565b60005b82811015620007e457848901518255600182019150602085019450602081019050620007bd565b8683101562000804578489015162000800601f891682620006f4565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200084b826200081e565b9050919050565b6200085d816200083e565b81146200086957600080fd5b50565b6000815190506200087d8162000852565b92915050565b60006bffffffffffffffffffffffff82169050919050565b620008a68162000883565b8114620008b257600080fd5b50565b600081519050620008c6816200089b565b92915050565b60008060408385031215620008e657620008e562000819565b5b6000620008f6858286016200086c565b92505060206200090985828601620008b5565b9150509250929050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000982602a8362000913565b91506200098f8262000924565b604082019050919050565b60006020820190508181036000830152620009b58162000973565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000620009f460198362000913565b915062000a0182620009bc565b602082019050919050565b6000602082019050818103600083015262000a2781620009e5565b9050919050565b6145378062000a3e6000396000f3fe6080604052600436106102675760003560e01c8063715018a611610144578063c6682862116100b6578063dc33e6811161007a578063dc33e681146108d6578063e75179a414610913578063e985e9c51461093c578063f2fde38b14610979578063f4a0a528146109a2578063fb796e6c146109cb57610267565b8063c6682862146107f1578063c6ab67a31461081c578063c87b56dd14610847578063d5b3621b14610884578063da3ef23f146108ad57610267565b8063a810e6ff11610108578063a810e6ff146106f2578063aa592f251461071b578063b7c0b8e814610746578063b88d4fde1461076f578063bbadfe761461078b578063c21b471b146107c857610267565b8063715018a6146106315780637e2ade0c146106485780638da5cb5b1461067357806395d89b411461069e578063a22cb465146106c957610267565b806334531828116101dd578063559c55b9116101a1578063559c55b91461050f57806355f804b314610538578063601e5e77146105615780636352211e1461058c5780636817c76c146105c957806370a08231146105f457610267565b8063345318281461046e5780633ccfd60b1461049757806342842e0e146104ae57806348c5bdaa146104ca5780634e9a0960146104f357610267565b8063109695231161022f578063109695231461035857806318160ddd1461038157806323b872dd146103ac5780632a55205a146103c857806332cb6b0c146104065780633418f5651461043157610267565b806301ffc9a71461026c578063066453df146102a957806306fdde03146102d4578063081812fc146102ff578063095ea7b31461033c575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190613019565b6109f6565b6040516102a09190613061565b60405180910390f35b3480156102b557600080fd5b506102be610a18565b6040516102cb9190613095565b60405180910390f35b3480156102e057600080fd5b506102e9610a1e565b6040516102f69190613140565b60405180910390f35b34801561030b57600080fd5b506103266004803603810190610321919061318e565b610ab0565b60405161033391906131fc565b60405180910390f35b61035660048036038101906103519190613243565b610b2f565b005b34801561036457600080fd5b5061037f600480360381019061037a91906132e8565b610b9e565b005b34801561038d57600080fd5b50610396610cbd565b6040516103a39190613095565b60405180910390f35b6103c660048036038101906103c19190613335565b610cd4565b005b3480156103d457600080fd5b506103ef60048036038101906103ea9190613388565b610d4d565b6040516103fd9291906133c8565b60405180910390f35b34801561041257600080fd5b5061041b610f37565b6040516104289190613095565b60405180910390f35b34801561043d57600080fd5b50610458600480360381019061045391906133f1565b610f3d565b6040516104659190613095565b60405180910390f35b34801561047a57600080fd5b5061049560048036038101906104909190613019565b610f55565b005b3480156104a357600080fd5b506104ac610fca565b005b6104c860048036038101906104c39190613335565b611078565b005b3480156104d657600080fd5b506104f160048036038101906104ec919061318e565b6110f1565b005b61050d6004803603810190610508919061344a565b611103565b005b34801561051b57600080fd5b506105366004803603810190610531919061318e565b6113b0565b005b34801561054457600080fd5b5061055f600480360381019061055a91906132e8565b6113c2565b005b34801561056d57600080fd5b50610576611499565b6040516105839190613095565b60405180910390f35b34801561059857600080fd5b506105b360048036038101906105ae919061318e565b61149f565b6040516105c091906131fc565b60405180910390f35b3480156105d557600080fd5b506105de6114b1565b6040516105eb9190613095565b60405180910390f35b34801561060057600080fd5b5061061b600480360381019061061691906133f1565b6114b7565b6040516106289190613095565b60405180910390f35b34801561063d57600080fd5b5061064661156f565b005b34801561065457600080fd5b5061065d611583565b60405161066a9190613095565b60405180910390f35b34801561067f57600080fd5b50610688611589565b60405161069591906131fc565b60405180910390f35b3480156106aa57600080fd5b506106b36115b3565b6040516106c09190613140565b60405180910390f35b3480156106d557600080fd5b506106f060048036038101906106eb919061348a565b611645565b005b3480156106fe57600080fd5b50610719600480360381019061071491906133f1565b6116b4565b005b34801561072757600080fd5b506107306117dd565b60405161073d9190613095565b60405180910390f35b34801561075257600080fd5b5061076d600480360381019061076891906134ca565b6117e2565b005b61078960048036038101906107849190613627565b6118c0565b005b34801561079757600080fd5b506107b260048036038101906107ad9190613019565b61193b565b6040516107bf9190613061565b60405180910390f35b3480156107d457600080fd5b506107ef60048036038101906107ea91906136ee565b61195b565b005b3480156107fd57600080fd5b50610806611971565b6040516108139190613140565b60405180910390f35b34801561082857600080fd5b506108316119ff565b60405161083e9190613140565b60405180910390f35b34801561085357600080fd5b5061086e6004803603810190610869919061318e565b611a8d565b60405161087b9190613140565b60405180910390f35b34801561089057600080fd5b506108ab60048036038101906108a6919061318e565b611b37565b005b3480156108b957600080fd5b506108d460048036038101906108cf91906137cf565b611b49565b005b3480156108e257600080fd5b506108fd60048036038101906108f891906133f1565b611b64565b60405161090a9190613095565b60405180910390f35b34801561091f57600080fd5b5061093a600480360381019061093591906133f1565b611b76565b005b34801561094857600080fd5b50610963600480360381019061095e9190613818565b611c86565b6040516109709190613061565b60405180910390f35b34801561098557600080fd5b506109a0600480360381019061099b91906133f1565b611d1a565b005b3480156109ae57600080fd5b506109c960048036038101906109c4919061318e565b611d9d565b005b3480156109d757600080fd5b506109e0611daf565b6040516109ed9190613061565b60405180910390f35b6000610a0182611dc2565b80610a115750610a1082611e54565b5b9050919050565b600e5481565b606060028054610a2d90613887565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5990613887565b8015610aa65780601f10610a7b57610100808354040283529160200191610aa6565b820191906000526020600020905b815481529060010190602001808311610a8957829003601f168201915b5050505050905090565b6000610abb82611ece565b610af1576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81601260009054906101000a900460ff168015610b8e5769c617113400112233445560005230601a528160601b60601c603a52600080604460166daaeb6d7670e522a718067333cd4e5afa610b88573d6000803e3d6000fd5b6000603a525b610b988484611f2d565b50505050565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615610c57576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c5f612071565b600060118054610c6e90613887565b905014610ca7576040517f19e24c1100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818160119182610cb8929190613a6f565b505050565b6000610cc76120ef565b6001546000540303905090565b82601260009054906101000a900460ff168015610d3b57338260601b60601c14610d3a5769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa610d34573d6000803e3d6000fd5b6000603a525b5b610d468585856120f8565b5050505050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610ee25760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610eec61241a565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610f189190613b6e565b610f229190613bdf565b90508160000151819350935050509250929050565b61014a81565b60146020528060005260406000206000915090505481565b610f5d612071565b600160136000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610fd2612071565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610ff890613c41565b60006040518083038185875af1925050503d8060008114611035576040519150601f19603f3d011682016040523d82523d6000602084013e61103a565b606091505b5050905080611075576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b82601260009054906101000a900460ff1680156110df57338260601b60601c146110de5769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa6110d8573d6000803e3d6000fd5b6000603a525b5b6110ea858585612424565b5050505050565b6110f9612071565b80600e8190555050565b600f54421015611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113f90613ca2565b60405180910390fd5b600e5482111561118d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118490613d34565b60405180910390fd5b600e5482601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111db9190613d54565b111561121c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121390613dfa565b60405180910390fd5b61014a82611228612444565b6112329190613d54565b1115611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90613e66565b60405180910390fd5b6000601054836112839190613b6e565b905060011515821515036112ad5760646078826112a09190613b6e565b6112aa9190613bdf565b90505b803410156112f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e790613ed2565b60405180910390fd5b6112fa3384612457565b82601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113499190613d54565b92505081905550803411156113ab573373ffffffffffffffffffffffffffffffffffffffff166108fc823461137e9190613ef2565b9081150290604051600060405180830381858888f193505050501580156113a9573d6000803e3d6000fd5b505b505050565b6113b8612071565b80600d8190555050565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff161561147b576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611483612071565b8181600b9182611494929190613a6f565b505050565b600d5481565b60006114aa82612612565b9050919050565b60105481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361151e576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611577612071565b61158160006126de565b565b600f5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546115c290613887565b80601f01602080910402602001604051908101604052809291908181526020018280546115ee90613887565b801561163b5780601f106116105761010080835404028352916020019161163b565b820191906000526020600020905b81548152906001019060200180831161161e57829003601f168201915b5050505050905090565b81601260009054906101000a900460ff1680156116a45769c617113400112233445560005230601a528160601b60601c603a52600080604460166daaeb6d7670e522a718067333cd4e5afa61169e573d6000803e3d6000fd5b6000603a525b6116ae84846127a4565b50505050565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff161561176d576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611775612071565b61014a600d54611783612444565b61178d9190613d54565b11156117ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c590613e66565b60405180910390fd5b6117da81600d54612457565b50565b609681565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff161561189b576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118a3612071565b80601260006101000a81548160ff02191690831515021790555050565b83601260009054906101000a900460ff16801561192757338260601b60601c146119265769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa611920573d6000803e3d6000fd5b6000603a525b5b611933868686866128af565b505050505050565b60136020528060005260406000206000915054906101000a900460ff1681565b611963612071565b61196d8282612922565b5050565b600c805461197e90613887565b80601f01602080910402602001604051908101604052809291908181526020018280546119aa90613887565b80156119f75780601f106119cc576101008083540402835291602001916119f7565b820191906000526020600020905b8154815290600101906020018083116119da57829003601f168201915b505050505081565b60118054611a0c90613887565b80601f0160208091040260200160405190810160405280929190818152602001828054611a3890613887565b8015611a855780601f10611a5a57610100808354040283529160200191611a85565b820191906000526020600020905b815481529060010190602001808311611a6857829003601f168201915b505050505081565b6060611a9882611ece565b611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace90613f98565b60405180910390fd5b6000611ae1612ab7565b90506000815111611b015760405180602001604052806000815250611b2f565b80611b0b84612b49565b600c604051602001611b1f93929190614077565b6040516020818303038152906040525b915050919050565b611b3f612071565b80600f8190555050565b611b51612071565b80600c9081611b6091906140a8565b5050565b6000611b6f82612ca9565b9050919050565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615611c2f576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c37612071565b6096611c41612444565b10611c78576040517f1f0f14ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c83816096612457565b50565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d22612071565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d88906141ec565b60405180910390fd5b611d9a816126de565b50565b611da5612071565b8060108190555050565b601260009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e1d57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e4d5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ec75750611ec682612d00565b5b9050919050565b600081611ed96120ef565b11158015611ee8575060005482105b8015611f26575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000611f388261149f565b90508073ffffffffffffffffffffffffffffffffffffffff16611f59612d6a565b73ffffffffffffffffffffffffffffffffffffffff1614611fbc57611f8581611f80612d6a565b611c86565b611fbb576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b612079612d72565b73ffffffffffffffffffffffffffffffffffffffff16612097611589565b73ffffffffffffffffffffffffffffffffffffffff16146120ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e490614258565b60405180910390fd5b565b60006001905090565b600061210382612612565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461216a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061217684612d7a565b9150915061218c8187612187612d6a565b612da1565b6121d8576121a18661219c612d6a565b611c86565b6121d7576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361223e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61224b8686866001612de5565b801561225657600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061232485612300888887612deb565b7c020000000000000000000000000000000000000000000000000000000017612e13565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036123aa57600060018501905060006004600083815260200190815260200160002054036123a85760005481146123a7578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124128686866001612e3e565b505050505050565b6000612710905090565b61243f838383604051806020016040528060008152506118c0565b505050565b600061244e6120ef565b60005403905090565b60008054905060008203612497576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124a46000848385612de5565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061251b8361250c6000866000612deb565b61251585612e44565b17612e13565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146125bc57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612581565b50600082036125f7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061260d6000848385612e3e565b505050565b600080829050806126216120ef565b116126a7576000548110156126a65760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036126a4575b6000810361269a576004600083600190039350838152602001908152602001600020549050612670565b80925050506126d9565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80600760006127b1612d6a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661285e612d6a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128a39190613061565b60405180910390a35050565b6128ba848484610cd4565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461291c576128e584848484612e54565b61291b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61292a61241a565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297f906142ea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036129f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ee90614356565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6060600b8054612ac690613887565b80601f0160208091040260200160405190810160405280929190818152602001828054612af290613887565b8015612b3f5780601f10612b1457610100808354040283529160200191612b3f565b820191906000526020600020905b815481529060010190602001808311612b2257829003601f168201915b5050505050905090565b606060008203612b90576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ca4565b600082905060005b60008214612bc2578080612bab90614376565b915050600a82612bbb9190613bdf565b9150612b98565b60008167ffffffffffffffff811115612bde57612bdd6134fc565b5b6040519080825280601f01601f191660200182016040528015612c105781602001600182028036833780820191505090505b5090505b60008514612c9d57600182612c299190613ef2565b9150600a85612c3891906143be565b6030612c449190613d54565b60f81b818381518110612c5a57612c596143ef565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c969190613bdf565b9450612c14565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612e02868684612fa4565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006001821460e11b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e7a612d6a565b8786866040518563ffffffff1660e01b8152600401612e9c9493929190614473565b6020604051808303816000875af1925050508015612ed857506040513d601f19601f82011682018060405250810190612ed591906144d4565b60015b612f51573d8060008114612f08576040519150601f19603f3d011682016040523d82523d6000602084013e612f0d565b606091505b506000815103612f49576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ff681612fc1565b811461300157600080fd5b50565b60008135905061301381612fed565b92915050565b60006020828403121561302f5761302e612fb7565b5b600061303d84828501613004565b91505092915050565b60008115159050919050565b61305b81613046565b82525050565b60006020820190506130766000830184613052565b92915050565b6000819050919050565b61308f8161307c565b82525050565b60006020820190506130aa6000830184613086565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156130ea5780820151818401526020810190506130cf565b60008484015250505050565b6000601f19601f8301169050919050565b6000613112826130b0565b61311c81856130bb565b935061312c8185602086016130cc565b613135816130f6565b840191505092915050565b6000602082019050818103600083015261315a8184613107565b905092915050565b61316b8161307c565b811461317657600080fd5b50565b60008135905061318881613162565b92915050565b6000602082840312156131a4576131a3612fb7565b5b60006131b284828501613179565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131e6826131bb565b9050919050565b6131f6816131db565b82525050565b600060208201905061321160008301846131ed565b92915050565b613220816131db565b811461322b57600080fd5b50565b60008135905061323d81613217565b92915050565b6000806040838503121561325a57613259612fb7565b5b60006132688582860161322e565b925050602061327985828601613179565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126132a8576132a7613283565b5b8235905067ffffffffffffffff8111156132c5576132c4613288565b5b6020830191508360018202830111156132e1576132e061328d565b5b9250929050565b600080602083850312156132ff576132fe612fb7565b5b600083013567ffffffffffffffff81111561331d5761331c612fbc565b5b61332985828601613292565b92509250509250929050565b60008060006060848603121561334e5761334d612fb7565b5b600061335c8682870161322e565b935050602061336d8682870161322e565b925050604061337e86828701613179565b9150509250925092565b6000806040838503121561339f5761339e612fb7565b5b60006133ad85828601613179565b92505060206133be85828601613179565b9150509250929050565b60006040820190506133dd60008301856131ed565b6133ea6020830184613086565b9392505050565b60006020828403121561340757613406612fb7565b5b60006134158482850161322e565b91505092915050565b61342781613046565b811461343257600080fd5b50565b6000813590506134448161341e565b92915050565b6000806040838503121561346157613460612fb7565b5b600061346f85828601613179565b925050602061348085828601613435565b9150509250929050565b600080604083850312156134a1576134a0612fb7565b5b60006134af8582860161322e565b92505060206134c085828601613435565b9150509250929050565b6000602082840312156134e0576134df612fb7565b5b60006134ee84828501613435565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613534826130f6565b810181811067ffffffffffffffff82111715613553576135526134fc565b5b80604052505050565b6000613566612fad565b9050613572828261352b565b919050565b600067ffffffffffffffff821115613592576135916134fc565b5b61359b826130f6565b9050602081019050919050565b82818337600083830152505050565b60006135ca6135c584613577565b61355c565b9050828152602081018484840111156135e6576135e56134f7565b5b6135f18482856135a8565b509392505050565b600082601f83011261360e5761360d613283565b5b813561361e8482602086016135b7565b91505092915050565b6000806000806080858703121561364157613640612fb7565b5b600061364f8782880161322e565b94505060206136608782880161322e565b935050604061367187828801613179565b925050606085013567ffffffffffffffff81111561369257613691612fbc565b5b61369e878288016135f9565b91505092959194509250565b60006bffffffffffffffffffffffff82169050919050565b6136cb816136aa565b81146136d657600080fd5b50565b6000813590506136e8816136c2565b92915050565b6000806040838503121561370557613704612fb7565b5b60006137138582860161322e565b9250506020613724858286016136d9565b9150509250929050565b600067ffffffffffffffff821115613749576137486134fc565b5b613752826130f6565b9050602081019050919050565b600061377261376d8461372e565b61355c565b90508281526020810184848401111561378e5761378d6134f7565b5b6137998482856135a8565b509392505050565b600082601f8301126137b6576137b5613283565b5b81356137c684826020860161375f565b91505092915050565b6000602082840312156137e5576137e4612fb7565b5b600082013567ffffffffffffffff81111561380357613802612fbc565b5b61380f848285016137a1565b91505092915050565b6000806040838503121561382f5761382e612fb7565b5b600061383d8582860161322e565b925050602061384e8582860161322e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061389f57607f821691505b6020821081036138b2576138b1613858565b5b50919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026139257fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826138e8565b61392f86836138e8565b95508019841693508086168417925050509392505050565b6000819050919050565b600061396c6139676139628461307c565b613947565b61307c565b9050919050565b6000819050919050565b61398683613951565b61399a61399282613973565b8484546138f5565b825550505050565b600090565b6139af6139a2565b6139ba81848461397d565b505050565b5b818110156139de576139d36000826139a7565b6001810190506139c0565b5050565b601f821115613a23576139f4816138c3565b6139fd846138d8565b81016020851015613a0c578190505b613a20613a18856138d8565b8301826139bf565b50505b505050565b600082821c905092915050565b6000613a4660001984600802613a28565b1980831691505092915050565b6000613a5f8383613a35565b9150826002028217905092915050565b613a7983836138b8565b67ffffffffffffffff811115613a9257613a916134fc565b5b613a9c8254613887565b613aa78282856139e2565b6000601f831160018114613ad65760008415613ac4578287013590505b613ace8582613a53565b865550613b36565b601f198416613ae4866138c3565b60005b82811015613b0c57848901358255600182019150602085019450602081019050613ae7565b86831015613b295784890135613b25601f891682613a35565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b798261307c565b9150613b848361307c565b9250828202613b928161307c565b91508282048414831517613ba957613ba8613b3f565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613bea8261307c565b9150613bf58361307c565b925082613c0557613c04613bb0565b5b828204905092915050565b600081905092915050565b50565b6000613c2b600083613c10565b9150613c3682613c1b565b600082019050919050565b6000613c4c82613c1e565b9150819050919050565b7f4d696e74696e67206973206e6f7420796574206f70656e2e0000000000000000600082015250565b6000613c8c6018836130bb565b9150613c9782613c56565b602082019050919050565b60006020820190508181036000830152613cbb81613c7f565b9050919050565b7f416d6f756e742045786365656473204d6178696d756d204d696e747320416c6c60008201527f6f77656420506572204163636f756e742e000000000000000000000000000000602082015250565b6000613d1e6031836130bb565b9150613d2982613cc2565b604082019050919050565b60006020820190508181036000830152613d4d81613d11565b9050919050565b6000613d5f8261307c565b9150613d6a8361307c565b9250828201905080821115613d8257613d81613b3f565b5b92915050565b7f596f752063616e206e6f74206d696e74206d6f7265207468616e204d6178204d60008201527f696e74204c696d69742e00000000000000000000000000000000000000000000602082015250565b6000613de4602a836130bb565b9150613def82613d88565b604082019050919050565b60006020820190508181036000830152613e1381613dd7565b9050919050565b7f45786365656473204d6178696d756d20537570706c7900000000000000000000600082015250565b6000613e506016836130bb565b9150613e5b82613e1a565b602082019050919050565b60006020820190508181036000830152613e7f81613e43565b9050919050565b7f45746865722073656e74206973206e6f7420636f72726563742e000000000000600082015250565b6000613ebc601a836130bb565b9150613ec782613e86565b602082019050919050565b60006020820190508181036000830152613eeb81613eaf565b9050919050565b6000613efd8261307c565b9150613f088361307c565b9250828203905081811115613f2057613f1f613b3f565b5b92915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613f82602f836130bb565b9150613f8d82613f26565b604082019050919050565b60006020820190508181036000830152613fb181613f75565b9050919050565b600081905092915050565b6000613fce826130b0565b613fd88185613fb8565b9350613fe88185602086016130cc565b80840191505092915050565b6000815461400181613887565b61400b8186613fb8565b94506001821660008114614026576001811461403b5761406e565b60ff198316865281151582028601935061406e565b614044856138c3565b60005b8381101561406657815481890152600182019150602081019050614047565b838801955050505b50505092915050565b60006140838286613fc3565b915061408f8285613fc3565b915061409b8284613ff4565b9150819050949350505050565b6140b1826130b0565b67ffffffffffffffff8111156140ca576140c96134fc565b5b6140d48254613887565b6140df8282856139e2565b600060209050601f8311600181146141125760008415614100578287015190505b61410a8582613a53565b865550614172565b601f198416614120866138c3565b60005b8281101561414857848901518255600182019150602085019450602081019050614123565b868310156141655784890151614161601f891682613a35565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006141d66026836130bb565b91506141e18261417a565b604082019050919050565b60006020820190508181036000830152614205816141c9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006142426020836130bb565b915061424d8261420c565b602082019050919050565b6000602082019050818103600083015261427181614235565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006142d4602a836130bb565b91506142df82614278565b604082019050919050565b60006020820190508181036000830152614303816142c7565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006143406019836130bb565b915061434b8261430a565b602082019050919050565b6000602082019050818103600083015261436f81614333565b9050919050565b60006143818261307c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143b3576143b2613b3f565b5b600182019050919050565b60006143c98261307c565b91506143d48361307c565b9250826143e4576143e3613bb0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006144458261441e565b61444f8185614429565b935061445f8185602086016130cc565b614468816130f6565b840191505092915050565b600060808201905061448860008301876131ed565b61449560208301866131ed565b6144a26040830185613086565b81810360608301526144b4818461443a565b905095945050505050565b6000815190506144ce81612fed565b92915050565b6000602082840312156144ea576144e9612fb7565b5b60006144f8848285016144bf565b9150509291505056fea2646970667358221220075d52a03dab011d2ee67e7b1b39203d2a557d32d2563295b1f4307d5a24625664736f6c6343000812003300000000000000000000000059de7273191e6bf1907d614e94ecfbe8e5fb73180000000000000000000000000000000000000000000000000000000000000064

Deployed Bytecode

0x6080604052600436106102675760003560e01c8063715018a611610144578063c6682862116100b6578063dc33e6811161007a578063dc33e681146108d6578063e75179a414610913578063e985e9c51461093c578063f2fde38b14610979578063f4a0a528146109a2578063fb796e6c146109cb57610267565b8063c6682862146107f1578063c6ab67a31461081c578063c87b56dd14610847578063d5b3621b14610884578063da3ef23f146108ad57610267565b8063a810e6ff11610108578063a810e6ff146106f2578063aa592f251461071b578063b7c0b8e814610746578063b88d4fde1461076f578063bbadfe761461078b578063c21b471b146107c857610267565b8063715018a6146106315780637e2ade0c146106485780638da5cb5b1461067357806395d89b411461069e578063a22cb465146106c957610267565b806334531828116101dd578063559c55b9116101a1578063559c55b91461050f57806355f804b314610538578063601e5e77146105615780636352211e1461058c5780636817c76c146105c957806370a08231146105f457610267565b8063345318281461046e5780633ccfd60b1461049757806342842e0e146104ae57806348c5bdaa146104ca5780634e9a0960146104f357610267565b8063109695231161022f578063109695231461035857806318160ddd1461038157806323b872dd146103ac5780632a55205a146103c857806332cb6b0c146104065780633418f5651461043157610267565b806301ffc9a71461026c578063066453df146102a957806306fdde03146102d4578063081812fc146102ff578063095ea7b31461033c575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190613019565b6109f6565b6040516102a09190613061565b60405180910390f35b3480156102b557600080fd5b506102be610a18565b6040516102cb9190613095565b60405180910390f35b3480156102e057600080fd5b506102e9610a1e565b6040516102f69190613140565b60405180910390f35b34801561030b57600080fd5b506103266004803603810190610321919061318e565b610ab0565b60405161033391906131fc565b60405180910390f35b61035660048036038101906103519190613243565b610b2f565b005b34801561036457600080fd5b5061037f600480360381019061037a91906132e8565b610b9e565b005b34801561038d57600080fd5b50610396610cbd565b6040516103a39190613095565b60405180910390f35b6103c660048036038101906103c19190613335565b610cd4565b005b3480156103d457600080fd5b506103ef60048036038101906103ea9190613388565b610d4d565b6040516103fd9291906133c8565b60405180910390f35b34801561041257600080fd5b5061041b610f37565b6040516104289190613095565b60405180910390f35b34801561043d57600080fd5b50610458600480360381019061045391906133f1565b610f3d565b6040516104659190613095565b60405180910390f35b34801561047a57600080fd5b5061049560048036038101906104909190613019565b610f55565b005b3480156104a357600080fd5b506104ac610fca565b005b6104c860048036038101906104c39190613335565b611078565b005b3480156104d657600080fd5b506104f160048036038101906104ec919061318e565b6110f1565b005b61050d6004803603810190610508919061344a565b611103565b005b34801561051b57600080fd5b506105366004803603810190610531919061318e565b6113b0565b005b34801561054457600080fd5b5061055f600480360381019061055a91906132e8565b6113c2565b005b34801561056d57600080fd5b50610576611499565b6040516105839190613095565b60405180910390f35b34801561059857600080fd5b506105b360048036038101906105ae919061318e565b61149f565b6040516105c091906131fc565b60405180910390f35b3480156105d557600080fd5b506105de6114b1565b6040516105eb9190613095565b60405180910390f35b34801561060057600080fd5b5061061b600480360381019061061691906133f1565b6114b7565b6040516106289190613095565b60405180910390f35b34801561063d57600080fd5b5061064661156f565b005b34801561065457600080fd5b5061065d611583565b60405161066a9190613095565b60405180910390f35b34801561067f57600080fd5b50610688611589565b60405161069591906131fc565b60405180910390f35b3480156106aa57600080fd5b506106b36115b3565b6040516106c09190613140565b60405180910390f35b3480156106d557600080fd5b506106f060048036038101906106eb919061348a565b611645565b005b3480156106fe57600080fd5b50610719600480360381019061071491906133f1565b6116b4565b005b34801561072757600080fd5b506107306117dd565b60405161073d9190613095565b60405180910390f35b34801561075257600080fd5b5061076d600480360381019061076891906134ca565b6117e2565b005b61078960048036038101906107849190613627565b6118c0565b005b34801561079757600080fd5b506107b260048036038101906107ad9190613019565b61193b565b6040516107bf9190613061565b60405180910390f35b3480156107d457600080fd5b506107ef60048036038101906107ea91906136ee565b61195b565b005b3480156107fd57600080fd5b50610806611971565b6040516108139190613140565b60405180910390f35b34801561082857600080fd5b506108316119ff565b60405161083e9190613140565b60405180910390f35b34801561085357600080fd5b5061086e6004803603810190610869919061318e565b611a8d565b60405161087b9190613140565b60405180910390f35b34801561089057600080fd5b506108ab60048036038101906108a6919061318e565b611b37565b005b3480156108b957600080fd5b506108d460048036038101906108cf91906137cf565b611b49565b005b3480156108e257600080fd5b506108fd60048036038101906108f891906133f1565b611b64565b60405161090a9190613095565b60405180910390f35b34801561091f57600080fd5b5061093a600480360381019061093591906133f1565b611b76565b005b34801561094857600080fd5b50610963600480360381019061095e9190613818565b611c86565b6040516109709190613061565b60405180910390f35b34801561098557600080fd5b506109a0600480360381019061099b91906133f1565b611d1a565b005b3480156109ae57600080fd5b506109c960048036038101906109c4919061318e565b611d9d565b005b3480156109d757600080fd5b506109e0611daf565b6040516109ed9190613061565b60405180910390f35b6000610a0182611dc2565b80610a115750610a1082611e54565b5b9050919050565b600e5481565b606060028054610a2d90613887565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5990613887565b8015610aa65780601f10610a7b57610100808354040283529160200191610aa6565b820191906000526020600020905b815481529060010190602001808311610a8957829003601f168201915b5050505050905090565b6000610abb82611ece565b610af1576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81601260009054906101000a900460ff168015610b8e5769c617113400112233445560005230601a528160601b60601c603a52600080604460166daaeb6d7670e522a718067333cd4e5afa610b88573d6000803e3d6000fd5b6000603a525b610b988484611f2d565b50505050565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615610c57576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c5f612071565b600060118054610c6e90613887565b905014610ca7576040517f19e24c1100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818160119182610cb8929190613a6f565b505050565b6000610cc76120ef565b6001546000540303905090565b82601260009054906101000a900460ff168015610d3b57338260601b60601c14610d3a5769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa610d34573d6000803e3d6000fd5b6000603a525b5b610d468585856120f8565b5050505050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610ee25760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610eec61241a565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610f189190613b6e565b610f229190613bdf565b90508160000151819350935050509250929050565b61014a81565b60146020528060005260406000206000915090505481565b610f5d612071565b600160136000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610fd2612071565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610ff890613c41565b60006040518083038185875af1925050503d8060008114611035576040519150601f19603f3d011682016040523d82523d6000602084013e61103a565b606091505b5050905080611075576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b82601260009054906101000a900460ff1680156110df57338260601b60601c146110de5769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa6110d8573d6000803e3d6000fd5b6000603a525b5b6110ea858585612424565b5050505050565b6110f9612071565b80600e8190555050565b600f54421015611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113f90613ca2565b60405180910390fd5b600e5482111561118d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118490613d34565b60405180910390fd5b600e5482601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111db9190613d54565b111561121c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121390613dfa565b60405180910390fd5b61014a82611228612444565b6112329190613d54565b1115611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90613e66565b60405180910390fd5b6000601054836112839190613b6e565b905060011515821515036112ad5760646078826112a09190613b6e565b6112aa9190613bdf565b90505b803410156112f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e790613ed2565b60405180910390fd5b6112fa3384612457565b82601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113499190613d54565b92505081905550803411156113ab573373ffffffffffffffffffffffffffffffffffffffff166108fc823461137e9190613ef2565b9081150290604051600060405180830381858888f193505050501580156113a9573d6000803e3d6000fd5b505b505050565b6113b8612071565b80600d8190555050565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff161561147b576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611483612071565b8181600b9182611494929190613a6f565b505050565b600d5481565b60006114aa82612612565b9050919050565b60105481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361151e576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611577612071565b61158160006126de565b565b600f5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546115c290613887565b80601f01602080910402602001604051908101604052809291908181526020018280546115ee90613887565b801561163b5780601f106116105761010080835404028352916020019161163b565b820191906000526020600020905b81548152906001019060200180831161161e57829003601f168201915b5050505050905090565b81601260009054906101000a900460ff1680156116a45769c617113400112233445560005230601a528160601b60601c603a52600080604460166daaeb6d7670e522a718067333cd4e5afa61169e573d6000803e3d6000fd5b6000603a525b6116ae84846127a4565b50505050565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff161561176d576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611775612071565b61014a600d54611783612444565b61178d9190613d54565b11156117ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c590613e66565b60405180910390fd5b6117da81600d54612457565b50565b609681565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff161561189b576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118a3612071565b80601260006101000a81548160ff02191690831515021790555050565b83601260009054906101000a900460ff16801561192757338260601b60601c146119265769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa611920573d6000803e3d6000fd5b6000603a525b5b611933868686866128af565b505050505050565b60136020528060005260406000206000915054906101000a900460ff1681565b611963612071565b61196d8282612922565b5050565b600c805461197e90613887565b80601f01602080910402602001604051908101604052809291908181526020018280546119aa90613887565b80156119f75780601f106119cc576101008083540402835291602001916119f7565b820191906000526020600020905b8154815290600101906020018083116119da57829003601f168201915b505050505081565b60118054611a0c90613887565b80601f0160208091040260200160405190810160405280929190818152602001828054611a3890613887565b8015611a855780601f10611a5a57610100808354040283529160200191611a85565b820191906000526020600020905b815481529060010190602001808311611a6857829003601f168201915b505050505081565b6060611a9882611ece565b611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace90613f98565b60405180910390fd5b6000611ae1612ab7565b90506000815111611b015760405180602001604052806000815250611b2f565b80611b0b84612b49565b600c604051602001611b1f93929190614077565b6040516020818303038152906040525b915050919050565b611b3f612071565b80600f8190555050565b611b51612071565b80600c9081611b6091906140a8565b5050565b6000611b6f82612ca9565b9050919050565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615611c2f576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c37612071565b6096611c41612444565b10611c78576040517f1f0f14ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c83816096612457565b50565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d22612071565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d88906141ec565b60405180910390fd5b611d9a816126de565b50565b611da5612071565b8060108190555050565b601260009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e1d57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e4d5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ec75750611ec682612d00565b5b9050919050565b600081611ed96120ef565b11158015611ee8575060005482105b8015611f26575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000611f388261149f565b90508073ffffffffffffffffffffffffffffffffffffffff16611f59612d6a565b73ffffffffffffffffffffffffffffffffffffffff1614611fbc57611f8581611f80612d6a565b611c86565b611fbb576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b612079612d72565b73ffffffffffffffffffffffffffffffffffffffff16612097611589565b73ffffffffffffffffffffffffffffffffffffffff16146120ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e490614258565b60405180910390fd5b565b60006001905090565b600061210382612612565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461216a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061217684612d7a565b9150915061218c8187612187612d6a565b612da1565b6121d8576121a18661219c612d6a565b611c86565b6121d7576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361223e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61224b8686866001612de5565b801561225657600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061232485612300888887612deb565b7c020000000000000000000000000000000000000000000000000000000017612e13565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036123aa57600060018501905060006004600083815260200190815260200160002054036123a85760005481146123a7578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124128686866001612e3e565b505050505050565b6000612710905090565b61243f838383604051806020016040528060008152506118c0565b505050565b600061244e6120ef565b60005403905090565b60008054905060008203612497576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124a46000848385612de5565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061251b8361250c6000866000612deb565b61251585612e44565b17612e13565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146125bc57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612581565b50600082036125f7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061260d6000848385612e3e565b505050565b600080829050806126216120ef565b116126a7576000548110156126a65760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036126a4575b6000810361269a576004600083600190039350838152602001908152602001600020549050612670565b80925050506126d9565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80600760006127b1612d6a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661285e612d6a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128a39190613061565b60405180910390a35050565b6128ba848484610cd4565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461291c576128e584848484612e54565b61291b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61292a61241a565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297f906142ea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036129f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ee90614356565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6060600b8054612ac690613887565b80601f0160208091040260200160405190810160405280929190818152602001828054612af290613887565b8015612b3f5780601f10612b1457610100808354040283529160200191612b3f565b820191906000526020600020905b815481529060010190602001808311612b2257829003601f168201915b5050505050905090565b606060008203612b90576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ca4565b600082905060005b60008214612bc2578080612bab90614376565b915050600a82612bbb9190613bdf565b9150612b98565b60008167ffffffffffffffff811115612bde57612bdd6134fc565b5b6040519080825280601f01601f191660200182016040528015612c105781602001600182028036833780820191505090505b5090505b60008514612c9d57600182612c299190613ef2565b9150600a85612c3891906143be565b6030612c449190613d54565b60f81b818381518110612c5a57612c596143ef565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c969190613bdf565b9450612c14565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612e02868684612fa4565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006001821460e11b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e7a612d6a565b8786866040518563ffffffff1660e01b8152600401612e9c9493929190614473565b6020604051808303816000875af1925050508015612ed857506040513d601f19601f82011682018060405250810190612ed591906144d4565b60015b612f51573d8060008114612f08576040519150601f19603f3d011682016040523d82523d6000602084013e612f0d565b606091505b506000815103612f49576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ff681612fc1565b811461300157600080fd5b50565b60008135905061301381612fed565b92915050565b60006020828403121561302f5761302e612fb7565b5b600061303d84828501613004565b91505092915050565b60008115159050919050565b61305b81613046565b82525050565b60006020820190506130766000830184613052565b92915050565b6000819050919050565b61308f8161307c565b82525050565b60006020820190506130aa6000830184613086565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156130ea5780820151818401526020810190506130cf565b60008484015250505050565b6000601f19601f8301169050919050565b6000613112826130b0565b61311c81856130bb565b935061312c8185602086016130cc565b613135816130f6565b840191505092915050565b6000602082019050818103600083015261315a8184613107565b905092915050565b61316b8161307c565b811461317657600080fd5b50565b60008135905061318881613162565b92915050565b6000602082840312156131a4576131a3612fb7565b5b60006131b284828501613179565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131e6826131bb565b9050919050565b6131f6816131db565b82525050565b600060208201905061321160008301846131ed565b92915050565b613220816131db565b811461322b57600080fd5b50565b60008135905061323d81613217565b92915050565b6000806040838503121561325a57613259612fb7565b5b60006132688582860161322e565b925050602061327985828601613179565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126132a8576132a7613283565b5b8235905067ffffffffffffffff8111156132c5576132c4613288565b5b6020830191508360018202830111156132e1576132e061328d565b5b9250929050565b600080602083850312156132ff576132fe612fb7565b5b600083013567ffffffffffffffff81111561331d5761331c612fbc565b5b61332985828601613292565b92509250509250929050565b60008060006060848603121561334e5761334d612fb7565b5b600061335c8682870161322e565b935050602061336d8682870161322e565b925050604061337e86828701613179565b9150509250925092565b6000806040838503121561339f5761339e612fb7565b5b60006133ad85828601613179565b92505060206133be85828601613179565b9150509250929050565b60006040820190506133dd60008301856131ed565b6133ea6020830184613086565b9392505050565b60006020828403121561340757613406612fb7565b5b60006134158482850161322e565b91505092915050565b61342781613046565b811461343257600080fd5b50565b6000813590506134448161341e565b92915050565b6000806040838503121561346157613460612fb7565b5b600061346f85828601613179565b925050602061348085828601613435565b9150509250929050565b600080604083850312156134a1576134a0612fb7565b5b60006134af8582860161322e565b92505060206134c085828601613435565b9150509250929050565b6000602082840312156134e0576134df612fb7565b5b60006134ee84828501613435565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613534826130f6565b810181811067ffffffffffffffff82111715613553576135526134fc565b5b80604052505050565b6000613566612fad565b9050613572828261352b565b919050565b600067ffffffffffffffff821115613592576135916134fc565b5b61359b826130f6565b9050602081019050919050565b82818337600083830152505050565b60006135ca6135c584613577565b61355c565b9050828152602081018484840111156135e6576135e56134f7565b5b6135f18482856135a8565b509392505050565b600082601f83011261360e5761360d613283565b5b813561361e8482602086016135b7565b91505092915050565b6000806000806080858703121561364157613640612fb7565b5b600061364f8782880161322e565b94505060206136608782880161322e565b935050604061367187828801613179565b925050606085013567ffffffffffffffff81111561369257613691612fbc565b5b61369e878288016135f9565b91505092959194509250565b60006bffffffffffffffffffffffff82169050919050565b6136cb816136aa565b81146136d657600080fd5b50565b6000813590506136e8816136c2565b92915050565b6000806040838503121561370557613704612fb7565b5b60006137138582860161322e565b9250506020613724858286016136d9565b9150509250929050565b600067ffffffffffffffff821115613749576137486134fc565b5b613752826130f6565b9050602081019050919050565b600061377261376d8461372e565b61355c565b90508281526020810184848401111561378e5761378d6134f7565b5b6137998482856135a8565b509392505050565b600082601f8301126137b6576137b5613283565b5b81356137c684826020860161375f565b91505092915050565b6000602082840312156137e5576137e4612fb7565b5b600082013567ffffffffffffffff81111561380357613802612fbc565b5b61380f848285016137a1565b91505092915050565b6000806040838503121561382f5761382e612fb7565b5b600061383d8582860161322e565b925050602061384e8582860161322e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061389f57607f821691505b6020821081036138b2576138b1613858565b5b50919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026139257fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826138e8565b61392f86836138e8565b95508019841693508086168417925050509392505050565b6000819050919050565b600061396c6139676139628461307c565b613947565b61307c565b9050919050565b6000819050919050565b61398683613951565b61399a61399282613973565b8484546138f5565b825550505050565b600090565b6139af6139a2565b6139ba81848461397d565b505050565b5b818110156139de576139d36000826139a7565b6001810190506139c0565b5050565b601f821115613a23576139f4816138c3565b6139fd846138d8565b81016020851015613a0c578190505b613a20613a18856138d8565b8301826139bf565b50505b505050565b600082821c905092915050565b6000613a4660001984600802613a28565b1980831691505092915050565b6000613a5f8383613a35565b9150826002028217905092915050565b613a7983836138b8565b67ffffffffffffffff811115613a9257613a916134fc565b5b613a9c8254613887565b613aa78282856139e2565b6000601f831160018114613ad65760008415613ac4578287013590505b613ace8582613a53565b865550613b36565b601f198416613ae4866138c3565b60005b82811015613b0c57848901358255600182019150602085019450602081019050613ae7565b86831015613b295784890135613b25601f891682613a35565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b798261307c565b9150613b848361307c565b9250828202613b928161307c565b91508282048414831517613ba957613ba8613b3f565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613bea8261307c565b9150613bf58361307c565b925082613c0557613c04613bb0565b5b828204905092915050565b600081905092915050565b50565b6000613c2b600083613c10565b9150613c3682613c1b565b600082019050919050565b6000613c4c82613c1e565b9150819050919050565b7f4d696e74696e67206973206e6f7420796574206f70656e2e0000000000000000600082015250565b6000613c8c6018836130bb565b9150613c9782613c56565b602082019050919050565b60006020820190508181036000830152613cbb81613c7f565b9050919050565b7f416d6f756e742045786365656473204d6178696d756d204d696e747320416c6c60008201527f6f77656420506572204163636f756e742e000000000000000000000000000000602082015250565b6000613d1e6031836130bb565b9150613d2982613cc2565b604082019050919050565b60006020820190508181036000830152613d4d81613d11565b9050919050565b6000613d5f8261307c565b9150613d6a8361307c565b9250828201905080821115613d8257613d81613b3f565b5b92915050565b7f596f752063616e206e6f74206d696e74206d6f7265207468616e204d6178204d60008201527f696e74204c696d69742e00000000000000000000000000000000000000000000602082015250565b6000613de4602a836130bb565b9150613def82613d88565b604082019050919050565b60006020820190508181036000830152613e1381613dd7565b9050919050565b7f45786365656473204d6178696d756d20537570706c7900000000000000000000600082015250565b6000613e506016836130bb565b9150613e5b82613e1a565b602082019050919050565b60006020820190508181036000830152613e7f81613e43565b9050919050565b7f45746865722073656e74206973206e6f7420636f72726563742e000000000000600082015250565b6000613ebc601a836130bb565b9150613ec782613e86565b602082019050919050565b60006020820190508181036000830152613eeb81613eaf565b9050919050565b6000613efd8261307c565b9150613f088361307c565b9250828203905081811115613f2057613f1f613b3f565b5b92915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613f82602f836130bb565b9150613f8d82613f26565b604082019050919050565b60006020820190508181036000830152613fb181613f75565b9050919050565b600081905092915050565b6000613fce826130b0565b613fd88185613fb8565b9350613fe88185602086016130cc565b80840191505092915050565b6000815461400181613887565b61400b8186613fb8565b94506001821660008114614026576001811461403b5761406e565b60ff198316865281151582028601935061406e565b614044856138c3565b60005b8381101561406657815481890152600182019150602081019050614047565b838801955050505b50505092915050565b60006140838286613fc3565b915061408f8285613fc3565b915061409b8284613ff4565b9150819050949350505050565b6140b1826130b0565b67ffffffffffffffff8111156140ca576140c96134fc565b5b6140d48254613887565b6140df8282856139e2565b600060209050601f8311600181146141125760008415614100578287015190505b61410a8582613a53565b865550614172565b601f198416614120866138c3565b60005b8281101561414857848901518255600182019150602085019450602081019050614123565b868310156141655784890151614161601f891682613a35565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006141d66026836130bb565b91506141e18261417a565b604082019050919050565b60006020820190508181036000830152614205816141c9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006142426020836130bb565b915061424d8261420c565b602082019050919050565b6000602082019050818103600083015261427181614235565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006142d4602a836130bb565b91506142df82614278565b604082019050919050565b60006020820190508181036000830152614303816142c7565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006143406019836130bb565b915061434b8261430a565b602082019050919050565b6000602082019050818103600083015261436f81614333565b9050919050565b60006143818261307c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143b3576143b2613b3f565b5b600182019050919050565b60006143c98261307c565b91506143d48361307c565b9250826143e4576143e3613bb0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006144458261441e565b61444f8185614429565b935061445f8185602086016130cc565b614468816130f6565b840191505092915050565b600060808201905061448860008301876131ed565b61449560208301866131ed565b6144a26040830185613086565b81810360608301526144b4818461443a565b905095945050505050565b6000815190506144ce81612fed565b92915050565b6000602082840312156144ea576144e9612fb7565b5b60006144f8848285016144bf565b9150509291505056fea2646970667358221220075d52a03dab011d2ee67e7b1b39203d2a557d32d2563295b1f4307d5a24625664736f6c63430008120033

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

00000000000000000000000059de7273191e6bf1907d614e94ecfbe8e5fb73180000000000000000000000000000000000000000000000000000000000000064

-----Decoded View---------------
Arg [0] : _royaltyReceiver (address): 0x59dE7273191E6bf1907d614e94eCFbe8e5FB7318
Arg [1] : _royaltyFraction (uint96): 100

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000059de7273191e6bf1907d614e94ecfbe8e5fb7318
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000064


Deployed Bytecode Sourcemap

80182:8394:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81456:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80509:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40968:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47459:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87118:232;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84154:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36719:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87510:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15758:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;80458:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80816:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82996:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86381:183;;;;;;;;;;;;;:::i;:::-;;87901:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86175:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84906:905;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85929:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83894:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80420:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42361:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80642:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37903:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21031:103;;;;;;;;;;;;;:::i;:::-;;80555:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20383:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41144:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86724:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84699:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80375:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83284:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88300:273;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80764:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83635:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80331:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80686:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82089:446;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86047:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81953:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82703:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84523:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48408:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21289:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85819:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80721:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81456:274;81587:4;81629:38;81655:11;81629:25;:38::i;:::-;:93;;;;81684:38;81710:11;81684:25;:38::i;:::-;81629:93;81609:113;;81456:274;;;:::o;80509:39::-;;;;:::o;40968:100::-;41022:13;41055:5;41048:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40968:100;:::o;47459:218::-;47535:7;47560:16;47568:7;47560;:16::i;:::-;47555:64;;47585:34;;;;;;;;;;;;;;47555:64;47639:15;:24;47655:7;47639:24;;;;;;;;;;;:30;;;;;;;;;;;;47632:37;;47459:218;;;:::o;87118:232::-;87258:8;87268:24;;;;;;;;;;;78765:7;78762:925;;;78894:22;78888:4;78881:36;78995:9;78989:4;78982:23;79147:8;79143:2;79139:17;79135:2;79131:26;79125:4;79118:40;79334:4;79328;79322;79316;79289:25;79282:5;79271:68;79261:290;;79463:16;79457:4;79451;79436:44;79515:16;79509:4;79502:30;79261:290;79670:1;79664:4;79657:15;78762:925;87310:32:::1;87324:8;87334:7;87310:13;:32::i;:::-;87118:232:::0;;;;:::o;84154:224::-;81334:14;:23;81349:7;;;;81334:23;;;;;;;;;;;;;;;;;;;;;;;;;;;81330:52;;;81366:16;;;;;;;;;;;;;;81330:52;20269:13:::1;:11;:13::i;:::-;84289:1:::2;84263:14;84257:28;;;;;:::i;:::-;;;:33;84253:72;;84299:26;;;;;;;;;;;;;;84253:72;84355:15;;84338:14;:32;;;;;;;:::i;:::-;;84154:224:::0;;:::o;36719:323::-;36780:7;37008:15;:13;:15::i;:::-;36993:12;;36977:13;;:28;:46;36970:53;;36719:323;:::o;87510:231::-;87653:4;87659:24;;;;;;;;;;;76538:7;76535:1643;;;76751:8;76743:4;76739:2;76735:13;76731:2;76727:22;76724:36;76714:1449;;77066:22;77060:4;77053:36;77175:9;77169:4;77162:23;77268:8;77262:4;77255:22;77461:4;77455;77449;77443;77416:25;77409:5;77398:68;77388:306;;77598:16;77592:4;77586;77571:44;77654:16;77648:4;77641:30;77388:306;78142:1;78136:4;78129:15;76714:1449;76535:1643;87696:37:::1;87715:4;87721:2;87725:7;87696:18;:37::i;:::-;87510:231:::0;;;;;:::o;15758:442::-;15855:7;15864;15884:26;15913:17;:27;15931:8;15913:27;;;;;;;;;;;15884:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15985:1;15957:30;;:7;:16;;;:30;;;15953:92;;16014:19;16004:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15953:92;16057:21;16122:17;:15;:17::i;:::-;16081:58;;16095:7;:23;;;16082:36;;:10;:36;;;;:::i;:::-;16081:58;;;;:::i;:::-;16057:82;;16160:7;:16;;;16178:13;16152:40;;;;;;15758:442;;;;;:::o;80458:40::-;80495:3;80458:40;:::o;80816:44::-;;;;;;;;;;;;;;;;;:::o;82996:96::-;20269:13;:11;:13::i;:::-;83080:4:::1;83059:14;:18;83074:2;83059:18;;;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;82996:96:::0;:::o;86381:183::-;20269:13;:11;:13::i;:::-;86432:12:::1;86458:10;86450:24;;86482:21;86450:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86431:77;;;86524:7;86519:37;;86540:16;;;;;;;;;;;;;;86519:37;86420:144;86381:183::o:0;87901:239::-;88048:4;88054:24;;;;;;;;;;;76538:7;76535:1643;;;76751:8;76743:4;76739:2;76735:13;76731:2;76727:22;76724:36;76714:1449;;77066:22;77060:4;77053:36;77175:9;77169:4;77162:23;77268:8;77262:4;77255:22;77461:4;77455;77449;77443;77416:25;77409:5;77398:68;77388:306;;77598:16;77592:4;77586;77571:44;77654:16;77648:4;77641:30;77388:306;78142:1;78136:4;78129:15;76714:1449;76535:1643;88091:41:::1;88114:4;88120:2;88124:7;88091:22;:41::i;:::-;87901:239:::0;;;;;:::o;86175:119::-;20269:13;:11;:13::i;:::-;86278:8:::1;86255:20;:31;;;;86175:119:::0;:::o;84906:905::-;85009:15;;84990;:34;;84982:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;85082:20;;85072:6;:30;;85064:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;85212:20;;85202:6;85175:12;:24;85188:10;85175:24;;;;;;;;;;;;;;;;:33;;;;:::i;:::-;:57;;85167:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;80495:3;85315:6;85298:14;:12;:14::i;:::-;:23;;;;:::i;:::-;:37;;85290:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;85375:14;85401:9;;85392:6;:18;;;;:::i;:::-;85375:35;;85434:4;85425:13;;:5;:13;;;85421:105;;85485:3;85479;85467:9;:15;;;;:::i;:::-;:21;;;;:::i;:::-;85455:33;;85421:105;85566:9;85553;:22;;85544:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;85618:25;85624:10;85636:6;85618:5;:25::i;:::-;85682:6;85654:12;:24;85667:10;85654:24;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;85715:9;85703;:21;85699:105;;;85749:10;85741:28;;:51;85782:9;85770;:21;;;;:::i;:::-;85741:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85699:105;84971:840;84906:905;;:::o;85929:106::-;20269:13;:11;:13::i;:::-;86021:6:::1;86006:12;:21;;;;85929:106:::0;:::o;83894:123::-;81334:14;:23;81349:7;;;;81334:23;;;;;;;;;;;;;;;;;;;;;;;;;;;81330:52;;;81366:16;;;;;;;;;;;;;;81330:52;20269:13:::1;:11;:13::i;:::-;83998:11:::2;;83982:13;:27;;;;;;;:::i;:::-;;83894:123:::0;;:::o;80420:31::-;;;;:::o;42361:152::-;42433:7;42476:27;42495:7;42476:18;:27::i;:::-;42453:52;;42361:152;;;:::o;80642:37::-;;;;:::o;37903:233::-;37975:7;38016:1;37999:19;;:5;:19;;;37995:60;;38027:28;;;;;;;;;;;;;;37995:60;32062:13;38073:18;:25;38092:5;38073:25;;;;;;;;;;;;;;;;:55;38066:62;;37903:233;;;:::o;21031:103::-;20269:13;:11;:13::i;:::-;21096:30:::1;21123:1;21096:18;:30::i;:::-;21031:103::o:0;80555:43::-;;;;:::o;20383:87::-;20429:7;20456:6;;;;;;;;;;;20449:13;;20383:87;:::o;41144:104::-;41200:13;41233:7;41226:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41144:104;:::o;86724:234::-;86855:8;86865:24;;;;;;;;;;;78765:7;78762:925;;;78894:22;78888:4;78881:36;78995:9;78989:4;78982:23;79147:8;79143:2;79139:17;79135:2;79131:26;79125:4;79118:40;79334:4;79328;79322;79316;79289:25;79282:5;79271:68;79261:290;;79463:16;79457:4;79451;79436:44;79515:16;79509:4;79502:30;79261:290;79670:1;79664:4;79657:15;78762:925;86907:43:::1;86931:8;86941;86907:23;:43::i;:::-;86724:234:::0;;;;:::o;84699:199::-;81334:14;:23;81349:7;;;;81334:23;;;;;;;;;;;;;;;;;;;;;;;;;;;81330:52;;;81366:16;;;;;;;;;;;;;;81330:52;20269:13:::1;:11;:13::i;:::-;80495:3:::2;84801:12;;84784:14;:12;:14::i;:::-;:29;;;;:::i;:::-;:43;;84776:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;84867:23;84873:2;84877:12;;84867:5;:23::i;:::-;84699:199:::0;:::o;80375:38::-;80410:3;80375:38;:::o;83284:128::-;81334:14;:23;81349:7;;;;81334:23;;;;;;;;;;;;;;;;;;;;;;;;;;;81330:52;;;81366:16;;;;;;;;;;;;;;81330:52;20269:13:::1;:11;:13::i;:::-;83399:5:::2;83372:24;;:32;;;;;;;;;;;;;;;;;;83284:128:::0;:::o;88300:273::-;88475:4;88481:24;;;;;;;;;;;76538:7;76535:1643;;;76751:8;76743:4;76739:2;76735:13;76731:2;76727:22;76724:36;76714:1449;;77066:22;77060:4;77053:36;77175:9;77169:4;77162:23;77268:8;77262:4;77255:22;77461:4;77455;77449;77443;77416:25;77409:5;77398:68;77388:306;;77598:16;77592:4;77586;77571:44;77654:16;77648:4;77641:30;77388:306;78142:1;78136:4;78129:15;76714:1449;76535:1643;88518:47:::1;88541:4;88547:2;88551:7;88560:4;88518:22;:47::i;:::-;88300:273:::0;;;;;;:::o;80764:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;83635:147::-;20269:13;:11;:13::i;:::-;83729:45:::1;83748:8;83758:15;83729:18;:45::i;:::-;83635:147:::0;;:::o;80331:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;80686:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;82089:446::-;82187:13;82230:16;82238:7;82230;:16::i;:::-;82214:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;82332:28;82363:10;:8;:10::i;:::-;82332:41;;82418:1;82393:14;82387:28;:32;:140;;;;;;;;;;;;;;;;;82455:14;82471:25;82488:7;82471:16;:25::i;:::-;82498:13;82438:74;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;82387:140;82380:147;;;82089:446;;;:::o;86047:120::-;20269:13;:11;:13::i;:::-;86146::::1;86128:15;:31;;;;86047:120:::0;:::o;81953:128::-;20269:13;:11;:13::i;:::-;82056:17:::1;82040:13;:33;;;;;;:::i;:::-;;81953:128:::0;:::o;82703:119::-;82765:7;82792:22;82806:7;82792:13;:22::i;:::-;82785:29;;82703:119;;;:::o;84523:168::-;81334:14;:23;81349:7;;;;81334:23;;;;;;;;;;;;;;;;;;;;;;;;;;;81330:52;;;81366:16;;;;;;;;;;;;;;81330:52;20269:13:::1;:11;:13::i;:::-;80410:3:::2;84595:14;:12;:14::i;:::-;:26;84591:62;;84630:23;;;;;;;;;;;;;;84591:62;84664:19;84670:2;80410:3;84664:5;:19::i;:::-;84523:168:::0;:::o;48408:164::-;48505:4;48529:18;:25;48548:5;48529:25;;;;;;;;;;;;;;;:35;48555:8;48529:35;;;;;;;;;;;;;;;;;;;;;;;;;48522:42;;48408:164;;;;:::o;21289:201::-;20269:13;:11;:13::i;:::-;21398:1:::1;21378:22;;:8;:22;;::::0;21370:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;21454:28;21473:8;21454:18;:28::i;:::-;21289:201:::0;:::o;85819:102::-;20269:13;:11;:13::i;:::-;85904:9:::1;85892;:21;;;;85819:102:::0;:::o;80721:36::-;;;;;;;;;;;;;:::o;40066:639::-;40151:4;40490:10;40475:25;;:11;:25;;;;:102;;;;40567:10;40552:25;;:11;:25;;;;40475:102;:179;;;;40644:10;40629:25;;:11;:25;;;;40475:179;40455:199;;40066:639;;;:::o;15488:215::-;15590:4;15629:26;15614:41;;;:11;:41;;;;:81;;;;15659:36;15683:11;15659:23;:36::i;:::-;15614:81;15607:88;;15488:215;;;:::o;48830:282::-;48895:4;48951:7;48932:15;:13;:15::i;:::-;:26;;:66;;;;;48985:13;;48975:7;:23;48932:66;:153;;;;;49084:1;32838:8;49036:17;:26;49054:7;49036:26;;;;;;;;;;;;:44;:49;48932:153;48912:173;;48830:282;;;:::o;46892:408::-;46981:13;46997:16;47005:7;46997;:16::i;:::-;46981:32;;47053:5;47030:28;;:19;:17;:19::i;:::-;:28;;;47026:175;;47078:44;47095:5;47102:19;:17;:19::i;:::-;47078:16;:44::i;:::-;47073:128;;47150:35;;;;;;;;;;;;;;47073:128;47026:175;47246:2;47213:15;:24;47229:7;47213:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;47284:7;47280:2;47264:28;;47273:5;47264:28;;;;;;;;;;;;46970:330;46892:408;;:::o;20548:132::-;20623:12;:10;:12::i;:::-;20612:23;;:7;:5;:7::i;:::-;:23;;;20604:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20548:132::o;36235:92::-;36291:7;36318:1;36311:8;;36235:92;:::o;51098:2825::-;51240:27;51270;51289:7;51270:18;:27::i;:::-;51240:57;;51355:4;51314:45;;51330:19;51314:45;;;51310:86;;51368:28;;;;;;;;;;;;;;51310:86;51410:27;51439:23;51466:35;51493:7;51466:26;:35::i;:::-;51409:92;;;;51601:68;51626:15;51643:4;51649:19;:17;:19::i;:::-;51601:24;:68::i;:::-;51596:180;;51689:43;51706:4;51712:19;:17;:19::i;:::-;51689:16;:43::i;:::-;51684:92;;51741:35;;;;;;;;;;;;;;51684:92;51596:180;51807:1;51793:16;;:2;:16;;;51789:52;;51818:23;;;;;;;;;;;;;;51789:52;51854:43;51876:4;51882:2;51886:7;51895:1;51854:21;:43::i;:::-;51990:15;51987:160;;;52130:1;52109:19;52102:30;51987:160;52527:18;:24;52546:4;52527:24;;;;;;;;;;;;;;;;52525:26;;;;;;;;;;;;52596:18;:22;52615:2;52596:22;;;;;;;;;;;;;;;;52594:24;;;;;;;;;;;52918:146;52955:2;53004:45;53019:4;53025:2;53029:19;53004:14;:45::i;:::-;33118:8;52976:73;52918:18;:146::i;:::-;52889:17;:26;52907:7;52889:26;;;;;;;;;;;:175;;;;53235:1;33118:8;53184:19;:47;:52;53180:627;;53257:19;53289:1;53279:7;:11;53257:33;;53446:1;53412:17;:30;53430:11;53412:30;;;;;;;;;;;;:35;53408:384;;53550:13;;53535:11;:28;53531:242;;53730:19;53697:17;:30;53715:11;53697:30;;;;;;;;;;;:52;;;;53531:242;53408:384;53238:569;53180:627;53854:7;53850:2;53835:27;;53844:4;53835:27;;;;;;;;;;;;53873:42;53894:4;53900:2;53904:7;53913:1;53873:20;:42::i;:::-;51229:2694;;;51098:2825;;;:::o;16482:97::-;16540:6;16566:5;16559:12;;16482:97;:::o;54019:193::-;54165:39;54182:4;54188:2;54192:7;54165:39;;;;;;;;;;;;:16;:39::i;:::-;54019:193;;;:::o;37140:296::-;37195:7;37402:15;:13;:15::i;:::-;37386:13;;:31;37379:38;;37140:296;:::o;58479:2966::-;58552:20;58575:13;;58552:36;;58615:1;58603:8;:13;58599:44;;58625:18;;;;;;;;;;;;;;58599:44;58656:61;58686:1;58690:2;58694:12;58708:8;58656:21;:61::i;:::-;59200:1;32200:2;59170:1;:26;;59169:32;59157:8;:45;59131:18;:22;59150:2;59131:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;59479:139;59516:2;59570:33;59593:1;59597:2;59601:1;59570:14;:33::i;:::-;59537:30;59558:8;59537:20;:30::i;:::-;:66;59479:18;:139::i;:::-;59445:17;:31;59463:12;59445:31;;;;;;;;;;;:173;;;;59635:16;59666:11;59695:8;59680:12;:23;59666:37;;60216:16;60212:2;60208:25;60196:37;;60588:12;60548:8;60507:1;60445:25;60386:1;60325;60298:335;60959:1;60945:12;60941:20;60899:346;61000:3;60991:7;60988:16;60899:346;;61218:7;61208:8;61205:1;61178:25;61175:1;61172;61167:59;61053:1;61044:7;61040:15;61029:26;;60899:346;;;60903:77;61290:1;61278:8;:13;61274:45;;61300:19;;;;;;;;;;;;;;61274:45;61352:3;61336:13;:19;;;;58905:2462;;61377:60;61406:1;61410:2;61414:12;61428:8;61377:20;:60::i;:::-;58541:2904;58479:2966;;:::o;43516:1275::-;43583:7;43603:12;43618:7;43603:22;;43686:4;43667:15;:13;:15::i;:::-;:23;43663:1061;;43720:13;;43713:4;:20;43709:1015;;;43758:14;43775:17;:23;43793:4;43775:23;;;;;;;;;;;;43758:40;;43892:1;32838:8;43864:6;:24;:29;43860:845;;44529:113;44546:1;44536:6;:11;44529:113;;44589:17;:25;44607:6;;;;;;;44589:25;;;;;;;;;;;;44580:34;;44529:113;;;44675:6;44668:13;;;;;;43860:845;43735:989;43709:1015;43663:1061;44752:31;;;;;;;;;;;;;;43516:1275;;;;:::o;21650:191::-;21724:16;21743:6;;;;;;;;;;;21724:25;;21769:8;21760:6;;:17;;;;;;;;;;;;;;;;;;21824:8;21793:40;;21814:8;21793:40;;;;;;;;;;;;21713:128;21650:191;:::o;48017:234::-;48164:8;48112:18;:39;48131:19;:17;:19::i;:::-;48112:39;;;;;;;;;;;;;;;:49;48152:8;48112:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;48224:8;48188:55;;48203:19;:17;:19::i;:::-;48188:55;;;48234:8;48188:55;;;;;;:::i;:::-;;;;;;;;48017:234;;:::o;54810:407::-;54985:31;54998:4;55004:2;55008:7;54985:12;:31::i;:::-;55049:1;55031:2;:14;;;:19;55027:183;;55070:56;55101:4;55107:2;55111:7;55120:5;55070:30;:56::i;:::-;55065:145;;55154:40;;;;;;;;;;;;;;55065:145;55027:183;54810:407;;;;:::o;16850:332::-;16969:17;:15;:17::i;:::-;16953:33;;:12;:33;;;;16945:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;17072:1;17052:22;;:8;:22;;;17044:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;17139:35;;;;;;;;17151:8;17139:35;;;;;;17161:12;17139:35;;;;;17117:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16850:332;;:::o;81831:114::-;81891:13;81924;81917:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81831:114;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;38218:178::-;38279:7;32062:13;32200:2;38307:18;:25;38326:5;38307:25;;;;;;;;;;;;;;;;:50;;38306:82;38299:89;;38218:178;;;:::o;13040:157::-;13125:4;13164:25;13149:40;;;:11;:40;;;;13142:47;;13040:157;;;:::o;71138:105::-;71198:7;71225:10;71218:17;;71138:105;:::o;18934:98::-;18987:7;19014:10;19007:17;;18934:98;:::o;49993:485::-;50095:27;50124:23;50165:38;50206:15;:24;50222:7;50206:24;;;;;;;;;;;50165:65;;50383:18;50360:41;;50440:19;50434:26;50415:45;;50345:126;49993:485;;;:::o;49221:659::-;49370:11;49535:16;49528:5;49524:28;49515:37;;49695:16;49684:9;49680:32;49667:45;;49845:15;49834:9;49831:30;49823:5;49812:9;49809:20;49806:56;49796:66;;49221:659;;;;;:::o;55879:159::-;;;;;:::o;70447:311::-;70582:7;70602:16;33242:3;70628:19;:41;;70602:68;;33242:3;70696:31;70707:4;70713:2;70717:9;70696:10;:31::i;:::-;70688:40;;:62;;70681:69;;;70447:311;;;;;:::o;45339:450::-;45419:14;45587:16;45580:5;45576:28;45567:37;;45764:5;45750:11;45725:23;45721:41;45718:52;45711:5;45708:63;45698:73;;45339:450;;;;:::o;56703:158::-;;;;;:::o;45891:324::-;45961:14;46194:1;46184:8;46181:15;46155:24;46151:46;46141:56;;45891:324;;;:::o;57301:716::-;57464:4;57510:2;57485:45;;;57531:19;:17;:19::i;:::-;57552:4;57558:7;57567:5;57485:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;57481:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57785:1;57768:6;:13;:18;57764:235;;57814:40;;;;;;;;;;;;;;57764:235;57957:6;57951:13;57942:6;57938:2;57934:15;57927:38;57481:529;57654:54;;;57644:64;;;:6;:64;;;;57637:71;;;57301:716;;;;;;:::o;70148:147::-;70285:6;70148:147;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:246::-;2314:1;2324:113;2338:6;2335:1;2332:13;2324:113;;;2423:1;2418:3;2414:11;2408:18;2404:1;2399:3;2395:11;2388:39;2360:2;2357:1;2353:10;2348:15;;2324:113;;;2471:1;2462:6;2457:3;2453:16;2446:27;2295:184;2233:246;;;:::o;2485:102::-;2526:6;2577:2;2573:7;2568:2;2561:5;2557:14;2553:28;2543:38;;2485:102;;;:::o;2593:377::-;2681:3;2709:39;2742:5;2709:39;:::i;:::-;2764:71;2828:6;2823:3;2764:71;:::i;:::-;2757:78;;2844:65;2902:6;2897:3;2890:4;2883:5;2879:16;2844:65;:::i;:::-;2934:29;2956:6;2934:29;:::i;:::-;2929:3;2925:39;2918:46;;2685:285;2593:377;;;;:::o;2976:313::-;3089:4;3127:2;3116:9;3112:18;3104:26;;3176:9;3170:4;3166:20;3162:1;3151:9;3147:17;3140:47;3204:78;3277:4;3268:6;3204:78;:::i;:::-;3196:86;;2976:313;;;;:::o;3295:122::-;3368:24;3386:5;3368:24;:::i;:::-;3361:5;3358:35;3348:63;;3407:1;3404;3397:12;3348:63;3295:122;:::o;3423:139::-;3469:5;3507:6;3494:20;3485:29;;3523:33;3550:5;3523:33;:::i;:::-;3423:139;;;;:::o;3568:329::-;3627:6;3676:2;3664:9;3655:7;3651:23;3647:32;3644:119;;;3682:79;;:::i;:::-;3644:119;3802:1;3827:53;3872:7;3863:6;3852:9;3848:22;3827:53;:::i;:::-;3817:63;;3773:117;3568:329;;;;:::o;3903:126::-;3940:7;3980:42;3973:5;3969:54;3958:65;;3903:126;;;:::o;4035:96::-;4072:7;4101:24;4119:5;4101:24;:::i;:::-;4090:35;;4035:96;;;:::o;4137:118::-;4224:24;4242:5;4224:24;:::i;:::-;4219:3;4212:37;4137:118;;:::o;4261:222::-;4354:4;4392:2;4381:9;4377:18;4369:26;;4405:71;4473:1;4462:9;4458:17;4449:6;4405:71;:::i;:::-;4261:222;;;;:::o;4489:122::-;4562:24;4580:5;4562:24;:::i;:::-;4555:5;4552:35;4542:63;;4601:1;4598;4591:12;4542:63;4489:122;:::o;4617:139::-;4663:5;4701:6;4688:20;4679:29;;4717:33;4744:5;4717:33;:::i;:::-;4617:139;;;;:::o;4762:474::-;4830:6;4838;4887:2;4875:9;4866:7;4862:23;4858:32;4855:119;;;4893:79;;:::i;:::-;4855:119;5013:1;5038:53;5083:7;5074:6;5063:9;5059:22;5038:53;:::i;:::-;5028:63;;4984:117;5140:2;5166:53;5211:7;5202:6;5191:9;5187:22;5166:53;:::i;:::-;5156:63;;5111:118;4762:474;;;;;:::o;5242:117::-;5351:1;5348;5341:12;5365:117;5474:1;5471;5464:12;5488:117;5597:1;5594;5587:12;5625:553;5683:8;5693:6;5743:3;5736:4;5728:6;5724:17;5720:27;5710:122;;5751:79;;:::i;:::-;5710:122;5864:6;5851:20;5841:30;;5894:18;5886:6;5883:30;5880:117;;;5916:79;;:::i;:::-;5880:117;6030:4;6022:6;6018:17;6006:29;;6084:3;6076:4;6068:6;6064:17;6054:8;6050:32;6047:41;6044:128;;;6091:79;;:::i;:::-;6044:128;5625:553;;;;;:::o;6184:529::-;6255:6;6263;6312:2;6300:9;6291:7;6287:23;6283:32;6280:119;;;6318:79;;:::i;:::-;6280:119;6466:1;6455:9;6451:17;6438:31;6496:18;6488:6;6485:30;6482:117;;;6518:79;;:::i;:::-;6482:117;6631:65;6688:7;6679:6;6668:9;6664:22;6631:65;:::i;:::-;6613:83;;;;6409:297;6184:529;;;;;:::o;6719:619::-;6796:6;6804;6812;6861:2;6849:9;6840:7;6836:23;6832:32;6829:119;;;6867:79;;:::i;:::-;6829:119;6987:1;7012:53;7057:7;7048:6;7037:9;7033:22;7012:53;:::i;:::-;7002:63;;6958:117;7114:2;7140:53;7185:7;7176:6;7165:9;7161:22;7140:53;:::i;:::-;7130:63;;7085:118;7242:2;7268:53;7313:7;7304:6;7293:9;7289:22;7268:53;:::i;:::-;7258:63;;7213:118;6719:619;;;;;:::o;7344:474::-;7412:6;7420;7469:2;7457:9;7448:7;7444:23;7440:32;7437:119;;;7475:79;;:::i;:::-;7437:119;7595:1;7620:53;7665:7;7656:6;7645:9;7641:22;7620:53;:::i;:::-;7610:63;;7566:117;7722:2;7748:53;7793:7;7784:6;7773:9;7769:22;7748:53;:::i;:::-;7738:63;;7693:118;7344:474;;;;;:::o;7824:332::-;7945:4;7983:2;7972:9;7968:18;7960:26;;7996:71;8064:1;8053:9;8049:17;8040:6;7996:71;:::i;:::-;8077:72;8145:2;8134:9;8130:18;8121:6;8077:72;:::i;:::-;7824:332;;;;;:::o;8162:329::-;8221:6;8270:2;8258:9;8249:7;8245:23;8241:32;8238:119;;;8276:79;;:::i;:::-;8238:119;8396:1;8421:53;8466:7;8457:6;8446:9;8442:22;8421:53;:::i;:::-;8411:63;;8367:117;8162:329;;;;:::o;8497:116::-;8567:21;8582:5;8567:21;:::i;:::-;8560:5;8557:32;8547:60;;8603:1;8600;8593:12;8547:60;8497:116;:::o;8619:133::-;8662:5;8700:6;8687:20;8678:29;;8716:30;8740:5;8716:30;:::i;:::-;8619:133;;;;:::o;8758:468::-;8823:6;8831;8880:2;8868:9;8859:7;8855:23;8851:32;8848:119;;;8886:79;;:::i;:::-;8848:119;9006:1;9031:53;9076:7;9067:6;9056:9;9052:22;9031:53;:::i;:::-;9021:63;;8977:117;9133:2;9159:50;9201:7;9192:6;9181:9;9177:22;9159:50;:::i;:::-;9149:60;;9104:115;8758:468;;;;;:::o;9232:::-;9297:6;9305;9354:2;9342:9;9333:7;9329:23;9325:32;9322:119;;;9360:79;;:::i;:::-;9322:119;9480:1;9505:53;9550:7;9541:6;9530:9;9526:22;9505:53;:::i;:::-;9495:63;;9451:117;9607:2;9633:50;9675:7;9666:6;9655:9;9651:22;9633:50;:::i;:::-;9623:60;;9578:115;9232:468;;;;;:::o;9706:323::-;9762:6;9811:2;9799:9;9790:7;9786:23;9782:32;9779:119;;;9817:79;;:::i;:::-;9779:119;9937:1;9962:50;10004:7;9995:6;9984:9;9980:22;9962:50;:::i;:::-;9952:60;;9908:114;9706:323;;;;:::o;10035:117::-;10144:1;10141;10134:12;10158:180;10206:77;10203:1;10196:88;10303:4;10300:1;10293:15;10327:4;10324:1;10317:15;10344:281;10427:27;10449:4;10427:27;:::i;:::-;10419:6;10415:40;10557:6;10545:10;10542:22;10521:18;10509:10;10506:34;10503:62;10500:88;;;10568:18;;:::i;:::-;10500:88;10608:10;10604:2;10597:22;10387:238;10344:281;;:::o;10631:129::-;10665:6;10692:20;;:::i;:::-;10682:30;;10721:33;10749:4;10741:6;10721:33;:::i;:::-;10631:129;;;:::o;10766:307::-;10827:4;10917:18;10909:6;10906:30;10903:56;;;10939:18;;:::i;:::-;10903:56;10977:29;10999:6;10977:29;:::i;:::-;10969:37;;11061:4;11055;11051:15;11043:23;;10766:307;;;:::o;11079:146::-;11176:6;11171:3;11166;11153:30;11217:1;11208:6;11203:3;11199:16;11192:27;11079:146;;;:::o;11231:423::-;11308:5;11333:65;11349:48;11390:6;11349:48;:::i;:::-;11333:65;:::i;:::-;11324:74;;11421:6;11414:5;11407:21;11459:4;11452:5;11448:16;11497:3;11488:6;11483:3;11479:16;11476:25;11473:112;;;11504:79;;:::i;:::-;11473:112;11594:54;11641:6;11636:3;11631;11594:54;:::i;:::-;11314:340;11231:423;;;;;:::o;11673:338::-;11728:5;11777:3;11770:4;11762:6;11758:17;11754:27;11744:122;;11785:79;;:::i;:::-;11744:122;11902:6;11889:20;11927:78;12001:3;11993:6;11986:4;11978:6;11974:17;11927:78;:::i;:::-;11918:87;;11734:277;11673:338;;;;:::o;12017:943::-;12112:6;12120;12128;12136;12185:3;12173:9;12164:7;12160:23;12156:33;12153:120;;;12192:79;;:::i;:::-;12153:120;12312:1;12337:53;12382:7;12373:6;12362:9;12358:22;12337:53;:::i;:::-;12327:63;;12283:117;12439:2;12465:53;12510:7;12501:6;12490:9;12486:22;12465:53;:::i;:::-;12455:63;;12410:118;12567:2;12593:53;12638:7;12629:6;12618:9;12614:22;12593:53;:::i;:::-;12583:63;;12538:118;12723:2;12712:9;12708:18;12695:32;12754:18;12746:6;12743:30;12740:117;;;12776:79;;:::i;:::-;12740:117;12881:62;12935:7;12926:6;12915:9;12911:22;12881:62;:::i;:::-;12871:72;;12666:287;12017:943;;;;;;;:::o;12966:109::-;13002:7;13042:26;13035:5;13031:38;13020:49;;12966:109;;;:::o;13081:120::-;13153:23;13170:5;13153:23;:::i;:::-;13146:5;13143:34;13133:62;;13191:1;13188;13181:12;13133:62;13081:120;:::o;13207:137::-;13252:5;13290:6;13277:20;13268:29;;13306:32;13332:5;13306:32;:::i;:::-;13207:137;;;;:::o;13350:472::-;13417:6;13425;13474:2;13462:9;13453:7;13449:23;13445:32;13442:119;;;13480:79;;:::i;:::-;13442:119;13600:1;13625:53;13670:7;13661:6;13650:9;13646:22;13625:53;:::i;:::-;13615:63;;13571:117;13727:2;13753:52;13797:7;13788:6;13777:9;13773:22;13753:52;:::i;:::-;13743:62;;13698:117;13350:472;;;;;:::o;13828:308::-;13890:4;13980:18;13972:6;13969:30;13966:56;;;14002:18;;:::i;:::-;13966:56;14040:29;14062:6;14040:29;:::i;:::-;14032:37;;14124:4;14118;14114:15;14106:23;;13828:308;;;:::o;14142:425::-;14220:5;14245:66;14261:49;14303:6;14261:49;:::i;:::-;14245:66;:::i;:::-;14236:75;;14334:6;14327:5;14320:21;14372:4;14365:5;14361:16;14410:3;14401:6;14396:3;14392:16;14389:25;14386:112;;;14417:79;;:::i;:::-;14386:112;14507:54;14554:6;14549:3;14544;14507:54;:::i;:::-;14226:341;14142:425;;;;;:::o;14587:340::-;14643:5;14692:3;14685:4;14677:6;14673:17;14669:27;14659:122;;14700:79;;:::i;:::-;14659:122;14817:6;14804:20;14842:79;14917:3;14909:6;14902:4;14894:6;14890:17;14842:79;:::i;:::-;14833:88;;14649:278;14587:340;;;;:::o;14933:509::-;15002:6;15051:2;15039:9;15030:7;15026:23;15022:32;15019:119;;;15057:79;;:::i;:::-;15019:119;15205:1;15194:9;15190:17;15177:31;15235:18;15227:6;15224:30;15221:117;;;15257:79;;:::i;:::-;15221:117;15362:63;15417:7;15408:6;15397:9;15393:22;15362:63;:::i;:::-;15352:73;;15148:287;14933:509;;;;:::o;15448:474::-;15516:6;15524;15573:2;15561:9;15552:7;15548:23;15544:32;15541:119;;;15579:79;;:::i;:::-;15541:119;15699:1;15724:53;15769:7;15760:6;15749:9;15745:22;15724:53;:::i;:::-;15714:63;;15670:117;15826:2;15852:53;15897:7;15888:6;15877:9;15873:22;15852:53;:::i;:::-;15842:63;;15797:118;15448:474;;;;;:::o;15928:180::-;15976:77;15973:1;15966:88;16073:4;16070:1;16063:15;16097:4;16094:1;16087:15;16114:320;16158:6;16195:1;16189:4;16185:12;16175:22;;16242:1;16236:4;16232:12;16263:18;16253:81;;16319:4;16311:6;16307:17;16297:27;;16253:81;16381:2;16373:6;16370:14;16350:18;16347:38;16344:84;;16400:18;;:::i;:::-;16344:84;16165:269;16114:320;;;:::o;16440:97::-;16499:6;16527:3;16517:13;;16440:97;;;;:::o;16543:141::-;16592:4;16615:3;16607:11;;16638:3;16635:1;16628:14;16672:4;16669:1;16659:18;16651:26;;16543:141;;;:::o;16690:93::-;16727:6;16774:2;16769;16762:5;16758:14;16754:23;16744:33;;16690:93;;;:::o;16789:107::-;16833:8;16883:5;16877:4;16873:16;16852:37;;16789:107;;;;:::o;16902:393::-;16971:6;17021:1;17009:10;17005:18;17044:97;17074:66;17063:9;17044:97;:::i;:::-;17162:39;17192:8;17181:9;17162:39;:::i;:::-;17150:51;;17234:4;17230:9;17223:5;17219:21;17210:30;;17283:4;17273:8;17269:19;17262:5;17259:30;17249:40;;16978:317;;16902:393;;;;;:::o;17301:60::-;17329:3;17350:5;17343:12;;17301:60;;;:::o;17367:142::-;17417:9;17450:53;17468:34;17477:24;17495:5;17477:24;:::i;:::-;17468:34;:::i;:::-;17450:53;:::i;:::-;17437:66;;17367:142;;;:::o;17515:75::-;17558:3;17579:5;17572:12;;17515:75;;;:::o;17596:269::-;17706:39;17737:7;17706:39;:::i;:::-;17767:91;17816:41;17840:16;17816:41;:::i;:::-;17808:6;17801:4;17795:11;17767:91;:::i;:::-;17761:4;17754:105;17672:193;17596:269;;;:::o;17871:73::-;17916:3;17871:73;:::o;17950:189::-;18027:32;;:::i;:::-;18068:65;18126:6;18118;18112:4;18068:65;:::i;:::-;18003:136;17950:189;;:::o;18145:186::-;18205:120;18222:3;18215:5;18212:14;18205:120;;;18276:39;18313:1;18306:5;18276:39;:::i;:::-;18249:1;18242:5;18238:13;18229:22;;18205:120;;;18145:186;;:::o;18337:543::-;18438:2;18433:3;18430:11;18427:446;;;18472:38;18504:5;18472:38;:::i;:::-;18556:29;18574:10;18556:29;:::i;:::-;18546:8;18542:44;18739:2;18727:10;18724:18;18721:49;;;18760:8;18745:23;;18721:49;18783:80;18839:22;18857:3;18839:22;:::i;:::-;18829:8;18825:37;18812:11;18783:80;:::i;:::-;18442:431;;18427:446;18337:543;;;:::o;18886:117::-;18940:8;18990:5;18984:4;18980:16;18959:37;;18886:117;;;;:::o;19009:169::-;19053:6;19086:51;19134:1;19130:6;19122:5;19119:1;19115:13;19086:51;:::i;:::-;19082:56;19167:4;19161;19157:15;19147:25;;19060:118;19009:169;;;;:::o;19183:295::-;19259:4;19405:29;19430:3;19424:4;19405:29;:::i;:::-;19397:37;;19467:3;19464:1;19460:11;19454:4;19451:21;19443:29;;19183:295;;;;:::o;19483:1403::-;19607:44;19647:3;19642;19607:44;:::i;:::-;19716:18;19708:6;19705:30;19702:56;;;19738:18;;:::i;:::-;19702:56;19782:38;19814:4;19808:11;19782:38;:::i;:::-;19867:67;19927:6;19919;19913:4;19867:67;:::i;:::-;19961:1;19990:2;19982:6;19979:14;20007:1;20002:632;;;;20678:1;20695:6;20692:84;;;20751:9;20746:3;20742:19;20729:33;20720:42;;20692:84;20802:67;20862:6;20855:5;20802:67;:::i;:::-;20796:4;20789:81;20651:229;19972:908;;20002:632;20054:4;20050:9;20042:6;20038:22;20088:37;20120:4;20088:37;:::i;:::-;20147:1;20161:215;20175:7;20172:1;20169:14;20161:215;;;20261:9;20256:3;20252:19;20239:33;20231:6;20224:49;20312:1;20304:6;20300:14;20290:24;;20359:2;20348:9;20344:18;20331:31;;20198:4;20195:1;20191:12;20186:17;;20161:215;;;20404:6;20395:7;20392:19;20389:186;;;20469:9;20464:3;20460:19;20447:33;20512:48;20554:4;20546:6;20542:17;20531:9;20512:48;:::i;:::-;20504:6;20497:64;20412:163;20389:186;20621:1;20617;20609:6;20605:14;20601:22;20595:4;20588:36;20009:625;;;19972:908;;19582:1304;;;19483:1403;;;:::o;20892:180::-;20940:77;20937:1;20930:88;21037:4;21034:1;21027:15;21061:4;21058:1;21051:15;21078:410;21118:7;21141:20;21159:1;21141:20;:::i;:::-;21136:25;;21175:20;21193:1;21175:20;:::i;:::-;21170:25;;21230:1;21227;21223:9;21252:30;21270:11;21252:30;:::i;:::-;21241:41;;21431:1;21422:7;21418:15;21415:1;21412:22;21392:1;21385:9;21365:83;21342:139;;21461:18;;:::i;:::-;21342:139;21126:362;21078:410;;;;:::o;21494:180::-;21542:77;21539:1;21532:88;21639:4;21636:1;21629:15;21663:4;21660:1;21653:15;21680:185;21720:1;21737:20;21755:1;21737:20;:::i;:::-;21732:25;;21771:20;21789:1;21771:20;:::i;:::-;21766:25;;21810:1;21800:35;;21815:18;;:::i;:::-;21800:35;21857:1;21854;21850:9;21845:14;;21680:185;;;;:::o;21871:147::-;21972:11;22009:3;21994:18;;21871:147;;;;:::o;22024:114::-;;:::o;22144:398::-;22303:3;22324:83;22405:1;22400:3;22324:83;:::i;:::-;22317:90;;22416:93;22505:3;22416:93;:::i;:::-;22534:1;22529:3;22525:11;22518:18;;22144:398;;;:::o;22548:379::-;22732:3;22754:147;22897:3;22754:147;:::i;:::-;22747:154;;22918:3;22911:10;;22548:379;;;:::o;22933:174::-;23073:26;23069:1;23061:6;23057:14;23050:50;22933:174;:::o;23113:366::-;23255:3;23276:67;23340:2;23335:3;23276:67;:::i;:::-;23269:74;;23352:93;23441:3;23352:93;:::i;:::-;23470:2;23465:3;23461:12;23454:19;;23113:366;;;:::o;23485:419::-;23651:4;23689:2;23678:9;23674:18;23666:26;;23738:9;23732:4;23728:20;23724:1;23713:9;23709:17;23702:47;23766:131;23892:4;23766:131;:::i;:::-;23758:139;;23485:419;;;:::o;23910:236::-;24050:34;24046:1;24038:6;24034:14;24027:58;24119:19;24114:2;24106:6;24102:15;24095:44;23910:236;:::o;24152:366::-;24294:3;24315:67;24379:2;24374:3;24315:67;:::i;:::-;24308:74;;24391:93;24480:3;24391:93;:::i;:::-;24509:2;24504:3;24500:12;24493:19;;24152:366;;;:::o;24524:419::-;24690:4;24728:2;24717:9;24713:18;24705:26;;24777:9;24771:4;24767:20;24763:1;24752:9;24748:17;24741:47;24805:131;24931:4;24805:131;:::i;:::-;24797:139;;24524:419;;;:::o;24949:191::-;24989:3;25008:20;25026:1;25008:20;:::i;:::-;25003:25;;25042:20;25060:1;25042:20;:::i;:::-;25037:25;;25085:1;25082;25078:9;25071:16;;25106:3;25103:1;25100:10;25097:36;;;25113:18;;:::i;:::-;25097:36;24949:191;;;;:::o;25146:229::-;25286:34;25282:1;25274:6;25270:14;25263:58;25355:12;25350:2;25342:6;25338:15;25331:37;25146:229;:::o;25381:366::-;25523:3;25544:67;25608:2;25603:3;25544:67;:::i;:::-;25537:74;;25620:93;25709:3;25620:93;:::i;:::-;25738:2;25733:3;25729:12;25722:19;;25381:366;;;:::o;25753:419::-;25919:4;25957:2;25946:9;25942:18;25934:26;;26006:9;26000:4;25996:20;25992:1;25981:9;25977:17;25970:47;26034:131;26160:4;26034:131;:::i;:::-;26026:139;;25753:419;;;:::o;26178:172::-;26318:24;26314:1;26306:6;26302:14;26295:48;26178:172;:::o;26356:366::-;26498:3;26519:67;26583:2;26578:3;26519:67;:::i;:::-;26512:74;;26595:93;26684:3;26595:93;:::i;:::-;26713:2;26708:3;26704:12;26697:19;;26356:366;;;:::o;26728:419::-;26894:4;26932:2;26921:9;26917:18;26909:26;;26981:9;26975:4;26971:20;26967:1;26956:9;26952:17;26945:47;27009:131;27135:4;27009:131;:::i;:::-;27001:139;;26728:419;;;:::o;27153:176::-;27293:28;27289:1;27281:6;27277:14;27270:52;27153:176;:::o;27335:366::-;27477:3;27498:67;27562:2;27557:3;27498:67;:::i;:::-;27491:74;;27574:93;27663:3;27574:93;:::i;:::-;27692:2;27687:3;27683:12;27676:19;;27335:366;;;:::o;27707:419::-;27873:4;27911:2;27900:9;27896:18;27888:26;;27960:9;27954:4;27950:20;27946:1;27935:9;27931:17;27924:47;27988:131;28114:4;27988:131;:::i;:::-;27980:139;;27707:419;;;:::o;28132:194::-;28172:4;28192:20;28210:1;28192:20;:::i;:::-;28187:25;;28226:20;28244:1;28226:20;:::i;:::-;28221:25;;28270:1;28267;28263:9;28255:17;;28294:1;28288:4;28285:11;28282:37;;;28299:18;;:::i;:::-;28282:37;28132:194;;;;:::o;28332:234::-;28472:34;28468:1;28460:6;28456:14;28449:58;28541:17;28536:2;28528:6;28524:15;28517:42;28332:234;:::o;28572:366::-;28714:3;28735:67;28799:2;28794:3;28735:67;:::i;:::-;28728:74;;28811:93;28900:3;28811:93;:::i;:::-;28929:2;28924:3;28920:12;28913:19;;28572:366;;;:::o;28944:419::-;29110:4;29148:2;29137:9;29133:18;29125:26;;29197:9;29191:4;29187:20;29183:1;29172:9;29168:17;29161:47;29225:131;29351:4;29225:131;:::i;:::-;29217:139;;28944:419;;;:::o;29369:148::-;29471:11;29508:3;29493:18;;29369:148;;;;:::o;29523:390::-;29629:3;29657:39;29690:5;29657:39;:::i;:::-;29712:89;29794:6;29789:3;29712:89;:::i;:::-;29705:96;;29810:65;29868:6;29863:3;29856:4;29849:5;29845:16;29810:65;:::i;:::-;29900:6;29895:3;29891:16;29884:23;;29633:280;29523:390;;;;:::o;29943:874::-;30046:3;30083:5;30077:12;30112:36;30138:9;30112:36;:::i;:::-;30164:89;30246:6;30241:3;30164:89;:::i;:::-;30157:96;;30284:1;30273:9;30269:17;30300:1;30295:166;;;;30475:1;30470:341;;;;30262:549;;30295:166;30379:4;30375:9;30364;30360:25;30355:3;30348:38;30441:6;30434:14;30427:22;30419:6;30415:35;30410:3;30406:45;30399:52;;30295:166;;30470:341;30537:38;30569:5;30537:38;:::i;:::-;30597:1;30611:154;30625:6;30622:1;30619:13;30611:154;;;30699:7;30693:14;30689:1;30684:3;30680:11;30673:35;30749:1;30740:7;30736:15;30725:26;;30647:4;30644:1;30640:12;30635:17;;30611:154;;;30794:6;30789:3;30785:16;30778:23;;30477:334;;30262:549;;30050:767;;29943:874;;;;:::o;30823:589::-;31048:3;31070:95;31161:3;31152:6;31070:95;:::i;:::-;31063:102;;31182:95;31273:3;31264:6;31182:95;:::i;:::-;31175:102;;31294:92;31382:3;31373:6;31294:92;:::i;:::-;31287:99;;31403:3;31396:10;;30823:589;;;;;;:::o;31418:1395::-;31535:37;31568:3;31535:37;:::i;:::-;31637:18;31629:6;31626:30;31623:56;;;31659:18;;:::i;:::-;31623:56;31703:38;31735:4;31729:11;31703:38;:::i;:::-;31788:67;31848:6;31840;31834:4;31788:67;:::i;:::-;31882:1;31906:4;31893:17;;31938:2;31930:6;31927:14;31955:1;31950:618;;;;32612:1;32629:6;32626:77;;;32678:9;32673:3;32669:19;32663:26;32654:35;;32626:77;32729:67;32789:6;32782:5;32729:67;:::i;:::-;32723:4;32716:81;32585:222;31920:887;;31950:618;32002:4;31998:9;31990:6;31986:22;32036:37;32068:4;32036:37;:::i;:::-;32095:1;32109:208;32123:7;32120:1;32117:14;32109:208;;;32202:9;32197:3;32193:19;32187:26;32179:6;32172:42;32253:1;32245:6;32241:14;32231:24;;32300:2;32289:9;32285:18;32272:31;;32146:4;32143:1;32139:12;32134:17;;32109:208;;;32345:6;32336:7;32333:19;32330:179;;;32403:9;32398:3;32394:19;32388:26;32446:48;32488:4;32480:6;32476:17;32465:9;32446:48;:::i;:::-;32438:6;32431:64;32353:156;32330:179;32555:1;32551;32543:6;32539:14;32535:22;32529:4;32522:36;31957:611;;;31920:887;;31510:1303;;;31418:1395;;:::o;32819:225::-;32959:34;32955:1;32947:6;32943:14;32936:58;33028:8;33023:2;33015:6;33011:15;33004:33;32819:225;:::o;33050:366::-;33192:3;33213:67;33277:2;33272:3;33213:67;:::i;:::-;33206:74;;33289:93;33378:3;33289:93;:::i;:::-;33407:2;33402:3;33398:12;33391:19;;33050:366;;;:::o;33422:419::-;33588:4;33626:2;33615:9;33611:18;33603:26;;33675:9;33669:4;33665:20;33661:1;33650:9;33646:17;33639:47;33703:131;33829:4;33703:131;:::i;:::-;33695:139;;33422:419;;;:::o;33847:182::-;33987:34;33983:1;33975:6;33971:14;33964:58;33847:182;:::o;34035:366::-;34177:3;34198:67;34262:2;34257:3;34198:67;:::i;:::-;34191:74;;34274:93;34363:3;34274:93;:::i;:::-;34392:2;34387:3;34383:12;34376:19;;34035:366;;;:::o;34407:419::-;34573:4;34611:2;34600:9;34596:18;34588:26;;34660:9;34654:4;34650:20;34646:1;34635:9;34631:17;34624:47;34688:131;34814:4;34688:131;:::i;:::-;34680:139;;34407:419;;;:::o;34832:229::-;34972:34;34968:1;34960:6;34956:14;34949:58;35041:12;35036:2;35028:6;35024:15;35017:37;34832:229;:::o;35067:366::-;35209:3;35230:67;35294:2;35289:3;35230:67;:::i;:::-;35223:74;;35306:93;35395:3;35306:93;:::i;:::-;35424:2;35419:3;35415:12;35408:19;;35067:366;;;:::o;35439:419::-;35605:4;35643:2;35632:9;35628:18;35620:26;;35692:9;35686:4;35682:20;35678:1;35667:9;35663:17;35656:47;35720:131;35846:4;35720:131;:::i;:::-;35712:139;;35439:419;;;:::o;35864:175::-;36004:27;36000:1;35992:6;35988:14;35981:51;35864:175;:::o;36045:366::-;36187:3;36208:67;36272:2;36267:3;36208:67;:::i;:::-;36201:74;;36284:93;36373:3;36284:93;:::i;:::-;36402:2;36397:3;36393:12;36386:19;;36045:366;;;:::o;36417:419::-;36583:4;36621:2;36610:9;36606:18;36598:26;;36670:9;36664:4;36660:20;36656:1;36645:9;36641:17;36634:47;36698:131;36824:4;36698:131;:::i;:::-;36690:139;;36417:419;;;:::o;36842:233::-;36881:3;36904:24;36922:5;36904:24;:::i;:::-;36895:33;;36950:66;36943:5;36940:77;36937:103;;37020:18;;:::i;:::-;36937:103;37067:1;37060:5;37056:13;37049:20;;36842:233;;;:::o;37081:176::-;37113:1;37130:20;37148:1;37130:20;:::i;:::-;37125:25;;37164:20;37182:1;37164:20;:::i;:::-;37159:25;;37203:1;37193:35;;37208:18;;:::i;:::-;37193:35;37249:1;37246;37242:9;37237:14;;37081:176;;;;:::o;37263:180::-;37311:77;37308:1;37301:88;37408:4;37405:1;37398:15;37432:4;37429:1;37422:15;37449:98;37500:6;37534:5;37528:12;37518:22;;37449:98;;;:::o;37553:168::-;37636:11;37670:6;37665:3;37658:19;37710:4;37705:3;37701:14;37686:29;;37553:168;;;;:::o;37727:373::-;37813:3;37841:38;37873:5;37841:38;:::i;:::-;37895:70;37958:6;37953:3;37895:70;:::i;:::-;37888:77;;37974:65;38032:6;38027:3;38020:4;38013:5;38009:16;37974:65;:::i;:::-;38064:29;38086:6;38064:29;:::i;:::-;38059:3;38055:39;38048:46;;37817:283;37727:373;;;;:::o;38106:640::-;38301:4;38339:3;38328:9;38324:19;38316:27;;38353:71;38421:1;38410:9;38406:17;38397:6;38353:71;:::i;:::-;38434:72;38502:2;38491:9;38487:18;38478:6;38434:72;:::i;:::-;38516;38584:2;38573:9;38569:18;38560:6;38516:72;:::i;:::-;38635:9;38629:4;38625:20;38620:2;38609:9;38605:18;38598:48;38663:76;38734:4;38725:6;38663:76;:::i;:::-;38655:84;;38106:640;;;;;;;:::o;38752:141::-;38808:5;38839:6;38833:13;38824:22;;38855:32;38881:5;38855:32;:::i;:::-;38752:141;;;;:::o;38899:349::-;38968:6;39017:2;39005:9;38996:7;38992:23;38988:32;38985:119;;;39023:79;;:::i;:::-;38985:119;39143:1;39168:63;39223:7;39214:6;39203:9;39199:22;39168:63;:::i;:::-;39158:73;;39114:127;38899:349;;;;:::o

Swarm Source

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