ETH Price: $2,349.39 (+0.28%)

Token

Golden Access (GA)
 

Overview

Max Total Supply

50 GA

Holders

48

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
bullsclub.eth
Balance
1 GA
0x8A2446Fcb3Ca74720FF69F7531E6D26E21Fd6BD3
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GoldenAccess

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-05-30
*/

// SPDX-License-Identifier: MIT
// File: contracts/Fiverr/Golden Access/lib/Constants.sol


pragma solidity ^0.8.13;

address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E;
address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;

// File: contracts/Fiverr/Golden Access/IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    /**
     * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns
     *         true if supplied registrant address is not registered.
     */
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);

    /**
     * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner.
     */
    function register(address registrant) external;

    /**
     * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes.
     */
    function registerAndSubscribe(address registrant, address subscription) external;

    /**
     * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another
     *         address without subscribing.
     */
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;

    /**
     * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner.
     *         Note that this does not remove any filtered addresses or codeHashes.
     *         Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes.
     */
    function unregister(address addr) external;

    /**
     * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered.
     */
    function updateOperator(address registrant, address operator, bool filtered) external;

    /**
     * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates.
     */
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;

    /**
     * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered.
     */
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;

    /**
     * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates.
     */
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;

    /**
     * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous
     *         subscription if present.
     *         Note that accounts with subscriptions may go on to subscribe to other accounts - in this case,
     *         subscriptions will not be forwarded. Instead the former subscription's existing entries will still be
     *         used.
     */
    function subscribe(address registrant, address registrantToSubscribe) external;

    /**
     * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes.
     */
    function unsubscribe(address registrant, bool copyExistingEntries) external;

    /**
     * @notice Get the subscription address of a given registrant, if any.
     */
    function subscriptionOf(address addr) external returns (address registrant);

    /**
     * @notice Get the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscribers(address registrant) external returns (address[] memory);

    /**
     * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscriberAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr.
     */
    function copyEntriesOf(address registrant, address registrantToCopy) external;

    /**
     * @notice Returns true if operator is filtered by a given address or its subscription.
     */
    function isOperatorFiltered(address registrant, address operator) external returns (bool);

    /**
     * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription.
     */
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);

    /**
     * @notice Returns true if a codeHash is filtered by a given address or its subscription.
     */
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);

    /**
     * @notice Returns a list of filtered operators for a given address or its subscription.
     */
    function filteredOperators(address addr) external returns (address[] memory);

    /**
     * @notice Returns the set of filtered codeHashes for a given address or its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);

    /**
     * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);

    /**
     * @notice Returns true if an address has registered
     */
    function isRegistered(address addr) external returns (bool);

    /**
     * @dev Convenience method to compute the code hash of an arbitrary contract
     */
    function codeHashOf(address addr) external returns (bytes32);
}

// File: contracts/Fiverr/Golden Access/OperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 *         Please note that if your token contract does not provide an owner with EIP-173, it must provide
 *         administration methods on the contract itself to interact with the registry otherwise the subscription
 *         will be locked to the options set during construction.
 */

abstract contract OperatorFilterer {
    /// @dev Emitted when an operator is not allowed.
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS);

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

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    /**
     * @dev A helper function to check if an operator approval is allowed.
     */
    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // under normal circumstances, this function will revert rather than return false, but inheriting contracts
            // may specify their own OperatorFilterRegistry implementations, which may behave differently
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

// File: contracts/Fiverr/Golden Access/DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 * @dev    Please note that if your token contract does not provide an owner with EIP-173, it must provide
 *         administration methods on the contract itself to interact with the registry otherwise the subscription
 *         will be locked to the options set during construction.
 */

abstract contract DefaultOperatorFilterer is OperatorFilterer {
    /// @dev The constructor that is called when the contract is being deployed.
    constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {}
}

// 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: @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: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;


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

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

// File: contracts/Fiverr/Golden Access/goldenbugNew.sol


pragma solidity ^0.8.9;





contract GoldenAccess is ERC721A, DefaultOperatorFilterer, Ownable, ERC2981 {
    uint256 public maxSupply = 50;
    bool public isMintingEnabled;
    bool public isPreRevealedEnabled;
    string public baseTokenUri;
    string public preRevealUri;
    address payable public withdrawWallet;
    uint public maxPerWallet = 1;

    address private royaltyAddr = 0x3D5f623009C91725364D8cF094a606aaF08937a5;

    mapping(address => uint256) public _totalMintedAmount;

    constructor(string memory _preRevealUri, string memory _baseUri) ERC721A("Golden Access", "GA") {
        preRevealUri = _preRevealUri;
        baseTokenUri = _baseUri;
        isPreRevealedEnabled = true;
        _setDefaultRoyalty(royaltyAddr, 500);
    }

    //functions can be called by only owner
    function setBaseTokenUri(string calldata _baseTokenUri) external onlyOwner{
        baseTokenUri = _baseTokenUri;
    }

    function setPreRevealUri(string calldata _preRevealUri) external onlyOwner{
        preRevealUri = _preRevealUri;
    }

    function setIsMintingEnabled() external onlyOwner{
        isMintingEnabled = true;
    }

    function revealNFT() public onlyOwner{
        isPreRevealedEnabled = false;
    }

    function withdraw() external onlyOwner{
        (bool success,) = withdrawWallet.call{value: address(this).balance}("");
        require(success, "Withdrawal failed");
    }

    /* -------------------------------------------------------------------------- */
    /*                              operator filterer                             */
    /* -------------------------------------------------------------------------- */
    function setApprovalForAll(address operator, bool approved)
        public
        override(ERC721A)
        onlyAllowedOperatorApproval(operator)
    {
        super.setApprovalForAll(operator, approved);
    }

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

    /**
     * @dev Both safeTransferFrom functions in ERC721A call this function
     * so we don't need to override them.
     */
    function transferFrom(address from, address to, uint256 tokenId)
        public
        payable
        override(ERC721A)
        onlyAllowedOperator(from)
    {
        super.transferFrom(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-approve}.
     *      In this example the added modifier ensures that the operator is allowed by the OperatorFilterRegistry.
     */
    /* -------------------------------------------------------------------------- */
    /*                                   erc2981                                  */
    /* -------------------------------------------------------------------------- */
    function setDefaultRoyalty(address receiver, uint96 feeNumerator) public onlyOwner {
        _setDefaultRoyalty(receiver, feeNumerator);
    }

    function deleteDefaultRoyalty() public onlyOwner {
        _deleteDefaultRoyalty();
    }

    /* -------------------------------------------------------------------------- */
    /*                                   erc165                                   */
    /* -------------------------------------------------------------------------- */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, ERC2981) returns (bool) {
        // Supports the following `interfaceId`s:
        // - IERC165: 0x01ffc9a7
        // - IERC721: 0x80ac58cd
        // - IERC721Metadata: 0x5b5e139f
        // - IERC2981: 0x2a55205a
        return ERC721A.supportsInterface(interfaceId) || ERC2981.supportsInterface(interfaceId);
    }


    /* -------------------------------------------------------------------------- */
    /*                                   erc721a                                  */
    /* -------------------------------------------------------------------------- */
 
    function _startTokenId() internal pure override returns (uint256) {
        return 1;
    }

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

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        if(isPreRevealedEnabled){
            return preRevealUri;
        }

        return bytes(baseTokenUri).length != 0 ? string(abi.encodePacked(baseTokenUri, _toString(tokenId),".json")) : "";
    }


    //mint function
    function mint(uint256 _quantity) external payable {
        require(isMintingEnabled, "Minting is not started yet");
        require(_quantity > 0, "You need to mint at least 1 NFT");
        require(_totalMintedAmount[msg.sender] + _quantity <= maxPerWallet, "Exceed maximum NFTs per wallet");
        require(totalSupply() + _quantity <= maxSupply, "Sold Out");

        _totalMintedAmount[msg.sender] += _quantity;
        _safeMint(msg.sender, _quantity);
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_preRevealUri","type":"string"},{"internalType":"string","name":"_baseUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_totalMintedAmount","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":"baseTokenUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deleteDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","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":[],"name":"isMintingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPreRevealedEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preRevealUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealNFT","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":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenUri","type":"string"}],"name":"setBaseTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setIsMintingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_preRevealUri","type":"string"}],"name":"setPreRevealUri","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040526032600b556001601055733d5f623009c91725364d8cf094a606aaf08937a5601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200007057600080fd5b506040516200471d3803806200471d833981810160405281019062000096919062000800565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600d81526020017f476f6c64656e20416363657373000000000000000000000000000000000000008152506040518060400160405280600281526020017f474100000000000000000000000000000000000000000000000000000000000081525081600290816200012a919062000ad0565b5080600390816200013c919062000ad0565b506200014d620003e960201b60201c565b600081905550505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200034a57801562000210576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001d692919062000bfc565b600060405180830381600087803b158015620001f157600080fd5b505af115801562000206573d6000803e3d6000fd5b5050505062000349565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002ca576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200029092919062000bfc565b600060405180830381600087803b158015620002ab57600080fd5b505af1158015620002c0573d6000803e3d6000fd5b5050505062000348565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000313919062000c29565b600060405180830381600087803b1580156200032e57600080fd5b505af115801562000343573d6000803e3d6000fd5b505050505b5b5b50506200036c62000360620003f260201b60201c565b620003fa60201b60201c565b81600e90816200037d919062000ad0565b5080600d90816200038f919062000ad0565b506001600c60016101000a81548160ff021916908315150217905550620003e1601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166101f4620004c060201b60201c565b505062000d61565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620004d06200066360201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000531576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005289062000ccd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620005a3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200059a9062000d3f565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006d6826200068b565b810181811067ffffffffffffffff82111715620006f857620006f76200069c565b5b80604052505050565b60006200070d6200066d565b90506200071b8282620006cb565b919050565b600067ffffffffffffffff8211156200073e576200073d6200069c565b5b62000749826200068b565b9050602081019050919050565b60005b838110156200077657808201518184015260208101905062000759565b60008484015250505050565b600062000799620007938462000720565b62000701565b905082815260208101848484011115620007b857620007b762000686565b5b620007c584828562000756565b509392505050565b600082601f830112620007e557620007e462000681565b5b8151620007f784826020860162000782565b91505092915050565b600080604083850312156200081a576200081962000677565b5b600083015167ffffffffffffffff8111156200083b576200083a6200067c565b5b6200084985828601620007cd565b925050602083015167ffffffffffffffff8111156200086d576200086c6200067c565b5b6200087b85828601620007cd565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620008d857607f821691505b602082108103620008ee57620008ed62000890565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620009587fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000919565b62000964868362000919565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620009b1620009ab620009a5846200097c565b62000986565b6200097c565b9050919050565b6000819050919050565b620009cd8362000990565b620009e5620009dc82620009b8565b84845462000926565b825550505050565b600090565b620009fc620009ed565b62000a09818484620009c2565b505050565b5b8181101562000a315762000a25600082620009f2565b60018101905062000a0f565b5050565b601f82111562000a805762000a4a81620008f4565b62000a558462000909565b8101602085101562000a65578190505b62000a7d62000a748562000909565b83018262000a0e565b50505b505050565b600082821c905092915050565b600062000aa56000198460080262000a85565b1980831691505092915050565b600062000ac0838362000a92565b9150826002028217905092915050565b62000adb8262000885565b67ffffffffffffffff81111562000af75762000af66200069c565b5b62000b038254620008bf565b62000b1082828562000a35565b600060209050601f83116001811462000b48576000841562000b33578287015190505b62000b3f858262000ab2565b86555062000baf565b601f19841662000b5886620008f4565b60005b8281101562000b825784890151825560018201915060208501945060208101905062000b5b565b8683101562000ba2578489015162000b9e601f89168262000a92565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000be48262000bb7565b9050919050565b62000bf68162000bd7565b82525050565b600060408201905062000c13600083018562000beb565b62000c22602083018462000beb565b9392505050565b600060208201905062000c40600083018462000beb565b92915050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000cb5602a8362000c46565b915062000cc28262000c57565b604082019050919050565b6000602082019050818103600083015262000ce88162000ca6565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000d2760198362000c46565b915062000d348262000cef565b602082019050919050565b6000602082019050818103600083015262000d5a8162000d18565b9050919050565b6139ac8062000d716000396000f3fe6080604052600436106102045760003560e01c806370a082311161011857806395d89b41116100a0578063b88d4fde1161006f578063b88d4fde146106d8578063c87b56dd146106f4578063d5abeb0114610731578063e985e9c51461075c578063f2fde38b1461079957610204565b806395d89b4114610651578063a0712d681461067c578063a22cb46514610698578063aa1b103f146106c157610204565b806385d178f4116100e757806385d178f41461057c5780638da5cb5b146105a75780638f7b9379146105d2578063916b1083146105fd57806395652cfa1461062857610204565b806370a08231146104e6578063715018a6146105235780637a0101a21461053a5780638460f0601461056557610204565b806318160ddd1161019b57806341f434341161016a57806341f434341461040c57806342842e0e14610437578063453c23101461045357806355c7ba141461047e5780636352211e146104a957610204565b806318160ddd1461037057806323b872dd1461039b5780632a55205a146103b75780633ccfd60b146103f557610204565b806306fdde03116101d757806306fdde03146102af578063081812fc146102da578063095ea7b31461031757806311b01a321461033357610204565b8063013eee1f1461020957806301ffc9a71461023257806304634d8d1461026f57806304b4bba914610298575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b919061271d565b6107c2565b005b34801561023e57600080fd5b50610259600480360381019061025491906127c2565b6107e0565b604051610266919061280a565b60405180910390f35b34801561027b57600080fd5b50610296600480360381019061029191906128c7565b610802565b005b3480156102a457600080fd5b506102ad610818565b005b3480156102bb57600080fd5b506102c461083d565b6040516102d19190612997565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc91906129ef565b6108cf565b60405161030e9190612a2b565b60405180910390f35b610331600480360381019061032c9190612a46565b61094e565b005b34801561033f57600080fd5b5061035a60048036038101906103559190612a86565b610967565b6040516103679190612ac2565b60405180910390f35b34801561037c57600080fd5b5061038561097f565b6040516103929190612ac2565b60405180910390f35b6103b560048036038101906103b09190612add565b610996565b005b3480156103c357600080fd5b506103de60048036038101906103d99190612b30565b6109e5565b6040516103ec929190612b70565b60405180910390f35b34801561040157600080fd5b5061040a610bcf565b005b34801561041857600080fd5b50610421610ca8565b60405161042e9190612bf8565b60405180910390f35b610451600480360381019061044c9190612add565b610cba565b005b34801561045f57600080fd5b50610468610cda565b6040516104759190612ac2565b60405180910390f35b34801561048a57600080fd5b50610493610ce0565b6040516104a0919061280a565b60405180910390f35b3480156104b557600080fd5b506104d060048036038101906104cb91906129ef565b610cf3565b6040516104dd9190612a2b565b60405180910390f35b3480156104f257600080fd5b5061050d60048036038101906105089190612a86565b610d05565b60405161051a9190612ac2565b60405180910390f35b34801561052f57600080fd5b50610538610dbd565b005b34801561054657600080fd5b5061054f610dd1565b60405161055c9190612997565b60405180910390f35b34801561057157600080fd5b5061057a610e5f565b005b34801561058857600080fd5b50610591610e84565b60405161059e9190612c34565b60405180910390f35b3480156105b357600080fd5b506105bc610eaa565b6040516105c99190612a2b565b60405180910390f35b3480156105de57600080fd5b506105e7610ed4565b6040516105f49190612997565b60405180910390f35b34801561060957600080fd5b50610612610f62565b60405161061f919061280a565b60405180910390f35b34801561063457600080fd5b5061064f600480360381019061064a919061271d565b610f75565b005b34801561065d57600080fd5b50610666610f93565b6040516106739190612997565b60405180910390f35b610696600480360381019061069191906129ef565b611025565b005b3480156106a457600080fd5b506106bf60048036038101906106ba9190612c7b565b611200565b005b3480156106cd57600080fd5b506106d6611219565b005b6106f260048036038101906106ed9190612deb565b61122b565b005b34801561070057600080fd5b5061071b600480360381019061071691906129ef565b61127c565b6040516107289190612997565b60405180910390f35b34801561073d57600080fd5b506107466113c3565b6040516107539190612ac2565b60405180910390f35b34801561076857600080fd5b50610783600480360381019061077e9190612e6e565b6113c9565b604051610790919061280a565b60405180910390f35b3480156107a557600080fd5b506107c060048036038101906107bb9190612a86565b61145d565b005b6107ca6114e0565b8181600e91826107db9291906130bb565b505050565b60006107eb8261155e565b806107fb57506107fa826115f0565b5b9050919050565b61080a6114e0565b610814828261166a565b5050565b6108206114e0565b6000600c60016101000a81548160ff021916908315150217905550565b60606002805461084c90612ee8565b80601f016020809104026020016040519081016040528092919081815260200182805461087890612ee8565b80156108c55780601f1061089a576101008083540402835291602001916108c5565b820191906000526020600020905b8154815290600101906020018083116108a857829003601f168201915b5050505050905090565b60006108da826117ff565b610910576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b816109588161185e565b610962838361195b565b505050565b60126020528060005260406000206000915090505481565b6000610989611a9f565b6001546000540303905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109d4576109d33361185e565b5b6109df848484611aa8565b50505050565b6000806000600a60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610b7a5760096040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610b84611dca565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610bb091906131ba565b610bba919061322b565b90508160000151819350935050509250929050565b610bd76114e0565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051610c1f9061328d565b60006040518083038185875af1925050503d8060008114610c5c576040519150601f19603f3d011682016040523d82523d6000602084013e610c61565b606091505b5050905080610ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9c906132ee565b60405180910390fd5b50565b6daaeb6d7670e522a718067333cd4e81565b610cd58383836040518060200160405280600081525061122b565b505050565b60105481565b600c60009054906101000a900460ff1681565b6000610cfe82611dd4565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d6c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610dc56114e0565b610dcf6000611ea0565b565b600d8054610dde90612ee8565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0a90612ee8565b8015610e575780601f10610e2c57610100808354040283529160200191610e57565b820191906000526020600020905b815481529060010190602001808311610e3a57829003601f168201915b505050505081565b610e676114e0565b6001600c60006101000a81548160ff021916908315150217905550565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e8054610ee190612ee8565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0d90612ee8565b8015610f5a5780601f10610f2f57610100808354040283529160200191610f5a565b820191906000526020600020905b815481529060010190602001808311610f3d57829003601f168201915b505050505081565b600c60019054906101000a900460ff1681565b610f7d6114e0565b8181600d9182610f8e9291906130bb565b505050565b606060038054610fa290612ee8565b80601f0160208091040260200160405190810160405280929190818152602001828054610fce90612ee8565b801561101b5780601f10610ff05761010080835404028352916020019161101b565b820191906000526020600020905b815481529060010190602001808311610ffe57829003601f168201915b5050505050905090565b600c60009054906101000a900460ff16611074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106b9061335a565b60405180910390fd5b600081116110b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ae906133c6565b60405180910390fd5b60105481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461110591906133e6565b1115611146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113d90613466565b60405180910390fd5b600b548161115261097f565b61115c91906133e6565b111561119d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611194906134d2565b60405180910390fd5b80601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111ec91906133e6565b925050819055506111fd3382611f66565b50565b8161120a8161185e565b6112148383611f84565b505050565b6112216114e0565b61122961208f565b565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611269576112683361185e565b5b611275858585856120dc565b5050505050565b6060611287826117ff565b6112bd576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c60019054906101000a900460ff161561136457600e80546112df90612ee8565b80601f016020809104026020016040519081016040528092919081815260200182805461130b90612ee8565b80156113585780601f1061132d57610100808354040283529160200191611358565b820191906000526020600020905b81548152906001019060200180831161133b57829003601f168201915b505050505090506113be565b6000600d805461137390612ee8565b90500361138f57604051806020016040528060008152506113bb565b600d61139a8361214f565b6040516020016113ab9291906135fd565b6040516020818303038152906040525b90505b919050565b600b5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114656114e0565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cb9061369e565b60405180910390fd5b6114dd81611ea0565b50565b6114e861219f565b73ffffffffffffffffffffffffffffffffffffffff16611506610eaa565b73ffffffffffffffffffffffffffffffffffffffff161461155c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115539061370a565b60405180910390fd5b565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806115b957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806115e95750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806116635750611662826121a7565b5b9050919050565b611672611dca565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156116d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c79061379c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361173f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173690613808565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b60008161180a611a9f565b11158015611819575060005482105b8015611857575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611958576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016118d5929190613828565b602060405180830381865afa1580156118f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119169190613866565b61195757806040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161194e9190612a2b565b60405180910390fd5b5b50565b600061196682610cf3565b90508073ffffffffffffffffffffffffffffffffffffffff16611987612211565b73ffffffffffffffffffffffffffffffffffffffff16146119ea576119b3816119ae612211565b6113c9565b6119e9576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611ab382611dd4565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b1a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611b2684612219565b91509150611b3c8187611b37612211565b612240565b611b8857611b5186611b4c612211565b6113c9565b611b87576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611bee576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bfb8686866001612284565b8015611c0657600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611cd485611cb088888761228a565b7c0200000000000000000000000000000000000000000000000000000000176122b2565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611d5a5760006001850190506000600460008381526020019081526020016000205403611d58576000548114611d57578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611dc286868660016122dd565b505050505050565b6000612710905090565b60008082905080611de3611a9f565b11611e6957600054811015611e685760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611e66575b60008103611e5c576004600083600190039350838152602001908152602001600020549050611e32565b8092505050611e9b565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f808282604051806020016040528060008152506122e3565b5050565b8060076000611f91612211565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661203e612211565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612083919061280a565b60405180910390a35050565b6009600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff02191690555050565b6120e7848484610996565b60008373ffffffffffffffffffffffffffffffffffffffff163b146121495761211284848484612380565b612148576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060a060405101806040526020810391506000825281835b60011561218a57600184039350600a81066030018453600a8104905080612168575b50828103602084039350808452505050919050565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86122a18686846124d0565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6122ed83836124d9565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461237b57600080549050600083820390505b61232d6000868380600101945086612380565b612363576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061231a57816000541461237857600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123a6612211565b8786866040518563ffffffff1660e01b81526004016123c894939291906138e8565b6020604051808303816000875af192505050801561240457506040513d601f19601f820116820180604052508101906124019190613949565b60015b61247d573d8060008114612434576040519150601f19603f3d011682016040523d82523d6000602084013e612439565b606091505b506000815103612475576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60008054905060008203612519576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125266000848385612284565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061259d8361258e600086600061228a565b61259785612694565b176122b2565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461263e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612603565b5060008203612679576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061268f60008483856122dd565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126126dd576126dc6126b8565b5b8235905067ffffffffffffffff8111156126fa576126f96126bd565b5b602083019150836001820283011115612716576127156126c2565b5b9250929050565b60008060208385031215612734576127336126ae565b5b600083013567ffffffffffffffff811115612752576127516126b3565b5b61275e858286016126c7565b92509250509250929050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61279f8161276a565b81146127aa57600080fd5b50565b6000813590506127bc81612796565b92915050565b6000602082840312156127d8576127d76126ae565b5b60006127e6848285016127ad565b91505092915050565b60008115159050919050565b612804816127ef565b82525050565b600060208201905061281f60008301846127fb565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061285082612825565b9050919050565b61286081612845565b811461286b57600080fd5b50565b60008135905061287d81612857565b92915050565b60006bffffffffffffffffffffffff82169050919050565b6128a481612883565b81146128af57600080fd5b50565b6000813590506128c18161289b565b92915050565b600080604083850312156128de576128dd6126ae565b5b60006128ec8582860161286e565b92505060206128fd858286016128b2565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612941578082015181840152602081019050612926565b60008484015250505050565b6000601f19601f8301169050919050565b600061296982612907565b6129738185612912565b9350612983818560208601612923565b61298c8161294d565b840191505092915050565b600060208201905081810360008301526129b1818461295e565b905092915050565b6000819050919050565b6129cc816129b9565b81146129d757600080fd5b50565b6000813590506129e9816129c3565b92915050565b600060208284031215612a0557612a046126ae565b5b6000612a13848285016129da565b91505092915050565b612a2581612845565b82525050565b6000602082019050612a406000830184612a1c565b92915050565b60008060408385031215612a5d57612a5c6126ae565b5b6000612a6b8582860161286e565b9250506020612a7c858286016129da565b9150509250929050565b600060208284031215612a9c57612a9b6126ae565b5b6000612aaa8482850161286e565b91505092915050565b612abc816129b9565b82525050565b6000602082019050612ad76000830184612ab3565b92915050565b600080600060608486031215612af657612af56126ae565b5b6000612b048682870161286e565b9350506020612b158682870161286e565b9250506040612b26868287016129da565b9150509250925092565b60008060408385031215612b4757612b466126ae565b5b6000612b55858286016129da565b9250506020612b66858286016129da565b9150509250929050565b6000604082019050612b856000830185612a1c565b612b926020830184612ab3565b9392505050565b6000819050919050565b6000612bbe612bb9612bb484612825565b612b99565b612825565b9050919050565b6000612bd082612ba3565b9050919050565b6000612be282612bc5565b9050919050565b612bf281612bd7565b82525050565b6000602082019050612c0d6000830184612be9565b92915050565b6000612c1e82612825565b9050919050565b612c2e81612c13565b82525050565b6000602082019050612c496000830184612c25565b92915050565b612c58816127ef565b8114612c6357600080fd5b50565b600081359050612c7581612c4f565b92915050565b60008060408385031215612c9257612c916126ae565b5b6000612ca08582860161286e565b9250506020612cb185828601612c66565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612cf88261294d565b810181811067ffffffffffffffff82111715612d1757612d16612cc0565b5b80604052505050565b6000612d2a6126a4565b9050612d368282612cef565b919050565b600067ffffffffffffffff821115612d5657612d55612cc0565b5b612d5f8261294d565b9050602081019050919050565b82818337600083830152505050565b6000612d8e612d8984612d3b565b612d20565b905082815260208101848484011115612daa57612da9612cbb565b5b612db5848285612d6c565b509392505050565b600082601f830112612dd257612dd16126b8565b5b8135612de2848260208601612d7b565b91505092915050565b60008060008060808587031215612e0557612e046126ae565b5b6000612e138782880161286e565b9450506020612e248782880161286e565b9350506040612e35878288016129da565b925050606085013567ffffffffffffffff811115612e5657612e556126b3565b5b612e6287828801612dbd565b91505092959194509250565b60008060408385031215612e8557612e846126ae565b5b6000612e938582860161286e565b9250506020612ea48582860161286e565b9150509250929050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612f0057607f821691505b602082108103612f1357612f12612eb9565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612f7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612f3e565b612f858683612f3e565b95508019841693508086168417925050509392505050565b6000612fb8612fb3612fae846129b9565b612b99565b6129b9565b9050919050565b6000819050919050565b612fd283612f9d565b612fe6612fde82612fbf565b848454612f4b565b825550505050565b600090565b612ffb612fee565b613006818484612fc9565b505050565b5b8181101561302a5761301f600082612ff3565b60018101905061300c565b5050565b601f82111561306f5761304081612f19565b61304984612f2e565b81016020851015613058578190505b61306c61306485612f2e565b83018261300b565b50505b505050565b600082821c905092915050565b600061309260001984600802613074565b1980831691505092915050565b60006130ab8383613081565b9150826002028217905092915050565b6130c58383612eae565b67ffffffffffffffff8111156130de576130dd612cc0565b5b6130e88254612ee8565b6130f382828561302e565b6000601f8311600181146131225760008415613110578287013590505b61311a858261309f565b865550613182565b601f19841661313086612f19565b60005b8281101561315857848901358255600182019150602085019450602081019050613133565b868310156131755784890135613171601f891682613081565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006131c5826129b9565b91506131d0836129b9565b92508282026131de816129b9565b915082820484148315176131f5576131f461318b565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613236826129b9565b9150613241836129b9565b925082613251576132506131fc565b5b828204905092915050565b600081905092915050565b50565b600061327760008361325c565b915061328282613267565b600082019050919050565b60006132988261326a565b9150819050919050565b7f5769746864726177616c206661696c6564000000000000000000000000000000600082015250565b60006132d8601183612912565b91506132e3826132a2565b602082019050919050565b60006020820190508181036000830152613307816132cb565b9050919050565b7f4d696e74696e67206973206e6f74207374617274656420796574000000000000600082015250565b6000613344601a83612912565b915061334f8261330e565b602082019050919050565b6000602082019050818103600083015261337381613337565b9050919050565b7f596f75206e65656420746f206d696e74206174206c656173742031204e465400600082015250565b60006133b0601f83612912565b91506133bb8261337a565b602082019050919050565b600060208201905081810360008301526133df816133a3565b9050919050565b60006133f1826129b9565b91506133fc836129b9565b92508282019050808211156134145761341361318b565b5b92915050565b7f457863656564206d6178696d756d204e465473207065722077616c6c65740000600082015250565b6000613450601e83612912565b915061345b8261341a565b602082019050919050565b6000602082019050818103600083015261347f81613443565b9050919050565b7f536f6c64204f7574000000000000000000000000000000000000000000000000600082015250565b60006134bc600883612912565b91506134c782613486565b602082019050919050565b600060208201905081810360008301526134eb816134af565b9050919050565b600081905092915050565b6000815461350a81612ee8565b61351481866134f2565b9450600182166000811461352f576001811461354457613577565b60ff1983168652811515820286019350613577565b61354d85612f19565b60005b8381101561356f57815481890152600182019150602081019050613550565b838801955050505b50505092915050565b600061358b82612907565b61359581856134f2565b93506135a5818560208601612923565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006135e76005836134f2565b91506135f2826135b1565b600582019050919050565b600061360982856134fd565b91506136158284613580565b9150613620826135da565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613688602683612912565b91506136938261362c565b604082019050919050565b600060208201905081810360008301526136b78161367b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136f4602083612912565b91506136ff826136be565b602082019050919050565b60006020820190508181036000830152613723816136e7565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000613786602a83612912565b91506137918261372a565b604082019050919050565b600060208201905081810360008301526137b581613779565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006137f2601983612912565b91506137fd826137bc565b602082019050919050565b60006020820190508181036000830152613821816137e5565b9050919050565b600060408201905061383d6000830185612a1c565b61384a6020830184612a1c565b9392505050565b60008151905061386081612c4f565b92915050565b60006020828403121561387c5761387b6126ae565b5b600061388a84828501613851565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006138ba82613893565b6138c4818561389e565b93506138d4818560208601612923565b6138dd8161294d565b840191505092915050565b60006080820190506138fd6000830187612a1c565b61390a6020830186612a1c565b6139176040830185612ab3565b818103606083015261392981846138af565b905095945050505050565b60008151905061394381612796565b92915050565b60006020828403121561395f5761395e6126ae565b5b600061396d84828501613934565b9150509291505056fea2646970667358221220420de6ff97eb547e3b95ada8e950de4eb96fbcf81f20a598c89d2d980c9b9c0464736f6c63430008120033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000004b697066733a2f2f6261667962656961776b78376a77726f74787074616368336732627a78696f356a376d7163666c75736c32706170373666336e736f64716978636d2f7072652e6a736f6e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b697066733a2f2f6261667962656961776b78376a77726f74787074616368336732627a78696f356a376d7163666c75736c32706170373666336e736f64716978636d2f7072652e6a736f6e000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102045760003560e01c806370a082311161011857806395d89b41116100a0578063b88d4fde1161006f578063b88d4fde146106d8578063c87b56dd146106f4578063d5abeb0114610731578063e985e9c51461075c578063f2fde38b1461079957610204565b806395d89b4114610651578063a0712d681461067c578063a22cb46514610698578063aa1b103f146106c157610204565b806385d178f4116100e757806385d178f41461057c5780638da5cb5b146105a75780638f7b9379146105d2578063916b1083146105fd57806395652cfa1461062857610204565b806370a08231146104e6578063715018a6146105235780637a0101a21461053a5780638460f0601461056557610204565b806318160ddd1161019b57806341f434341161016a57806341f434341461040c57806342842e0e14610437578063453c23101461045357806355c7ba141461047e5780636352211e146104a957610204565b806318160ddd1461037057806323b872dd1461039b5780632a55205a146103b75780633ccfd60b146103f557610204565b806306fdde03116101d757806306fdde03146102af578063081812fc146102da578063095ea7b31461031757806311b01a321461033357610204565b8063013eee1f1461020957806301ffc9a71461023257806304634d8d1461026f57806304b4bba914610298575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b919061271d565b6107c2565b005b34801561023e57600080fd5b50610259600480360381019061025491906127c2565b6107e0565b604051610266919061280a565b60405180910390f35b34801561027b57600080fd5b50610296600480360381019061029191906128c7565b610802565b005b3480156102a457600080fd5b506102ad610818565b005b3480156102bb57600080fd5b506102c461083d565b6040516102d19190612997565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc91906129ef565b6108cf565b60405161030e9190612a2b565b60405180910390f35b610331600480360381019061032c9190612a46565b61094e565b005b34801561033f57600080fd5b5061035a60048036038101906103559190612a86565b610967565b6040516103679190612ac2565b60405180910390f35b34801561037c57600080fd5b5061038561097f565b6040516103929190612ac2565b60405180910390f35b6103b560048036038101906103b09190612add565b610996565b005b3480156103c357600080fd5b506103de60048036038101906103d99190612b30565b6109e5565b6040516103ec929190612b70565b60405180910390f35b34801561040157600080fd5b5061040a610bcf565b005b34801561041857600080fd5b50610421610ca8565b60405161042e9190612bf8565b60405180910390f35b610451600480360381019061044c9190612add565b610cba565b005b34801561045f57600080fd5b50610468610cda565b6040516104759190612ac2565b60405180910390f35b34801561048a57600080fd5b50610493610ce0565b6040516104a0919061280a565b60405180910390f35b3480156104b557600080fd5b506104d060048036038101906104cb91906129ef565b610cf3565b6040516104dd9190612a2b565b60405180910390f35b3480156104f257600080fd5b5061050d60048036038101906105089190612a86565b610d05565b60405161051a9190612ac2565b60405180910390f35b34801561052f57600080fd5b50610538610dbd565b005b34801561054657600080fd5b5061054f610dd1565b60405161055c9190612997565b60405180910390f35b34801561057157600080fd5b5061057a610e5f565b005b34801561058857600080fd5b50610591610e84565b60405161059e9190612c34565b60405180910390f35b3480156105b357600080fd5b506105bc610eaa565b6040516105c99190612a2b565b60405180910390f35b3480156105de57600080fd5b506105e7610ed4565b6040516105f49190612997565b60405180910390f35b34801561060957600080fd5b50610612610f62565b60405161061f919061280a565b60405180910390f35b34801561063457600080fd5b5061064f600480360381019061064a919061271d565b610f75565b005b34801561065d57600080fd5b50610666610f93565b6040516106739190612997565b60405180910390f35b610696600480360381019061069191906129ef565b611025565b005b3480156106a457600080fd5b506106bf60048036038101906106ba9190612c7b565b611200565b005b3480156106cd57600080fd5b506106d6611219565b005b6106f260048036038101906106ed9190612deb565b61122b565b005b34801561070057600080fd5b5061071b600480360381019061071691906129ef565b61127c565b6040516107289190612997565b60405180910390f35b34801561073d57600080fd5b506107466113c3565b6040516107539190612ac2565b60405180910390f35b34801561076857600080fd5b50610783600480360381019061077e9190612e6e565b6113c9565b604051610790919061280a565b60405180910390f35b3480156107a557600080fd5b506107c060048036038101906107bb9190612a86565b61145d565b005b6107ca6114e0565b8181600e91826107db9291906130bb565b505050565b60006107eb8261155e565b806107fb57506107fa826115f0565b5b9050919050565b61080a6114e0565b610814828261166a565b5050565b6108206114e0565b6000600c60016101000a81548160ff021916908315150217905550565b60606002805461084c90612ee8565b80601f016020809104026020016040519081016040528092919081815260200182805461087890612ee8565b80156108c55780601f1061089a576101008083540402835291602001916108c5565b820191906000526020600020905b8154815290600101906020018083116108a857829003601f168201915b5050505050905090565b60006108da826117ff565b610910576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b816109588161185e565b610962838361195b565b505050565b60126020528060005260406000206000915090505481565b6000610989611a9f565b6001546000540303905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109d4576109d33361185e565b5b6109df848484611aa8565b50505050565b6000806000600a60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610b7a5760096040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610b84611dca565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610bb091906131ba565b610bba919061322b565b90508160000151819350935050509250929050565b610bd76114e0565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051610c1f9061328d565b60006040518083038185875af1925050503d8060008114610c5c576040519150601f19603f3d011682016040523d82523d6000602084013e610c61565b606091505b5050905080610ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9c906132ee565b60405180910390fd5b50565b6daaeb6d7670e522a718067333cd4e81565b610cd58383836040518060200160405280600081525061122b565b505050565b60105481565b600c60009054906101000a900460ff1681565b6000610cfe82611dd4565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d6c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610dc56114e0565b610dcf6000611ea0565b565b600d8054610dde90612ee8565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0a90612ee8565b8015610e575780601f10610e2c57610100808354040283529160200191610e57565b820191906000526020600020905b815481529060010190602001808311610e3a57829003601f168201915b505050505081565b610e676114e0565b6001600c60006101000a81548160ff021916908315150217905550565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e8054610ee190612ee8565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0d90612ee8565b8015610f5a5780601f10610f2f57610100808354040283529160200191610f5a565b820191906000526020600020905b815481529060010190602001808311610f3d57829003601f168201915b505050505081565b600c60019054906101000a900460ff1681565b610f7d6114e0565b8181600d9182610f8e9291906130bb565b505050565b606060038054610fa290612ee8565b80601f0160208091040260200160405190810160405280929190818152602001828054610fce90612ee8565b801561101b5780601f10610ff05761010080835404028352916020019161101b565b820191906000526020600020905b815481529060010190602001808311610ffe57829003601f168201915b5050505050905090565b600c60009054906101000a900460ff16611074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106b9061335a565b60405180910390fd5b600081116110b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ae906133c6565b60405180910390fd5b60105481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461110591906133e6565b1115611146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113d90613466565b60405180910390fd5b600b548161115261097f565b61115c91906133e6565b111561119d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611194906134d2565b60405180910390fd5b80601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111ec91906133e6565b925050819055506111fd3382611f66565b50565b8161120a8161185e565b6112148383611f84565b505050565b6112216114e0565b61122961208f565b565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611269576112683361185e565b5b611275858585856120dc565b5050505050565b6060611287826117ff565b6112bd576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c60019054906101000a900460ff161561136457600e80546112df90612ee8565b80601f016020809104026020016040519081016040528092919081815260200182805461130b90612ee8565b80156113585780601f1061132d57610100808354040283529160200191611358565b820191906000526020600020905b81548152906001019060200180831161133b57829003601f168201915b505050505090506113be565b6000600d805461137390612ee8565b90500361138f57604051806020016040528060008152506113bb565b600d61139a8361214f565b6040516020016113ab9291906135fd565b6040516020818303038152906040525b90505b919050565b600b5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114656114e0565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cb9061369e565b60405180910390fd5b6114dd81611ea0565b50565b6114e861219f565b73ffffffffffffffffffffffffffffffffffffffff16611506610eaa565b73ffffffffffffffffffffffffffffffffffffffff161461155c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115539061370a565b60405180910390fd5b565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806115b957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806115e95750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806116635750611662826121a7565b5b9050919050565b611672611dca565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156116d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c79061379c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361173f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173690613808565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b60008161180a611a9f565b11158015611819575060005482105b8015611857575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611958576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016118d5929190613828565b602060405180830381865afa1580156118f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119169190613866565b61195757806040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161194e9190612a2b565b60405180910390fd5b5b50565b600061196682610cf3565b90508073ffffffffffffffffffffffffffffffffffffffff16611987612211565b73ffffffffffffffffffffffffffffffffffffffff16146119ea576119b3816119ae612211565b6113c9565b6119e9576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611ab382611dd4565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b1a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611b2684612219565b91509150611b3c8187611b37612211565b612240565b611b8857611b5186611b4c612211565b6113c9565b611b87576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611bee576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bfb8686866001612284565b8015611c0657600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611cd485611cb088888761228a565b7c0200000000000000000000000000000000000000000000000000000000176122b2565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611d5a5760006001850190506000600460008381526020019081526020016000205403611d58576000548114611d57578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611dc286868660016122dd565b505050505050565b6000612710905090565b60008082905080611de3611a9f565b11611e6957600054811015611e685760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611e66575b60008103611e5c576004600083600190039350838152602001908152602001600020549050611e32565b8092505050611e9b565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f808282604051806020016040528060008152506122e3565b5050565b8060076000611f91612211565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661203e612211565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612083919061280a565b60405180910390a35050565b6009600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff02191690555050565b6120e7848484610996565b60008373ffffffffffffffffffffffffffffffffffffffff163b146121495761211284848484612380565b612148576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060a060405101806040526020810391506000825281835b60011561218a57600184039350600a81066030018453600a8104905080612168575b50828103602084039350808452505050919050565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86122a18686846124d0565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6122ed83836124d9565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461237b57600080549050600083820390505b61232d6000868380600101945086612380565b612363576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061231a57816000541461237857600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123a6612211565b8786866040518563ffffffff1660e01b81526004016123c894939291906138e8565b6020604051808303816000875af192505050801561240457506040513d601f19601f820116820180604052508101906124019190613949565b60015b61247d573d8060008114612434576040519150601f19603f3d011682016040523d82523d6000602084013e612439565b606091505b506000815103612475576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60008054905060008203612519576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125266000848385612284565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061259d8361258e600086600061228a565b61259785612694565b176122b2565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461263e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612603565b5060008203612679576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061268f60008483856122dd565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126126dd576126dc6126b8565b5b8235905067ffffffffffffffff8111156126fa576126f96126bd565b5b602083019150836001820283011115612716576127156126c2565b5b9250929050565b60008060208385031215612734576127336126ae565b5b600083013567ffffffffffffffff811115612752576127516126b3565b5b61275e858286016126c7565b92509250509250929050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61279f8161276a565b81146127aa57600080fd5b50565b6000813590506127bc81612796565b92915050565b6000602082840312156127d8576127d76126ae565b5b60006127e6848285016127ad565b91505092915050565b60008115159050919050565b612804816127ef565b82525050565b600060208201905061281f60008301846127fb565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061285082612825565b9050919050565b61286081612845565b811461286b57600080fd5b50565b60008135905061287d81612857565b92915050565b60006bffffffffffffffffffffffff82169050919050565b6128a481612883565b81146128af57600080fd5b50565b6000813590506128c18161289b565b92915050565b600080604083850312156128de576128dd6126ae565b5b60006128ec8582860161286e565b92505060206128fd858286016128b2565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612941578082015181840152602081019050612926565b60008484015250505050565b6000601f19601f8301169050919050565b600061296982612907565b6129738185612912565b9350612983818560208601612923565b61298c8161294d565b840191505092915050565b600060208201905081810360008301526129b1818461295e565b905092915050565b6000819050919050565b6129cc816129b9565b81146129d757600080fd5b50565b6000813590506129e9816129c3565b92915050565b600060208284031215612a0557612a046126ae565b5b6000612a13848285016129da565b91505092915050565b612a2581612845565b82525050565b6000602082019050612a406000830184612a1c565b92915050565b60008060408385031215612a5d57612a5c6126ae565b5b6000612a6b8582860161286e565b9250506020612a7c858286016129da565b9150509250929050565b600060208284031215612a9c57612a9b6126ae565b5b6000612aaa8482850161286e565b91505092915050565b612abc816129b9565b82525050565b6000602082019050612ad76000830184612ab3565b92915050565b600080600060608486031215612af657612af56126ae565b5b6000612b048682870161286e565b9350506020612b158682870161286e565b9250506040612b26868287016129da565b9150509250925092565b60008060408385031215612b4757612b466126ae565b5b6000612b55858286016129da565b9250506020612b66858286016129da565b9150509250929050565b6000604082019050612b856000830185612a1c565b612b926020830184612ab3565b9392505050565b6000819050919050565b6000612bbe612bb9612bb484612825565b612b99565b612825565b9050919050565b6000612bd082612ba3565b9050919050565b6000612be282612bc5565b9050919050565b612bf281612bd7565b82525050565b6000602082019050612c0d6000830184612be9565b92915050565b6000612c1e82612825565b9050919050565b612c2e81612c13565b82525050565b6000602082019050612c496000830184612c25565b92915050565b612c58816127ef565b8114612c6357600080fd5b50565b600081359050612c7581612c4f565b92915050565b60008060408385031215612c9257612c916126ae565b5b6000612ca08582860161286e565b9250506020612cb185828601612c66565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612cf88261294d565b810181811067ffffffffffffffff82111715612d1757612d16612cc0565b5b80604052505050565b6000612d2a6126a4565b9050612d368282612cef565b919050565b600067ffffffffffffffff821115612d5657612d55612cc0565b5b612d5f8261294d565b9050602081019050919050565b82818337600083830152505050565b6000612d8e612d8984612d3b565b612d20565b905082815260208101848484011115612daa57612da9612cbb565b5b612db5848285612d6c565b509392505050565b600082601f830112612dd257612dd16126b8565b5b8135612de2848260208601612d7b565b91505092915050565b60008060008060808587031215612e0557612e046126ae565b5b6000612e138782880161286e565b9450506020612e248782880161286e565b9350506040612e35878288016129da565b925050606085013567ffffffffffffffff811115612e5657612e556126b3565b5b612e6287828801612dbd565b91505092959194509250565b60008060408385031215612e8557612e846126ae565b5b6000612e938582860161286e565b9250506020612ea48582860161286e565b9150509250929050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612f0057607f821691505b602082108103612f1357612f12612eb9565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612f7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612f3e565b612f858683612f3e565b95508019841693508086168417925050509392505050565b6000612fb8612fb3612fae846129b9565b612b99565b6129b9565b9050919050565b6000819050919050565b612fd283612f9d565b612fe6612fde82612fbf565b848454612f4b565b825550505050565b600090565b612ffb612fee565b613006818484612fc9565b505050565b5b8181101561302a5761301f600082612ff3565b60018101905061300c565b5050565b601f82111561306f5761304081612f19565b61304984612f2e565b81016020851015613058578190505b61306c61306485612f2e565b83018261300b565b50505b505050565b600082821c905092915050565b600061309260001984600802613074565b1980831691505092915050565b60006130ab8383613081565b9150826002028217905092915050565b6130c58383612eae565b67ffffffffffffffff8111156130de576130dd612cc0565b5b6130e88254612ee8565b6130f382828561302e565b6000601f8311600181146131225760008415613110578287013590505b61311a858261309f565b865550613182565b601f19841661313086612f19565b60005b8281101561315857848901358255600182019150602085019450602081019050613133565b868310156131755784890135613171601f891682613081565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006131c5826129b9565b91506131d0836129b9565b92508282026131de816129b9565b915082820484148315176131f5576131f461318b565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613236826129b9565b9150613241836129b9565b925082613251576132506131fc565b5b828204905092915050565b600081905092915050565b50565b600061327760008361325c565b915061328282613267565b600082019050919050565b60006132988261326a565b9150819050919050565b7f5769746864726177616c206661696c6564000000000000000000000000000000600082015250565b60006132d8601183612912565b91506132e3826132a2565b602082019050919050565b60006020820190508181036000830152613307816132cb565b9050919050565b7f4d696e74696e67206973206e6f74207374617274656420796574000000000000600082015250565b6000613344601a83612912565b915061334f8261330e565b602082019050919050565b6000602082019050818103600083015261337381613337565b9050919050565b7f596f75206e65656420746f206d696e74206174206c656173742031204e465400600082015250565b60006133b0601f83612912565b91506133bb8261337a565b602082019050919050565b600060208201905081810360008301526133df816133a3565b9050919050565b60006133f1826129b9565b91506133fc836129b9565b92508282019050808211156134145761341361318b565b5b92915050565b7f457863656564206d6178696d756d204e465473207065722077616c6c65740000600082015250565b6000613450601e83612912565b915061345b8261341a565b602082019050919050565b6000602082019050818103600083015261347f81613443565b9050919050565b7f536f6c64204f7574000000000000000000000000000000000000000000000000600082015250565b60006134bc600883612912565b91506134c782613486565b602082019050919050565b600060208201905081810360008301526134eb816134af565b9050919050565b600081905092915050565b6000815461350a81612ee8565b61351481866134f2565b9450600182166000811461352f576001811461354457613577565b60ff1983168652811515820286019350613577565b61354d85612f19565b60005b8381101561356f57815481890152600182019150602081019050613550565b838801955050505b50505092915050565b600061358b82612907565b61359581856134f2565b93506135a5818560208601612923565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006135e76005836134f2565b91506135f2826135b1565b600582019050919050565b600061360982856134fd565b91506136158284613580565b9150613620826135da565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613688602683612912565b91506136938261362c565b604082019050919050565b600060208201905081810360008301526136b78161367b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136f4602083612912565b91506136ff826136be565b602082019050919050565b60006020820190508181036000830152613723816136e7565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000613786602a83612912565b91506137918261372a565b604082019050919050565b600060208201905081810360008301526137b581613779565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006137f2601983612912565b91506137fd826137bc565b602082019050919050565b60006020820190508181036000830152613821816137e5565b9050919050565b600060408201905061383d6000830185612a1c565b61384a6020830184612a1c565b9392505050565b60008151905061386081612c4f565b92915050565b60006020828403121561387c5761387b6126ae565b5b600061388a84828501613851565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006138ba82613893565b6138c4818561389e565b93506138d4818560208601612923565b6138dd8161294d565b840191505092915050565b60006080820190506138fd6000830187612a1c565b61390a6020830186612a1c565b6139176040830185612ab3565b818103606083015261392981846138af565b905095945050505050565b60008151905061394381612796565b92915050565b60006020828403121561395f5761395e6126ae565b5b600061396d84828501613934565b9150509291505056fea2646970667358221220420de6ff97eb547e3b95ada8e950de4eb96fbcf81f20a598c89d2d980c9b9c0464736f6c63430008120033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000004b697066733a2f2f6261667962656961776b78376a77726f74787074616368336732627a78696f356a376d7163666c75736c32706170373666336e736f64716978636d2f7072652e6a736f6e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b697066733a2f2f6261667962656961776b78376a77726f74787074616368336732627a78696f356a376d7163666c75736c32706170373666336e736f64716978636d2f7072652e6a736f6e000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _preRevealUri (string): ipfs://bafybeiawkx7jwrotxptach3g2bzxio5j7mqcflusl2pap76f3nsodqixcm/pre.json
Arg [1] : _baseUri (string): ipfs://bafybeiawkx7jwrotxptach3g2bzxio5j7mqcflusl2pap76f3nsodqixcm/pre.json

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 000000000000000000000000000000000000000000000000000000000000004b
Arg [3] : 697066733a2f2f6261667962656961776b78376a77726f747870746163683367
Arg [4] : 32627a78696f356a376d7163666c75736c32706170373666336e736f64716978
Arg [5] : 636d2f7072652e6a736f6e000000000000000000000000000000000000000000
Arg [6] : 000000000000000000000000000000000000000000000000000000000000004b
Arg [7] : 697066733a2f2f6261667962656961776b78376a77726f747870746163683367
Arg [8] : 32627a78696f356a376d7163666c75736c32706170373666336e736f64716978
Arg [9] : 636d2f7072652e6a736f6e000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

73251:5483:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74178:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76952:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76443:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74406:84;;;;;;;;;;;;;:::i;:::-;;41025:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47516:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75165:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73672:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36776:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75524:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19222:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;74498:176;;;;;;;;;;;;;:::i;:::-;;7774:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54076:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73554:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73370;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42418:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37960:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13905:103;;;;;;;;;;;;;:::i;:::-;;73444:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74307:91;;;;;;;;;;;;;:::i;:::-;;73510:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13257:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73477:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73405:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74049:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41201:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78252:473;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74940:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76595:91;;;;;;;;;;;;;:::i;:::-;;75753:254;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77848:373;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73334:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48465:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14163:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74178:121;13143:13;:11;:13::i;:::-;74278::::1;;74263:12;:28;;;;;;;:::i;:::-;;74178:121:::0;;:::o;76952:411::-;77055:4;77275:38;77301:11;77275:25;:38::i;:::-;:80;;;;77317:38;77343:11;77317:25;:38::i;:::-;77275:80;77268:87;;76952:411;;;:::o;76443:144::-;13143:13;:11;:13::i;:::-;76537:42:::1;76556:8;76566:12;76537:18;:42::i;:::-;76443:144:::0;;:::o;74406:84::-;13143:13;:11;:13::i;:::-;74477:5:::1;74454:20;;:28;;;;;;;;;;;;;;;;;;74406:84::o:0;41025:100::-;41079:13;41112:5;41105:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41025:100;:::o;47516:218::-;47592:7;47617:16;47625:7;47617;:16::i;:::-;47612:64;;47642:34;;;;;;;;;;;;;;47612:64;47696:15;:24;47712:7;47696:24;;;;;;;;;;;:30;;;;;;;;;;;;47689:37;;47516:218;;;:::o;75165:215::-;75314:8;9556:30;9577:8;9556:20;:30::i;:::-;75340:32:::1;75354:8;75364:7;75340:13;:32::i;:::-;75165:215:::0;;;:::o;73672:53::-;;;;;;;;;;;;;;;;;:::o;36776:323::-;36837:7;37065:15;:13;:15::i;:::-;37050:12;;37034:13;;:28;:46;37027:53;;36776:323;:::o;75524:221::-;75678:4;9290:10;9282:18;;:4;:18;;;9278:83;;9317:32;9338:10;9317:20;:32::i;:::-;9278:83;75700:37:::1;75719:4;75725:2;75729:7;75700:18;:37::i;:::-;75524:221:::0;;;;:::o;19222:442::-;19319:7;19328;19348:26;19377:17;:27;19395:8;19377:27;;;;;;;;;;;19348:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19449:1;19421:30;;:7;:16;;;:30;;;19417:92;;19478:19;19468:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19417:92;19521:21;19586:17;:15;:17::i;:::-;19545:58;;19559:7;:23;;;19546:36;;:10;:36;;;;:::i;:::-;19545:58;;;;:::i;:::-;19521:82;;19624:7;:16;;;19642:13;19616:40;;;;;;19222:442;;;;;:::o;74498:176::-;13143:13;:11;:13::i;:::-;74548:12:::1;74565:14;;;;;;;;;;;:19;;74592:21;74565:53;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74547:71;;;74637:7;74629:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;74536:138;74498:176::o:0;7774:143::-;186:42;7774:143;:::o;54076:193::-;54222:39;54239:4;54245:2;54249:7;54222:39;;;;;;;;;;;;:16;:39::i;:::-;54076:193;;;:::o;73554:28::-;;;;:::o;73370:::-;;;;;;;;;;;;;:::o;42418:152::-;42490:7;42533:27;42552:7;42533:18;:27::i;:::-;42510:52;;42418:152;;;:::o;37960:233::-;38032:7;38073:1;38056:19;;:5;:19;;;38052:60;;38084:28;;;;;;;;;;;;;;38052:60;32119:13;38130:18;:25;38149:5;38130:25;;;;;;;;;;;;;;;;:55;38123:62;;37960:233;;;:::o;13905:103::-;13143:13;:11;:13::i;:::-;13970:30:::1;13997:1;13970:18;:30::i;:::-;13905:103::o:0;73444:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;74307:91::-;13143:13;:11;:13::i;:::-;74386:4:::1;74367:16;;:23;;;;;;;;;;;;;;;;;;74307:91::o:0;73510:37::-;;;;;;;;;;;;;:::o;13257:87::-;13303:7;13330:6;;;;;;;;;;;13323:13;;13257:87;:::o;73477:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;73405:32::-;;;;;;;;;;;;;:::o;74049:121::-;13143:13;:11;:13::i;:::-;74149::::1;;74134:12;:28;;;;;;;:::i;:::-;;74049:121:::0;;:::o;41201:104::-;41257:13;41290:7;41283:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41201:104;:::o;78252:473::-;78321:16;;;;;;;;;;;78313:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;78399:1;78387:9;:13;78379:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;78501:12;;78488:9;78455:18;:30;78474:10;78455:30;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;:58;;78447:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;78596:9;;78583;78567:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:38;;78559:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;78665:9;78631:18;:30;78650:10;78631:30;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;78685:32;78695:10;78707:9;78685;:32::i;:::-;78252:473;:::o;74940:217::-;75080:8;9556:30;9577:8;9556:20;:30::i;:::-;75106:43:::1;75130:8;75140;75106:23;:43::i;:::-;74940:217:::0;;;:::o;76595:91::-;13143:13;:11;:13::i;:::-;76655:23:::1;:21;:23::i;:::-;76595:91::o:0;75753:254::-;75930:4;9290:10;9282:18;;:4;:18;;;9278:83;;9317:32;9338:10;9317:20;:32::i;:::-;9278:83;75952:47:::1;75975:4;75981:2;75985:7;75994:4;75952:22;:47::i;:::-;75753:254:::0;;;;;:::o;77848:373::-;77921:13;77952:16;77960:7;77952;:16::i;:::-;77947:59;;77977:29;;;;;;;;;;;;;;77947:59;78022:20;;;;;;;;;;;78019:70;;;78065:12;78058:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78019:70;78138:1;78114:12;78108:26;;;;;:::i;:::-;;;:31;:105;;;;;;;;;;;;;;;;;78166:12;78180:18;78190:7;78180:9;:18::i;:::-;78149:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78108:105;78101:112;;77848:373;;;;:::o;73334:29::-;;;;:::o;48465:164::-;48562:4;48586:18;:25;48605:5;48586:25;;;;;;;;;;;;;;;:35;48612:8;48586:35;;;;;;;;;;;;;;;;;;;;;;;;;48579:42;;48465:164;;;;:::o;14163:201::-;13143:13;:11;:13::i;:::-;14272:1:::1;14252:22;;:8;:22;;::::0;14244:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;14328:28;14347:8;14328:18;:28::i;:::-;14163:201:::0;:::o;13422:132::-;13497:12;:10;:12::i;:::-;13486:23;;:7;:5;:7::i;:::-;:23;;;13478:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13422:132::o;40123:639::-;40208:4;40547:10;40532:25;;:11;:25;;;;:102;;;;40624:10;40609:25;;:11;:25;;;;40532:102;:179;;;;40701:10;40686:25;;:11;:25;;;;40532:179;40512:199;;40123:639;;;:::o;18952:215::-;19054:4;19093:26;19078:41;;;:11;:41;;;;:81;;;;19123:36;19147:11;19123:23;:36::i;:::-;19078:81;19071:88;;18952:215;;;:::o;20314:332::-;20433:17;:15;:17::i;:::-;20417:33;;:12;:33;;;;20409:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;20536:1;20516:22;;:8;:22;;;20508:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;20603:35;;;;;;;;20615:8;20603:35;;;;;;20625:12;20603:35;;;;;20581:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20314:332;;:::o;48887:282::-;48952:4;49008:7;48989:15;:13;:15::i;:::-;:26;;:66;;;;;49042:13;;49032:7;:23;48989:66;:153;;;;;49141:1;32895:8;49093:17;:26;49111:7;49093:26;;;;;;;;;;;;:44;:49;48989:153;48969:173;;48887:282;;;:::o;9699:647::-;9938:1;186:42;9890:45;;;:49;9886:453;;;186:42;10189;;;10240:4;10247:8;10189:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10184:144;;10303:8;10284:28;;;;;;;;;;;:::i;:::-;;;;;;;;10184:144;9886:453;9699:647;:::o;46949:408::-;47038:13;47054:16;47062:7;47054;:16::i;:::-;47038:32;;47110:5;47087:28;;:19;:17;:19::i;:::-;:28;;;47083:175;;47135:44;47152:5;47159:19;:17;:19::i;:::-;47135:16;:44::i;:::-;47130:128;;47207:35;;;;;;;;;;;;;;47130:128;47083:175;47303:2;47270:15;:24;47286:7;47270:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;47341:7;47337:2;47321:28;;47330:5;47321:28;;;;;;;;;;;;47027:330;46949:408;;:::o;77634:93::-;77691:7;77718:1;77711:8;;77634:93;:::o;51155:2825::-;51297:27;51327;51346:7;51327:18;:27::i;:::-;51297:57;;51412:4;51371:45;;51387:19;51371:45;;;51367:86;;51425:28;;;;;;;;;;;;;;51367:86;51467:27;51496:23;51523:35;51550:7;51523:26;:35::i;:::-;51466:92;;;;51658:68;51683:15;51700:4;51706:19;:17;:19::i;:::-;51658:24;:68::i;:::-;51653:180;;51746:43;51763:4;51769:19;:17;:19::i;:::-;51746:16;:43::i;:::-;51741:92;;51798:35;;;;;;;;;;;;;;51741:92;51653:180;51864:1;51850:16;;:2;:16;;;51846:52;;51875:23;;;;;;;;;;;;;;51846:52;51911:43;51933:4;51939:2;51943:7;51952:1;51911:21;:43::i;:::-;52047:15;52044:160;;;52187:1;52166:19;52159:30;52044:160;52584:18;:24;52603:4;52584:24;;;;;;;;;;;;;;;;52582:26;;;;;;;;;;;;52653:18;:22;52672:2;52653:22;;;;;;;;;;;;;;;;52651:24;;;;;;;;;;;52975:146;53012:2;53061:45;53076:4;53082:2;53086:19;53061:14;:45::i;:::-;33175:8;53033:73;52975:18;:146::i;:::-;52946:17;:26;52964:7;52946:26;;;;;;;;;;;:175;;;;53292:1;33175:8;53241:19;:47;:52;53237:627;;53314:19;53346:1;53336:7;:11;53314:33;;53503:1;53469:17;:30;53487:11;53469:30;;;;;;;;;;;;:35;53465:384;;53607:13;;53592:11;:28;53588:242;;53787:19;53754:17;:30;53772:11;53754:30;;;;;;;;;;;:52;;;;53588:242;53465:384;53295:569;53237:627;53911:7;53907:2;53892:27;;53901:4;53892:27;;;;;;;;;;;;53930:42;53951:4;53957:2;53961:7;53970:1;53930:20;:42::i;:::-;51286:2694;;;51155:2825;;;:::o;19946:97::-;20004:6;20030:5;20023:12;;19946:97;:::o;43573:1275::-;43640:7;43660:12;43675:7;43660:22;;43743:4;43724:15;:13;:15::i;:::-;:23;43720:1061;;43777:13;;43770:4;:20;43766:1015;;;43815:14;43832:17;:23;43850:4;43832:23;;;;;;;;;;;;43815:40;;43949:1;32895:8;43921:6;:24;:29;43917:845;;44586:113;44603:1;44593:6;:11;44586:113;;44646:17;:25;44664:6;;;;;;;44646:25;;;;;;;;;;;;44637:34;;44586:113;;;44732:6;44725:13;;;;;;43917:845;43792:989;43766:1015;43720:1061;44809:31;;;;;;;;;;;;;;43573:1275;;;;:::o;14524:191::-;14598:16;14617:6;;;;;;;;;;;14598:25;;14643:8;14634:6;;:17;;;;;;;;;;;;;;;;;;14698:8;14667:40;;14688:8;14667:40;;;;;;;;;;;;14587:128;14524:191;:::o;65027:112::-;65104:27;65114:2;65118:8;65104:27;;;;;;;;;;;;:9;:27::i;:::-;65027:112;;:::o;48074:234::-;48221:8;48169:18;:39;48188:19;:17;:19::i;:::-;48169:39;;;;;;;;;;;;;;;:49;48209:8;48169:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;48281:8;48245:55;;48260:19;:17;:19::i;:::-;48245:55;;;48291:8;48245:55;;;;;;:::i;:::-;;;;;;;;48074:234;;:::o;20722:95::-;20790:19;;20783:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20722:95::o;54867:407::-;55042:31;55055:4;55061:2;55065:7;55042:12;:31::i;:::-;55106:1;55088:2;:14;;;:19;55084:183;;55127:56;55158:4;55164:2;55168:7;55177:5;55127:30;:56::i;:::-;55122:145;;55211:40;;;;;;;;;;;;;;55122:145;55084:183;54867:407;;;;:::o;71402:1745::-;71467:17;71901:4;71894;71888:11;71884:22;71993:1;71987:4;71980:15;72068:4;72065:1;72061:12;72054:19;;72150:1;72145:3;72138:14;72254:3;72493:5;72475:428;72501:1;72475:428;;;72541:1;72536:3;72532:11;72525:18;;72712:2;72706:4;72702:13;72698:2;72694:22;72689:3;72681:36;72806:2;72800:4;72796:13;72788:21;;72873:4;72475:428;72863:25;72475:428;72479:21;72942:3;72937;72933:13;73057:4;73052:3;73048:14;73041:21;;73122:6;73117:3;73110:19;71506:1634;;;71402:1745;;;:::o;11808:98::-;11861:7;11888:10;11881:17;;11808:98;:::o;16504:157::-;16589:4;16628:25;16613:40;;;:11;:40;;;;16606:47;;16504:157;;;:::o;71195:105::-;71255:7;71282:10;71275:17;;71195:105;:::o;50050:485::-;50152:27;50181:23;50222:38;50263:15;:24;50279:7;50263:24;;;;;;;;;;;50222:65;;50440:18;50417:41;;50497:19;50491:26;50472:45;;50402:126;50050:485;;;:::o;49278:659::-;49427:11;49592:16;49585:5;49581:28;49572:37;;49752:16;49741:9;49737:32;49724:45;;49902:15;49891:9;49888:30;49880:5;49869:9;49866:20;49863:56;49853:66;;49278:659;;;;;:::o;55936:159::-;;;;;:::o;70504:311::-;70639:7;70659:16;33299:3;70685:19;:41;;70659:68;;33299:3;70753:31;70764:4;70770:2;70774:9;70753:10;:31::i;:::-;70745:40;;:62;;70738:69;;;70504:311;;;;;:::o;45396:450::-;45476:14;45644:16;45637:5;45633:28;45624:37;;45821:5;45807:11;45782:23;45778:41;45775:52;45768:5;45765:63;45755:73;;45396:450;;;;:::o;56760:158::-;;;;;:::o;64254:689::-;64385:19;64391:2;64395:8;64385:5;:19::i;:::-;64464:1;64446:2;:14;;;:19;64442:483;;64486:11;64500:13;;64486:27;;64532:13;64554:8;64548:3;:14;64532:30;;64581:233;64612:62;64651:1;64655:2;64659:7;;;;;;64668:5;64612:30;:62::i;:::-;64607:167;;64710:40;;;;;;;;;;;;;;64607:167;64809:3;64801:5;:11;64581:233;;64896:3;64879:13;;:20;64875:34;;64901:8;;;64875:34;64467:458;;64442:483;64254:689;;;:::o;57358:716::-;57521:4;57567:2;57542:45;;;57588:19;:17;:19::i;:::-;57609:4;57615:7;57624:5;57542:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;57538:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57842:1;57825:6;:13;:18;57821:235;;57871:40;;;;;;;;;;;;;;57821:235;58014:6;58008:13;57999:6;57995:2;57991:15;57984:38;57538:529;57711:54;;;57701:64;;;:6;:64;;;;57694:71;;;57358:716;;;;;;:::o;70205:147::-;70342:6;70205:147;;;;;:::o;58536:2966::-;58609:20;58632:13;;58609:36;;58672:1;58660:8;:13;58656:44;;58682:18;;;;;;;;;;;;;;58656:44;58713:61;58743:1;58747:2;58751:12;58765:8;58713:21;:61::i;:::-;59257:1;32257:2;59227:1;:26;;59226:32;59214:8;:45;59188:18;:22;59207:2;59188:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;59536:139;59573:2;59627:33;59650:1;59654:2;59658:1;59627:14;:33::i;:::-;59594:30;59615:8;59594:20;:30::i;:::-;:66;59536:18;:139::i;:::-;59502:17;:31;59520:12;59502:31;;;;;;;;;;;:173;;;;59692:16;59723:11;59752:8;59737:12;:23;59723:37;;60273:16;60269:2;60265:25;60253:37;;60645:12;60605:8;60564:1;60502:25;60443:1;60382;60355:335;61016:1;61002:12;60998:20;60956:346;61057:3;61048:7;61045:16;60956:346;;61275:7;61265:8;61262:1;61235:25;61232:1;61229;61224:59;61110:1;61101:7;61097:15;61086:26;;60956:346;;;60960:77;61347:1;61335:8;:13;61331:45;;61357:19;;;;;;;;;;;;;;61331:45;61409:3;61393:13;:19;;;;58962:2462;;61434:60;61463:1;61467:2;61471:12;61485:8;61434:20;:60::i;:::-;58598:2904;58536:2966;;:::o;45948:324::-;46018:14;46251:1;46241:8;46238:15;46212:24;46208:46;46198:56;;45948:324;;;:::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:117;443:1;440;433:12;457:117;566:1;563;556:12;580:117;689:1;686;679:12;717:553;775:8;785:6;835:3;828:4;820:6;816:17;812:27;802:122;;843:79;;:::i;:::-;802:122;956:6;943:20;933:30;;986:18;978:6;975:30;972:117;;;1008:79;;:::i;:::-;972:117;1122:4;1114:6;1110:17;1098:29;;1176:3;1168:4;1160:6;1156:17;1146:8;1142:32;1139:41;1136:128;;;1183:79;;:::i;:::-;1136:128;717:553;;;;;:::o;1276:529::-;1347:6;1355;1404:2;1392:9;1383:7;1379:23;1375:32;1372:119;;;1410:79;;:::i;:::-;1372:119;1558:1;1547:9;1543:17;1530:31;1588:18;1580:6;1577:30;1574:117;;;1610:79;;:::i;:::-;1574:117;1723:65;1780:7;1771:6;1760:9;1756:22;1723:65;:::i;:::-;1705:83;;;;1501:297;1276:529;;;;;:::o;1811:149::-;1847:7;1887:66;1880:5;1876:78;1865:89;;1811:149;;;:::o;1966:120::-;2038:23;2055:5;2038:23;:::i;:::-;2031:5;2028:34;2018:62;;2076:1;2073;2066:12;2018:62;1966:120;:::o;2092:137::-;2137:5;2175:6;2162:20;2153:29;;2191:32;2217:5;2191:32;:::i;:::-;2092:137;;;;:::o;2235:327::-;2293:6;2342:2;2330:9;2321:7;2317:23;2313:32;2310:119;;;2348:79;;:::i;:::-;2310:119;2468:1;2493:52;2537:7;2528:6;2517:9;2513:22;2493:52;:::i;:::-;2483:62;;2439:116;2235:327;;;;:::o;2568:90::-;2602:7;2645:5;2638:13;2631:21;2620:32;;2568:90;;;:::o;2664:109::-;2745:21;2760:5;2745:21;:::i;:::-;2740:3;2733:34;2664:109;;:::o;2779:210::-;2866:4;2904:2;2893:9;2889:18;2881:26;;2917:65;2979:1;2968:9;2964:17;2955:6;2917:65;:::i;:::-;2779:210;;;;:::o;2995:126::-;3032:7;3072:42;3065:5;3061:54;3050:65;;2995:126;;;:::o;3127:96::-;3164:7;3193:24;3211:5;3193:24;:::i;:::-;3182:35;;3127:96;;;:::o;3229:122::-;3302:24;3320:5;3302:24;:::i;:::-;3295:5;3292:35;3282:63;;3341:1;3338;3331:12;3282:63;3229:122;:::o;3357:139::-;3403:5;3441:6;3428:20;3419:29;;3457:33;3484:5;3457:33;:::i;:::-;3357:139;;;;:::o;3502:109::-;3538:7;3578:26;3571:5;3567:38;3556:49;;3502:109;;;:::o;3617:120::-;3689:23;3706:5;3689:23;:::i;:::-;3682:5;3679:34;3669:62;;3727:1;3724;3717:12;3669:62;3617:120;:::o;3743:137::-;3788:5;3826:6;3813:20;3804:29;;3842:32;3868:5;3842:32;:::i;:::-;3743:137;;;;:::o;3886:472::-;3953:6;3961;4010:2;3998:9;3989:7;3985:23;3981:32;3978:119;;;4016:79;;:::i;:::-;3978:119;4136:1;4161:53;4206:7;4197:6;4186:9;4182:22;4161:53;:::i;:::-;4151:63;;4107:117;4263:2;4289:52;4333:7;4324:6;4313:9;4309:22;4289:52;:::i;:::-;4279:62;;4234:117;3886:472;;;;;:::o;4364:99::-;4416:6;4450:5;4444:12;4434:22;;4364:99;;;:::o;4469:169::-;4553:11;4587:6;4582:3;4575:19;4627:4;4622:3;4618:14;4603:29;;4469:169;;;;:::o;4644:246::-;4725:1;4735:113;4749:6;4746:1;4743:13;4735:113;;;4834:1;4829:3;4825:11;4819:18;4815:1;4810:3;4806:11;4799:39;4771:2;4768:1;4764:10;4759:15;;4735:113;;;4882:1;4873:6;4868:3;4864:16;4857:27;4706:184;4644:246;;;:::o;4896:102::-;4937:6;4988:2;4984:7;4979:2;4972:5;4968:14;4964:28;4954:38;;4896:102;;;:::o;5004:377::-;5092:3;5120:39;5153:5;5120:39;:::i;:::-;5175:71;5239:6;5234:3;5175:71;:::i;:::-;5168:78;;5255:65;5313:6;5308:3;5301:4;5294:5;5290:16;5255:65;:::i;:::-;5345:29;5367:6;5345:29;:::i;:::-;5340:3;5336:39;5329:46;;5096:285;5004:377;;;;:::o;5387:313::-;5500:4;5538:2;5527:9;5523:18;5515:26;;5587:9;5581:4;5577:20;5573:1;5562:9;5558:17;5551:47;5615:78;5688:4;5679:6;5615:78;:::i;:::-;5607:86;;5387:313;;;;:::o;5706:77::-;5743:7;5772:5;5761:16;;5706:77;;;:::o;5789:122::-;5862:24;5880:5;5862:24;:::i;:::-;5855:5;5852:35;5842:63;;5901:1;5898;5891:12;5842:63;5789:122;:::o;5917:139::-;5963:5;6001:6;5988:20;5979:29;;6017:33;6044:5;6017:33;:::i;:::-;5917:139;;;;:::o;6062:329::-;6121:6;6170:2;6158:9;6149:7;6145:23;6141:32;6138:119;;;6176:79;;:::i;:::-;6138:119;6296:1;6321:53;6366:7;6357:6;6346:9;6342:22;6321:53;:::i;:::-;6311:63;;6267:117;6062:329;;;;:::o;6397:118::-;6484:24;6502:5;6484:24;:::i;:::-;6479:3;6472:37;6397:118;;:::o;6521:222::-;6614:4;6652:2;6641:9;6637:18;6629:26;;6665:71;6733:1;6722:9;6718:17;6709:6;6665:71;:::i;:::-;6521:222;;;;:::o;6749:474::-;6817:6;6825;6874:2;6862:9;6853:7;6849:23;6845:32;6842:119;;;6880:79;;:::i;:::-;6842:119;7000:1;7025:53;7070:7;7061:6;7050:9;7046:22;7025:53;:::i;:::-;7015:63;;6971:117;7127:2;7153:53;7198:7;7189:6;7178:9;7174:22;7153:53;:::i;:::-;7143:63;;7098:118;6749:474;;;;;:::o;7229:329::-;7288:6;7337:2;7325:9;7316:7;7312:23;7308:32;7305:119;;;7343:79;;:::i;:::-;7305:119;7463:1;7488:53;7533:7;7524:6;7513:9;7509:22;7488:53;:::i;:::-;7478:63;;7434:117;7229:329;;;;:::o;7564:118::-;7651:24;7669:5;7651:24;:::i;:::-;7646:3;7639:37;7564:118;;:::o;7688:222::-;7781:4;7819:2;7808:9;7804:18;7796:26;;7832:71;7900:1;7889:9;7885:17;7876:6;7832:71;:::i;:::-;7688:222;;;;:::o;7916:619::-;7993:6;8001;8009;8058:2;8046:9;8037:7;8033:23;8029:32;8026:119;;;8064:79;;:::i;:::-;8026:119;8184:1;8209:53;8254:7;8245:6;8234:9;8230:22;8209:53;:::i;:::-;8199:63;;8155:117;8311:2;8337:53;8382:7;8373:6;8362:9;8358:22;8337:53;:::i;:::-;8327:63;;8282:118;8439:2;8465:53;8510:7;8501:6;8490:9;8486:22;8465:53;:::i;:::-;8455:63;;8410:118;7916:619;;;;;:::o;8541:474::-;8609:6;8617;8666:2;8654:9;8645:7;8641:23;8637:32;8634:119;;;8672:79;;:::i;:::-;8634:119;8792:1;8817:53;8862:7;8853:6;8842:9;8838:22;8817:53;:::i;:::-;8807:63;;8763:117;8919:2;8945:53;8990:7;8981:6;8970:9;8966:22;8945:53;:::i;:::-;8935:63;;8890:118;8541:474;;;;;:::o;9021:332::-;9142:4;9180:2;9169:9;9165:18;9157:26;;9193:71;9261:1;9250:9;9246:17;9237:6;9193:71;:::i;:::-;9274:72;9342:2;9331:9;9327:18;9318:6;9274:72;:::i;:::-;9021:332;;;;;:::o;9359:60::-;9387:3;9408:5;9401:12;;9359:60;;;:::o;9425:142::-;9475:9;9508:53;9526:34;9535:24;9553:5;9535:24;:::i;:::-;9526:34;:::i;:::-;9508:53;:::i;:::-;9495:66;;9425:142;;;:::o;9573:126::-;9623:9;9656:37;9687:5;9656:37;:::i;:::-;9643:50;;9573:126;;;:::o;9705:157::-;9786:9;9819:37;9850:5;9819:37;:::i;:::-;9806:50;;9705:157;;;:::o;9868:193::-;9986:68;10048:5;9986:68;:::i;:::-;9981:3;9974:81;9868:193;;:::o;10067:284::-;10191:4;10229:2;10218:9;10214:18;10206:26;;10242:102;10341:1;10330:9;10326:17;10317:6;10242:102;:::i;:::-;10067:284;;;;:::o;10357:104::-;10402:7;10431:24;10449:5;10431:24;:::i;:::-;10420:35;;10357:104;;;:::o;10467:142::-;10570:32;10596:5;10570:32;:::i;:::-;10565:3;10558:45;10467:142;;:::o;10615:254::-;10724:4;10762:2;10751:9;10747:18;10739:26;;10775:87;10859:1;10848:9;10844:17;10835:6;10775:87;:::i;:::-;10615:254;;;;:::o;10875:116::-;10945:21;10960:5;10945:21;:::i;:::-;10938:5;10935:32;10925:60;;10981:1;10978;10971:12;10925:60;10875:116;:::o;10997:133::-;11040:5;11078:6;11065:20;11056:29;;11094:30;11118:5;11094:30;:::i;:::-;10997:133;;;;:::o;11136:468::-;11201:6;11209;11258:2;11246:9;11237:7;11233:23;11229:32;11226:119;;;11264:79;;:::i;:::-;11226:119;11384:1;11409:53;11454:7;11445:6;11434:9;11430:22;11409:53;:::i;:::-;11399:63;;11355:117;11511:2;11537:50;11579:7;11570:6;11559:9;11555:22;11537:50;:::i;:::-;11527:60;;11482:115;11136:468;;;;;:::o;11610:117::-;11719:1;11716;11709:12;11733:180;11781:77;11778:1;11771:88;11878:4;11875:1;11868:15;11902:4;11899:1;11892:15;11919:281;12002:27;12024:4;12002:27;:::i;:::-;11994:6;11990:40;12132:6;12120:10;12117:22;12096:18;12084:10;12081:34;12078:62;12075:88;;;12143:18;;:::i;:::-;12075:88;12183:10;12179:2;12172:22;11962:238;11919:281;;:::o;12206:129::-;12240:6;12267:20;;:::i;:::-;12257:30;;12296:33;12324:4;12316:6;12296:33;:::i;:::-;12206:129;;;:::o;12341:307::-;12402:4;12492:18;12484:6;12481:30;12478:56;;;12514:18;;:::i;:::-;12478:56;12552:29;12574:6;12552:29;:::i;:::-;12544:37;;12636:4;12630;12626:15;12618:23;;12341:307;;;:::o;12654:146::-;12751:6;12746:3;12741;12728:30;12792:1;12783:6;12778:3;12774:16;12767:27;12654:146;;;:::o;12806:423::-;12883:5;12908:65;12924:48;12965:6;12924:48;:::i;:::-;12908:65;:::i;:::-;12899:74;;12996:6;12989:5;12982:21;13034:4;13027:5;13023:16;13072:3;13063:6;13058:3;13054:16;13051:25;13048:112;;;13079:79;;:::i;:::-;13048:112;13169:54;13216:6;13211:3;13206;13169:54;:::i;:::-;12889:340;12806:423;;;;;:::o;13248:338::-;13303:5;13352:3;13345:4;13337:6;13333:17;13329:27;13319:122;;13360:79;;:::i;:::-;13319:122;13477:6;13464:20;13502:78;13576:3;13568:6;13561:4;13553:6;13549:17;13502:78;:::i;:::-;13493:87;;13309:277;13248:338;;;;:::o;13592:943::-;13687:6;13695;13703;13711;13760:3;13748:9;13739:7;13735:23;13731:33;13728:120;;;13767:79;;:::i;:::-;13728:120;13887:1;13912:53;13957:7;13948:6;13937:9;13933:22;13912:53;:::i;:::-;13902:63;;13858:117;14014:2;14040:53;14085:7;14076:6;14065:9;14061:22;14040:53;:::i;:::-;14030:63;;13985:118;14142:2;14168:53;14213:7;14204:6;14193:9;14189:22;14168:53;:::i;:::-;14158:63;;14113:118;14298:2;14287:9;14283:18;14270:32;14329:18;14321:6;14318:30;14315:117;;;14351:79;;:::i;:::-;14315:117;14456:62;14510:7;14501:6;14490:9;14486:22;14456:62;:::i;:::-;14446:72;;14241:287;13592:943;;;;;;;:::o;14541:474::-;14609:6;14617;14666:2;14654:9;14645:7;14641:23;14637:32;14634:119;;;14672:79;;:::i;:::-;14634:119;14792:1;14817:53;14862:7;14853:6;14842:9;14838:22;14817:53;:::i;:::-;14807:63;;14763:117;14919:2;14945:53;14990:7;14981:6;14970:9;14966:22;14945:53;:::i;:::-;14935:63;;14890:118;14541:474;;;;;:::o;15021:97::-;15080:6;15108:3;15098:13;;15021:97;;;;:::o;15124:180::-;15172:77;15169:1;15162:88;15269:4;15266:1;15259:15;15293:4;15290:1;15283:15;15310:320;15354:6;15391:1;15385:4;15381:12;15371:22;;15438:1;15432:4;15428:12;15459:18;15449:81;;15515:4;15507:6;15503:17;15493:27;;15449:81;15577:2;15569:6;15566:14;15546:18;15543:38;15540:84;;15596:18;;:::i;:::-;15540:84;15361:269;15310:320;;;:::o;15636:141::-;15685:4;15708:3;15700:11;;15731:3;15728:1;15721:14;15765:4;15762:1;15752:18;15744:26;;15636:141;;;:::o;15783:93::-;15820:6;15867:2;15862;15855:5;15851:14;15847:23;15837:33;;15783:93;;;:::o;15882:107::-;15926:8;15976:5;15970:4;15966:16;15945:37;;15882:107;;;;:::o;15995:393::-;16064:6;16114:1;16102:10;16098:18;16137:97;16167:66;16156:9;16137:97;:::i;:::-;16255:39;16285:8;16274:9;16255:39;:::i;:::-;16243:51;;16327:4;16323:9;16316:5;16312:21;16303:30;;16376:4;16366:8;16362:19;16355:5;16352:30;16342:40;;16071:317;;15995:393;;;;;:::o;16394:142::-;16444:9;16477:53;16495:34;16504:24;16522:5;16504:24;:::i;:::-;16495:34;:::i;:::-;16477:53;:::i;:::-;16464:66;;16394:142;;;:::o;16542:75::-;16585:3;16606:5;16599:12;;16542:75;;;:::o;16623:269::-;16733:39;16764:7;16733:39;:::i;:::-;16794:91;16843:41;16867:16;16843:41;:::i;:::-;16835:6;16828:4;16822:11;16794:91;:::i;:::-;16788:4;16781:105;16699:193;16623:269;;;:::o;16898:73::-;16943:3;16898:73;:::o;16977:189::-;17054:32;;:::i;:::-;17095:65;17153:6;17145;17139:4;17095:65;:::i;:::-;17030:136;16977:189;;:::o;17172:186::-;17232:120;17249:3;17242:5;17239:14;17232:120;;;17303:39;17340:1;17333:5;17303:39;:::i;:::-;17276:1;17269:5;17265:13;17256:22;;17232:120;;;17172:186;;:::o;17364:543::-;17465:2;17460:3;17457:11;17454:446;;;17499:38;17531:5;17499:38;:::i;:::-;17583:29;17601:10;17583:29;:::i;:::-;17573:8;17569:44;17766:2;17754:10;17751:18;17748:49;;;17787:8;17772:23;;17748:49;17810:80;17866:22;17884:3;17866:22;:::i;:::-;17856:8;17852:37;17839:11;17810:80;:::i;:::-;17469:431;;17454:446;17364:543;;;:::o;17913:117::-;17967:8;18017:5;18011:4;18007:16;17986:37;;17913:117;;;;:::o;18036:169::-;18080:6;18113:51;18161:1;18157:6;18149:5;18146:1;18142:13;18113:51;:::i;:::-;18109:56;18194:4;18188;18184:15;18174:25;;18087:118;18036:169;;;;:::o;18210:295::-;18286:4;18432:29;18457:3;18451:4;18432:29;:::i;:::-;18424:37;;18494:3;18491:1;18487:11;18481:4;18478:21;18470:29;;18210:295;;;;:::o;18510:1403::-;18634:44;18674:3;18669;18634:44;:::i;:::-;18743:18;18735:6;18732:30;18729:56;;;18765:18;;:::i;:::-;18729:56;18809:38;18841:4;18835:11;18809:38;:::i;:::-;18894:67;18954:6;18946;18940:4;18894:67;:::i;:::-;18988:1;19017:2;19009:6;19006:14;19034:1;19029:632;;;;19705:1;19722:6;19719:84;;;19778:9;19773:3;19769:19;19756:33;19747:42;;19719:84;19829:67;19889:6;19882:5;19829:67;:::i;:::-;19823:4;19816:81;19678:229;18999:908;;19029:632;19081:4;19077:9;19069:6;19065:22;19115:37;19147:4;19115:37;:::i;:::-;19174:1;19188:215;19202:7;19199:1;19196:14;19188:215;;;19288:9;19283:3;19279:19;19266:33;19258:6;19251:49;19339:1;19331:6;19327:14;19317:24;;19386:2;19375:9;19371:18;19358:31;;19225:4;19222:1;19218:12;19213:17;;19188:215;;;19431:6;19422:7;19419:19;19416:186;;;19496:9;19491:3;19487:19;19474:33;19539:48;19581:4;19573:6;19569:17;19558:9;19539:48;:::i;:::-;19531:6;19524:64;19439:163;19416:186;19648:1;19644;19636:6;19632:14;19628:22;19622:4;19615:36;19036:625;;;18999:908;;18609:1304;;;18510:1403;;;:::o;19919:180::-;19967:77;19964:1;19957:88;20064:4;20061:1;20054:15;20088:4;20085:1;20078:15;20105:410;20145:7;20168:20;20186:1;20168:20;:::i;:::-;20163:25;;20202:20;20220:1;20202:20;:::i;:::-;20197:25;;20257:1;20254;20250:9;20279:30;20297:11;20279:30;:::i;:::-;20268:41;;20458:1;20449:7;20445:15;20442:1;20439:22;20419:1;20412:9;20392:83;20369:139;;20488:18;;:::i;:::-;20369:139;20153:362;20105:410;;;;:::o;20521:180::-;20569:77;20566:1;20559:88;20666:4;20663:1;20656:15;20690:4;20687:1;20680:15;20707:185;20747:1;20764:20;20782:1;20764:20;:::i;:::-;20759:25;;20798:20;20816:1;20798:20;:::i;:::-;20793:25;;20837:1;20827:35;;20842:18;;:::i;:::-;20827:35;20884:1;20881;20877:9;20872:14;;20707:185;;;;:::o;20898:147::-;20999:11;21036:3;21021:18;;20898:147;;;;:::o;21051:114::-;;:::o;21171:398::-;21330:3;21351:83;21432:1;21427:3;21351:83;:::i;:::-;21344:90;;21443:93;21532:3;21443:93;:::i;:::-;21561:1;21556:3;21552:11;21545:18;;21171:398;;;:::o;21575:379::-;21759:3;21781:147;21924:3;21781:147;:::i;:::-;21774:154;;21945:3;21938:10;;21575:379;;;:::o;21960:167::-;22100:19;22096:1;22088:6;22084:14;22077:43;21960:167;:::o;22133:366::-;22275:3;22296:67;22360:2;22355:3;22296:67;:::i;:::-;22289:74;;22372:93;22461:3;22372:93;:::i;:::-;22490:2;22485:3;22481:12;22474:19;;22133:366;;;:::o;22505:419::-;22671:4;22709:2;22698:9;22694:18;22686:26;;22758:9;22752:4;22748:20;22744:1;22733:9;22729:17;22722:47;22786:131;22912:4;22786:131;:::i;:::-;22778:139;;22505:419;;;:::o;22930:176::-;23070:28;23066:1;23058:6;23054:14;23047:52;22930:176;:::o;23112:366::-;23254:3;23275:67;23339:2;23334:3;23275:67;:::i;:::-;23268:74;;23351:93;23440:3;23351:93;:::i;:::-;23469:2;23464:3;23460:12;23453:19;;23112:366;;;:::o;23484:419::-;23650:4;23688:2;23677:9;23673:18;23665:26;;23737:9;23731:4;23727:20;23723:1;23712:9;23708:17;23701:47;23765:131;23891:4;23765:131;:::i;:::-;23757:139;;23484:419;;;:::o;23909:181::-;24049:33;24045:1;24037:6;24033:14;24026:57;23909:181;:::o;24096:366::-;24238:3;24259:67;24323:2;24318:3;24259:67;:::i;:::-;24252:74;;24335:93;24424:3;24335:93;:::i;:::-;24453:2;24448:3;24444:12;24437:19;;24096:366;;;:::o;24468:419::-;24634:4;24672:2;24661:9;24657:18;24649:26;;24721:9;24715:4;24711:20;24707:1;24696:9;24692:17;24685:47;24749:131;24875:4;24749:131;:::i;:::-;24741:139;;24468:419;;;:::o;24893:191::-;24933:3;24952:20;24970:1;24952:20;:::i;:::-;24947:25;;24986:20;25004:1;24986:20;:::i;:::-;24981:25;;25029:1;25026;25022:9;25015:16;;25050:3;25047:1;25044:10;25041:36;;;25057:18;;:::i;:::-;25041:36;24893:191;;;;:::o;25090:180::-;25230:32;25226:1;25218:6;25214:14;25207:56;25090:180;:::o;25276:366::-;25418:3;25439:67;25503:2;25498:3;25439:67;:::i;:::-;25432:74;;25515:93;25604:3;25515:93;:::i;:::-;25633:2;25628:3;25624:12;25617:19;;25276:366;;;:::o;25648:419::-;25814:4;25852:2;25841:9;25837:18;25829:26;;25901:9;25895:4;25891:20;25887:1;25876:9;25872:17;25865:47;25929:131;26055:4;25929:131;:::i;:::-;25921:139;;25648:419;;;:::o;26073:158::-;26213:10;26209:1;26201:6;26197:14;26190:34;26073:158;:::o;26237:365::-;26379:3;26400:66;26464:1;26459:3;26400:66;:::i;:::-;26393:73;;26475:93;26564:3;26475:93;:::i;:::-;26593:2;26588:3;26584:12;26577:19;;26237:365;;;:::o;26608:419::-;26774:4;26812:2;26801:9;26797:18;26789:26;;26861:9;26855:4;26851:20;26847:1;26836:9;26832:17;26825:47;26889:131;27015:4;26889:131;:::i;:::-;26881:139;;26608:419;;;:::o;27033:148::-;27135:11;27172:3;27157:18;;27033:148;;;;:::o;27211:874::-;27314:3;27351:5;27345:12;27380:36;27406:9;27380:36;:::i;:::-;27432:89;27514:6;27509:3;27432:89;:::i;:::-;27425:96;;27552:1;27541:9;27537:17;27568:1;27563:166;;;;27743:1;27738:341;;;;27530:549;;27563:166;27647:4;27643:9;27632;27628:25;27623:3;27616:38;27709:6;27702:14;27695:22;27687:6;27683:35;27678:3;27674:45;27667:52;;27563:166;;27738:341;27805:38;27837:5;27805:38;:::i;:::-;27865:1;27879:154;27893:6;27890:1;27887:13;27879:154;;;27967:7;27961:14;27957:1;27952:3;27948:11;27941:35;28017:1;28008:7;28004:15;27993:26;;27915:4;27912:1;27908:12;27903:17;;27879:154;;;28062:6;28057:3;28053:16;28046:23;;27745:334;;27530:549;;27318:767;;27211:874;;;;:::o;28091:390::-;28197:3;28225:39;28258:5;28225:39;:::i;:::-;28280:89;28362:6;28357:3;28280:89;:::i;:::-;28273:96;;28378:65;28436:6;28431:3;28424:4;28417:5;28413:16;28378:65;:::i;:::-;28468:6;28463:3;28459:16;28452:23;;28201:280;28091:390;;;;:::o;28487:155::-;28627:7;28623:1;28615:6;28611:14;28604:31;28487:155;:::o;28648:400::-;28808:3;28829:84;28911:1;28906:3;28829:84;:::i;:::-;28822:91;;28922:93;29011:3;28922:93;:::i;:::-;29040:1;29035:3;29031:11;29024:18;;28648:400;;;:::o;29054:695::-;29332:3;29354:92;29442:3;29433:6;29354:92;:::i;:::-;29347:99;;29463:95;29554:3;29545:6;29463:95;:::i;:::-;29456:102;;29575:148;29719:3;29575:148;:::i;:::-;29568:155;;29740:3;29733:10;;29054:695;;;;;:::o;29755:225::-;29895:34;29891:1;29883:6;29879:14;29872:58;29964:8;29959:2;29951:6;29947:15;29940:33;29755:225;:::o;29986:366::-;30128:3;30149:67;30213:2;30208:3;30149:67;:::i;:::-;30142:74;;30225:93;30314:3;30225:93;:::i;:::-;30343:2;30338:3;30334:12;30327:19;;29986:366;;;:::o;30358:419::-;30524:4;30562:2;30551:9;30547:18;30539:26;;30611:9;30605:4;30601:20;30597:1;30586:9;30582:17;30575:47;30639:131;30765:4;30639:131;:::i;:::-;30631:139;;30358:419;;;:::o;30783:182::-;30923:34;30919:1;30911:6;30907:14;30900:58;30783:182;:::o;30971:366::-;31113:3;31134:67;31198:2;31193:3;31134:67;:::i;:::-;31127:74;;31210:93;31299:3;31210:93;:::i;:::-;31328:2;31323:3;31319:12;31312:19;;30971:366;;;:::o;31343:419::-;31509:4;31547:2;31536:9;31532:18;31524:26;;31596:9;31590:4;31586:20;31582:1;31571:9;31567:17;31560:47;31624:131;31750:4;31624:131;:::i;:::-;31616:139;;31343:419;;;:::o;31768:229::-;31908:34;31904:1;31896:6;31892:14;31885:58;31977:12;31972:2;31964:6;31960:15;31953:37;31768:229;:::o;32003:366::-;32145:3;32166:67;32230:2;32225:3;32166:67;:::i;:::-;32159:74;;32242:93;32331:3;32242:93;:::i;:::-;32360:2;32355:3;32351:12;32344:19;;32003:366;;;:::o;32375:419::-;32541:4;32579:2;32568:9;32564:18;32556:26;;32628:9;32622:4;32618:20;32614:1;32603:9;32599:17;32592:47;32656:131;32782:4;32656:131;:::i;:::-;32648:139;;32375:419;;;:::o;32800:175::-;32940:27;32936:1;32928:6;32924:14;32917:51;32800:175;:::o;32981:366::-;33123:3;33144:67;33208:2;33203:3;33144:67;:::i;:::-;33137:74;;33220:93;33309:3;33220:93;:::i;:::-;33338:2;33333:3;33329:12;33322:19;;32981:366;;;:::o;33353:419::-;33519:4;33557:2;33546:9;33542:18;33534:26;;33606:9;33600:4;33596:20;33592:1;33581:9;33577:17;33570:47;33634:131;33760:4;33634:131;:::i;:::-;33626:139;;33353:419;;;:::o;33778:332::-;33899:4;33937:2;33926:9;33922:18;33914:26;;33950:71;34018:1;34007:9;34003:17;33994:6;33950:71;:::i;:::-;34031:72;34099:2;34088:9;34084:18;34075:6;34031:72;:::i;:::-;33778:332;;;;;:::o;34116:137::-;34170:5;34201:6;34195:13;34186:22;;34217:30;34241:5;34217:30;:::i;:::-;34116:137;;;;:::o;34259:345::-;34326:6;34375:2;34363:9;34354:7;34350:23;34346:32;34343:119;;;34381:79;;:::i;:::-;34343:119;34501:1;34526:61;34579:7;34570:6;34559:9;34555:22;34526:61;:::i;:::-;34516:71;;34472:125;34259:345;;;;:::o;34610:98::-;34661:6;34695:5;34689:12;34679:22;;34610:98;;;:::o;34714:168::-;34797:11;34831:6;34826:3;34819:19;34871:4;34866:3;34862:14;34847:29;;34714:168;;;;:::o;34888:373::-;34974:3;35002:38;35034:5;35002:38;:::i;:::-;35056:70;35119:6;35114:3;35056:70;:::i;:::-;35049:77;;35135:65;35193:6;35188:3;35181:4;35174:5;35170:16;35135:65;:::i;:::-;35225:29;35247:6;35225:29;:::i;:::-;35220:3;35216:39;35209:46;;34978:283;34888:373;;;;:::o;35267:640::-;35462:4;35500:3;35489:9;35485:19;35477:27;;35514:71;35582:1;35571:9;35567:17;35558:6;35514:71;:::i;:::-;35595:72;35663:2;35652:9;35648:18;35639:6;35595:72;:::i;:::-;35677;35745:2;35734:9;35730:18;35721:6;35677:72;:::i;:::-;35796:9;35790:4;35786:20;35781:2;35770:9;35766:18;35759:48;35824:76;35895:4;35886:6;35824:76;:::i;:::-;35816:84;;35267:640;;;;;;;:::o;35913:141::-;35969:5;36000:6;35994:13;35985:22;;36016:32;36042:5;36016:32;:::i;:::-;35913:141;;;;:::o;36060:349::-;36129:6;36178:2;36166:9;36157:7;36153:23;36149:32;36146:119;;;36184:79;;:::i;:::-;36146:119;36304:1;36329:63;36384:7;36375:6;36364:9;36360:22;36329:63;:::i;:::-;36319:73;;36275:127;36060:349;;;;:::o

Swarm Source

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