ETH Price: $3,122.64 (+0.79%)
Gas: 6 Gwei

Token

AA1 Spaceship (AA1)
 

Overview

Max Total Supply

6,000 AA1

Holders

786

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
8 AA1
0xe092Aa8C13F3b84fc0Fa6f12a48F76f00ee1622d
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:
AA1Spaceship

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-26
*/

// SPDX-License-Identifier: MIT

// File: IOperatorFilterRegistry.sol

pragma solidity ^0.8.13;

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

// File: 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.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

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

    modifier onlyAllowedOperator(address from) virtual {
        // 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);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    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) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

// File: DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


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

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

// File: MerkleProof.sol

// contracts/MerkleProofVerify.sol

// based upon https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.0.1/contracts/mocks/MerkleProofWrapper.sol

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle trees (hash trees),
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(bytes32[] calldata proof, bytes32 leaf, bytes32 root) internal pure returns (bool) {
        bytes32 computedHash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}


/*

pragma solidity ^0.8.0;



contract MerkleProofVerify {
    function verify(bytes32[] calldata proof, bytes32 root)
        public
        view
        returns (bool)
    {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

        return MerkleProof.verify(proof, root, leaf);
    }
}
*/
// File: Strings.sol



pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    /**
     * @dev Converts a `uint256` to its ASCII `string` representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        uint256 index = digits;
        temp = value;
        while (temp != 0) {
            buffer[--index] = bytes1(uint8(48 + uint256(temp % 10)));
            temp /= 10;
        }
        return string(buffer);
    }
}

// File: 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 GSN 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 memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: 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: Address.sol



pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: IERC721Receiver.sol



pragma solidity ^0.8.0;

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

// File: 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: 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: 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: 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: IERC721.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: IERC721Enumerable.sol


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

pragma solidity ^0.8.0;


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

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

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



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

// File: ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;









error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

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

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

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
    }

    // Compiler will pack the following 
    // _currentIndex and _burnCounter into a single 256bit word.
    
    // The tokenId of the next token to be minted.
    uint128 internal _currentIndex;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return _currentIndex - _burnCounter;    
        }
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (!ownership.burned) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }
        revert TokenIndexOutOfBounds();
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        // Execution should never reach this point.
        revert();
    }

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

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

    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

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

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

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

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

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

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                updatedIndex++;
            }

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

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

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // 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**128.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

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

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

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

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

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // 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**128.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

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

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

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

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

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

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

pragma solidity ^0.8.4;

contract AA1Spaceship is ERC721A, Ownable, ERC2981, DefaultOperatorFilterer {
    using Strings for uint256;

    string private baseURI;
    string public notRevealedUri;
    string public contractURI;

    bool public public_mint_status = true;
    bool public whitelist_mint_status = false;
    bool public revealed = false;

    uint256 public MAX_SUPPLY = 6000;  
    uint256 public publicSaleCost = 0.02 ether;
    uint256 public wlCost = 0.01 ether;
    uint256 public max_per_wallet = 8;  
    uint256 public whitelistCount;
    uint256 public whitelistLimit = 600;
    uint256 public whitelistLimitPerWallet = 8;
    uint256 public overallFreeMintLimit = 600;
    uint256 public freeMintedCount;
    uint256 public crewJoinLimit = 1;
    uint256 public max_per_txn = 1;  

    address[] public crew1;
    address[] public crew2;
    address[] public crew3;
    address[] public crew4;
    address[] public crew5;
    address[] public crew6;
    address[] public whitelistedAddresses;    

    mapping(address => uint256) public publicMinted;
    mapping(address => uint256) public whitelistMinted;
    mapping(address => uint256) public joined;
    mapping(address => uint256) public myCurrentCrew;

    constructor(string memory _initBaseURI, string memory _initNotRevealedUri, string memory _contractURI) ERC721A("AA1 Spaceship", "AA1") {
     
    setBaseURI(_initBaseURI);
    setNotRevealedURI(_initNotRevealedUri);   
    setRoyaltyInfo(0xa18b5819D04764bD42DCCC8313Ec2A54A066C780,500);
    contractURI = _contractURI;
    }

    function airdrop(address[] calldata receiver, uint256[] calldata quantity) public payable onlyOwner {
  
        require(receiver.length == quantity.length, "Airdrop data does not match");

        for(uint256 x = 0; x < receiver.length; x++){
        _safeMint(receiver[x], quantity[x]);
        }
    }

    function whitelistUsers(address[] calldata _users) public onlyOwner {
        delete whitelistedAddresses;
        whitelistedAddresses = _users;
    }

    function isWhitelisted(address _user) public view returns (bool) {
    for (uint i = 0; i < whitelistedAddresses.length; i++) {
      if (whitelistedAddresses[i] == _user) {
          return true;
      }
    }
    return false;
  }

    function mint(uint256 quantity) public payable  {
        require(totalSupply() + quantity <= MAX_SUPPLY,"No More NFTs to Mint");

        if (msg.sender != owner()) {
            require(publicMinted[msg.sender] + whitelistMinted[msg.sender] + quantity <= max_per_wallet, "Per Wallet Limit Reached");
            require( quantity <= max_per_txn, "Per txn Limit Reached");

            if(whitelist_mint_status){

            require(isWhitelisted(msg.sender), "Not Whitelisted");
            require(whitelistMinted[msg.sender] + quantity <= whitelistLimitPerWallet, "Whitelist Limit Per Wallet Reached");
            require(whitelistCount + quantity <= whitelistLimit, "Overall Whitelist Limit Reached");
            require(msg.value >= (wlCost * quantity), "Not Enough ETH Sent");
            whitelistMinted[msg.sender] = whitelistMinted[msg.sender] + quantity;
            whitelistCount = whitelistCount + quantity;

            } else {
                
            require(public_mint_status, "Public mint status is off");  
            if(totalSupply() + quantity <= overallFreeMintLimit){
                freeMintedCount = freeMintedCount + quantity;
            }else{
                require(msg.value >= (publicSaleCost * quantity), "Not Enough ETH Sent");
            }  

            publicMinted[msg.sender] = publicMinted[msg.sender] + quantity;

            }              
                       
        }

        _safeMint(msg.sender, quantity);
        
    }

    function joinCrew1() external {
        require(balanceOf(msg.sender) > 0, "No NFTs in your wallet");
        require(joined[msg.sender] < crewJoinLimit);
        crew1.push(msg.sender);
        joined[msg.sender]++;
        myCurrentCrew[msg.sender] = 1;
    }    

    function joinCrew2() external {
        require(balanceOf(msg.sender) > 0, "No NFTs in your wallet");
        require(joined[msg.sender] < crewJoinLimit);
        crew2.push(msg.sender);
        joined[msg.sender]++;
        myCurrentCrew[msg.sender] = 2;
    }    


    function joinCrew3() external {
        require(balanceOf(msg.sender) > 0, "No NFTs in your wallet");
        require(joined[msg.sender] < crewJoinLimit);
        crew3.push(msg.sender);
        joined[msg.sender]++;
        myCurrentCrew[msg.sender] = 3;
    }    

    function joinCrew4() external {
        require(balanceOf(msg.sender) > 0, "No NFTs in your wallet");
        require(joined[msg.sender] < crewJoinLimit);
        crew4.push(msg.sender);
        joined[msg.sender]++;
        myCurrentCrew[msg.sender] = 4;
    }    

    function joinCrew5() external {
        require(balanceOf(msg.sender) > 0, "No NFTs in your wallet");
        require(joined[msg.sender] < crewJoinLimit);
        crew5.push(msg.sender);
        joined[msg.sender]++;
        myCurrentCrew[msg.sender] = 5;
    }    

    function joinCrew6() external {
        require(balanceOf(msg.sender) > 0, "No NFTs in your wallet");
        require(joined[msg.sender] < crewJoinLimit);
        crew6.push(msg.sender);
        joined[msg.sender]++;
        myCurrentCrew[msg.sender] = 6;
    }    


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

        if(revealed == false) {
        return notRevealedUri;
        }
      
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString(),".json")) : '';
    }

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

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

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

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

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

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

      function setRoyaltyInfo(address _receiver, uint96 _royaltyFeesInBips) public onlyOwner {
        _setDefaultRoyalty(_receiver, _royaltyFeesInBips);
    }
   

    //only owner      
    
    function toggleReveal() external onlyOwner {
        
        if(revealed==false){
            revealed = true;
        }else{
            revealed = false;
        }
    }   
        
    function toggle_public_mint_status() external onlyOwner {
        
        if(public_mint_status==false){
            public_mint_status = true;
        }else{
            public_mint_status = false;
        }
    }  

    function toggle_whitelist_mint_status() external onlyOwner {
        
        if(whitelist_mint_status==false){
            whitelist_mint_status = true;
        }else{
            whitelist_mint_status = false;
        }
    }  

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

    function setContractURI(string memory _contractURI) external onlyOwner {
        contractURI = _contractURI;
    }
   
    function withdraw() external payable onlyOwner {
  
    (bool main, ) = payable(owner()).call{value: address(this).balance}("");
    require(main);
    }

    function setPublicSaleCost(uint256 _publicSaleCost) external onlyOwner {
        publicSaleCost = _publicSaleCost;
    }

    function setWlCost(uint256 _wlCost) external onlyOwner {
        wlCost = _wlCost;
    }

    function setWhitelistLimit(uint256 _whitelistLimit) external onlyOwner {
        whitelistLimit = _whitelistLimit;
    }

    function setwhitelistLimitPerWallet(uint256 _whitelistLimitPerWallet) external onlyOwner {
        whitelistLimitPerWallet = _whitelistLimitPerWallet;
    }

    function setMax_per_wallet(uint256 _max_per_wallet) external onlyOwner {
        max_per_wallet = _max_per_wallet;
    }

    function setOverallFreeMintLimit(uint256 _overallFreeMintLimit) external onlyOwner {
        overallFreeMintLimit = _overallFreeMintLimit;
    }

    function setMAX_SUPPLY(uint256 _MAX_SUPPLY) external onlyOwner {
        MAX_SUPPLY = _MAX_SUPPLY;
    }

    function setMax_per_txn(uint256 _max_per_txn) external onlyOwner {
        max_per_txn = _max_per_txn;
    }

    function setCrewJoinLimit(uint256 _crewJoinLimit) external onlyOwner {
        crewJoinLimit = _crewJoinLimit;
    }

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

    function getBaseURI() external view onlyOwner returns (string memory) {
        return baseURI;
    }
       
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"},{"internalType":"string","name":"_contractURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receiver","type":"address[]"},{"internalType":"uint256[]","name":"quantity","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"crew1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"crew2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"crew3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"crew4","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"crew5","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"crew6","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crewJoinLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"joinCrew1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"joinCrew2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"joinCrew3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"joinCrew4","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"joinCrew5","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"joinCrew6","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"joined","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"max_per_txn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"max_per_wallet","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":[{"internalType":"address","name":"","type":"address"}],"name":"myCurrentCrew","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"overallFreeMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"public_mint_status","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_crewJoinLimit","type":"uint256"}],"name":"setCrewJoinLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MAX_SUPPLY","type":"uint256"}],"name":"setMAX_SUPPLY","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max_per_txn","type":"uint256"}],"name":"setMax_per_txn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max_per_wallet","type":"uint256"}],"name":"setMax_per_wallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_overallFreeMintLimit","type":"uint256"}],"name":"setOverallFreeMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicSaleCost","type":"uint256"}],"name":"setPublicSaleCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_royaltyFeesInBips","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistLimit","type":"uint256"}],"name":"setWhitelistLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wlCost","type":"uint256"}],"name":"setWlCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistLimitPerWallet","type":"uint256"}],"name":"setwhitelistLimitPerWallet","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":[],"name":"toggleReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggle_public_mint_status","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggle_whitelist_mint_status","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistLimitPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelist_mint_status","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"wlCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052600d805462ffffff19166001908117909155611770600e5566470de4df820000600f55662386f26fc1000060105560086011819055610258601381905560149190915560155560178190556018553480156200005f57600080fd5b5060405162003c1938038062003c1983398101604081905262000082916200057a565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600d81526020016c04141312053706163657368697609c1b8152506040518060400160405280600381526020016241413160e81b8152508160019081620000ec91906200069a565b506002620000fb82826200069a565b5050700100000000000000000000000000000001600055506200011e33620002b6565b6daaeb6d7670e522a718067333cd4e3b1562000263578015620001b157604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200019257600080fd5b505af1158015620001a7573d6000803e3d6000fd5b5050505062000263565b6001600160a01b03821615620002025760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440162000177565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200024957600080fd5b505af11580156200025e573d6000803e3d6000fd5b505050505b506200027190508362000308565b6200027c8262000324565b6200029e73a18b5819d04764bd42dccc8313ec2a54a066c7806101f46200033c565b600c620002ac82826200069a565b5050505062000766565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200031262000352565b600a6200032082826200069a565b5050565b6200032e62000352565b600b6200032082826200069a565b6200034662000352565b620003208282620003b4565b6007546001600160a01b03163314620003b25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b565b6127106001600160601b0382161115620004245760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401620003a9565b6001600160a01b0382166200047c5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401620003a9565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620004dd57600080fd5b81516001600160401b0380821115620004fa57620004fa620004b5565b604051601f8301601f19908116603f01168101908282118183101715620005255762000525620004b5565b816040528381526020925086838588010111156200054257600080fd5b600091505b8382101562000566578582018301518183018401529082019062000547565b600093810190920192909252949350505050565b6000806000606084860312156200059057600080fd5b83516001600160401b0380821115620005a857600080fd5b620005b687838801620004cb565b94506020860151915080821115620005cd57600080fd5b620005db87838801620004cb565b93506040860151915080821115620005f257600080fd5b506200060186828701620004cb565b9150509250925092565b600181811c908216806200062057607f821691505b6020821081036200064157634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200069557600081815260208120601f850160051c81016020861015620006705750805b601f850160051c820191505b8181101562000691578281556001016200067c565b5050505b505050565b81516001600160401b03811115620006b657620006b6620004b5565b620006ce81620006c784546200060b565b8462000647565b602080601f831160018114620007065760008415620006ed5750858301515b600019600386901b1c1916600185901b17855562000691565b600085815260208120601f198616915b82811015620007375788860151825594840194600190910190840162000716565b5085821015620007565787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6134a380620007766000396000f3fe6080604052600436106104475760003560e01c806381c4cede11610234578063b6c84d191161012e578063dcc7eb35116100b6578063f12f6d5d1161007a578063f12f6d5d14610c97578063f2624b5d14610cb7578063f2c4ce1e14610ccd578063f2fde38b14610ced578063f887d01914610d0d57600080fd5b8063dcc7eb3514610be4578063e8a3d48514610bf9578063e985e9c514610c0e578063ec9496ba14610c57578063edec5f2714610c7757600080fd5b8063cf6db226116100fd578063cf6db22614610b6d578063d2521ae814610b83578063d685b64514610ba3578063d70a28d114610bb9578063d7bd707a14610bcf57600080fd5b8063b6c84d1914610aed578063b88d4fde14610b0d578063ba4e5c4914610b2d578063c87b56dd14610b4d57600080fd5b8063969597be116101bc578063a405ea2511610180578063a405ea2514610a61578063a698e23114610a77578063aab3e3cf14610a97578063ab53fcaa14610ab7578063b355eb0114610acd57600080fd5b8063969597be146109cc57806398a8cffe146109ec578063a00ddab014610a19578063a0712d6814610a2e578063a22cb46514610a4157600080fd5b80638b0a225b116102035780638b0a225b1461092c5780638da5cb5b146109595780638dbb7c0614610977578063938e3d7b1461099757806395d89b41146109b757600080fd5b806381c4cede146108bd57806382c87352146108d7578063835d997e146108f757806385a52fe51461091757600080fd5b806339a7e51f1161034557806351830227116102cd5780636690b888116102915780636690b8881461084b578063672434821461086057806370a0823114610873578063714c539814610893578063715018a6146108a857600080fd5b806351830227146107b757806355f804b3146107d75780635b8ad429146107f75780635d12e13f1461080c5780636352211e1461082b57600080fd5b806341f434341161031457806341f434341461071f57806342842e0e14610741578063453afb0f1461076157806345cc7297146107775780634f6ccce71461079757600080fd5b806339a7e51f146106c15780633af32abf146106e15780633ccfd60b1461070157806340b33f1b1461070957600080fd5b80631f8e8dc8116103d3578063312cabc911610397578063312cabc91461064b57806331877c6c14610660578063326e3ec61461067657806332cb6b0c1461069657806332cf534b146106ac57600080fd5b80631f8e8dc81461059657806323b872dd146105b65780632a55205a146105d65780632f745c5914610615578063302150e51461063557600080fd5b8063081812fc1161041a578063081812fc146104da578063081c8c4414610512578063095ea7b3146105275780631015805b1461054757806318160ddd1461058157600080fd5b806301ffc9a71461044c5780630230f05c1461048157806302fa7c471461049857806306fdde03146104b8575b600080fd5b34801561045857600080fd5b5061046c610467366004612cd7565b610d3a565b60405190151581526020015b60405180910390f35b34801561048d57600080fd5b50610496610d5a565b005b3480156104a457600080fd5b506104966104b3366004612d17565b610e1c565b3480156104c457600080fd5b506104cd610e32565b6040516104789190612daa565b3480156104e657600080fd5b506104fa6104f5366004612dbd565b610ec4565b6040516001600160a01b039091168152602001610478565b34801561051e57600080fd5b506104cd610f08565b34801561053357600080fd5b50610496610542366004612dd6565b610f96565b34801561055357600080fd5b50610573610562366004612e00565b602080526000908152604090205481565b604051908152602001610478565b34801561058d57600080fd5b50610573610faf565b3480156105a257600080fd5b506104966105b1366004612dbd565b610fce565b3480156105c257600080fd5b506104966105d1366004612e1b565b610fdb565b3480156105e257600080fd5b506105f66105f1366004612e57565b611006565b604080516001600160a01b039093168352602083019190915201610478565b34801561062157600080fd5b50610573610630366004612dd6565b6110b4565b34801561064157600080fd5b5061057360135481565b34801561065757600080fd5b506104966111a8565b34801561066c57600080fd5b5061057360175481565b34801561068257600080fd5b506104fa610691366004612dbd565b6111e3565b3480156106a257600080fd5b50610573600e5481565b3480156106b857600080fd5b5061049661120d565b3480156106cd57600080fd5b506104966106dc366004612dbd565b6112c6565b3480156106ed57600080fd5b5061046c6106fc366004612e00565b6112d3565b61049661133c565b34801561071557600080fd5b5061057360155481565b34801561072b57600080fd5b506104fa6daaeb6d7670e522a718067333cd4e81565b34801561074d57600080fd5b5061049661075c366004612e1b565b6113b8565b34801561076d57600080fd5b50610573600f5481565b34801561078357600080fd5b506104fa610792366004612dbd565b6113dd565b3480156107a357600080fd5b506105736107b2366004612dbd565b6113ed565b3480156107c357600080fd5b50600d5461046c9062010000900460ff1681565b3480156107e357600080fd5b506104966107f2366004612f04565b611496565b34801561080357600080fd5b506104966114aa565b34801561081857600080fd5b50600d5461046c90610100900460ff1681565b34801561083757600080fd5b506104fa610846366004612dbd565b6114e8565b34801561085757600080fd5b506104966114fa565b61049661086e366004612f90565b6115b3565b34801561087f57600080fd5b5061057361088e366004612e00565b611676565b34801561089f57600080fd5b506104cd6116c4565b3480156108b457600080fd5b506104966116db565b3480156108c957600080fd5b50600d5461046c9060ff1681565b3480156108e357600080fd5b506104fa6108f2366004612dbd565b6116ed565b34801561090357600080fd5b50610496610912366004612dbd565b6116fd565b34801561092357600080fd5b5061049661170a565b34801561093857600080fd5b50610573610947366004612e00565b60236020526000908152604090205481565b34801561096557600080fd5b506007546001600160a01b03166104fa565b34801561098357600080fd5b50610496610992366004612dbd565b6117c3565b3480156109a357600080fd5b506104966109b2366004612f04565b6117d0565b3480156109c357600080fd5b506104cd6117e4565b3480156109d857600080fd5b506104fa6109e7366004612dbd565b6117f3565b3480156109f857600080fd5b50610573610a07366004612e00565b60216020526000908152604090205481565b348015610a2557600080fd5b50610496611803565b610496610a3c366004612dbd565b6118bc565b348015610a4d57600080fd5b50610496610a5c366004613009565b611cbe565b348015610a6d57600080fd5b5061057360145481565b348015610a8357600080fd5b506104fa610a92366004612dbd565b611cd2565b348015610aa357600080fd5b50610496610ab2366004612dbd565b611ce2565b348015610ac357600080fd5b5061057360115481565b348015610ad957600080fd5b50610496610ae8366004612dbd565b611cef565b348015610af957600080fd5b506104fa610b08366004612dbd565b611cfc565b348015610b1957600080fd5b50610496610b28366004613035565b611d0c565b348015610b3957600080fd5b506104fa610b48366004612dbd565b611d32565b348015610b5957600080fd5b506104cd610b68366004612dbd565b611d42565b348015610b7957600080fd5b5061057360165481565b348015610b8f57600080fd5b50610496610b9e366004612dbd565b611e6d565b348015610baf57600080fd5b5061057360185481565b348015610bc557600080fd5b5061057360105481565b348015610bdb57600080fd5b50610496611e7a565b348015610bf057600080fd5b50610496611f33565b348015610c0557600080fd5b506104cd611f65565b348015610c1a57600080fd5b5061046c610c293660046130b0565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610c6357600080fd5b50610496610c72366004612dbd565b611f72565b348015610c8357600080fd5b50610496610c923660046130e3565b611f7f565b348015610ca357600080fd5b50610496610cb2366004612dbd565b611f9f565b348015610cc357600080fd5b5061057360125481565b348015610cd957600080fd5b50610496610ce8366004612f04565b611fac565b348015610cf957600080fd5b50610496610d08366004612e00565b611fc0565b348015610d1957600080fd5b50610573610d28366004612e00565b60226020526000908152604090205481565b6000610d4582612036565b80610d545750610d54826120a1565b92915050565b6000610d6533611676565b11610d8b5760405162461bcd60e51b8152600401610d8290613124565b60405180910390fd5b6017543360009081526022602052604090205410610da857600080fd5b601e8054600181019091557f50bb669a95c7b50b7e8a6f09454034b2b14cf2b85c730dca9a539ca82cb6e3500180546001600160a01b031916339081179091556000908152602260205260408120805491610e028361316a565b909155505033600090815260236020526040902060069055565b610e246120c6565b610e2e8282612120565b5050565b606060018054610e4190613183565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6d90613183565b8015610eba5780601f10610e8f57610100808354040283529160200191610eba565b820191906000526020600020905b815481529060010190602001808311610e9d57829003601f168201915b5050505050905090565b6000610ecf8261221d565b610eec576040516333d1c03960e21b815260040160405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600b8054610f1590613183565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4190613183565b8015610f8e5780601f10610f6357610100808354040283529160200191610f8e565b820191906000526020600020905b815481529060010190602001808311610f7157829003601f168201915b505050505081565b81610fa081612251565b610faa838361230a565b505050565b6000546001600160801b03600160801b82048116918116919091031690565b610fd66120c6565b601455565b826001600160a01b0381163314610ff557610ff533612251565b611000848484612392565b50505050565b60008281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b031692820192909252829161107b5750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101516000906127109061109a906001600160601b0316876131bd565b6110a491906131ea565b91519350909150505b9250929050565b60006110bf83611676565b82106110de576040516306ed618760e11b815260040160405180910390fd5b600080546001600160801b03169080805b8381101561044757600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16158015928201929092529061115657506111a0565b80516001600160a01b03161561116b57805192505b876001600160a01b0316836001600160a01b03160361119e5786840361119757509350610d5492505050565b6001909301925b505b6001016110ef565b6111b06120c6565b600d54610100900460ff1615156000036111d557600d805461ff001916610100179055565b600d805461ff00191690555b565b601981815481106111f357600080fd5b6000918252602090912001546001600160a01b0316905081565b600061121833611676565b116112355760405162461bcd60e51b8152600401610d8290613124565b601754336000908152602260205260409020541061125257600080fd5b601b8054600181019091557f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc10180546001600160a01b0319163390811790915560009081526022602052604081208054916112ac8361316a565b909155505033600090815260236020526040902060039055565b6112ce6120c6565b601755565b6000805b601f5481101561133357826001600160a01b0316601f82815481106112fe576112fe6131fe565b6000918252602090912001546001600160a01b0316036113215750600192915050565b8061132b8161316a565b9150506112d7565b50600092915050565b6113446120c6565b60006113586007546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146113a2576040519150601f19603f3d011682016040523d82523d6000602084013e6113a7565b606091505b50509050806113b557600080fd5b50565b826001600160a01b03811633146113d2576113d233612251565b61100084848461239d565b601a81815481106111f357600080fd5b600080546001600160801b031681805b8281101561147c57600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906114735785830361146c5750949350505050565b6001909201915b506001016113fd565b506040516329c8c00760e21b815260040160405180910390fd5b61149e6120c6565b600a610e2e8282613262565b6114b26120c6565b600d5462010000900460ff1615156000036114da57600d805462ff0000191662010000179055565b600d805462ff000019169055565b60006114f3826123b8565b5192915050565b600061150533611676565b116115225760405162461bcd60e51b8152600401610d8290613124565b601754336000908152602260205260409020541061153f57600080fd5b60198054600181019091557f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c96950180546001600160a01b0319163390811790915560009081526022602052604081208054916115998361316a565b909155505033600090815260236020526040902060019055565b6115bb6120c6565b82811461160a5760405162461bcd60e51b815260206004820152601b60248201527f41697264726f70206461746120646f6573206e6f74206d6174636800000000006044820152606401610d82565b60005b8381101561166f5761165d85858381811061162a5761162a6131fe565b905060200201602081019061163f9190612e00565b848484818110611651576116516131fe565b905060200201356124da565b806116678161316a565b91505061160d565b5050505050565b60006001600160a01b03821661169f576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600460205260409020546001600160401b031690565b60606116ce6120c6565b600a8054610e4190613183565b6116e36120c6565b6111e160006124f4565b601e81815481106111f357600080fd5b6117056120c6565b601155565b600061171533611676565b116117325760405162461bcd60e51b8152600401610d8290613124565b601754336000908152602260205260409020541061174f57600080fd5b601c8054600181019091557f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b0319163390811790915560009081526022602052604081208054916117a98361316a565b909155505033600090815260236020526040902060049055565b6117cb6120c6565b600f55565b6117d86120c6565b600c610e2e8282613262565b606060028054610e4190613183565b601d81815481106111f357600080fd5b600061180e33611676565b1161182b5760405162461bcd60e51b8152600401610d8290613124565b601754336000908152602260205260409020541061184857600080fd5b601a8054600181019091557f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e0180546001600160a01b0319163390811790915560009081526022602052604081208054916118a28361316a565b909155505033600090815260236020526040902060029055565b600e54816118c8610faf565b6118d29190613321565b11156119175760405162461bcd60e51b8152602060048201526014602482015273139bc8135bdc99481391951cc81d1bc8135a5b9d60621b6044820152606401610d82565b6007546001600160a01b03163314611cb4576011543360009081526021602090815260408083205491805290912054839161195191613321565b61195b9190613321565b11156119a95760405162461bcd60e51b815260206004820152601860248201527f5065722057616c6c6574204c696d6974205265616368656400000000000000006044820152606401610d82565b6018548111156119f35760405162461bcd60e51b815260206004820152601560248201527414195c881d1e1b88131a5b5a5d0814995858da1959605a1b6044820152606401610d82565b600d54610100900460ff1615611bb457611a0c336112d3565b611a4a5760405162461bcd60e51b815260206004820152600f60248201526e139bdd0815da1a5d195b1a5cdd1959608a1b6044820152606401610d82565b60145433600090815260216020526040902054611a68908390613321565b1115611ac15760405162461bcd60e51b815260206004820152602260248201527f57686974656c697374204c696d6974205065722057616c6c6574205265616368604482015261195960f21b6064820152608401610d82565b60135481601254611ad29190613321565b1115611b205760405162461bcd60e51b815260206004820152601f60248201527f4f766572616c6c2057686974656c697374204c696d69742052656163686564006044820152606401610d82565b80601054611b2e91906131bd565b341015611b735760405162461bcd60e51b8152602060048201526013602482015272139bdd08115b9bdd59da081155120814d95b9d606a1b6044820152606401610d82565b33600090815260216020526040902054611b8e908290613321565b33600090815260216020526040902055601254611bac908290613321565b601255611cb4565b600d5460ff16611c065760405162461bcd60e51b815260206004820152601960248201527f5075626c6963206d696e7420737461747573206973206f6666000000000000006044820152606401610d82565b60155481611c12610faf565b611c1c9190613321565b11611c375780601654611c2f9190613321565b601655611c8a565b80600f54611c4591906131bd565b341015611c8a5760405162461bcd60e51b8152602060048201526013602482015272139bdd08115b9bdd59da081155120814d95b9d606a1b6044820152606401610d82565b336000908152602080526040902054611ca4908290613321565b3360009081526020805260409020555b6113b533826124da565b81611cc881612251565b610faa8383612546565b601c81815481106111f357600080fd5b611cea6120c6565b601855565b611cf76120c6565b601555565b601b81815481106111f357600080fd5b836001600160a01b0381163314611d2657611d2633612251565b61166f858585856125db565b601f81815481106111f357600080fd5b6060611d4d8261221d565b611d6a57604051630a14c4b560e41b815260040160405180910390fd5b600d5462010000900460ff161515600003611e1157600b8054611d8c90613183565b80601f0160208091040260200160405190810160405280929190818152602001828054611db890613183565b8015611e055780601f10611dda57610100808354040283529160200191611e05565b820191906000526020600020905b815481529060010190602001808311611de857829003601f168201915b50505050509050919050565b600a8054611e1e90613183565b9050600003611e3c5760405180602001604052806000815250610d54565b600a611e478361260f565b604051602001611e58929190613334565b60405160208183030381529060405292915050565b611e756120c6565b601355565b6000611e8533611676565b11611ea25760405162461bcd60e51b8152600401610d8290613124565b6017543360009081526022602052604090205410611ebf57600080fd5b601d8054600181019091557f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0180546001600160a01b031916339081179091556000908152602260205260408120805491611f198361316a565b909155505033600090815260236020526040902060059055565b611f3b6120c6565b600d5460ff161515600003611f5957600d805460ff19166001179055565b600d805460ff19169055565b600c8054610f1590613183565b611f7a6120c6565b600e55565b611f876120c6565b611f93601f6000612c2b565b610faa601f8383612c49565b611fa76120c6565b601055565b611fb46120c6565b600b610e2e8282613262565b611fc86120c6565b6001600160a01b03811661202d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d82565b6113b5816124f4565b60006001600160e01b031982166380ac58cd60e01b148061206757506001600160e01b03198216635b5e139f60e01b145b8061208257506001600160e01b0319821663780e9d6360e01b145b80610d5457506301ffc9a760e01b6001600160e01b0319831614610d54565b60006001600160e01b0319821663152a902d60e11b1480610d545750610d5482612036565b6007546001600160a01b031633146111e15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d82565b6127106001600160601b038216111561218e5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610d82565b6001600160a01b0382166121e45760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610d82565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b600080546001600160801b031682108015610d54575050600090815260036020526040902054600160e01b900460ff161590565b6daaeb6d7670e522a718067333cd4e3b156113b557604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156122be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e291906133cb565b6113b557604051633b79c77360e21b81526001600160a01b0382166004820152602401610d82565b6000612315826114e8565b9050806001600160a01b0316836001600160a01b0316036123495760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061236957506123678133610c29565b155b15612387576040516367d9dca160e11b815260040160405180910390fd5b610faa83838361271a565b610faa838383612776565b610faa83838360405180602001604052806000815250611d0c565b60408051606081018252600080825260208201819052918101829052905482906001600160801b03168110156124c157600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906124bf5780516001600160a01b031615612456579392505050565b5060001901600081815260036020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156124ba579392505050565b612456565b505b604051636f96cda160e11b815260040160405180910390fd5b610e2e828260405180602001604052806000815250612990565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b336001600160a01b0383160361256f5760405163b06307db60e01b815260040160405180910390fd5b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6125e6848484612776565b6125f28484848461299d565b611000576040516368d2bf6b60e11b815260040160405180910390fd5b6060816000036126365750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612660578061264a8161316a565b91506126599050600a836131ea565b915061263a565b6000816001600160401b0381111561267a5761267a612e79565b6040519080825280601f01601f1916602001820160405280156126a4576020820181803683370190505b508593509050815b8315612711576126bd600a856133e8565b6126c8906030613321565b60f81b826126d5836133fc565b925082815181106126e8576126e86131fe565b60200101906001600160f81b031916908160001a90535061270a600a856131ea565b93506126ac565b50949350505050565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000612781826123b8565b80519091506000906001600160a01b0316336001600160a01b031614806127af575081516127af9033610c29565b806127ca5750336127bf84610ec4565b6001600160a01b0316145b9050806127ea57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b03161461281f5760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661284657604051633a954ecd60e21b815260040160405180910390fd5b612856600084846000015161271a565b6001600160a01b038581166000908152600460209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600390945282852080546001600160e01b031916909417600160a01b429092169190910217909255908601808352912054909116612949576000546001600160801b031681101561294957825160008281526003602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461166f565b610faa8383836001612aa0565b60006001600160a01b0384163b15612a9457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906129e1903390899088908890600401613413565b6020604051808303816000875af1925050508015612a1c575060408051601f3d908101601f19168201909252612a1991810190613450565b60015b612a7a573d808015612a4a576040519150601f19603f3d011682016040523d82523d6000602084013e612a4f565b606091505b508051600003612a72576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612a98565b5060015b949350505050565b6000546001600160801b03166001600160a01b038516612ad257604051622e076360e81b815260040160405180910390fd5b83600003612af35760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260046020908152604080832080546001600160801b031981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c018116909202179091558584526003909252822080546001600160e01b031916909317600160a01b42909216919091021790915581905b85811015612c055760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4838015612bdb5750612bd9600088848861299d565b155b15612bf9576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101612b84565b50600080546001600160801b0319166001600160801b039290921691909117905561166f565b50805460008255906000526020600020908101906113b59190612cac565b828054828255906000526020600020908101928215612c9c579160200282015b82811115612c9c5781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612c69565b50612ca8929150612cac565b5090565b5b80821115612ca85760008155600101612cad565b6001600160e01b0319811681146113b557600080fd5b600060208284031215612ce957600080fd5b8135612cf481612cc1565b9392505050565b80356001600160a01b0381168114612d1257600080fd5b919050565b60008060408385031215612d2a57600080fd5b612d3383612cfb565b915060208301356001600160601b0381168114612d4f57600080fd5b809150509250929050565b60005b83811015612d75578181015183820152602001612d5d565b50506000910152565b60008151808452612d96816020860160208601612d5a565b601f01601f19169290920160200192915050565b602081526000612cf46020830184612d7e565b600060208284031215612dcf57600080fd5b5035919050565b60008060408385031215612de957600080fd5b612df283612cfb565b946020939093013593505050565b600060208284031215612e1257600080fd5b612cf482612cfb565b600080600060608486031215612e3057600080fd5b612e3984612cfb565b9250612e4760208501612cfb565b9150604084013590509250925092565b60008060408385031215612e6a57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115612ea957612ea9612e79565b604051601f8501601f19908116603f01168101908282118183101715612ed157612ed1612e79565b81604052809350858152868686011115612eea57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612f1657600080fd5b81356001600160401b03811115612f2c57600080fd5b8201601f81018413612f3d57600080fd5b612a9884823560208401612e8f565b60008083601f840112612f5e57600080fd5b5081356001600160401b03811115612f7557600080fd5b6020830191508360208260051b85010111156110ad57600080fd5b60008060008060408587031215612fa657600080fd5b84356001600160401b0380821115612fbd57600080fd5b612fc988838901612f4c565b90965094506020870135915080821115612fe257600080fd5b50612fef87828801612f4c565b95989497509550505050565b80151581146113b557600080fd5b6000806040838503121561301c57600080fd5b61302583612cfb565b91506020830135612d4f81612ffb565b6000806000806080858703121561304b57600080fd5b61305485612cfb565b935061306260208601612cfb565b92506040850135915060608501356001600160401b0381111561308457600080fd5b8501601f8101871361309557600080fd5b6130a487823560208401612e8f565b91505092959194509250565b600080604083850312156130c357600080fd5b6130cc83612cfb565b91506130da60208401612cfb565b90509250929050565b600080602083850312156130f657600080fd5b82356001600160401b0381111561310c57600080fd5b61311885828601612f4c565b90969095509350505050565b602080825260169082015275139bc81391951cc81a5b881e5bdd5c881dd85b1b195d60521b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60006001820161317c5761317c613154565b5060010190565b600181811c9082168061319757607f821691505b6020821081036131b757634e487b7160e01b600052602260045260246000fd5b50919050565b8082028115828204841417610d5457610d54613154565b634e487b7160e01b600052601260045260246000fd5b6000826131f9576131f96131d4565b500490565b634e487b7160e01b600052603260045260246000fd5b601f821115610faa57600081815260208120601f850160051c8101602086101561323b5750805b601f850160051c820191505b8181101561325a57828155600101613247565b505050505050565b81516001600160401b0381111561327b5761327b612e79565b61328f816132898454613183565b84613214565b602080601f8311600181146132c457600084156132ac5750858301515b600019600386901b1c1916600185901b17855561325a565b600085815260208120601f198616915b828110156132f3578886015182559484019460019091019084016132d4565b50858210156133115787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610d5457610d54613154565b600080845461334281613183565b6001828116801561335a576001811461336f5761339e565b60ff198416875282151583028701945061339e565b8860005260208060002060005b858110156133955781548a82015290840190820161337c565b50505082870194505b5050505083516133b2818360208801612d5a565b64173539b7b760d91b9101908152600501949350505050565b6000602082840312156133dd57600080fd5b8151612cf481612ffb565b6000826133f7576133f76131d4565b500690565b60008161340b5761340b613154565b506000190190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061344690830184612d7e565b9695505050505050565b60006020828403121561346257600080fd5b8151612cf481612cc156fea2646970667358221220301208634ad14e1060acb21a197e1cd86c000ace63cc32459e7acb0b44c30f3264736f6c63430008120033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000005968747470733a2f2f626166796265696762343537627177626274686a76377269796c6a7674363332716b7a327a6f747964786464626a6b68347a676d74656a336a796d2e697066732e6e667473746f726167652e6c696e6b2f00000000000000000000000000000000000000000000000000000000000000000000000000006868747470733a2f2f62616679626569636779726934617a3232346f6c36776c6c71366d7378743775766634356174787a6561796871767175716a7134753569376d65712e697066732e6e667473746f726167652e6c696e6b2f7072652d72657665616c2e6a736f6e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106104475760003560e01c806381c4cede11610234578063b6c84d191161012e578063dcc7eb35116100b6578063f12f6d5d1161007a578063f12f6d5d14610c97578063f2624b5d14610cb7578063f2c4ce1e14610ccd578063f2fde38b14610ced578063f887d01914610d0d57600080fd5b8063dcc7eb3514610be4578063e8a3d48514610bf9578063e985e9c514610c0e578063ec9496ba14610c57578063edec5f2714610c7757600080fd5b8063cf6db226116100fd578063cf6db22614610b6d578063d2521ae814610b83578063d685b64514610ba3578063d70a28d114610bb9578063d7bd707a14610bcf57600080fd5b8063b6c84d1914610aed578063b88d4fde14610b0d578063ba4e5c4914610b2d578063c87b56dd14610b4d57600080fd5b8063969597be116101bc578063a405ea2511610180578063a405ea2514610a61578063a698e23114610a77578063aab3e3cf14610a97578063ab53fcaa14610ab7578063b355eb0114610acd57600080fd5b8063969597be146109cc57806398a8cffe146109ec578063a00ddab014610a19578063a0712d6814610a2e578063a22cb46514610a4157600080fd5b80638b0a225b116102035780638b0a225b1461092c5780638da5cb5b146109595780638dbb7c0614610977578063938e3d7b1461099757806395d89b41146109b757600080fd5b806381c4cede146108bd57806382c87352146108d7578063835d997e146108f757806385a52fe51461091757600080fd5b806339a7e51f1161034557806351830227116102cd5780636690b888116102915780636690b8881461084b578063672434821461086057806370a0823114610873578063714c539814610893578063715018a6146108a857600080fd5b806351830227146107b757806355f804b3146107d75780635b8ad429146107f75780635d12e13f1461080c5780636352211e1461082b57600080fd5b806341f434341161031457806341f434341461071f57806342842e0e14610741578063453afb0f1461076157806345cc7297146107775780634f6ccce71461079757600080fd5b806339a7e51f146106c15780633af32abf146106e15780633ccfd60b1461070157806340b33f1b1461070957600080fd5b80631f8e8dc8116103d3578063312cabc911610397578063312cabc91461064b57806331877c6c14610660578063326e3ec61461067657806332cb6b0c1461069657806332cf534b146106ac57600080fd5b80631f8e8dc81461059657806323b872dd146105b65780632a55205a146105d65780632f745c5914610615578063302150e51461063557600080fd5b8063081812fc1161041a578063081812fc146104da578063081c8c4414610512578063095ea7b3146105275780631015805b1461054757806318160ddd1461058157600080fd5b806301ffc9a71461044c5780630230f05c1461048157806302fa7c471461049857806306fdde03146104b8575b600080fd5b34801561045857600080fd5b5061046c610467366004612cd7565b610d3a565b60405190151581526020015b60405180910390f35b34801561048d57600080fd5b50610496610d5a565b005b3480156104a457600080fd5b506104966104b3366004612d17565b610e1c565b3480156104c457600080fd5b506104cd610e32565b6040516104789190612daa565b3480156104e657600080fd5b506104fa6104f5366004612dbd565b610ec4565b6040516001600160a01b039091168152602001610478565b34801561051e57600080fd5b506104cd610f08565b34801561053357600080fd5b50610496610542366004612dd6565b610f96565b34801561055357600080fd5b50610573610562366004612e00565b602080526000908152604090205481565b604051908152602001610478565b34801561058d57600080fd5b50610573610faf565b3480156105a257600080fd5b506104966105b1366004612dbd565b610fce565b3480156105c257600080fd5b506104966105d1366004612e1b565b610fdb565b3480156105e257600080fd5b506105f66105f1366004612e57565b611006565b604080516001600160a01b039093168352602083019190915201610478565b34801561062157600080fd5b50610573610630366004612dd6565b6110b4565b34801561064157600080fd5b5061057360135481565b34801561065757600080fd5b506104966111a8565b34801561066c57600080fd5b5061057360175481565b34801561068257600080fd5b506104fa610691366004612dbd565b6111e3565b3480156106a257600080fd5b50610573600e5481565b3480156106b857600080fd5b5061049661120d565b3480156106cd57600080fd5b506104966106dc366004612dbd565b6112c6565b3480156106ed57600080fd5b5061046c6106fc366004612e00565b6112d3565b61049661133c565b34801561071557600080fd5b5061057360155481565b34801561072b57600080fd5b506104fa6daaeb6d7670e522a718067333cd4e81565b34801561074d57600080fd5b5061049661075c366004612e1b565b6113b8565b34801561076d57600080fd5b50610573600f5481565b34801561078357600080fd5b506104fa610792366004612dbd565b6113dd565b3480156107a357600080fd5b506105736107b2366004612dbd565b6113ed565b3480156107c357600080fd5b50600d5461046c9062010000900460ff1681565b3480156107e357600080fd5b506104966107f2366004612f04565b611496565b34801561080357600080fd5b506104966114aa565b34801561081857600080fd5b50600d5461046c90610100900460ff1681565b34801561083757600080fd5b506104fa610846366004612dbd565b6114e8565b34801561085757600080fd5b506104966114fa565b61049661086e366004612f90565b6115b3565b34801561087f57600080fd5b5061057361088e366004612e00565b611676565b34801561089f57600080fd5b506104cd6116c4565b3480156108b457600080fd5b506104966116db565b3480156108c957600080fd5b50600d5461046c9060ff1681565b3480156108e357600080fd5b506104fa6108f2366004612dbd565b6116ed565b34801561090357600080fd5b50610496610912366004612dbd565b6116fd565b34801561092357600080fd5b5061049661170a565b34801561093857600080fd5b50610573610947366004612e00565b60236020526000908152604090205481565b34801561096557600080fd5b506007546001600160a01b03166104fa565b34801561098357600080fd5b50610496610992366004612dbd565b6117c3565b3480156109a357600080fd5b506104966109b2366004612f04565b6117d0565b3480156109c357600080fd5b506104cd6117e4565b3480156109d857600080fd5b506104fa6109e7366004612dbd565b6117f3565b3480156109f857600080fd5b50610573610a07366004612e00565b60216020526000908152604090205481565b348015610a2557600080fd5b50610496611803565b610496610a3c366004612dbd565b6118bc565b348015610a4d57600080fd5b50610496610a5c366004613009565b611cbe565b348015610a6d57600080fd5b5061057360145481565b348015610a8357600080fd5b506104fa610a92366004612dbd565b611cd2565b348015610aa357600080fd5b50610496610ab2366004612dbd565b611ce2565b348015610ac357600080fd5b5061057360115481565b348015610ad957600080fd5b50610496610ae8366004612dbd565b611cef565b348015610af957600080fd5b506104fa610b08366004612dbd565b611cfc565b348015610b1957600080fd5b50610496610b28366004613035565b611d0c565b348015610b3957600080fd5b506104fa610b48366004612dbd565b611d32565b348015610b5957600080fd5b506104cd610b68366004612dbd565b611d42565b348015610b7957600080fd5b5061057360165481565b348015610b8f57600080fd5b50610496610b9e366004612dbd565b611e6d565b348015610baf57600080fd5b5061057360185481565b348015610bc557600080fd5b5061057360105481565b348015610bdb57600080fd5b50610496611e7a565b348015610bf057600080fd5b50610496611f33565b348015610c0557600080fd5b506104cd611f65565b348015610c1a57600080fd5b5061046c610c293660046130b0565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610c6357600080fd5b50610496610c72366004612dbd565b611f72565b348015610c8357600080fd5b50610496610c923660046130e3565b611f7f565b348015610ca357600080fd5b50610496610cb2366004612dbd565b611f9f565b348015610cc357600080fd5b5061057360125481565b348015610cd957600080fd5b50610496610ce8366004612f04565b611fac565b348015610cf957600080fd5b50610496610d08366004612e00565b611fc0565b348015610d1957600080fd5b50610573610d28366004612e00565b60226020526000908152604090205481565b6000610d4582612036565b80610d545750610d54826120a1565b92915050565b6000610d6533611676565b11610d8b5760405162461bcd60e51b8152600401610d8290613124565b60405180910390fd5b6017543360009081526022602052604090205410610da857600080fd5b601e8054600181019091557f50bb669a95c7b50b7e8a6f09454034b2b14cf2b85c730dca9a539ca82cb6e3500180546001600160a01b031916339081179091556000908152602260205260408120805491610e028361316a565b909155505033600090815260236020526040902060069055565b610e246120c6565b610e2e8282612120565b5050565b606060018054610e4190613183565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6d90613183565b8015610eba5780601f10610e8f57610100808354040283529160200191610eba565b820191906000526020600020905b815481529060010190602001808311610e9d57829003601f168201915b5050505050905090565b6000610ecf8261221d565b610eec576040516333d1c03960e21b815260040160405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600b8054610f1590613183565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4190613183565b8015610f8e5780601f10610f6357610100808354040283529160200191610f8e565b820191906000526020600020905b815481529060010190602001808311610f7157829003601f168201915b505050505081565b81610fa081612251565b610faa838361230a565b505050565b6000546001600160801b03600160801b82048116918116919091031690565b610fd66120c6565b601455565b826001600160a01b0381163314610ff557610ff533612251565b611000848484612392565b50505050565b60008281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b031692820192909252829161107b5750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101516000906127109061109a906001600160601b0316876131bd565b6110a491906131ea565b91519350909150505b9250929050565b60006110bf83611676565b82106110de576040516306ed618760e11b815260040160405180910390fd5b600080546001600160801b03169080805b8381101561044757600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16158015928201929092529061115657506111a0565b80516001600160a01b03161561116b57805192505b876001600160a01b0316836001600160a01b03160361119e5786840361119757509350610d5492505050565b6001909301925b505b6001016110ef565b6111b06120c6565b600d54610100900460ff1615156000036111d557600d805461ff001916610100179055565b600d805461ff00191690555b565b601981815481106111f357600080fd5b6000918252602090912001546001600160a01b0316905081565b600061121833611676565b116112355760405162461bcd60e51b8152600401610d8290613124565b601754336000908152602260205260409020541061125257600080fd5b601b8054600181019091557f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc10180546001600160a01b0319163390811790915560009081526022602052604081208054916112ac8361316a565b909155505033600090815260236020526040902060039055565b6112ce6120c6565b601755565b6000805b601f5481101561133357826001600160a01b0316601f82815481106112fe576112fe6131fe565b6000918252602090912001546001600160a01b0316036113215750600192915050565b8061132b8161316a565b9150506112d7565b50600092915050565b6113446120c6565b60006113586007546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146113a2576040519150601f19603f3d011682016040523d82523d6000602084013e6113a7565b606091505b50509050806113b557600080fd5b50565b826001600160a01b03811633146113d2576113d233612251565b61100084848461239d565b601a81815481106111f357600080fd5b600080546001600160801b031681805b8281101561147c57600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906114735785830361146c5750949350505050565b6001909201915b506001016113fd565b506040516329c8c00760e21b815260040160405180910390fd5b61149e6120c6565b600a610e2e8282613262565b6114b26120c6565b600d5462010000900460ff1615156000036114da57600d805462ff0000191662010000179055565b600d805462ff000019169055565b60006114f3826123b8565b5192915050565b600061150533611676565b116115225760405162461bcd60e51b8152600401610d8290613124565b601754336000908152602260205260409020541061153f57600080fd5b60198054600181019091557f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c96950180546001600160a01b0319163390811790915560009081526022602052604081208054916115998361316a565b909155505033600090815260236020526040902060019055565b6115bb6120c6565b82811461160a5760405162461bcd60e51b815260206004820152601b60248201527f41697264726f70206461746120646f6573206e6f74206d6174636800000000006044820152606401610d82565b60005b8381101561166f5761165d85858381811061162a5761162a6131fe565b905060200201602081019061163f9190612e00565b848484818110611651576116516131fe565b905060200201356124da565b806116678161316a565b91505061160d565b5050505050565b60006001600160a01b03821661169f576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600460205260409020546001600160401b031690565b60606116ce6120c6565b600a8054610e4190613183565b6116e36120c6565b6111e160006124f4565b601e81815481106111f357600080fd5b6117056120c6565b601155565b600061171533611676565b116117325760405162461bcd60e51b8152600401610d8290613124565b601754336000908152602260205260409020541061174f57600080fd5b601c8054600181019091557f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b0319163390811790915560009081526022602052604081208054916117a98361316a565b909155505033600090815260236020526040902060049055565b6117cb6120c6565b600f55565b6117d86120c6565b600c610e2e8282613262565b606060028054610e4190613183565b601d81815481106111f357600080fd5b600061180e33611676565b1161182b5760405162461bcd60e51b8152600401610d8290613124565b601754336000908152602260205260409020541061184857600080fd5b601a8054600181019091557f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e0180546001600160a01b0319163390811790915560009081526022602052604081208054916118a28361316a565b909155505033600090815260236020526040902060029055565b600e54816118c8610faf565b6118d29190613321565b11156119175760405162461bcd60e51b8152602060048201526014602482015273139bc8135bdc99481391951cc81d1bc8135a5b9d60621b6044820152606401610d82565b6007546001600160a01b03163314611cb4576011543360009081526021602090815260408083205491805290912054839161195191613321565b61195b9190613321565b11156119a95760405162461bcd60e51b815260206004820152601860248201527f5065722057616c6c6574204c696d6974205265616368656400000000000000006044820152606401610d82565b6018548111156119f35760405162461bcd60e51b815260206004820152601560248201527414195c881d1e1b88131a5b5a5d0814995858da1959605a1b6044820152606401610d82565b600d54610100900460ff1615611bb457611a0c336112d3565b611a4a5760405162461bcd60e51b815260206004820152600f60248201526e139bdd0815da1a5d195b1a5cdd1959608a1b6044820152606401610d82565b60145433600090815260216020526040902054611a68908390613321565b1115611ac15760405162461bcd60e51b815260206004820152602260248201527f57686974656c697374204c696d6974205065722057616c6c6574205265616368604482015261195960f21b6064820152608401610d82565b60135481601254611ad29190613321565b1115611b205760405162461bcd60e51b815260206004820152601f60248201527f4f766572616c6c2057686974656c697374204c696d69742052656163686564006044820152606401610d82565b80601054611b2e91906131bd565b341015611b735760405162461bcd60e51b8152602060048201526013602482015272139bdd08115b9bdd59da081155120814d95b9d606a1b6044820152606401610d82565b33600090815260216020526040902054611b8e908290613321565b33600090815260216020526040902055601254611bac908290613321565b601255611cb4565b600d5460ff16611c065760405162461bcd60e51b815260206004820152601960248201527f5075626c6963206d696e7420737461747573206973206f6666000000000000006044820152606401610d82565b60155481611c12610faf565b611c1c9190613321565b11611c375780601654611c2f9190613321565b601655611c8a565b80600f54611c4591906131bd565b341015611c8a5760405162461bcd60e51b8152602060048201526013602482015272139bdd08115b9bdd59da081155120814d95b9d606a1b6044820152606401610d82565b336000908152602080526040902054611ca4908290613321565b3360009081526020805260409020555b6113b533826124da565b81611cc881612251565b610faa8383612546565b601c81815481106111f357600080fd5b611cea6120c6565b601855565b611cf76120c6565b601555565b601b81815481106111f357600080fd5b836001600160a01b0381163314611d2657611d2633612251565b61166f858585856125db565b601f81815481106111f357600080fd5b6060611d4d8261221d565b611d6a57604051630a14c4b560e41b815260040160405180910390fd5b600d5462010000900460ff161515600003611e1157600b8054611d8c90613183565b80601f0160208091040260200160405190810160405280929190818152602001828054611db890613183565b8015611e055780601f10611dda57610100808354040283529160200191611e05565b820191906000526020600020905b815481529060010190602001808311611de857829003601f168201915b50505050509050919050565b600a8054611e1e90613183565b9050600003611e3c5760405180602001604052806000815250610d54565b600a611e478361260f565b604051602001611e58929190613334565b60405160208183030381529060405292915050565b611e756120c6565b601355565b6000611e8533611676565b11611ea25760405162461bcd60e51b8152600401610d8290613124565b6017543360009081526022602052604090205410611ebf57600080fd5b601d8054600181019091557f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0180546001600160a01b031916339081179091556000908152602260205260408120805491611f198361316a565b909155505033600090815260236020526040902060059055565b611f3b6120c6565b600d5460ff161515600003611f5957600d805460ff19166001179055565b600d805460ff19169055565b600c8054610f1590613183565b611f7a6120c6565b600e55565b611f876120c6565b611f93601f6000612c2b565b610faa601f8383612c49565b611fa76120c6565b601055565b611fb46120c6565b600b610e2e8282613262565b611fc86120c6565b6001600160a01b03811661202d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d82565b6113b5816124f4565b60006001600160e01b031982166380ac58cd60e01b148061206757506001600160e01b03198216635b5e139f60e01b145b8061208257506001600160e01b0319821663780e9d6360e01b145b80610d5457506301ffc9a760e01b6001600160e01b0319831614610d54565b60006001600160e01b0319821663152a902d60e11b1480610d545750610d5482612036565b6007546001600160a01b031633146111e15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d82565b6127106001600160601b038216111561218e5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610d82565b6001600160a01b0382166121e45760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610d82565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b600080546001600160801b031682108015610d54575050600090815260036020526040902054600160e01b900460ff161590565b6daaeb6d7670e522a718067333cd4e3b156113b557604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156122be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e291906133cb565b6113b557604051633b79c77360e21b81526001600160a01b0382166004820152602401610d82565b6000612315826114e8565b9050806001600160a01b0316836001600160a01b0316036123495760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061236957506123678133610c29565b155b15612387576040516367d9dca160e11b815260040160405180910390fd5b610faa83838361271a565b610faa838383612776565b610faa83838360405180602001604052806000815250611d0c565b60408051606081018252600080825260208201819052918101829052905482906001600160801b03168110156124c157600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906124bf5780516001600160a01b031615612456579392505050565b5060001901600081815260036020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156124ba579392505050565b612456565b505b604051636f96cda160e11b815260040160405180910390fd5b610e2e828260405180602001604052806000815250612990565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b336001600160a01b0383160361256f5760405163b06307db60e01b815260040160405180910390fd5b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6125e6848484612776565b6125f28484848461299d565b611000576040516368d2bf6b60e11b815260040160405180910390fd5b6060816000036126365750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612660578061264a8161316a565b91506126599050600a836131ea565b915061263a565b6000816001600160401b0381111561267a5761267a612e79565b6040519080825280601f01601f1916602001820160405280156126a4576020820181803683370190505b508593509050815b8315612711576126bd600a856133e8565b6126c8906030613321565b60f81b826126d5836133fc565b925082815181106126e8576126e86131fe565b60200101906001600160f81b031916908160001a90535061270a600a856131ea565b93506126ac565b50949350505050565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000612781826123b8565b80519091506000906001600160a01b0316336001600160a01b031614806127af575081516127af9033610c29565b806127ca5750336127bf84610ec4565b6001600160a01b0316145b9050806127ea57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b03161461281f5760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661284657604051633a954ecd60e21b815260040160405180910390fd5b612856600084846000015161271a565b6001600160a01b038581166000908152600460209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600390945282852080546001600160e01b031916909417600160a01b429092169190910217909255908601808352912054909116612949576000546001600160801b031681101561294957825160008281526003602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461166f565b610faa8383836001612aa0565b60006001600160a01b0384163b15612a9457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906129e1903390899088908890600401613413565b6020604051808303816000875af1925050508015612a1c575060408051601f3d908101601f19168201909252612a1991810190613450565b60015b612a7a573d808015612a4a576040519150601f19603f3d011682016040523d82523d6000602084013e612a4f565b606091505b508051600003612a72576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612a98565b5060015b949350505050565b6000546001600160801b03166001600160a01b038516612ad257604051622e076360e81b815260040160405180910390fd5b83600003612af35760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260046020908152604080832080546001600160801b031981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c018116909202179091558584526003909252822080546001600160e01b031916909317600160a01b42909216919091021790915581905b85811015612c055760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4838015612bdb5750612bd9600088848861299d565b155b15612bf9576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101612b84565b50600080546001600160801b0319166001600160801b039290921691909117905561166f565b50805460008255906000526020600020908101906113b59190612cac565b828054828255906000526020600020908101928215612c9c579160200282015b82811115612c9c5781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612c69565b50612ca8929150612cac565b5090565b5b80821115612ca85760008155600101612cad565b6001600160e01b0319811681146113b557600080fd5b600060208284031215612ce957600080fd5b8135612cf481612cc1565b9392505050565b80356001600160a01b0381168114612d1257600080fd5b919050565b60008060408385031215612d2a57600080fd5b612d3383612cfb565b915060208301356001600160601b0381168114612d4f57600080fd5b809150509250929050565b60005b83811015612d75578181015183820152602001612d5d565b50506000910152565b60008151808452612d96816020860160208601612d5a565b601f01601f19169290920160200192915050565b602081526000612cf46020830184612d7e565b600060208284031215612dcf57600080fd5b5035919050565b60008060408385031215612de957600080fd5b612df283612cfb565b946020939093013593505050565b600060208284031215612e1257600080fd5b612cf482612cfb565b600080600060608486031215612e3057600080fd5b612e3984612cfb565b9250612e4760208501612cfb565b9150604084013590509250925092565b60008060408385031215612e6a57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115612ea957612ea9612e79565b604051601f8501601f19908116603f01168101908282118183101715612ed157612ed1612e79565b81604052809350858152868686011115612eea57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612f1657600080fd5b81356001600160401b03811115612f2c57600080fd5b8201601f81018413612f3d57600080fd5b612a9884823560208401612e8f565b60008083601f840112612f5e57600080fd5b5081356001600160401b03811115612f7557600080fd5b6020830191508360208260051b85010111156110ad57600080fd5b60008060008060408587031215612fa657600080fd5b84356001600160401b0380821115612fbd57600080fd5b612fc988838901612f4c565b90965094506020870135915080821115612fe257600080fd5b50612fef87828801612f4c565b95989497509550505050565b80151581146113b557600080fd5b6000806040838503121561301c57600080fd5b61302583612cfb565b91506020830135612d4f81612ffb565b6000806000806080858703121561304b57600080fd5b61305485612cfb565b935061306260208601612cfb565b92506040850135915060608501356001600160401b0381111561308457600080fd5b8501601f8101871361309557600080fd5b6130a487823560208401612e8f565b91505092959194509250565b600080604083850312156130c357600080fd5b6130cc83612cfb565b91506130da60208401612cfb565b90509250929050565b600080602083850312156130f657600080fd5b82356001600160401b0381111561310c57600080fd5b61311885828601612f4c565b90969095509350505050565b602080825260169082015275139bc81391951cc81a5b881e5bdd5c881dd85b1b195d60521b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60006001820161317c5761317c613154565b5060010190565b600181811c9082168061319757607f821691505b6020821081036131b757634e487b7160e01b600052602260045260246000fd5b50919050565b8082028115828204841417610d5457610d54613154565b634e487b7160e01b600052601260045260246000fd5b6000826131f9576131f96131d4565b500490565b634e487b7160e01b600052603260045260246000fd5b601f821115610faa57600081815260208120601f850160051c8101602086101561323b5750805b601f850160051c820191505b8181101561325a57828155600101613247565b505050505050565b81516001600160401b0381111561327b5761327b612e79565b61328f816132898454613183565b84613214565b602080601f8311600181146132c457600084156132ac5750858301515b600019600386901b1c1916600185901b17855561325a565b600085815260208120601f198616915b828110156132f3578886015182559484019460019091019084016132d4565b50858210156133115787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610d5457610d54613154565b600080845461334281613183565b6001828116801561335a576001811461336f5761339e565b60ff198416875282151583028701945061339e565b8860005260208060002060005b858110156133955781548a82015290840190820161337c565b50505082870194505b5050505083516133b2818360208801612d5a565b64173539b7b760d91b9101908152600501949350505050565b6000602082840312156133dd57600080fd5b8151612cf481612ffb565b6000826133f7576133f76131d4565b500690565b60008161340b5761340b613154565b506000190190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061344690830184612d7e565b9695505050505050565b60006020828403121561346257600080fd5b8151612cf481612cc156fea2646970667358221220301208634ad14e1060acb21a197e1cd86c000ace63cc32459e7acb0b44c30f3264736f6c63430008120033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000005968747470733a2f2f626166796265696762343537627177626274686a76377269796c6a7674363332716b7a327a6f747964786464626a6b68347a676d74656a336a796d2e697066732e6e667473746f726167652e6c696e6b2f00000000000000000000000000000000000000000000000000000000000000000000000000006868747470733a2f2f62616679626569636779726934617a3232346f6c36776c6c71366d7378743775766634356174787a6561796871767175716a7134753569376d65712e697066732e6e667473746f726167652e6c696e6b2f7072652d72657665616c2e6a736f6e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): https://bafybeigb457bqwbbthjv7riyljvt632qkz2zotydxddbjkh4zgmtej3jym.ipfs.nftstorage.link/
Arg [1] : _initNotRevealedUri (string): https://bafybeicgyri4az224ol6wllq6msxt7uvf45atxzeayhqvquqjq4u5i7meq.ipfs.nftstorage.link/pre-reveal.json
Arg [2] : _contractURI (string):

-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000059
Arg [4] : 68747470733a2f2f626166796265696762343537627177626274686a76377269
Arg [5] : 796c6a7674363332716b7a327a6f747964786464626a6b68347a676d74656a33
Arg [6] : 6a796d2e697066732e6e667473746f726167652e6c696e6b2f00000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000068
Arg [8] : 68747470733a2f2f62616679626569636779726934617a3232346f6c36776c6c
Arg [9] : 71366d7378743775766634356174787a6561796871767175716a713475356937
Arg [10] : 6d65712e697066732e6e667473746f726167652e6c696e6b2f7072652d726576
Arg [11] : 65616c2e6a736f6e000000000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

56399:10020:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63228:487;;;;;;;;;;-1:-1:-1;63228:487:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;63228:487:0;;;;;;;;61638:267;;;;;;;;;;;;;:::i;:::-;;63725:155;;;;;;;;;;-1:-1:-1;63725:155:0;;;;;:::i;:::-;;:::i;42504:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;44015:204::-;;;;;;;;;;-1:-1:-1;44015:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2246:32:1;;;2228:51;;2216:2;2201:18;44015:204:0;2082:203:1;56545:28:0;;;;;;;;;;;;;:::i;62476:157::-;;;;;;;;;;-1:-1:-1;62476:157:0;;;;;:::i;:::-;;:::i;57432:47::-;;;;;;;;;;-1:-1:-1;57432:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2886:25:1;;;2874:2;2859:18;57432:47:0;2740:177:1;37131:280:0;;;;;;;;;;;;;:::i;65385:158::-;;;;;;;;;;-1:-1:-1;65385:158:0;;;;;:::i;:::-;;:::i;62641:163::-;;;;;;;;;;-1:-1:-1;62641:163:0;;;;;:::i;:::-;;:::i;24954:442::-;;;;;;;;;;-1:-1:-1;24954:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3700:32:1;;;3682:51;;3764:2;3749:18;;3742:34;;;;3655:18;24954:442:0;3508:274:1;38717:1105:0;;;;;;;;;;-1:-1:-1;38717:1105:0;;;;;:::i;:::-;;:::i;56952:35::-;;;;;;;;;;;;;;;;64353:234;;;;;;;;;;;;;:::i;57128:32::-;;;;;;;;;;;;;;;;57208:22;;;;;;;;;;-1:-1:-1;57208:22:0;;;;;:::i;:::-;;:::i;56743:32::-;;;;;;;;;;;;;;;;60801:267;;;;;;;;;;;;;:::i;66067:118::-;;;;;;;;;;-1:-1:-1;66067:118:0;;;;;:::i;:::-;;:::i;58468:239::-;;;;;;;;;;-1:-1:-1;58468:239:0;;;;;:::i;:::-;;:::i;64862:157::-;;;:::i;57043:41::-;;;;;;;;;;;;;;;;2902:143;;;;;;;;;;;;3002:42;2902:143;;62812:171;;;;;;;;;;-1:-1:-1;62812:171:0;;;;;:::i;:::-;;:::i;56784:42::-;;;;;;;;;;;;;;;;57237:22;;;;;;;;;;-1:-1:-1;57237:22:0;;;;;:::i;:::-;;:::i;37704:713::-;;;;;;;;;;-1:-1:-1;37704:713:0;;;;;:::i;:::-;;:::i;56706:28::-;;;;;;;;;;-1:-1:-1;56706:28:0;;;;;;;;;;;66193:103;;;;;;;;;;-1:-1:-1;66193:103:0;;;;;:::i;:::-;;:::i;63923:179::-;;;;;;;;;;;;;:::i;56658:41::-;;;;;;;;;;-1:-1:-1;56658:41:0;;;;;;;;;;;42313:124;;;;;;;;;;-1:-1:-1;42313:124:0;;;;;:::i;:::-;;:::i;60241:267::-;;;;;;;;;;;;;:::i;57987:311::-;;;;;;:::i;:::-;;:::i;40330:206::-;;;;;;;;;;-1:-1:-1;40330:206:0;;;;;:::i;:::-;;:::i;66304:103::-;;;;;;;;;;;;;:::i;10928:::-;;;;;;;;;;;;;:::i;56614:37::-;;;;;;;;;;-1:-1:-1;56614:37:0;;;;;;;;57353:22;;;;;;;;;;-1:-1:-1;57353:22:0;;;;;:::i;:::-;;:::i;65551:122::-;;;;;;;;;;-1:-1:-1;65551:122:0;;;;;:::i;:::-;;:::i;61080:267::-;;;;;;;;;;;;;:::i;57591:48::-;;;;;;;;;;-1:-1:-1;57591:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;10280:87;;;;;;;;;;-1:-1:-1;10353:6:0;;-1:-1:-1;;;;;10353:6:0;10280:87;;65027:122;;;;;;;;;;-1:-1:-1;65027:122:0;;;;;:::i;:::-;;:::i;64735:116::-;;;;;;;;;;-1:-1:-1;64735:116:0;;;;;:::i;:::-;;:::i;42673:104::-;;;;;;;;;;;;;:::i;57324:22::-;;;;;;;;;;-1:-1:-1;57324:22:0;;;;;:::i;:::-;;:::i;57486:50::-;;;;;;;;;;-1:-1:-1;57486:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;60520:267;;;;;;;;;;;;;:::i;58715:1518::-;;;;;;:::i;:::-;;:::i;62292:176::-;;;;;;;;;;-1:-1:-1;62292:176:0;;;;;:::i;:::-;;:::i;56994:42::-;;;;;;;;;;;;;;;;57295:22;;;;;;;;;;-1:-1:-1;57295:22:0;;;;;:::i;:::-;;:::i;65949:110::-;;;;;;;;;;-1:-1:-1;65949:110:0;;;;;:::i;:::-;;:::i;56874:33::-;;;;;;;;;;;;;;;;65681:146;;;;;;;;;;-1:-1:-1;65681:146:0;;;;;:::i;:::-;;:::i;57266:22::-;;;;;;;;;;-1:-1:-1;57266:22:0;;;;;:::i;:::-;;:::i;62991:228::-;;;;;;;;;;-1:-1:-1;62991:228:0;;;;;:::i;:::-;;:::i;57382:37::-;;;;;;;;;;-1:-1:-1;57382:37:0;;;;;:::i;:::-;;:::i;61919:365::-;;;;;;;;;;-1:-1:-1;61919:365:0;;;;;:::i;:::-;;:::i;57091:30::-;;;;;;;;;;;;;;;;65255:122;;;;;;;;;;-1:-1:-1;65255:122:0;;;;;:::i;:::-;;:::i;57167:30::-;;;;;;;;;;;;;;;;56833:34;;;;;;;;;;;;;;;;61359:267;;;;;;;;;;;;;:::i;64121:222::-;;;;;;;;;;;;;:::i;56580:25::-;;;;;;;;;;;;;:::i;44649:164::-;;;;;;;;;;-1:-1:-1;44649:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;44770:25:0;;;44746:4;44770:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;44649:164;65835:106;;;;;;;;;;-1:-1:-1;65835:106:0;;;;;:::i;:::-;;:::i;58306:154::-;;;;;;;;;;-1:-1:-1;58306:154:0;;;;;:::i;:::-;;:::i;65157:90::-;;;;;;;;;;-1:-1:-1;65157:90:0;;;;;:::i;:::-;;:::i;56916:29::-;;;;;;;;;;;;;;;;64597:126;;;;;;;;;;-1:-1:-1;64597:126:0;;;;;:::i;:::-;;:::i;11186:201::-;;;;;;;;;;-1:-1:-1;11186:201:0;;;;;:::i;:::-;;:::i;57543:41::-;;;;;;;;;;-1:-1:-1;57543:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;63228:487;63376:4;63614:38;63640:11;63614:25;:38::i;:::-;:93;;;;63669:38;63695:11;63669:25;:38::i;:::-;63594:113;63228:487;-1:-1:-1;;63228:487:0:o;61638:267::-;61711:1;61687:21;61697:10;61687:9;:21::i;:::-;:25;61679:60;;;;-1:-1:-1;;;61679:60:0;;;;;;;:::i;:::-;;;;;;;;;61779:13;;61765:10;61758:18;;;;:6;:18;;;;;;:34;61750:43;;;;;;61804:5;:22;;;;;;;;;;;;-1:-1:-1;;;;;;61804:22:0;61815:10;61804:22;;;;;;-1:-1:-1;61837:18:0;;;:6;61804:22;61837:18;;;;:20;;;;;;:::i;:::-;;;;-1:-1:-1;;61882:10:0;61868:25;;;;:13;:25;;;;;61896:1;61868:29;;61638:267::o;63725:155::-;10166:13;:11;:13::i;:::-;63823:49:::1;63842:9;63853:18;63823;:49::i;:::-;63725:155:::0;;:::o;42504:100::-;42558:13;42591:5;42584:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42504:100;:::o;44015:204::-;44083:7;44108:16;44116:7;44108;:16::i;:::-;44103:64;;44133:34;;-1:-1:-1;;;44133:34:0;;;;;;;;;;;44103:64;-1:-1:-1;44187:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;44187:24:0;;44015:204::o;56545:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;62476:157::-;62572:8;4423:30;4444:8;4423:20;:30::i;:::-;62593:32:::1;62607:8;62617:7;62593:13;:32::i;:::-;62476:157:::0;;;:::o;37131:280::-;37184:7;37376:12;-1:-1:-1;;;;;;;;37376:12:0;;;;37360:13;;;:28;;;;37353:35;;37131:280::o;65385:158::-;10166:13;:11;:13::i;:::-;65485:23:::1;:50:::0;65385:158::o;62641:163::-;62742:4;-1:-1:-1;;;;;4243:18:0;;4251:10;4243:18;4239:83;;4278:32;4299:10;4278:20;:32::i;:::-;62759:37:::1;62778:4;62784:2;62788:7;62759:18;:37::i;:::-;62641:163:::0;;;;:::o;24954:442::-;25051:7;25109:27;;;:17;:27;;;;;;;;25080:56;;;;;;;;;-1:-1:-1;;;;;25080:56:0;;;;;-1:-1:-1;;;25080:56:0;;;-1:-1:-1;;;;;25080:56:0;;;;;;;;25051:7;;25149:92;;-1:-1:-1;25200:29:0;;;;;;;;;25210:19;25200:29;-1:-1:-1;;;;;25200:29:0;;;;-1:-1:-1;;;25200:29:0;;-1:-1:-1;;;;;25200:29:0;;;;;25149:92;25291:23;;;;25253:21;;25762:5;;25278:36;;-1:-1:-1;;;;;25278:36:0;:10;:36;:::i;:::-;25277:58;;;;:::i;:::-;25356:16;;;-1:-1:-1;25253:82:0;;-1:-1:-1;;24954:442:0;;;;;;:::o;38717:1105::-;38806:7;38839:16;38849:5;38839:9;:16::i;:::-;38830:5;:25;38826:61;;38864:23;;-1:-1:-1;;;38864:23:0;;;;;;;;;;;38826:61;38898:22;38923:13;;-1:-1:-1;;;;;38923:13:0;;38898:22;;39173:557;39193:14;39189:1;:18;39173:557;;;39233:31;39267:14;;;:11;:14;;;;;;;;;39233:48;;;;;;;;;-1:-1:-1;;;;;39233:48:0;;;;-1:-1:-1;;;39233:48:0;;-1:-1:-1;;;;;39233:48:0;;;;;;;;-1:-1:-1;;;39233:48:0;;;;;;;;;;;;;;;;39300:73;;39345:8;;;39300:73;39395:14;;-1:-1:-1;;;;;39395:28:0;;39391:111;;39468:14;;;-1:-1:-1;39391:111:0;39545:5;-1:-1:-1;;;;;39524:26:0;:17;-1:-1:-1;;;;;39524:26:0;;39520:195;;39594:5;39579:11;:20;39575:85;;-1:-1:-1;39635:1:0;-1:-1:-1;39628:8:0;;-1:-1:-1;;;39628:8:0;39575:85;39682:13;;;;;39520:195;39214:516;39173:557;39209:3;;39173:557;;64353:234;10166:13;:11;:13::i;:::-;64436:21:::1;::::0;::::1;::::0;::::1;;;:28;;64459:5;64436:28:::0;64433:147:::1;;64480:21;:28:::0;;-1:-1:-1;;64480:28:0::1;;;::::0;;64353:234::o;64433:147::-:1;64539:21;:29:::0;;-1:-1:-1;;64539:29:0::1;::::0;;64433:147:::1;64353:234::o:0;57208:22::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57208:22:0;;-1:-1:-1;57208:22:0;:::o;60801:267::-;60874:1;60850:21;60860:10;60850:9;:21::i;:::-;:25;60842:60;;;;-1:-1:-1;;;60842:60:0;;;;;;;:::i;:::-;60942:13;;60928:10;60921:18;;;;:6;:18;;;;;;:34;60913:43;;;;;;60967:5;:22;;;;;;;;;;;;-1:-1:-1;;;;;;60967:22:0;60978:10;60967:22;;;;;;-1:-1:-1;61000:18:0;;;:6;60967:22;61000:18;;;;:20;;;;;;:::i;:::-;;;;-1:-1:-1;;61045:10:0;61031:25;;;;:13;:25;;;;;61059:1;61031:29;;60801:267::o;66067:118::-;10166:13;:11;:13::i;:::-;66147::::1;:30:::0;66067:118::o;58468:239::-;58527:4;;58540:143;58561:20;:27;58557:31;;58540:143;;;58635:5;-1:-1:-1;;;;;58608:32:0;:20;58629:1;58608:23;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;58608:23:0;:32;58604:72;;-1:-1:-1;58662:4:0;;58468:239;-1:-1:-1;;58468:239:0:o;58604:72::-;58590:3;;;;:::i;:::-;;;;58540:143;;;-1:-1:-1;58696:5:0;;58468:239;-1:-1:-1;;58468:239:0:o;64862:157::-;10166:13;:11;:13::i;:::-;64921:9:::1;64944:7;10353:6:::0;;-1:-1:-1;;;;;10353:6:0;;10280:87;64944:7:::1;-1:-1:-1::0;;;;;64936:21:0::1;64965;64936:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64920:71;;;65006:4;64998:13;;;::::0;::::1;;64909:110;64862:157::o:0;62812:171::-;62917:4;-1:-1:-1;;;;;4243:18:0;;4251:10;4243:18;4239:83;;4278:32;4299:10;4278:20;:32::i;:::-;62934:41:::1;62957:4;62963:2;62967:7;62934:22;:41::i;57237:22::-:0;;;;;;;;;;;;37704:713;37771:7;37816:13;;-1:-1:-1;;;;;37816:13:0;37771:7;;38030:328;38050:14;38046:1;:18;38030:328;;;38090:31;38124:14;;;:11;:14;;;;;;;;;38090:48;;;;;;;;;-1:-1:-1;;;;;38090:48:0;;;;-1:-1:-1;;;38090:48:0;;-1:-1:-1;;;;;38090:48:0;;;;;;;;-1:-1:-1;;;38090:48:0;;;;;;;;;;;;;;38157:186;;38222:5;38207:11;:20;38203:85;;-1:-1:-1;38263:1:0;37704:713;-1:-1:-1;;;;37704:713:0:o;38203:85::-;38310:13;;;;;38157:186;-1:-1:-1;38066:3:0;;38030:328;;;;38386:23;;-1:-1:-1;;;38386:23:0;;;;;;;;;;;66193:103;10166:13;:11;:13::i;:::-;66268:7:::1;:21;66278:11:::0;66268:7;:21:::1;:::i;63923:179::-:0;10166:13;:11;:13::i;:::-;63990:8:::1;::::0;;;::::1;;;:15;;64000:5;63990:15:::0;63987:108:::1;;64021:8;:15:::0;;-1:-1:-1;;64021:15:0::1;::::0;::::1;::::0;;64353:234::o;63987:108::-:1;64067:8;:16:::0;;-1:-1:-1;;64067:16:0::1;::::0;;63923:179::o;42313:124::-;42377:7;42404:20;42416:7;42404:11;:20::i;:::-;:25;;42313:124;-1:-1:-1;;42313:124:0:o;60241:267::-;60314:1;60290:21;60300:10;60290:9;:21::i;:::-;:25;60282:60;;;;-1:-1:-1;;;60282:60:0;;;;;;;:::i;:::-;60382:13;;60368:10;60361:18;;;;:6;:18;;;;;;:34;60353:43;;;;;;60407:5;:22;;;;;;;;;;;;-1:-1:-1;;;;;;60407:22:0;60418:10;60407:22;;;;;;-1:-1:-1;60440:18:0;;;:6;60407:22;60440:18;;;;:20;;;;;;:::i;:::-;;;;-1:-1:-1;;60485:10:0;60471:25;;;;:13;:25;;;;;60499:1;60471:29;;60241:267::o;57987:311::-;10166:13;:11;:13::i;:::-;58110:34;;::::1;58102:74;;;::::0;-1:-1:-1;;;58102:74:0;;12409:2:1;58102:74:0::1;::::0;::::1;12391:21:1::0;12448:2;12428:18;;;12421:30;12487:29;12467:18;;;12460:57;12534:18;;58102:74:0::1;12207:351:1::0;58102:74:0::1;58193:9;58189:102;58208:19:::0;;::::1;58189:102;;;58244:35;58254:8;;58263:1;58254:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;58267:8;;58276:1;58267:11;;;;;;;:::i;:::-;;;;;;;58244:9;:35::i;:::-;58229:3:::0;::::1;::::0;::::1;:::i;:::-;;;;58189:102;;;;57987:311:::0;;;;:::o;40330:206::-;40394:7;-1:-1:-1;;;;;40418:19:0;;40414:60;;40446:28;;-1:-1:-1;;;40446:28:0;;;;;;;;;;;40414:60;-1:-1:-1;;;;;;40500:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;40500:27:0;;40330:206::o;66304:103::-;66359:13;10166;:11;:13::i;:::-;66392:7:::1;66385:14;;;;;:::i;10928:103::-:0;10166:13;:11;:13::i;:::-;10993:30:::1;11020:1;10993:18;:30::i;57353:22::-:0;;;;;;;;;;;;65551:122;10166:13;:11;:13::i;:::-;65633:14:::1;:32:::0;65551:122::o;61080:267::-;61153:1;61129:21;61139:10;61129:9;:21::i;:::-;:25;61121:60;;;;-1:-1:-1;;;61121:60:0;;;;;;;:::i;:::-;61221:13;;61207:10;61200:18;;;;:6;:18;;;;;;:34;61192:43;;;;;;61246:5;:22;;;;;;;;;;;;-1:-1:-1;;;;;;61246:22:0;61257:10;61246:22;;;;;;-1:-1:-1;61279:18:0;;;:6;61246:22;61279:18;;;;:20;;;;;;:::i;:::-;;;;-1:-1:-1;;61324:10:0;61310:25;;;;:13;:25;;;;;61338:1;61310:29;;61080:267::o;65027:122::-;10166:13;:11;:13::i;:::-;65109:14:::1;:32:::0;65027:122::o;64735:116::-;10166:13;:11;:13::i;:::-;64817:11:::1;:26;64831:12:::0;64817:11;:26:::1;:::i;42673:104::-:0;42729:13;42762:7;42755:14;;;;;:::i;57324:22::-;;;;;;;;;;;;60520:267;60593:1;60569:21;60579:10;60569:9;:21::i;:::-;:25;60561:60;;;;-1:-1:-1;;;60561:60:0;;;;;;;:::i;:::-;60661:13;;60647:10;60640:18;;;;:6;:18;;;;;;:34;60632:43;;;;;;60686:5;:22;;;;;;;;;;;;-1:-1:-1;;;;;;60686:22:0;60697:10;60686:22;;;;;;-1:-1:-1;60719:18:0;;;:6;60686:22;60719:18;;;;:20;;;;;;:::i;:::-;;;;-1:-1:-1;;60764:10:0;60750:25;;;;:13;:25;;;;;60778:1;60750:29;;60520:267::o;58715:1518::-;58810:10;;58798:8;58782:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;58774:70;;;;-1:-1:-1;;;58774:70:0;;12895:2:1;58774:70:0;;;12877:21:1;12934:2;12914:18;;;12907:30;-1:-1:-1;;;12953:18:1;;;12946:50;13013:18;;58774:70:0;12693:344:1;58774:70:0;10353:6;;-1:-1:-1;;;;;10353:6:0;58861:10;:21;58857:1315;;58976:14;;58950:10;58934:27;;;;:15;:27;;;;;;;;;58907:24;;;;;;;58964:8;;58907:54;;;:::i;:::-;:65;;;;:::i;:::-;:83;;58899:120;;;;-1:-1:-1;;;58899:120:0;;13244:2:1;58899:120:0;;;13226:21:1;13283:2;13263:18;;;13256:30;13322:26;13302:18;;;13295:54;13366:18;;58899:120:0;13042:348:1;58899:120:0;59055:11;;59043:8;:23;;59034:58;;;;-1:-1:-1;;;59034:58:0;;13597:2:1;59034:58:0;;;13579:21:1;13636:2;13616:18;;;13609:30;-1:-1:-1;;;13655:18:1;;;13648:51;13716:18;;59034:58:0;13395:345:1;59034:58:0;59112:21;;;;;;;59109:1013;;;59159:25;59173:10;59159:13;:25::i;:::-;59151:53;;;;-1:-1:-1;;;59151:53:0;;13947:2:1;59151:53:0;;;13929:21:1;13986:2;13966:18;;;13959:30;-1:-1:-1;;;14005:18:1;;;13998:45;14060:18;;59151:53:0;13745:339:1;59151:53:0;59269:23;;59243:10;59227:27;;;;:15;:27;;;;;;:38;;59257:8;;59227:38;:::i;:::-;:65;;59219:112;;;;-1:-1:-1;;;59219:112:0;;14291:2:1;59219:112:0;;;14273:21:1;14330:2;14310:18;;;14303:30;14369:34;14349:18;;;14342:62;-1:-1:-1;;;14420:18:1;;;14413:32;14462:19;;59219:112:0;14089:398:1;59219:112:0;59383:14;;59371:8;59354:14;;:25;;;;:::i;:::-;:43;;59346:87;;;;-1:-1:-1;;;59346:87:0;;14694:2:1;59346:87:0;;;14676:21:1;14733:2;14713:18;;;14706:30;14772:33;14752:18;;;14745:61;14823:18;;59346:87:0;14492:355:1;59346:87:0;59479:8;59470:6;;:17;;;;:::i;:::-;59456:9;:32;;59448:64;;;;-1:-1:-1;;;59448:64:0;;15054:2:1;59448:64:0;;;15036:21:1;15093:2;15073:18;;;15066:30;-1:-1:-1;;;15112:18:1;;;15105:49;15171:18;;59448:64:0;14852:343:1;59448:64:0;59573:10;59557:27;;;;:15;:27;;;;;;:38;;59587:8;;59557:38;:::i;:::-;59543:10;59527:27;;;;:15;:27;;;;;:68;59627:14;;:25;;59644:8;;59627:25;:::i;:::-;59610:14;:42;59109:1013;;;59717:18;;;;59709:56;;;;-1:-1:-1;;;59709:56:0;;15402:2:1;59709:56:0;;;15384:21:1;15441:2;15421:18;;;15414:30;15480:27;15460:18;;;15453:55;15525:18;;59709:56:0;15200:349:1;59709:56:0;59813:20;;59801:8;59785:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:48;59782:242;;59889:8;59871:15;;:26;;;;:::i;:::-;59853:15;:44;59782:242;;;59975:8;59958:14;;:25;;;;:::i;:::-;59944:9;:40;;59936:72;;;;-1:-1:-1;;;59936:72:0;;15054:2:1;59936:72:0;;;15036:21:1;15093:2;15073:18;;;15066:30;-1:-1:-1;;;15112:18:1;;;15105:49;15171:18;;59936:72:0;14852:343:1;59936:72:0;60082:10;60069:24;;;;:12;:24;;;;;;:35;;60096:8;;60069:35;:::i;:::-;60055:10;60042:24;;;;:12;:24;;;;;:62;59109:1013;60184:31;60194:10;60206:8;60184:9;:31::i;62292:176::-;62396:8;4423:30;4444:8;4423:20;:30::i;:::-;62417:43:::1;62441:8;62451;62417:23;:43::i;57295:22::-:0;;;;;;;;;;;;65949:110;10166:13;:11;:13::i;:::-;66025:11:::1;:26:::0;65949:110::o;65681:146::-;10166:13;:11;:13::i;:::-;65775:20:::1;:44:::0;65681:146::o;57266:22::-;;;;;;;;;;;;62991:228;63142:4;-1:-1:-1;;;;;4243:18:0;;4251:10;4243:18;4239:83;;4278:32;4299:10;4278:20;:32::i;:::-;63164:47:::1;63187:4;63193:2;63197:7;63206:4;63164:22;:47::i;57382:37::-:0;;;;;;;;;;;;61919:365;61992:13;62023:16;62031:7;62023;:16::i;:::-;62018:59;;62048:29;;-1:-1:-1;;;62048:29:0;;;;;;;;;;;62018:59;62093:8;;;;;;;:17;;62105:5;62093:17;62090:66;;62130:14;62123:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61919:365;;;:::o;62090:66::-;62187:7;62181:21;;;;;:::i;:::-;;;62206:1;62181:26;:95;;;;;;;;;;;;;;;;;62234:7;62243:18;:7;:16;:18::i;:::-;62217:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62174:102;61919:365;-1:-1:-1;;61919:365:0:o;65255:122::-;10166:13;:11;:13::i;:::-;65337:14:::1;:32:::0;65255:122::o;61359:267::-;61432:1;61408:21;61418:10;61408:9;:21::i;:::-;:25;61400:60;;;;-1:-1:-1;;;61400:60:0;;;;;;;:::i;:::-;61500:13;;61486:10;61479:18;;;;:6;:18;;;;;;:34;61471:43;;;;;;61525:5;:22;;;;;;;;;;;;-1:-1:-1;;;;;;61525:22:0;61536:10;61525:22;;;;;;-1:-1:-1;61558:18:0;;;:6;61525:22;61558:18;;;;:20;;;;;;:::i;:::-;;;;-1:-1:-1;;61603:10:0;61589:25;;;;:13;:25;;;;;61617:1;61589:29;;61359:267::o;64121:222::-;10166:13;:11;:13::i;:::-;64201:18:::1;::::0;::::1;;:25;;:18;:25:::0;64198:138:::1;;64242:18;:25:::0;;-1:-1:-1;;64242:25:0::1;64263:4;64242:25;::::0;;64353:234::o;64198:138::-:1;64298:18;:26:::0;;-1:-1:-1;;64298:26:0::1;::::0;;64121:222::o;56580:25::-;;;;;;;:::i;65835:106::-;10166:13;:11;:13::i;:::-;65909:10:::1;:24:::0;65835:106::o;58306:154::-;10166:13;:11;:13::i;:::-;58385:27:::1;58392:20;;58385:27;:::i;:::-;58423:29;:20;58446:6:::0;;58423:29:::1;:::i;65157:90::-:0;10166:13;:11;:13::i;:::-;65223:6:::1;:16:::0;65157:90::o;64597:126::-;10166:13;:11;:13::i;:::-;64683:14:::1;:32;64700:15:::0;64683:14;:32:::1;:::i;11186:201::-:0;10166:13;:11;:13::i;:::-;-1:-1:-1;;;;;11275:22:0;::::1;11267:73;;;::::0;-1:-1:-1;;;11267:73:0;;16948:2:1;11267:73:0::1;::::0;::::1;16930:21:1::0;16987:2;16967:18;;;16960:30;17026:34;17006:18;;;16999:62;-1:-1:-1;;;17077:18:1;;;17070:36;17123:19;;11267:73:0::1;16746:402:1::0;11267:73:0::1;11351:28;11370:8;11351:18;:28::i;39894:372::-:0;39996:4;-1:-1:-1;;;;;;40033:40:0;;-1:-1:-1;;;40033:40:0;;:105;;-1:-1:-1;;;;;;;40090:48:0;;-1:-1:-1;;;40090:48:0;40033:105;:172;;;-1:-1:-1;;;;;;;40155:50:0;;-1:-1:-1;;;40155:50:0;40033:172;:225;;;-1:-1:-1;;;;;;;;;;23282:40:0;;;40222:36;23173:157;24684:215;24786:4;-1:-1:-1;;;;;;24810:41:0;;-1:-1:-1;;;24810:41:0;;:81;;;24855:36;24879:11;24855:23;:36::i;10445:132::-;10353:6;;-1:-1:-1;;;;;10353:6:0;8810:10;10509:23;10501:68;;;;-1:-1:-1;;;10501:68:0;;17355:2:1;10501:68:0;;;17337:21:1;;;17374:18;;;17367:30;17433:34;17413:18;;;17406:62;17485:18;;10501:68:0;17153:356:1;26046:332:0;25762:5;-1:-1:-1;;;;;26149:33:0;;;;26141:88;;;;-1:-1:-1;;;26141:88:0;;17716:2:1;26141:88:0;;;17698:21:1;17755:2;17735:18;;;17728:30;17794:34;17774:18;;;17767:62;-1:-1:-1;;;17845:18:1;;;17838:40;17895:19;;26141:88:0;17514:406:1;26141:88:0;-1:-1:-1;;;;;26248:22:0;;26240:60;;;;-1:-1:-1;;;26240:60:0;;18127:2:1;26240:60:0;;;18109:21:1;18166:2;18146:18;;;18139:30;18205:27;18185:18;;;18178:55;18250:18;;26240:60:0;17925:349:1;26240:60:0;26335:35;;;;;;;;;-1:-1:-1;;;;;26335:35:0;;;;;;-1:-1:-1;;;;;26335:35:0;;;;;;;;;;-1:-1:-1;;;26313:57:0;;;;:19;:57;26046:332::o;45974:144::-;46031:4;46065:13;;-1:-1:-1;;;;;46065:13:0;46055:23;;:55;;;;-1:-1:-1;;46083:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;46083:27:0;;;;46082:28;;45974:144::o;4481:419::-;3002:42;4672:45;:49;4668:225;;4743:67;;-1:-1:-1;;;4743:67:0;;4794:4;4743:67;;;18491:34:1;-1:-1:-1;;;;;18561:15:1;;18541:18;;;18534:43;3002:42:0;;4743;;18426:18:1;;4743:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4738:144;;4838:28;;-1:-1:-1;;;4838:28:0;;-1:-1:-1;;;;;2246:32:1;;4838:28:0;;;2228:51:1;2201:18;;4838:28:0;2082:203:1;43570:379:0;43651:13;43667:24;43683:7;43667:15;:24::i;:::-;43651:40;;43712:5;-1:-1:-1;;;;;43706:11:0;:2;-1:-1:-1;;;;;43706:11:0;;43702:48;;43726:24;;-1:-1:-1;;;43726:24:0;;;;;;;;;;;43702:48;8810:10;-1:-1:-1;;;;;43767:21:0;;;;;;:63;;-1:-1:-1;43793:37:0;43810:5;8810:10;44649:164;:::i;43793:37::-;43792:38;43767:63;43763:138;;;43854:35;;-1:-1:-1;;;43854:35:0;;;;;;;;;;;43763:138;43913:28;43922:2;43926:7;43935:5;43913:8;:28::i;44880:170::-;45014:28;45024:4;45030:2;45034:7;45014:9;:28::i;45121:185::-;45259:39;45276:4;45282:2;45286:7;45259:39;;;;;;;;;;;;:16;:39::i;41168:1083::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;41334:13:0;;41278:7;;-1:-1:-1;;;;;41334:13:0;41327:20;;41323:861;;;41368:31;41402:17;;;:11;:17;;;;;;;;;41368:51;;;;;;;;;-1:-1:-1;;;;;41368:51:0;;;;-1:-1:-1;;;41368:51:0;;-1:-1:-1;;;;;41368:51:0;;;;;;;;-1:-1:-1;;;41368:51:0;;;;;;;;;;;;;;41438:731;;41488:14;;-1:-1:-1;;;;;41488:28:0;;41484:101;;41552:9;41168:1083;-1:-1:-1;;;41168:1083:0:o;41484:101::-;-1:-1:-1;;;41929:6:0;41974:17;;;;:11;:17;;;;;;;;;41962:29;;;;;;;;;-1:-1:-1;;;;;41962:29:0;;;;;-1:-1:-1;;;41962:29:0;;-1:-1:-1;;;;;41962:29:0;;;;;;;;-1:-1:-1;;;41962:29:0;;;;;;;;;;;;;42022:28;42018:109;;42090:9;41168:1083;-1:-1:-1;;;41168:1083:0:o;42018:109::-;41889:261;;;41349:835;41323:861;42212:31;;-1:-1:-1;;;42212:31:0;;;;;;;;;;;46126:104;46195:27;46205:2;46209:8;46195:27;;;;;;;;;;;;:9;:27::i;11547:191::-;11640:6;;;-1:-1:-1;;;;;11657:17:0;;;-1:-1:-1;;;;;;11657:17:0;;;;;;;11690:40;;11640:6;;;11657:17;11640:6;;11690:40;;11621:16;;11690:40;11610:128;11547:191;:::o;44291:287::-;8810:10;-1:-1:-1;;;;;44390:24:0;;;44386:54;;44423:17;;-1:-1:-1;;;44423:17:0;;;;;;;;;;;44386:54;8810:10;44453:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;44453:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;44453:53:0;;;;;;;;;;44522:48;;540:41:1;;;44453:42:0;;8810:10;44522:48;;513:18:1;44522:48:0;;;;;;;44291:287;;:::o;45377:342::-;45544:28;45554:4;45560:2;45564:7;45544:9;:28::i;:::-;45588:48;45611:4;45617:2;45621:7;45630:5;45588:22;:48::i;:::-;45583:129;;45660:40;;-1:-1:-1;;;45660:40:0;;;;;;;;;;;7374:751;7430:13;7651:5;7660:1;7651:10;7647:53;;-1:-1:-1;;7678:10:0;;;;;;;;;;;;-1:-1:-1;;;7678:10:0;;;;;7374:751::o;7647:53::-;7725:5;7710:12;7766:78;7773:9;;7766:78;;7799:8;;;;:::i;:::-;;-1:-1:-1;7822:10:0;;-1:-1:-1;7830:2:0;7822:10;;:::i;:::-;;;7766:78;;;7854:19;7886:6;-1:-1:-1;;;;;7876:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7876:17:0;-1:-1:-1;7944:5:0;;-1:-1:-1;7854:39:0;-1:-1:-1;7920:6:0;7960:126;7967:9;;7960:126;;8037:9;8044:2;8037:4;:9;:::i;:::-;8024:23;;:2;:23;:::i;:::-;8011:38;;7993:6;8000:7;;;:::i;:::-;;;;7993:15;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;7993:56:0;;;;;;;;-1:-1:-1;8064:10:0;8072:2;8064:10;;:::i;:::-;;;7960:126;;;-1:-1:-1;8110:6:0;7374:751;-1:-1:-1;;;;7374:751:0:o;53190:196::-;53305:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;53305:29:0;-1:-1:-1;;;;;53305:29:0;;;;;;;;;53350:28;;53305:24;;53350:28;;;;;;;53190:196;;;:::o;48691:2112::-;48806:35;48844:20;48856:7;48844:11;:20::i;:::-;48919:18;;48806:58;;-1:-1:-1;48877:22:0;;-1:-1:-1;;;;;48903:34:0;8810:10;-1:-1:-1;;;;;48903:34:0;;:101;;;-1:-1:-1;48971:18:0;;48954:50;;8810:10;44649:164;:::i;48954:50::-;48903:154;;;-1:-1:-1;8810:10:0;49021:20;49033:7;49021:11;:20::i;:::-;-1:-1:-1;;;;;49021:36:0;;48903:154;48877:181;;49076:17;49071:66;;49102:35;;-1:-1:-1;;;49102:35:0;;;;;;;;;;;49071:66;49174:4;-1:-1:-1;;;;;49152:26:0;:13;:18;;;-1:-1:-1;;;;;49152:26:0;;49148:67;;49187:28;;-1:-1:-1;;;49187:28:0;;;;;;;;;;;49148:67;-1:-1:-1;;;;;49230:16:0;;49226:52;;49255:23;;-1:-1:-1;;;49255:23:0;;;;;;;;;;;49226:52;49399:49;49416:1;49420:7;49429:13;:18;;;49399:8;:49::i;:::-;-1:-1:-1;;;;;49744:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;49744:31:0;;;-1:-1:-1;;;;;49744:31:0;;;-1:-1:-1;;49744:31:0;;;;;;;49790:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;49790:29:0;;;;;;;;;;;49836:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;49881:61:0;;;;-1:-1:-1;;;49926:15:0;49881:61;;;;;;;;;;;50216:11;;;50246:24;;;;;:29;50216:11;;50246:29;50242:445;;50471:13;;-1:-1:-1;;;;;50471:13:0;50457:27;;50453:219;;;50541:18;;;50509:24;;;:11;:24;;;;;;;;:50;;50624:28;;;;-1:-1:-1;;;;;50582:70:0;-1:-1:-1;;;50582:70:0;-1:-1:-1;;;;;;50582:70:0;;;-1:-1:-1;;;;;50509:50:0;;;50582:70;;;;;;;50453:219;49719:979;50734:7;50730:2;-1:-1:-1;;;;;50715:27:0;50724:4;-1:-1:-1;;;;;50715:27:0;;;;;;;;;;;50753:42;62641:163;46593;46716:32;46722:2;46726:8;46736:5;46743:4;46716:5;:32::i;53951:790::-;54106:4;-1:-1:-1;;;;;54127:13:0;;12846:20;12885:8;54123:611;;54163:72;;-1:-1:-1;;;54163:72:0;;-1:-1:-1;;;;;54163:36:0;;;;;:72;;8810:10;;54214:4;;54220:7;;54229:5;;54163:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54163:72:0;;;;;;;;-1:-1:-1;;54163:72:0;;;;;;;;;;;;:::i;:::-;;;54159:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54409:6;:13;54426:1;54409:18;54405:259;;54459:40;;-1:-1:-1;;;54459:40:0;;;;;;;;;;;54405:259;54614:6;54608:13;54599:6;54595:2;54591:15;54584:38;54159:520;-1:-1:-1;;;;;;54286:55:0;-1:-1:-1;;;54286:55:0;;-1:-1:-1;54279:62:0;;54123:611;-1:-1:-1;54718:4:0;54123:611;53951:790;;;;;;:::o;47015:1422::-;47154:20;47177:13;-1:-1:-1;;;;;47177:13:0;-1:-1:-1;;;;;47205:16:0;;47201:48;;47230:19;;-1:-1:-1;;;47230:19:0;;;;;;;;;;;47201:48;47264:8;47276:1;47264:13;47260:44;;47286:18;;-1:-1:-1;;;47286:18:0;;;;;;;;;;;47260:44;-1:-1:-1;;;;;47656:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;;;;;47715:49:0;;-1:-1:-1;;;;;47656:44:0;;;;;;;47715:49;;;;-1:-1:-1;;47656:44:0;;;;;;47715:49;;;;;;;;;;;;;;;;47781:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;47831:66:0;;;;-1:-1:-1;;;47881:15:0;47831:66;;;;;;;;;;;47781:25;;47966:328;47986:8;47982:1;:12;47966:328;;;48025:38;;48050:12;;-1:-1:-1;;;;;48025:38:0;;;48042:1;;48025:38;;48042:1;;48025:38;48086:4;:68;;;;;48095:59;48126:1;48130:2;48134:12;48148:5;48095:22;:59::i;:::-;48094:60;48086:68;48082:164;;;48186:40;;-1:-1:-1;;;48186:40:0;;;;;;;;;;;48082:164;48264:14;;;;;47996:3;47966:328;;;-1:-1:-1;48310:13:0;:37;;-1:-1:-1;;;;;;48310:37:0;-1:-1:-1;;;;;48310:37:0;;;;;;;;;;48369:60;62641:163;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:173::-;660:20;;-1:-1:-1;;;;;709:31:1;;699:42;;689:70;;755:1;752;745:12;689:70;592:173;;;:::o;770:366::-;837:6;845;898:2;886:9;877:7;873:23;869:32;866:52;;;914:1;911;904:12;866:52;937:29;956:9;937:29;:::i;:::-;927:39;;1016:2;1005:9;1001:18;988:32;-1:-1:-1;;;;;1053:5:1;1049:38;1042:5;1039:49;1029:77;;1102:1;1099;1092:12;1029:77;1125:5;1115:15;;;770:366;;;;;:::o;1141:250::-;1226:1;1236:113;1250:6;1247:1;1244:13;1236:113;;;1326:11;;;1320:18;1307:11;;;1300:39;1272:2;1265:10;1236:113;;;-1:-1:-1;;1383:1:1;1365:16;;1358:27;1141:250::o;1396:271::-;1438:3;1476:5;1470:12;1503:6;1498:3;1491:19;1519:76;1588:6;1581:4;1576:3;1572:14;1565:4;1558:5;1554:16;1519:76;:::i;:::-;1649:2;1628:15;-1:-1:-1;;1624:29:1;1615:39;;;;1656:4;1611:50;;1396:271;-1:-1:-1;;1396:271:1:o;1672:220::-;1821:2;1810:9;1803:21;1784:4;1841:45;1882:2;1871:9;1867:18;1859:6;1841:45;:::i;1897:180::-;1956:6;2009:2;1997:9;1988:7;1984:23;1980:32;1977:52;;;2025:1;2022;2015:12;1977:52;-1:-1:-1;2048:23:1;;1897:180;-1:-1:-1;1897:180:1:o;2290:254::-;2358:6;2366;2419:2;2407:9;2398:7;2394:23;2390:32;2387:52;;;2435:1;2432;2425:12;2387:52;2458:29;2477:9;2458:29;:::i;:::-;2448:39;2534:2;2519:18;;;;2506:32;;-1:-1:-1;;;2290:254:1:o;2549:186::-;2608:6;2661:2;2649:9;2640:7;2636:23;2632:32;2629:52;;;2677:1;2674;2667:12;2629:52;2700:29;2719:9;2700:29;:::i;2922:328::-;2999:6;3007;3015;3068:2;3056:9;3047:7;3043:23;3039:32;3036:52;;;3084:1;3081;3074:12;3036:52;3107:29;3126:9;3107:29;:::i;:::-;3097:39;;3155:38;3189:2;3178:9;3174:18;3155:38;:::i;:::-;3145:48;;3240:2;3229:9;3225:18;3212:32;3202:42;;2922:328;;;;;:::o;3255:248::-;3323:6;3331;3384:2;3372:9;3363:7;3359:23;3355:32;3352:52;;;3400:1;3397;3390:12;3352:52;-1:-1:-1;;3423:23:1;;;3493:2;3478:18;;;3465:32;;-1:-1:-1;3255:248:1:o;4026:127::-;4087:10;4082:3;4078:20;4075:1;4068:31;4118:4;4115:1;4108:15;4142:4;4139:1;4132:15;4158:632;4223:5;-1:-1:-1;;;;;4294:2:1;4286:6;4283:14;4280:40;;;4300:18;;:::i;:::-;4375:2;4369:9;4343:2;4429:15;;-1:-1:-1;;4425:24:1;;;4451:2;4421:33;4417:42;4405:55;;;4475:18;;;4495:22;;;4472:46;4469:72;;;4521:18;;:::i;:::-;4561:10;4557:2;4550:22;4590:6;4581:15;;4620:6;4612;4605:22;4660:3;4651:6;4646:3;4642:16;4639:25;4636:45;;;4677:1;4674;4667:12;4636:45;4727:6;4722:3;4715:4;4707:6;4703:17;4690:44;4782:1;4775:4;4766:6;4758;4754:19;4750:30;4743:41;;;;4158:632;;;;;:::o;4795:451::-;4864:6;4917:2;4905:9;4896:7;4892:23;4888:32;4885:52;;;4933:1;4930;4923:12;4885:52;4973:9;4960:23;-1:-1:-1;;;;;4998:6:1;4995:30;4992:50;;;5038:1;5035;5028:12;4992:50;5061:22;;5114:4;5106:13;;5102:27;-1:-1:-1;5092:55:1;;5143:1;5140;5133:12;5092:55;5166:74;5232:7;5227:2;5214:16;5209:2;5205;5201:11;5166:74;:::i;5251:367::-;5314:8;5324:6;5378:3;5371:4;5363:6;5359:17;5355:27;5345:55;;5396:1;5393;5386:12;5345:55;-1:-1:-1;5419:20:1;;-1:-1:-1;;;;;5451:30:1;;5448:50;;;5494:1;5491;5484:12;5448:50;5531:4;5523:6;5519:17;5507:29;;5591:3;5584:4;5574:6;5571:1;5567:14;5559:6;5555:27;5551:38;5548:47;5545:67;;;5608:1;5605;5598:12;5623:773;5745:6;5753;5761;5769;5822:2;5810:9;5801:7;5797:23;5793:32;5790:52;;;5838:1;5835;5828:12;5790:52;5878:9;5865:23;-1:-1:-1;;;;;5948:2:1;5940:6;5937:14;5934:34;;;5964:1;5961;5954:12;5934:34;6003:70;6065:7;6056:6;6045:9;6041:22;6003:70;:::i;:::-;6092:8;;-1:-1:-1;5977:96:1;-1:-1:-1;6180:2:1;6165:18;;6152:32;;-1:-1:-1;6196:16:1;;;6193:36;;;6225:1;6222;6215:12;6193:36;;6264:72;6328:7;6317:8;6306:9;6302:24;6264:72;:::i;:::-;5623:773;;;;-1:-1:-1;6355:8:1;-1:-1:-1;;;;5623:773:1:o;6401:118::-;6487:5;6480:13;6473:21;6466:5;6463:32;6453:60;;6509:1;6506;6499:12;6524:315;6589:6;6597;6650:2;6638:9;6629:7;6625:23;6621:32;6618:52;;;6666:1;6663;6656:12;6618:52;6689:29;6708:9;6689:29;:::i;:::-;6679:39;;6768:2;6757:9;6753:18;6740:32;6781:28;6803:5;6781:28;:::i;6844:667::-;6939:6;6947;6955;6963;7016:3;7004:9;6995:7;6991:23;6987:33;6984:53;;;7033:1;7030;7023:12;6984:53;7056:29;7075:9;7056:29;:::i;:::-;7046:39;;7104:38;7138:2;7127:9;7123:18;7104:38;:::i;:::-;7094:48;;7189:2;7178:9;7174:18;7161:32;7151:42;;7244:2;7233:9;7229:18;7216:32;-1:-1:-1;;;;;7263:6:1;7260:30;7257:50;;;7303:1;7300;7293:12;7257:50;7326:22;;7379:4;7371:13;;7367:27;-1:-1:-1;7357:55:1;;7408:1;7405;7398:12;7357:55;7431:74;7497:7;7492:2;7479:16;7474:2;7470;7466:11;7431:74;:::i;:::-;7421:84;;;6844:667;;;;;;;:::o;7516:260::-;7584:6;7592;7645:2;7633:9;7624:7;7620:23;7616:32;7613:52;;;7661:1;7658;7651:12;7613:52;7684:29;7703:9;7684:29;:::i;:::-;7674:39;;7732:38;7766:2;7755:9;7751:18;7732:38;:::i;:::-;7722:48;;7516:260;;;;;:::o;7781:437::-;7867:6;7875;7928:2;7916:9;7907:7;7903:23;7899:32;7896:52;;;7944:1;7941;7934:12;7896:52;7984:9;7971:23;-1:-1:-1;;;;;8009:6:1;8006:30;8003:50;;;8049:1;8046;8039:12;8003:50;8088:70;8150:7;8141:6;8130:9;8126:22;8088:70;:::i;:::-;8177:8;;8062:96;;-1:-1:-1;7781:437:1;-1:-1:-1;;;;7781:437:1:o;8223:346::-;8425:2;8407:21;;;8464:2;8444:18;;;8437:30;-1:-1:-1;;;8498:2:1;8483:18;;8476:52;8560:2;8545:18;;8223:346::o;8574:127::-;8635:10;8630:3;8626:20;8623:1;8616:31;8666:4;8663:1;8656:15;8690:4;8687:1;8680:15;8706:135;8745:3;8766:17;;;8763:43;;8786:18;;:::i;:::-;-1:-1:-1;8833:1:1;8822:13;;8706:135::o;8846:380::-;8925:1;8921:12;;;;8968;;;8989:61;;9043:4;9035:6;9031:17;9021:27;;8989:61;9096:2;9088:6;9085:14;9065:18;9062:38;9059:161;;9142:10;9137:3;9133:20;9130:1;9123:31;9177:4;9174:1;9167:15;9205:4;9202:1;9195:15;9059:161;;8846:380;;;:::o;9231:168::-;9304:9;;;9335;;9352:15;;;9346:22;;9332:37;9322:71;;9373:18;;:::i;9404:127::-;9465:10;9460:3;9456:20;9453:1;9446:31;9496:4;9493:1;9486:15;9520:4;9517:1;9510:15;9536:120;9576:1;9602;9592:35;;9607:18;;:::i;:::-;-1:-1:-1;9641:9:1;;9536:120::o;9661:127::-;9722:10;9717:3;9713:20;9710:1;9703:31;9753:4;9750:1;9743:15;9777:4;9774:1;9767:15;10129:545;10231:2;10226:3;10223:11;10220:448;;;10267:1;10292:5;10288:2;10281:17;10337:4;10333:2;10323:19;10407:2;10395:10;10391:19;10388:1;10384:27;10378:4;10374:38;10443:4;10431:10;10428:20;10425:47;;;-1:-1:-1;10466:4:1;10425:47;10521:2;10516:3;10512:12;10509:1;10505:20;10499:4;10495:31;10485:41;;10576:82;10594:2;10587:5;10584:13;10576:82;;;10639:17;;;10620:1;10609:13;10576:82;;;10580:3;;;10129:545;;;:::o;10850:1352::-;10976:3;10970:10;-1:-1:-1;;;;;10995:6:1;10992:30;10989:56;;;11025:18;;:::i;:::-;11054:97;11144:6;11104:38;11136:4;11130:11;11104:38;:::i;:::-;11098:4;11054:97;:::i;:::-;11206:4;;11270:2;11259:14;;11287:1;11282:663;;;;11989:1;12006:6;12003:89;;;-1:-1:-1;12058:19:1;;;12052:26;12003:89;-1:-1:-1;;10807:1:1;10803:11;;;10799:24;10795:29;10785:40;10831:1;10827:11;;;10782:57;12105:81;;11252:944;;11282:663;10076:1;10069:14;;;10113:4;10100:18;;-1:-1:-1;;11318:20:1;;;11436:236;11450:7;11447:1;11444:14;11436:236;;;11539:19;;;11533:26;11518:42;;11631:27;;;;11599:1;11587:14;;;;11466:19;;11436:236;;;11440:3;11700:6;11691:7;11688:19;11685:201;;;11761:19;;;11755:26;-1:-1:-1;;11844:1:1;11840:14;;;11856:3;11836:24;11832:37;11828:42;11813:58;11798:74;;11685:201;-1:-1:-1;;;;;11932:1:1;11916:14;;;11912:22;11899:36;;-1:-1:-1;10850:1352:1:o;12563:125::-;12628:9;;;12649:10;;;12646:36;;;12662:18;;:::i;15554:1187::-;15831:3;15860:1;15893:6;15887:13;15923:36;15949:9;15923:36;:::i;:::-;15978:1;15995:18;;;16022:133;;;;16169:1;16164:356;;;;15988:532;;16022:133;-1:-1:-1;;16055:24:1;;16043:37;;16128:14;;16121:22;16109:35;;16100:45;;;-1:-1:-1;16022:133:1;;16164:356;16195:6;16192:1;16185:17;16225:4;16270:2;16267:1;16257:16;16295:1;16309:165;16323:6;16320:1;16317:13;16309:165;;;16401:14;;16388:11;;;16381:35;16444:16;;;;16338:10;;16309:165;;;16313:3;;;16503:6;16498:3;16494:16;16487:23;;15988:532;;;;;16551:6;16545:13;16567:68;16626:8;16621:3;16614:4;16606:6;16602:17;16567:68;:::i;:::-;-1:-1:-1;;;16657:18:1;;16684:22;;;16733:1;16722:13;;15554:1187;-1:-1:-1;;;;15554:1187:1:o;18588:245::-;18655:6;18708:2;18696:9;18687:7;18683:23;18679:32;18676:52;;;18724:1;18721;18714:12;18676:52;18756:9;18750:16;18775:28;18797:5;18775:28;:::i;18838:112::-;18870:1;18896;18886:35;;18901:18;;:::i;:::-;-1:-1:-1;18935:9:1;;18838:112::o;18955:136::-;18994:3;19022:5;19012:39;;19031:18;;:::i;:::-;-1:-1:-1;;;19067:18:1;;18955:136::o;19096:489::-;-1:-1:-1;;;;;19365:15:1;;;19347:34;;19417:15;;19412:2;19397:18;;19390:43;19464:2;19449:18;;19442:34;;;19512:3;19507:2;19492:18;;19485:31;;;19290:4;;19533:46;;19559:19;;19551:6;19533:46;:::i;:::-;19525:54;19096:489;-1:-1:-1;;;;;;19096:489:1:o;19590:249::-;19659:6;19712:2;19700:9;19691:7;19687:23;19683:32;19680:52;;;19728:1;19725;19718:12;19680:52;19760:9;19754:16;19779:30;19803:5;19779:30;:::i

Swarm Source

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