ETH Price: $2,113.20 (+4.25%)

Token

Plague (PLAGUE)
 

Overview

Max Total Supply

3,636 PLAGUE

Holders

1,347

Transfers

-
47 ( -16.07%)

Market

Volume (24H)

0.0299 ETH

Min Price (24H)

$2.32 @ 0.001100 ETH

Max Price (24H)

$7.82 @ 0.003700 ETH

Other Info

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:
Plague

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 1 runs

Other Settings:
default evmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2026-03-03
*/

// File: erc721a/contracts/IERC721A.sol
    
    
    // ERC721A Contracts v4.2.3
    // Creator: Chiru Labs
    
    pragma solidity ^0.8.4;
    
    /**
     * @dev Interface of ERC721A.
     */
    interface IERC721A {
        /**
         * The caller must own the token or be an approved operator.
         */
        error ApprovalCallerNotOwnerNorApproved();
    
        /**
         * The token does not exist.
         */
        error ApprovalQueryForNonexistentToken();
    
        /**
         * Cannot query the balance for the zero address.
         */
        error BalanceQueryForZeroAddress();
    
        /**
         * Cannot mint to the zero address.
         */
        error MintToZeroAddress();
    
        /**
         * The quantity of tokens minted must be more than zero.
         */
        error MintZeroQuantity();
    
        /**
         * The token does not exist.
         */
        error OwnerQueryForNonexistentToken();
    
        /**
         * The caller must own the token or be an approved operator.
         */
        error TransferCallerNotOwnerNorApproved();
    
        /**
         * The token must be owned by 'from'.
         */
        error TransferFromIncorrectOwner();
    
        /**
         * Cannot safely transfer to a contract that does not implement the
         * ERC721Receiver interface.
         */
        error TransferToNonERC721ReceiverImplementer();
    
        /**
         * Cannot transfer to the zero address.
         */
        error TransferToZeroAddress();
    
        /**
         * The token does not exist.
         */
        error URIQueryForNonexistentToken();
    
        /**
         * The 'quantity' minted with ERC2309 exceeds the safety limit.
         */
        error MintERC2309QuantityExceedsLimit();
    
        /**
         * The 'extraData' cannot be set on an unintialized ownership slot.
         */
        error OwnershipNotInitializedForExtraData();
    
        // =============================================================
        //                            STRUCTS
        // =============================================================
    
        struct TokenOwnership {
            // The address of the owner.
            address addr;
            // Stores the start time of ownership with minimal overhead for tokenomics.
            uint64 startTimestamp;
            // Whether the token has been burned.
            bool burned;
            // Arbitrary data similar to 'startTimestamp' that can be set via {_extraData}.
            uint24 extraData;
        }
    
        // =============================================================
        //                         TOKEN COUNTERS
        // =============================================================
    
        /**
         * @dev Returns the total number of tokens in existence.
         * Burned tokens will reduce the count.
         * To get the total number of tokens minted, please see {_totalMinted}.
         */
        function totalSupply() external view returns (uint256);
    
        // =============================================================
        //                            IERC165
        // =============================================================
    
        /**
         * @dev Returns true if this contract implements the interface defined by
         * 'interfaceId'. See the corresponding
         * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
         * to learn more about how these ids are created.
         *
         * This function call must use less than 30000 gas.
         */
        function supportsInterface(bytes4 interfaceId) external view returns (bool);
    
        // =============================================================
        //                            IERC721
        // =============================================================
    
        /**
         * @dev Emitted when 'tokenId' token is transferred from 'from' to 'to'.
         */
        event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    
        /**
         * @dev Emitted when 'owner' enables 'approved' to manage the 'tokenId' token.
         */
        event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    
        /**
         * @dev Emitted when 'owner' enables or disables
         * ('approved') 'operator' to manage all of its assets.
         */
        event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    
        /**
         * @dev Returns the number of tokens in 'owner''s account.
         */
        function balanceOf(address owner) external view returns (uint256 balance);
    
        /**
         * @dev Returns the owner of the 'tokenId' token.
         *
         * Requirements:
         *
         * - 'tokenId' must exist.
         */
        function ownerOf(uint256 tokenId) external view returns (address owner);
    
        /**
         * @dev Safely transfers 'tokenId' token from 'from' to 'to',
         * checking first that contract recipients are aware of the ERC721 protocol
         * to prevent tokens from being forever locked.
         *
         * Requirements:
         *
         * - 'from' cannot be the zero address.
         * - 'to' cannot be the zero address.
         * - 'tokenId' token must exist and be owned by 'from'.
         * - If the caller is not 'from', it must be have been allowed to move
         * this token by either {approve} or {setApprovalForAll}.
         * - If 'to' refers to a smart contract, it must implement
         * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
         *
         * Emits a {Transfer} event.
         */
        function safeTransferFrom(
            address from,
            address to,
            uint256 tokenId,
            bytes calldata data
        ) external payable;
    
        /**
         * @dev Equivalent to 'safeTransferFrom(from, to, tokenId, '')'.
         */
        function safeTransferFrom(
            address from,
            address to,
            uint256 tokenId
        ) external payable;
    
        /**
         * @dev Transfers 'tokenId' from 'from' to 'to'.
         *
         * WARNING: Usage of this method is discouraged, use {safeTransferFrom}
         * whenever possible.
         *
         * Requirements:
         *
         * - 'from' cannot be the zero address.
         * - 'to' cannot be the zero address.
         * - 'tokenId' token must be owned by 'from'.
         * - If the caller is not 'from', it must be approved to move this token
         * by either {approve} or {setApprovalForAll}.
         *
         * Emits a {Transfer} event.
         */
        function transferFrom(
            address from,
            address to,
            uint256 tokenId
        ) external payable;
    
        /**
         * @dev Gives permission to 'to' to transfer 'tokenId' token to another account.
         * The approval is cleared when the token is transferred.
         *
         * Only a single account can be approved at a time, so approving the
         * zero address clears previous approvals.
         *
         * Requirements:
         *
         * - The caller must own the token or be an approved operator.
         * - 'tokenId' must exist.
         *
         * Emits an {Approval} event.
         */
        function approve(address to, uint256 tokenId) external payable;
    
        /**
         * @dev Approve or remove 'operator' as an operator for the caller.
         * Operators can call {transferFrom} or {safeTransferFrom}
         * for any token owned by the caller.
         *
         * Requirements:
         *
         * - The 'operator' cannot be the caller.
         *
         * Emits an {ApprovalForAll} event.
         */
        function setApprovalForAll(address operator, bool _approved) external;
    
        /**
         * @dev Returns the account approved for 'tokenId' token.
         *
         * Requirements:
         *
         * - 'tokenId' must exist.
         */
        function getApproved(uint256 tokenId) external view returns (address operator);
    
        /**
         * @dev Returns if the 'operator' is allowed to manage all of the assets of 'owner'.
         *
         * See {setApprovalForAll}.
         */
        function isApprovedForAll(address owner, address operator) external view returns (bool);
    
        // =============================================================
        //                        IERC721Metadata
        // =============================================================
    
        /**
         * @dev Returns the token collection name.
         */
        function name() external view returns (string memory);
    
        /**
         * @dev Returns the token collection symbol.
         */
        function symbol() external view returns (string memory);
    
        /**
         * @dev Returns the Uniform Resource Identifier (URI) for 'tokenId' token.
         */
        function tokenURI(uint256 tokenId) external view returns (string memory);
    
        // =============================================================
        //                           IERC2309
        // =============================================================
    
        /**
         * @dev Emitted when tokens in 'fromTokenId' to 'toTokenId'
         * (inclusive) is transferred from 'from' to 'to', as defined in the
         * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
         *
         * See {_mintERC2309} for more details.
         */
        event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
    }
    
    // File: erc721a/contracts/ERC721A.sol
    
    
    // ERC721A Contracts v4.2.3
    // Creator: Chiru Labs
    
    pragma solidity ^0.8.4;
    
    
    /**
     * @dev Interface of ERC721 token receiver.
     */
    interface ERC721A__IERC721Receiver {
        function onERC721Received(
            address operator,
            address from,
            uint256 tokenId,
            bytes calldata data
        ) external returns (bytes4);
    }
    
    /**
     * @title ERC721A
     *
     * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
     * Non-Fungible Token Standard, including the Metadata extension.
     * Optimized for lower gas during batch mints.
     *
     * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
     * starting from '_startTokenId()'.
     *
     * Assumptions:
     *
     * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
     * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
     */
    contract ERC721A is IERC721A {
        // Bypass for a '--via-ir' bug (https://github.com/chiru-labs/ERC721A/pull/364).
        struct TokenApprovalRef {
            address value;
        }
    
        // =============================================================
        //                           CONSTANTS
        // =============================================================
    
        // Mask of an entry in packed address data.
        uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;
    
        // The bit position of 'numberMinted' in packed address data.
        uint256 private constant _BITPOS_NUMBER_MINTED = 64;
    
        // The bit position of 'numberBurned' in packed address data.
        uint256 private constant _BITPOS_NUMBER_BURNED = 128;
    
        // The bit position of 'aux' in packed address data.
        uint256 private constant _BITPOS_AUX = 192;
    
        // Mask of all 256 bits in packed address data except the 64 bits for 'aux'.
        uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;
    
        // The bit position of 'startTimestamp' in packed ownership.
        uint256 private constant _BITPOS_START_TIMESTAMP = 160;
    
        // The bit mask of the 'burned' bit in packed ownership.
        uint256 private constant _BITMASK_BURNED = 1 << 224;
    
        // The bit position of the 'nextInitialized' bit in packed ownership.
        uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;
    
        // The bit mask of the 'nextInitialized' bit in packed ownership.
        uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;
    
        // The bit position of 'extraData' in packed ownership.
        uint256 private constant _BITPOS_EXTRA_DATA = 232;
    
        // Mask of all 256 bits in a packed ownership except the 24 bits for 'extraData'.
        uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;
    
        // The mask of the lower 160 bits for addresses.
        uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;
    
        // The maximum 'quantity' that can be minted with {_mintERC2309}.
        // This limit is to prevent overflows on the address data entries.
        // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
        // is required to cause an overflow, which is unrealistic.
        uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;
    
        // The 'Transfer' event signature is given by:
        // 'keccak256(bytes("Transfer(address,address,uint256)"))'.
        bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
            0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;
    
        // =============================================================
        //                            STORAGE
        // =============================================================
    
        // The next token ID to be minted.
        uint256 private _currentIndex;
    
        // The number of tokens burned.
        uint256 private _burnCounter;
    
        // Token name
        string private _name;
    
        // Token symbol
        string private _symbol;
    
        // Mapping from token ID to ownership details
        // An empty struct value does not necessarily mean the token is unowned.
        // See {_packedOwnershipOf} implementation for details.
        //
        // Bits Layout:
        // - [0..159]   'addr'
        // - [160..223] 'startTimestamp'
        // - [224]      'burned'
        // - [225]      'nextInitialized'
        // - [232..255] 'extraData'
        mapping(uint256 => uint256) private _packedOwnerships;
    
        // Mapping owner address to address data.
        //
        // Bits Layout:
        // - [0..63]    'balance'
        // - [64..127]  'numberMinted'
        // - [128..191] 'numberBurned'
        // - [192..255] 'aux'
        mapping(address => uint256) private _packedAddressData;
    
        // Mapping from token ID to approved address.
        mapping(uint256 => TokenApprovalRef) private _tokenApprovals;
    
        // Mapping from owner to operator approvals
        mapping(address => mapping(address => bool)) private _operatorApprovals;
    
        // =============================================================
        //                          CONSTRUCTOR
        // =============================================================
    
        constructor(string memory name_, string memory symbol_) {
            _name = name_;
            _symbol = symbol_;
            _currentIndex = _startTokenId();
        }
    
        // =============================================================
        //                   TOKEN COUNTING OPERATIONS
        // =============================================================
    
        /**
         * @dev Returns the starting token ID.
         * To change the starting token ID, please override this function.
         */
        function _startTokenId() internal view virtual returns (uint256) {
            return 0;
        }
    
        /**
         * @dev Returns the next token ID to be minted.
         */
        function _nextTokenId() internal view virtual returns (uint256) {
            return _currentIndex;
        }
    
        /**
         * @dev Returns the total number of tokens in existence.
         * Burned tokens will reduce the count.
         * To get the total number of tokens minted, please see {_totalMinted}.
         */
        function totalSupply() public view virtual override returns (uint256) {
            // Counter underflow is impossible as _burnCounter cannot be incremented
            // more than '_currentIndex - _startTokenId()' times.
            unchecked {
                return _currentIndex - _burnCounter - _startTokenId();
            }
        }
    
        /**
         * @dev Returns the total amount of tokens minted in the contract.
         */
        function _totalMinted() internal view virtual returns (uint256) {
            // Counter underflow is impossible as '_currentIndex' does not decrement,
            // and it is initialized to '_startTokenId()'.
            unchecked {
                return _currentIndex - _startTokenId();
            }
        }
    
        /**
         * @dev Returns the total number of tokens burned.
         */
        function _totalBurned() internal view virtual returns (uint256) {
            return _burnCounter;
        }
    
        // =============================================================
        //                    ADDRESS DATA OPERATIONS
        // =============================================================
    
        /**
         * @dev Returns the number of tokens in 'owner''s account.
         */
        function balanceOf(address owner) public view virtual override returns (uint256) {
            if (owner == address(0)) revert BalanceQueryForZeroAddress();
            return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
        }
    
        /**
         * Returns the number of tokens minted by 'owner'.
         */
        function _numberMinted(address owner) internal view returns (uint256) {
            return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
        }
    
        /**
         * Returns the number of tokens burned by or on behalf of 'owner'.
         */
        function _numberBurned(address owner) internal view returns (uint256) {
            return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
        }
    
        /**
         * Returns the auxiliary data for 'owner'. (e.g. number of whitelist mint slots used).
         */
        function _getAux(address owner) internal view returns (uint64) {
            return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
        }
    
        /**
         * Sets the auxiliary data for 'owner'. (e.g. number of whitelist mint slots used).
         * If there are multiple variables, please pack them into a uint64.
         */
        function _setAux(address owner, uint64 aux) internal virtual {
            uint256 packed = _packedAddressData[owner];
            uint256 auxCasted;
            // Cast 'aux' with assembly to avoid redundant masking.
            assembly {
                auxCasted := aux
            }
            packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
            _packedAddressData[owner] = packed;
        }
    
        // =============================================================
        //                            IERC165
        // =============================================================
    
        /**
         * @dev Returns true if this contract implements the interface defined by
         * 'interfaceId'. See the corresponding
         * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
         * to learn more about how these ids are created.
         *
         * This function call must use less than 30000 gas.
         */
        function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
            // The interface IDs are constants representing the first 4 bytes
            // of the XOR of all function selectors in the interface.
            // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
            // (e.g. 'bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)')
            return
                interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
                interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
                interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
        }
    
        // =============================================================
        //                        IERC721Metadata
        // =============================================================
    
        /**
         * @dev Returns the token collection name.
         */
        function name() public view virtual override returns (string memory) {
            return _name;
        }
    
        /**
         * @dev Returns the token collection symbol.
         */
        function symbol() public view virtual override returns (string memory) {
            return _symbol;
        }
    
        /**
         * @dev Returns the Uniform Resource Identifier (URI) for 'tokenId' token.
         */
        function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
            if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
    
            string memory baseURI = _baseURI();
            return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
        }
    
        /**
         * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
         * token will be the concatenation of the 'baseURI' and the 'tokenId'. Empty
         * by default, it can be overridden in child contracts.
         */
        function _baseURI() internal view virtual returns (string memory) {
            return '';
        }
    
        // =============================================================
        //                     OWNERSHIPS OPERATIONS
        // =============================================================
    
        /**
         * @dev Returns the owner of the 'tokenId' token.
         *
         * Requirements:
         *
         * - 'tokenId' must exist.
         */
        function ownerOf(uint256 tokenId) public view virtual override returns (address) {
            return address(uint160(_packedOwnershipOf(tokenId)));
        }
    
        /**
         * @dev Gas spent here starts off proportional to the maximum mint batch size.
         * It gradually moves to O(1) as tokens get transferred around over time.
         */
        function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
            return _unpackedOwnership(_packedOwnershipOf(tokenId));
        }
    
        /**
         * @dev Returns the unpacked 'TokenOwnership' struct at 'index'.
         */
        function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
            return _unpackedOwnership(_packedOwnerships[index]);
        }
    
        /**
         * @dev Initializes the ownership slot minted at 'index' for efficiency purposes.
         */
        function _initializeOwnershipAt(uint256 index) internal virtual {
            if (_packedOwnerships[index] == 0) {
                _packedOwnerships[index] = _packedOwnershipOf(index);
            }
        }
    
        /**
         * Returns the packed ownership data of 'tokenId'.
         */
        function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
            uint256 curr = tokenId;
    
            unchecked {
                if (_startTokenId() <= curr)
                    if (curr < _currentIndex) {
                        uint256 packed = _packedOwnerships[curr];
                        // If not burned.
                        if (packed & _BITMASK_BURNED == 0) {
                            // Invariant:
                            // There will always be an initialized ownership slot
                            // (i.e. 'ownership.addr != address(0) && ownership.burned == false')
                            // before an unintialized ownership slot
                            // (i.e. 'ownership.addr == address(0) && ownership.burned == false')
                            // Hence, 'curr' will not underflow.
                            //
                            // We can directly compare the packed value.
                            // If the address is zero, packed will be zero.
                            while (packed == 0) {
                                packed = _packedOwnerships[--curr];
                            }
                            return packed;
                        }
                    }
            }
            revert OwnerQueryForNonexistentToken();
        }
    
        /**
         * @dev Returns the unpacked 'TokenOwnership' struct from 'packed'.
         */
        function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
            ownership.addr = address(uint160(packed));
            ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
            ownership.burned = packed & _BITMASK_BURNED != 0;
            ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
        }
    
        /**
         * @dev Packs ownership data into a single uint256.
         */
        function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
            assembly {
                // Mask 'owner' to the lower 160 bits, in case the upper bits somehow aren't clean.
                owner := and(owner, _BITMASK_ADDRESS)
                // 'owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags'.
                result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
            }
        }
    
        /**
         * @dev Returns the 'nextInitialized' flag set if 'quantity' equals 1.
         */
        function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
            // For branchless setting of the 'nextInitialized' flag.
            assembly {
                // '(quantity == 1) << _BITPOS_NEXT_INITIALIZED'.
                result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
            }
        }
    
        // =============================================================
        //                      APPROVAL OPERATIONS
        // =============================================================
    
        /**
         * @dev Gives permission to 'to' to transfer 'tokenId' token to another account.
         * The approval is cleared when the token is transferred.
         *
         * Only a single account can be approved at a time, so approving the
         * zero address clears previous approvals.
         *
         * Requirements:
         *
         * - The caller must own the token or be an approved operator.
         * - 'tokenId' must exist.
         *
         * Emits an {Approval} event.
         */
        function approve(address to, uint256 tokenId) public payable virtual override {
            address owner = ownerOf(tokenId);
    
            if (_msgSenderERC721A() != owner)
                if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                    revert ApprovalCallerNotOwnerNorApproved();
                }
    
            _tokenApprovals[tokenId].value = to;
            emit Approval(owner, to, tokenId);
        }
    
        /**
         * @dev Returns the account approved for 'tokenId' token.
         *
         * Requirements:
         *
         * - 'tokenId' must exist.
         */
        function getApproved(uint256 tokenId) public view virtual override returns (address) {
            if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();
    
            return _tokenApprovals[tokenId].value;
        }
    
        /**
         * @dev Approve or remove 'operator' as an operator for the caller.
         * Operators can call {transferFrom} or {safeTransferFrom}
         * for any token owned by the caller.
         *
         * Requirements:
         *
         * - The 'operator' cannot be the caller.
         *
         * Emits an {ApprovalForAll} event.
         */
        function setApprovalForAll(address operator, bool approved) public virtual override {
            _operatorApprovals[_msgSenderERC721A()][operator] = approved;
            emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
        }
    
        /**
         * @dev Returns if the 'operator' is allowed to manage all of the assets of 'owner'.
         *
         * See {setApprovalForAll}.
         */
        function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
            return _operatorApprovals[owner][operator];
        }
    
        /**
         * @dev Returns whether 'tokenId' exists.
         *
         * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
         *
         * Tokens start existing when they are minted. See {_mint}.
         */
        function _exists(uint256 tokenId) internal view virtual returns (bool) {
            return
                _startTokenId() <= tokenId &&
                tokenId < _currentIndex && // If within bounds,
                _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
        }
    
        /**
         * @dev Returns whether 'msgSender' is equal to 'approvedAddress' or 'owner'.
         */
        function _isSenderApprovedOrOwner(
            address approvedAddress,
            address owner,
            address msgSender
        ) private pure returns (bool result) {
            assembly {
                // Mask 'owner' to the lower 160 bits, in case the upper bits somehow aren't clean.
                owner := and(owner, _BITMASK_ADDRESS)
                // Mask 'msgSender' to the lower 160 bits, in case the upper bits somehow aren't clean.
                msgSender := and(msgSender, _BITMASK_ADDRESS)
                // 'msgSender == owner || msgSender == approvedAddress'.
                result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
            }
        }
    
        /**
         * @dev Returns the storage slot and value for the approved address of 'tokenId'.
         */
        function _getApprovedSlotAndAddress(uint256 tokenId)
            private
            view
            returns (uint256 approvedAddressSlot, address approvedAddress)
        {
            TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
            // The following is equivalent to 'approvedAddress = _tokenApprovals[tokenId].value'.
            assembly {
                approvedAddressSlot := tokenApproval.slot
                approvedAddress := sload(approvedAddressSlot)
            }
        }
    
        // =============================================================
        //                      TRANSFER OPERATIONS
        // =============================================================
    
        /**
         * @dev Transfers 'tokenId' from 'from' to 'to'.
         *
         * Requirements:
         *
         * - 'from' cannot be the zero address.
         * - 'to' cannot be the zero address.
         * - 'tokenId' token must be owned by 'from'.
         * - If the caller is not 'from', it must be approved to move this token
         * by either {approve} or {setApprovalForAll}.
         *
         * Emits a {Transfer} event.
         */
        function transferFrom(
            address from,
            address to,
            uint256 tokenId
        ) public payable virtual override {
            uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
    
            if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();
    
            (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);
    
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
    
            if (to == address(0)) revert TransferToZeroAddress();
    
            _beforeTokenTransfers(from, to, tokenId, 1);
    
            // Clear approvals from the previous owner.
            assembly {
                if approvedAddress {
                    // This is equivalent to 'delete _tokenApprovals[tokenId]'.
                    sstore(approvedAddressSlot, 0)
                }
            }
    
            // Underflow of the sender's balance is impossible because we check for
            // ownership above and the recipient's balance can't realistically overflow.
            // Counter overflow is incredibly unrealistic as 'tokenId' would have to be 2**256.
            unchecked {
                // We can directly increment and decrement the balances.
                --_packedAddressData[from]; // Updates: 'balance -= 1'.
                ++_packedAddressData[to]; // Updates: 'balance += 1'.
    
                // Updates:
                // - 'address' to the next owner.
                // - 'startTimestamp' to the timestamp of transfering.
                // - 'burned' to 'false'.
                // - 'nextInitialized' to 'true'.
                _packedOwnerships[tokenId] = _packOwnershipData(
                    to,
                    _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
                );
    
                // If the next slot may not have been initialized (i.e. 'nextInitialized == false') .
                if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                    uint256 nextTokenId = tokenId + 1;
                    // If the next slot's address is zero and not burned (i.e. packed value is zero).
                    if (_packedOwnerships[nextTokenId] == 0) {
                        // If the next slot is within bounds.
                        if (nextTokenId != _currentIndex) {
                            // Initialize the next slot to maintain correctness for 'ownerOf(tokenId + 1)'.
                            _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                        }
                    }
                }
            }
    
            emit Transfer(from, to, tokenId);
            _afterTokenTransfers(from, to, tokenId, 1);
        }
    
        /**
         * @dev Equivalent to 'safeTransferFrom(from, to, tokenId, '')'.
         */
        function safeTransferFrom(
            address from,
            address to,
            uint256 tokenId
        ) public payable virtual override {
            safeTransferFrom(from, to, tokenId, '');
        }
    
        /**
         * @dev Safely transfers 'tokenId' token from 'from' to 'to'.
         *
         * Requirements:
         *
         * - 'from' cannot be the zero address.
         * - 'to' cannot be the zero address.
         * - 'tokenId' token must exist and be owned by 'from'.
         * - If the caller is not 'from', it must be approved to move this token
         * by either {approve} or {setApprovalForAll}.
         * - If 'to' refers to a smart contract, it must implement
         * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
         *
         * Emits a {Transfer} event.
         */
        function safeTransferFrom(
            address from,
            address to,
            uint256 tokenId,
            bytes memory _data
        ) public payable virtual override {
            transferFrom(from, to, tokenId);
            if (to.code.length != 0)
                if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
        }
    
        /**
         * @dev Hook that is called before a set of serially-ordered token IDs
         * are about to be transferred. This includes minting.
         * And also called before burning one token.
         *
         * 'startTokenId' - the first token ID to be transferred.
         * 'quantity' - the amount to be transferred.
         *
         * Calling conditions:
         *
         * - When 'from' and 'to' are both non-zero, 'from''s 'tokenId' will be
         * transferred to 'to'.
         * - When 'from' is zero, 'tokenId' will be minted for 'to'.
         * - When 'to' is zero, 'tokenId' will be burned by 'from'.
         * - 'from' and 'to' are never both zero.
         */
        function _beforeTokenTransfers(
            address from,
            address to,
            uint256 startTokenId,
            uint256 quantity
        ) internal virtual {}
    
        /**
         * @dev Hook that is called after a set of serially-ordered token IDs
         * have been transferred. This includes minting.
         * And also called after one token has been burned.
         *
         * 'startTokenId' - the first token ID to be transferred.
         * 'quantity' - the amount to be transferred.
         *
         * Calling conditions:
         *
         * - When 'from' and 'to' are both non-zero, 'from''s 'tokenId' has been
         * transferred to 'to'.
         * - When 'from' is zero, 'tokenId' has been minted for 'to'.
         * - When 'to' is zero, 'tokenId' has been burned by 'from'.
         * - 'from' and 'to' are never both zero.
         */
        function _afterTokenTransfers(
            address from,
            address to,
            uint256 startTokenId,
            uint256 quantity
        ) internal virtual {}
    
        /**
         * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
         *
         * 'from' - Previous owner of the given token ID.
         * 'to' - Target address that will receive the token.
         * 'tokenId' - Token ID to be transferred.
         * '_data' - Optional data to send along with the call.
         *
         * Returns whether the call correctly returned the expected magic value.
         */
        function _checkContractOnERC721Received(
            address from,
            address to,
            uint256 tokenId,
            bytes memory _data
        ) private returns (bool) {
            try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
                bytes4 retval
            ) {
                return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert TransferToNonERC721ReceiverImplementer();
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        }
    
        // =============================================================
        //                        MINT OPERATIONS
        // =============================================================
    
        /**
         * @dev Mints 'quantity' tokens and transfers them to 'to'.
         *
         * Requirements:
         *
         * - 'to' cannot be the zero address.
         * - 'quantity' must be greater than 0.
         *
         * Emits a {Transfer} event for each mint.
         */
        function _mint(address to, uint256 quantity) internal virtual {
            uint256 startTokenId = _currentIndex;
            if (quantity == 0) revert MintZeroQuantity();
    
            _beforeTokenTransfers(address(0), to, startTokenId, quantity);
    
            // Overflows are incredibly unrealistic.
            // 'balance' and 'numberMinted' have a maximum limit of 2**64.
            // 'tokenId' has a maximum limit of 2**256.
            unchecked {
                // Updates:
                // - 'balance += quantity'.
                // - 'numberMinted += quantity'.
                //
                // We can directly add to the 'balance' and 'numberMinted'.
                _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);
    
                // Updates:
                // - 'address' to the owner.
                // - 'startTimestamp' to the timestamp of minting.
                // - 'burned' to 'false'.
                // - 'nextInitialized' to 'quantity == 1'.
                _packedOwnerships[startTokenId] = _packOwnershipData(
                    to,
                    _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
                );
    
                uint256 toMasked;
                uint256 end = startTokenId + quantity;
    
                // Use assembly to loop and emit the 'Transfer' event for gas savings.
                // The duplicated 'log4' removes an extra check and reduces stack juggling.
                // The assembly, together with the surrounding Solidity code, have been
                // delicately arranged to nudge the compiler into producing optimized opcodes.
                assembly {
                    // Mask 'to' to the lower 160 bits, in case the upper bits somehow aren't clean.
                    toMasked := and(to, _BITMASK_ADDRESS)
                    // Emit the 'Transfer' event.
                    log4(
                        0, // Start of data (0, since no data).
                        0, // End of data (0, since no data).
                        _TRANSFER_EVENT_SIGNATURE, // Signature.
                        0, // 'address(0)'.
                        toMasked, // 'to'.
                        startTokenId // 'tokenId'.
                    )
    
                    // The 'iszero(eq(,))' check ensures that large values of 'quantity'
                    // that overflows uint256 will make the loop run out of gas.
                    // The compiler will optimize the 'iszero' away for performance.
                    for {
                        let tokenId := add(startTokenId, 1)
                    } iszero(eq(tokenId, end)) {
                        tokenId := add(tokenId, 1)
                    } {
                        // Emit the 'Transfer' event. Similar to above.
                        log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                    }
                }
                if (toMasked == 0) revert MintToZeroAddress();
    
                _currentIndex = end;
            }
            _afterTokenTransfers(address(0), to, startTokenId, quantity);
        }
    
        /**
         * @dev Mints 'quantity' tokens and transfers them to 'to'.
         *
         * This function is intended for efficient minting only during contract creation.
         *
         * It emits only one {ConsecutiveTransfer} as defined in
         * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
         * instead of a sequence of {Transfer} event(s).
         *
         * Calling this function outside of contract creation WILL make your contract
         * non-compliant with the ERC721 standard.
         * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
         * {ConsecutiveTransfer} event is only permissible during contract creation.
         *
         * Requirements:
         *
         * - 'to' cannot be the zero address.
         * - 'quantity' must be greater than 0.
         *
         * Emits a {ConsecutiveTransfer} event.
         */
        function _mintERC2309(address to, uint256 quantity) internal virtual {
            uint256 startTokenId = _currentIndex;
            if (to == address(0)) revert MintToZeroAddress();
            if (quantity == 0) revert MintZeroQuantity();
            if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();
    
            _beforeTokenTransfers(address(0), to, startTokenId, quantity);
    
            // Overflows are unrealistic due to the above check for 'quantity' to be below the limit.
            unchecked {
                // Updates:
                // - 'balance += quantity'.
                // - 'numberMinted += quantity'.
                //
                // We can directly add to the 'balance' and 'numberMinted'.
                _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);
    
                // Updates:
                // - 'address' to the owner.
                // - 'startTimestamp' to the timestamp of minting.
                // - 'burned' to 'false'.
                // - 'nextInitialized' to 'quantity == 1'.
                _packedOwnerships[startTokenId] = _packOwnershipData(
                    to,
                    _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
                );
    
                emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);
    
                _currentIndex = startTokenId + quantity;
            }
            _afterTokenTransfers(address(0), to, startTokenId, quantity);
        }
    
        /**
         * @dev Safely mints 'quantity' tokens and transfers them to 'to'.
         *
         * Requirements:
         *
         * - If 'to' refers to a smart contract, it must implement
         * {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
         * - 'quantity' must be greater than 0.
         *
         * See {_mint}.
         *
         * Emits a {Transfer} event for each mint.
         */
        function _safeMint(
            address to,
            uint256 quantity,
            bytes memory _data
        ) internal virtual {
            _mint(to, quantity);
    
            unchecked {
                if (to.code.length != 0) {
                    uint256 end = _currentIndex;
                    uint256 index = end - quantity;
                    do {
                        if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                            revert TransferToNonERC721ReceiverImplementer();
                        }
                    } while (index < end);
                    // Reentrancy protection.
                    if (_currentIndex != end) revert();
                }
            }
        }
    
        /**
         * @dev Equivalent to '_safeMint(to, quantity, '')'.
         */
        function _safeMint(address to, uint256 quantity) internal virtual {
            _safeMint(to, quantity, '');
        }
    
        // =============================================================
        //                        BURN OPERATIONS
        // =============================================================
    
        /**
         * @dev Equivalent to '_burn(tokenId, false)'.
         */
        function _burn(uint256 tokenId) internal virtual {
            _burn(tokenId, false);
        }
    
        /**
         * @dev Destroys 'tokenId'.
         * The approval is cleared when the token is burned.
         *
         * Requirements:
         *
         * - 'tokenId' must exist.
         *
         * Emits a {Transfer} event.
         */
        function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
            uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
    
            address from = address(uint160(prevOwnershipPacked));
    
            (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);
    
            if (approvalCheck) {
                // The nested ifs save around 20+ gas over a compound boolean condition.
                if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                    if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
            }
    
            _beforeTokenTransfers(from, address(0), tokenId, 1);
    
            // Clear approvals from the previous owner.
            assembly {
                if approvedAddress {
                    // This is equivalent to 'delete _tokenApprovals[tokenId]'.
                    sstore(approvedAddressSlot, 0)
                }
            }
    
            // Underflow of the sender's balance is impossible because we check for
            // ownership above and the recipient's balance can't realistically overflow.
            // Counter overflow is incredibly unrealistic as 'tokenId' would have to be 2**256.
            unchecked {
                // Updates:
                // - 'balance -= 1'.
                // - 'numberBurned += 1'.
                //
                // We can directly decrement the balance, and increment the number burned.
                // This is equivalent to 'packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;'.
                _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;
    
                // Updates:
                // - 'address' to the last owner.
                // - 'startTimestamp' to the timestamp of burning.
                // - 'burned' to 'true'.
                // - 'nextInitialized' to 'true'.
                _packedOwnerships[tokenId] = _packOwnershipData(
                    from,
                    (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
                );
    
                // If the next slot may not have been initialized (i.e. 'nextInitialized == false') .
                if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                    uint256 nextTokenId = tokenId + 1;
                    // If the next slot's address is zero and not burned (i.e. packed value is zero).
                    if (_packedOwnerships[nextTokenId] == 0) {
                        // If the next slot is within bounds.
                        if (nextTokenId != _currentIndex) {
                            // Initialize the next slot to maintain correctness for 'ownerOf(tokenId + 1)'.
                            _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                        }
                    }
                }
            }
    
            emit Transfer(from, address(0), tokenId);
            _afterTokenTransfers(from, address(0), tokenId, 1);
    
            // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
            unchecked {
                _burnCounter++;
            }
        }
    
        // =============================================================
        //                     EXTRA DATA OPERATIONS
        // =============================================================
    
        /**
         * @dev Directly sets the extra data for the ownership data 'index'.
         */
        function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
            uint256 packed = _packedOwnerships[index];
            if (packed == 0) revert OwnershipNotInitializedForExtraData();
            uint256 extraDataCasted;
            // Cast 'extraData' with assembly to avoid redundant masking.
            assembly {
                extraDataCasted := extraData
            }
            packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
            _packedOwnerships[index] = packed;
        }
    
        /**
         * @dev Called during each token transfer to set the 24bit 'extraData' field.
         * Intended to be overridden by the cosumer contract.
         *
         * 'previousExtraData' - the value of 'extraData' before transfer.
         *
         * Calling conditions:
         *
         * - When 'from' and 'to' are both non-zero, 'from''s 'tokenId' will be
         * transferred to 'to'.
         * - When 'from' is zero, 'tokenId' will be minted for 'to'.
         * - When 'to' is zero, 'tokenId' will be burned by 'from'.
         * - 'from' and 'to' are never both zero.
         */
        function _extraData(
            address from,
            address to,
            uint24 previousExtraData
        ) internal view virtual returns (uint24) {}
    
        /**
         * @dev Returns the next extra data for the packed ownership data.
         * The returned result is shifted into position.
         */
        function _nextExtraData(
            address from,
            address to,
            uint256 prevOwnershipPacked
        ) private view returns (uint256) {
            uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
            return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
        }
    
        // =============================================================
        //                       OTHER OPERATIONS
        // =============================================================
    
        /**
         * @dev Returns the message sender (defaults to 'msg.sender').
         *
         * If you are writing GSN compatible contracts, you need to override this function.
         */
        function _msgSenderERC721A() internal view virtual returns (address) {
            return msg.sender;
        }
    
        /**
         * @dev Converts a uint256 to its ASCII string decimal representation.
         */
        function _toString(uint256 value) internal pure virtual returns (string memory str) {
            assembly {
                // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
                // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
                // We will need 1 word for the trailing zeros padding, 1 word for the length,
                // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
                let m := add(mload(0x40), 0xa0)
                // Update the free memory pointer to allocate.
                mstore(0x40, m)
                // Assign the 'str' to the end.
                str := sub(m, 0x20)
                // Zeroize the slot after the string.
                mstore(str, 0)
    
                // Cache the end of the memory to calculate the length later.
                let end := str
    
                // We write the string from rightmost digit to leftmost digit.
                // The following is essentially a do-while loop that also handles the zero case.
                // prettier-ignore
                for { let temp := value } 1 {} {
                    str := sub(str, 1)
                    // Write the character to the pointer.
                    // The ASCII index of the '0' character is 48.
                    mstore8(str, add(48, mod(temp, 10)))
                    // Keep dividing 'temp' until zero.
                    temp := div(temp, 10)
                    // prettier-ignore
                    if iszero(temp) { break }
                }
    
                let length := sub(end, str)
                // Move the pointer 32 bytes leftwards to make room for the length.
                str := sub(str, 0x20)
                // Store the length.
                mstore(str, length)
            }
        }
    }
    
    // File: erc721a/contracts/extensions/IERC721AQueryable.sol
    
    
    // ERC721A Contracts v4.2.3
    // Creator: Chiru Labs
    
    pragma solidity ^0.8.4;
    
    
    /**
     * @dev Interface of ERC721AQueryable.
     */
    interface IERC721AQueryable is IERC721A {
        /**
         * Invalid query range ('start' >= 'stop').
         */
        error InvalidQueryRange();
    
        /**
         * @dev Returns the 'TokenOwnership' struct at 'tokenId' without reverting.
         *
         * If the 'tokenId' is out of bounds:
         *
         * - 'addr = address(0)'
         * - 'startTimestamp = 0'
         * - 'burned = false'
         * - 'extraData = 0'
         *
         * If the 'tokenId' is burned:
         *
         * - 'addr = <Address of owner before token was burned>'
         * - 'startTimestamp = <Timestamp when token was burned>'
         * - 'burned = true'
         * - 'extraData = <Extra data when token was burned>'
         *
         * Otherwise:
         *
         * - 'addr = <Address of owner>'
         * - 'startTimestamp = <Timestamp of start of ownership>'
         * - 'burned = false'
         * - 'extraData = <Extra data at start of ownership>'
         */
        function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);
    
        /**
         * @dev Returns an array of 'TokenOwnership' structs at 'tokenIds' in order.
         * See {ERC721AQueryable-explicitOwnershipOf}
         */
        function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);
    
        /**
         * @dev Returns an array of token IDs owned by 'owner',
         * in the range ['start', 'stop')
         * (i.e. 'start <= tokenId < stop').
         *
         * This function allows for tokens to be queried if the collection
         * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
         *
         * Requirements:
         *
         * - 'start < stop'
         */
        function tokensOfOwnerIn(
            address owner,
            uint256 start,
            uint256 stop
        ) external view returns (uint256[] memory);
    
        /**
         * @dev Returns an array of token IDs owned by 'owner'.
         *
         * This function scans the ownership mapping and is O('totalSupply') in complexity.
         * It is meant to be called off-chain.
         *
         * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
         * multiple smaller scans if the collection is large enough to cause
         * an out-of-gas error (10K collections should be fine).
         */
        function tokensOfOwner(address owner) external view returns (uint256[] memory);
    }
    
    // File: contracts/IERC721L.sol
    
    pragma solidity ^0.8.4;
    
    
    interface IERC721L is IERC721AQueryable {
        error CannotIncreaseMaxMintableSupply();
        error CannotUpdatePermanentBaseURI();
        error GlobalWalletLimitOverflow();
        error InsufficientStageTimeGap();
        error InvalidProof();
        error InvalidStage();
        error InvalidStageArgsLength();
        error InvalidStartAndEndTimestamp();
        error NoSupplyLeft();
        error NotEnoughValue();
        error StageSupplyExceeded();
        error TimestampExpired();
        error WalletGlobalLimitExceeded();
        error WalletStageLimitExceeded();
        error WithdrawFailed();
    
        struct MintStageInfo {
            uint80 cost;
            uint32 walletLimit; // 0 for unlimited
            bytes32 merkleRoot; // 0x0 for no presale enforced
            uint24 maxStageSupply; // 0 for unlimited
            uint64 startTimeUnixSeconds;
            uint64 endTimeUnixSeconds;
        }
    
        event UpdateStage(
            uint256 stage,
            uint80 cost,
            uint32 walletLimit,
            bytes32 merkleRoot,
            uint24 maxStageSupply,
            uint64 startTimeUnixSeconds,
            uint64 endTimeUnixSeconds
        );
    
    
        event SetMaxMintableSupply(uint256 maxMintableSupply);
        event SetGlobalWalletLimit(uint256 globalWalletLimit);
        event SetActiveStage(uint256 activeStage);
        event SetBaseURI(string baseURI);
        event PermanentBaseURI(string baseURI);
        event Withdraw(uint256 value);
    
    
        function getNumberStages() external view returns (uint256);
    
        function getGlobalWalletLimit() external view returns (uint256);
    
        function getMaxMintableSupply() external view returns (uint256);
    
        function totalMintedByAddress(address a) external view returns (uint256);
    
        function getTokenURISuffix() external view returns (string memory);
    
        function getStageInfo(uint256 index)
            external
            view
            returns (
                MintStageInfo memory,
                uint32,
                uint256
            );
    
        function getActiveStageFromTimestamp(uint64 timestamp)
            external
            view
            returns (uint256);
    
    }
    // File: erc721a/contracts/extensions/ERC721AQueryable.sol
    
    
    // ERC721A Contracts v4.2.3
    // Creator: Chiru Labs
    
    pragma solidity ^0.8.4;
    
    
    
    /**
     * @title ERC721AQueryable.
     *
     * @dev ERC721A subclass with convenience query functions.
     */
    abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
        /**
         * @dev Returns the 'TokenOwnership' struct at 'tokenId' without reverting.
         *
         * If the 'tokenId' is out of bounds:
         *
         * - 'addr = address(0)'
         * - 'startTimestamp = 0'
         * - 'burned = false'
         * - 'extraData = 0'
         *
         * If the 'tokenId' is burned:
         *
         * - 'addr = <Address of owner before token was burned>'
         * - 'startTimestamp = <Timestamp when token was burned>'
         * - 'burned = true'
         * - 'extraData = <Extra data when token was burned>'
         *
         * Otherwise:
         *
         * - 'addr = <Address of owner>'
         * - 'startTimestamp = <Timestamp of start of ownership>'
         * - 'burned = false'
         * - 'extraData = <Extra data at start of ownership>'
         */
        function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) {
            TokenOwnership memory ownership;
            if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
                return ownership;
            }
            ownership = _ownershipAt(tokenId);
            if (ownership.burned) {
                return ownership;
            }
            return _ownershipOf(tokenId);
        }
    
        /**
         * @dev Returns an array of 'TokenOwnership' structs at 'tokenIds' in order.
         * See {ERC721AQueryable-explicitOwnershipOf}
         */
        function explicitOwnershipsOf(uint256[] calldata tokenIds)
            external
            view
            virtual
            override
            returns (TokenOwnership[] memory)
        {
            unchecked {
                uint256 tokenIdsLength = tokenIds.length;
                TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
                for (uint256 i; i != tokenIdsLength; ++i) {
                    ownerships[i] = explicitOwnershipOf(tokenIds[i]);
                }
                return ownerships;
            }
        }
    
        /**
         * @dev Returns an array of token IDs owned by 'owner',
         * in the range ['start', 'stop')
         * (i.e. 'start <= tokenId < stop').
         *
         * This function allows for tokens to be queried if the collection
         * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
         *
         * Requirements:
         *
         * - 'start < stop'
         */
        function tokensOfOwnerIn(
            address owner,
            uint256 start,
            uint256 stop
        ) external view virtual override returns (uint256[] memory) {
            unchecked {
                if (start >= stop) revert InvalidQueryRange();
                uint256 tokenIdsIdx;
                uint256 stopLimit = _nextTokenId();
                // Set 'start = max(start, _startTokenId())'.
                if (start < _startTokenId()) {
                    start = _startTokenId();
                }
                // Set 'stop = min(stop, stopLimit)'.
                if (stop > stopLimit) {
                    stop = stopLimit;
                }
                uint256 tokenIdsMaxLength = balanceOf(owner);
                // Set 'tokenIdsMaxLength = min(balanceOf(owner), stop - start)',
                // to cater for cases where 'balanceOf(owner)' is too big.
                if (start < stop) {
                    uint256 rangeLength = stop - start;
                    if (rangeLength < tokenIdsMaxLength) {
                        tokenIdsMaxLength = rangeLength;
                    }
                } else {
                    tokenIdsMaxLength = 0;
                }
                uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
                if (tokenIdsMaxLength == 0) {
                    return tokenIds;
                }
                // We need to call 'explicitOwnershipOf(start)',
                // because the slot at 'start' may not be initialized.
                TokenOwnership memory ownership = explicitOwnershipOf(start);
                address currOwnershipAddr;
                // If the starting slot exists (i.e. not burned), initialize 'currOwnershipAddr'.
                // 'ownership.address' will not be zero, as 'start' is clamped to the valid token ID range.
                if (!ownership.burned) {
                    currOwnershipAddr = ownership.addr;
                }
                for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
                    ownership = _ownershipAt(i);
                    if (ownership.burned) {
                        continue;
                    }
                    if (ownership.addr != address(0)) {
                        currOwnershipAddr = ownership.addr;
                    }
                    if (currOwnershipAddr == owner) {
                        tokenIds[tokenIdsIdx++] = i;
                    }
                }
                // Downsize the array to fit.
                assembly {
                    mstore(tokenIds, tokenIdsIdx)
                }
                return tokenIds;
            }
        }
    
        /**
         * @dev Returns an array of token IDs owned by 'owner'.
         *
         * This function scans the ownership mapping and is O('totalSupply') in complexity.
         * It is meant to be called off-chain.
         *
         * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
         * multiple smaller scans if the collection is large enough to cause
         * an out-of-gas error (10K collections should be fine).
         */
        function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) {
            unchecked {
                uint256 tokenIdsIdx;
                address currOwnershipAddr;
                uint256 tokenIdsLength = balanceOf(owner);
                uint256[] memory tokenIds = new uint256[](tokenIdsLength);
                TokenOwnership memory ownership;
                for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
                    ownership = _ownershipAt(i);
                    if (ownership.burned) {
                        continue;
                    }
                    if (ownership.addr != address(0)) {
                        currOwnershipAddr = ownership.addr;
                    }
                    if (currOwnershipAddr == owner) {
                        tokenIds[tokenIdsIdx++] = i;
                    }
                }
                return tokenIds;
            }
        }
    }
    
    
    // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol
    
    
    // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)
    
    pragma solidity ^0.8.0;
    
    /**
     * @dev These functions deal with verification of Merkle Tree proofs.
     *
     * The tree and the proofs can be generated using our
     * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
     * You will find a quickstart guide in the readme.
     *
     * WARNING: You should avoid using leaf values that are 64 bytes long prior to
     * hashing, or use a hash function other than keccak256 for hashing leaves.
     * This is because the concatenation of a sorted pair of internal nodes in
     * the merkle tree could be reinterpreted as a leaf value.
     * OpenZeppelin's JavaScript library generates merkle trees that are safe
     * against this attack out of the box.
     */
    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[] memory proof,
            bytes32 root,
            bytes32 leaf
        ) internal pure returns (bool) {
            return processProof(proof, leaf) == root;
        }
    
        /**
         * @dev Calldata version of {verify}
         *
         * _Available since v4.7._
         */
        function verifyCalldata(
            bytes32[] calldata proof,
            bytes32 root,
            bytes32 leaf
        ) internal pure returns (bool) {
            return processProofCalldata(proof, leaf) == root;
        }
    
        /**
         * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
         * from 'leaf' using 'proof'. A 'proof' is valid if and only if the rebuilt
         * hash matches the root of the tree. When processing the proof, the pairs
         * of leafs & pre-images are assumed to be sorted.
         *
         * _Available since v4.4._
         */
        function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
            bytes32 computedHash = leaf;
            for (uint256 i = 0; i < proof.length; i++) {
                computedHash = _hashPair(computedHash, proof[i]);
            }
            return computedHash;
        }
    
        /**
         * @dev Calldata version of {processProof}
         *
         * _Available since v4.7._
         */
        function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
            bytes32 computedHash = leaf;
            for (uint256 i = 0; i < proof.length; i++) {
                computedHash = _hashPair(computedHash, proof[i]);
            }
            return computedHash;
        }
    
        /**
         * @dev Returns true if the 'leaves' can be simultaneously proven to be a part of a merkle tree defined by
         * 'root', according to 'proof' and 'proofFlags' as described in {processMultiProof}.
         *
         * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
         *
         * _Available since v4.7._
         */
        function multiProofVerify(
            bytes32[] memory proof,
            bool[] memory proofFlags,
            bytes32 root,
            bytes32[] memory leaves
        ) internal pure returns (bool) {
            return processMultiProof(proof, proofFlags, leaves) == root;
        }
    
        /**
         * @dev Calldata version of {multiProofVerify}
         *
         * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
         *
         * _Available since v4.7._
         */
        function multiProofVerifyCalldata(
            bytes32[] calldata proof,
            bool[] calldata proofFlags,
            bytes32 root,
            bytes32[] memory leaves
        ) internal pure returns (bool) {
            return processMultiProofCalldata(proof, proofFlags, leaves) == root;
        }
    
        /**
         * @dev Returns the root of a tree reconstructed from 'leaves' and sibling nodes in 'proof'. The reconstruction
         * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
         * leaf/inner node or a proof sibling node, depending on whether each 'proofFlags' item is true or false
         * respectively.
         *
         * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
         * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
         * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
         *
         * _Available since v4.7._
         */
        function processMultiProof(
            bytes32[] memory proof,
            bool[] memory proofFlags,
            bytes32[] memory leaves
        ) internal pure returns (bytes32 merkleRoot) {
            // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
            // consuming and producing values on a queue. The queue starts with the 'leaves' array, then goes onto the
            // 'hashes' array. At the end of the process, the last hash in the 'hashes' array should contain the root of
            // the merkle tree.
            uint256 leavesLen = leaves.length;
            uint256 totalHashes = proofFlags.length;
    
            // Check proof validity.
            require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
    
            // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
            // 'xxx[xxxPos++]', which return the current value and increment the pointer, thus mimicking a queue's "pop".
            bytes32[] memory hashes = new bytes32[](totalHashes);
            uint256 leafPos = 0;
            uint256 hashPos = 0;
            uint256 proofPos = 0;
            // At each step, we compute the next hash using two values:
            // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
            //   get the next hash.
            // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
            //   'proof' array.
            for (uint256 i = 0; i < totalHashes; i++) {
                bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
                bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
                hashes[i] = _hashPair(a, b);
            }
    
            if (totalHashes > 0) {
                return hashes[totalHashes - 1];
            } else if (leavesLen > 0) {
                return leaves[0];
            } else {
                return proof[0];
            }
        }
    
        /**
         * @dev Calldata version of {processMultiProof}.
         *
         * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
         *
         * _Available since v4.7._
         */
        function processMultiProofCalldata(
            bytes32[] calldata proof,
            bool[] calldata proofFlags,
            bytes32[] memory leaves
        ) internal pure returns (bytes32 merkleRoot) {
            // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
            // consuming and producing values on a queue. The queue starts with the 'leaves' array, then goes onto the
            // 'hashes' array. At the end of the process, the last hash in the 'hashes' array should contain the root of
            // the merkle tree.
            uint256 leavesLen = leaves.length;
            uint256 totalHashes = proofFlags.length;
    
            // Check proof validity.
            require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
    
            // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
            // 'xxx[xxxPos++]', which return the current value and increment the pointer, thus mimicking a queue's "pop".
            bytes32[] memory hashes = new bytes32[](totalHashes);
            uint256 leafPos = 0;
            uint256 hashPos = 0;
            uint256 proofPos = 0;
            // At each step, we compute the next hash using two values:
            // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
            //   get the next hash.
            // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
            //   'proof' array.
            for (uint256 i = 0; i < totalHashes; i++) {
                bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
                bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
                hashes[i] = _hashPair(a, b);
            }
    
            if (totalHashes > 0) {
                return hashes[totalHashes - 1];
            } else if (leavesLen > 0) {
                return leaves[0];
            } else {
                return proof[0];
            }
        }
    
        function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
            return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
        }
    
        function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
            /// @solidity memory-safe-assembly
            assembly {
                mstore(0x00, a)
                mstore(0x20, b)
                value := keccak256(0x00, 0x40)
            }
        }
    }
    
    // File: @openzeppelin/contracts/security/ReentrancyGuard.sol
    
    
    // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)
    
    pragma solidity ^0.8.0;
    
    /**
     * @dev Contract module that helps prevent reentrant calls to a function.
     *
     * Inheriting from 'ReentrancyGuard' will make the {nonReentrant} modifier
     * available, which can be applied to functions to make sure there are no nested
     * (reentrant) calls to them.
     *
     * Note that because there is a single 'nonReentrant' guard, functions marked as
     * 'nonReentrant' may not call one another. This can be worked around by making
     * those functions 'private', and then adding 'external' 'nonReentrant' entry
     * points to them.
     *
     * TIP: If you would like to learn more about reentrancy and alternative ways
     * to protect against it, check out our blog post
     * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
     */
    abstract contract ReentrancyGuard {
        // Booleans are more expensive than uint256 or any type that takes up a full
        // word because each write operation emits an extra SLOAD to first read the
        // slot's contents, replace the bits taken up by the boolean, and then write
        // back. This is the compiler's defense against contract upgrades and
        // pointer aliasing, and it cannot be disabled.
    
        // The values being non-zero value makes deployment a bit more expensive,
        // but in exchange the refund on every call to nonReentrant will be lower in
        // amount. Since refunds are capped to a percentage of the total
        // transaction's gas, it is best to keep them low in cases like this one, to
        // increase the likelihood of the full refund coming into effect.
        uint256 private constant _NOT_ENTERED = 1;
        uint256 private constant _ENTERED = 2;
    
        uint256 private _status;
    
        constructor() {
            _status = _NOT_ENTERED;
        }
    
        /**
         * @dev Prevents a contract from calling itself, directly or indirectly.
         * Calling a 'nonReentrant' function from another 'nonReentrant'
         * function is not supported. It is possible to prevent this from happening
         * by making the 'nonReentrant' function external, and making it call a
         * 'private' function that does the actual work.
         */
        modifier nonReentrant() {
            _nonReentrantBefore();
            _;
            _nonReentrantAfter();
        }
    
        function _nonReentrantBefore() private {
            // On the first call to nonReentrant, _status will be _NOT_ENTERED
            require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
    
            // Any calls to nonReentrant after this point will fail
            _status = _ENTERED;
        }
    
        function _nonReentrantAfter() private {
            // By storing the original value once again, a refund is triggered (see
            // https://eips.ethereum.org/EIPS/eip-2200)
            _status = _NOT_ENTERED;
        }
    }
    
    // File: @openzeppelin/contracts/utils/Context.sol
    
    
    // OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
    
    pragma solidity ^0.8.0;
    
    /**
     * @dev Provides information about the current execution context, including the
     * sender of the transaction and its data. While these are generally available
     * via msg.sender and msg.data, they should not be accessed in such a direct
     * manner, since when dealing with meta-transactions the account sending and
     * paying for execution may not be the actual sender (as far as an application
     * is concerned).
     *
     * This contract is only required for intermediate, library-like contracts.
     */
    abstract contract Context {
        function _msgSender() internal view virtual returns (address) {
            return msg.sender;
        }
    
        function _msgData() internal view virtual returns (bytes calldata) {
            return msg.data;
        }
    }
    
    // File: @openzeppelin/contracts/access/Ownable.sol
    
    
    // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
    
    pragma solidity ^0.8.0;
    
    
    /**
     * @dev Contract module which provides a basic access control mechanism, where
     * there is an account (an owner) that can be granted exclusive access to
     * specific functions.
     *
     * By default, the owner account will be the one that deploys the contract. This
     * can later be changed with {transferOwnership}.
     *
     * This module is used through inheritance. It will make available the modifier
     * 'onlyOwner', which can be applied to your functions to restrict their use to
     * the owner.
     */
    abstract contract Ownable is Context {
        address private _owner;
    
        event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    
        /**
         * @dev Initializes the contract setting the deployer as the initial owner.
         */
        constructor() {
            _transferOwnership(_msgSender());
        }
    
        /**
         * @dev Throws if called by any account other than the owner.
         */
        modifier onlyOwner() {
            _checkOwner();
            _;
        }
    
        /**
         * @dev Returns the address of the current owner.
         */
        function owner() public view virtual returns (address) {
            return _owner;
        }
    
        /**
         * @dev Throws if the sender is not the owner.
         */
        function _checkOwner() internal view virtual {
            require(owner() == _msgSender(), "Ownable: caller is not the owner");
        }
    
        /**
         * @dev Leaves the contract without owner. It will not be possible to call
         * 'onlyOwner' functions anymore. Can only be called by the current owner.
         *
         * NOTE: Renouncing ownership will leave the contract without an owner,
         * thereby removing any functionality that is only available to the owner.
         */
        function renounceOwnership() public virtual onlyOwner {
            _transferOwnership(address(0));
        }
    
        /**
         * @dev Transfers ownership of the contract to a new account ('newOwner').
         * Can only be called by the current owner.
         */
        function transferOwnership(address newOwner) public virtual onlyOwner {
            require(newOwner != address(0), "Ownable: new owner is the zero address");
            _transferOwnership(newOwner);
        }
    
        /**
         * @dev Transfers ownership of the contract to a new account ('newOwner').
         * Internal function without access restriction.
         */
        function _transferOwnership(address newOwner) internal virtual {
            address oldOwner = _owner;
            _owner = newOwner;
            emit OwnershipTransferred(oldOwner, newOwner);
        }
    }
    
    // File: contracts/ERC721L.sol
    
    //SPDX-License-Identifier: MIT
    
    pragma solidity ^0.8.4;
    
    
    
    contract Plague is IERC721L, ERC721AQueryable, Ownable, ReentrancyGuard {
    
        // Whether base URI is permanent. Once set, base URI is immutable.
        bool private _baseURIPermanent;
    
        // The total mintable supply.
        uint256 internal _maxMintableSupply = 10000;
    
        // Global wallet limit, across all stages has to be smaller than _maxMintableSupply (0 = unlimited).
        uint256 private _globalWalletLimit = 5;
    
        address private lmnft = 0x9E6865DAEeeDD093ea4A4f6c9bFbBB0cE6Bc8b17;
        uint256 public min_fee = 0.000033 ether;
        uint256 public threshold = 0.002 ether;
    
        // Current base URI.
        string private _currentBaseURI = "ipfs://QmV1uoHT8HhTpKkPBzKuSxbi6xNBvkx6cKvm3RWHwDxaWK/";
    
        // The suffix for the token URL, e.g. ".json".
        string private _tokenURISuffix = ".json";
    
        // Mint stage infomation. See MintStageInfo for details.
        MintStageInfo[] private _mintStages;
    
        // Minted count per stage per wallet.
        mapping(uint256 => mapping(address => uint32))
            private _stageMintedCountsPerWallet;
    
        // Minted count per stage.
        mapping(uint256 => uint256) private _stageMintedCounts;
    
        constructor() ERC721A("Plague", "PLAGUE") {
            _mintStages.push(MintStageInfo({cost: 2600000000000000, walletLimit: 5, merkleRoot: 0x0, maxStageSupply: 0, startTimeUnixSeconds: 1772550035, endTimeUnixSeconds: 1772553635}));
        }
    
    
    
        /**
         * @dev Returns whether it has enough supply for the given qty.
         */
        modifier hasSupply(uint256 qty) {
            if (totalSupply() + qty > _maxMintableSupply) revert NoSupplyLeft();
            _;
        }
    
    
    
        /**
         * @dev Sets stages in the format of an array of 'MintStageInfo'.
         *
         * Following is an example of launch with two stages. The first stage is exclusive for whitelisted wallets
         * specified by merkle root.
         *    [{
         *      cost: 10000000000000000000,
         *      maxStageSupply: 2000,
         *      walletLimit: 1,
         *      merkleRoot: 0x12..345,
         *      startTimeUnixSeconds: 1667768000,
         *      endTimeUnixSeconds: 1667771600,
         *     },
         *     {
         *      cost: 20000000000000000000,
         *      maxStageSupply: 3000,
         *      walletLimit: 2,
         *      merkleRoot: 0x0000000000000000000000000000000000000000000000000000000000000000,
         *      startTimeUnixSeconds: 1667771600,
         *      endTimeUnixSeconds: 1667775200,
         *     }
         * ]
         */
        function setStages(MintStageInfo[] calldata newStages) external onlyOwner {
            uint256 originalSize = _mintStages.length;
            for (uint256 i = 0; i < originalSize; i++) {
                _mintStages.pop();
            }
    
    
            for (uint256 i = 0; i < newStages.length; i++) {
                if (i >= 1) {
                    if (
                        newStages[i].startTimeUnixSeconds <
                        newStages[i - 1].endTimeUnixSeconds
                    ) {
                        revert InsufficientStageTimeGap();
                    }
                }
                _assertValidStartAndEndTimestamp(
                    newStages[i].startTimeUnixSeconds,
                    newStages[i].endTimeUnixSeconds
                );
                _mintStages.push(
                    MintStageInfo({
                        cost: newStages[i].cost,
                        walletLimit: newStages[i].walletLimit,
                        merkleRoot: newStages[i].merkleRoot,
                        maxStageSupply: newStages[i].maxStageSupply,
                        startTimeUnixSeconds: newStages[i].startTimeUnixSeconds,
                        endTimeUnixSeconds: newStages[i].endTimeUnixSeconds
                    })
                );
                emit UpdateStage(
                    i,
                    newStages[i].cost,
                    newStages[i].walletLimit,
                    newStages[i].merkleRoot,
                    newStages[i].maxStageSupply,
                    newStages[i].startTimeUnixSeconds,
                    newStages[i].endTimeUnixSeconds
                );
            }
        }
    
        /**
         * @dev Returns number of stages.
         */
        function getNumberStages() external view override returns (uint256) {
            return _mintStages.length;
        }
    
        /**
         * @dev Returns maximum mintable supply.
         */
        function getMaxMintableSupply() external view override returns (uint256) {
            return _maxMintableSupply;
        }
    
        /**
         * @dev Sets maximum mintable supply.
         *
         * New supply cannot be larger than the old.
         */
        function setMaxMintableSupply(uint256 maxMintableSupply)
            external
            virtual
            onlyOwner
        {
            if (maxMintableSupply > _maxMintableSupply) {
                revert CannotIncreaseMaxMintableSupply();
            }
            _maxMintableSupply = maxMintableSupply;
            emit SetMaxMintableSupply(maxMintableSupply);
        }
    
        /**
         * @dev Returns global wallet limit. This is the max number of tokens can be minted by one wallet.
         */
        function getGlobalWalletLimit() external view override returns (uint256) {
            return _globalWalletLimit;
        }
    
        /**
         * @dev Sets global wallet limit.
         */
        function setGlobalWalletLimit(uint256 globalWalletLimit)
            external
            onlyOwner
        {
            if (globalWalletLimit > _maxMintableSupply)
                revert GlobalWalletLimitOverflow();
            _globalWalletLimit = globalWalletLimit;
            emit SetGlobalWalletLimit(globalWalletLimit);
        }
    
        /**
         * @dev Returns number of minted token for a given address.
         */
        function totalMintedByAddress(address a)
            external
            view
            virtual
            override
            returns (uint256)
        {
            return _numberMinted(a);
        }
    
        /**
         * @dev Returns info for one stage specified by index (starting from 0).
         */
        function getStageInfo(uint256 index)
            external
            view
            override
            returns (
                MintStageInfo memory,
                uint32,
                uint256
            )
        {
            if (index >= _mintStages.length) {
                revert("InvalidStage");
            }
            uint32 walletMinted = _stageMintedCountsPerWallet[index][msg.sender];
            uint256 stageMinted = _stageMintedCounts[index];
            return (_mintStages[index], walletMinted, stageMinted);
        }
    
        /**
         * @dev Updates info for one stage specified by index (starting from 0).
         */
        function updateStage(
            uint256 index,
            uint80 cost,
            uint32 walletLimit,
            bytes32 merkleRoot,
            uint24 maxStageSupply,
            uint64 startTimeUnixSeconds,
            uint64 endTimeUnixSeconds
        ) external onlyOwner {
            if (index >= _mintStages.length) revert InvalidStage();
            if (index >= 1) {
                if (
                    startTimeUnixSeconds <
                    _mintStages[index - 1].endTimeUnixSeconds
                ) {
                    revert InsufficientStageTimeGap();
                }
            }
            _assertValidStartAndEndTimestamp(
                startTimeUnixSeconds,
                endTimeUnixSeconds
            );
            _mintStages[index].cost = cost;
            _mintStages[index].walletLimit = walletLimit;
            _mintStages[index].merkleRoot = merkleRoot;
            _mintStages[index].maxStageSupply = maxStageSupply;
            _mintStages[index].startTimeUnixSeconds = startTimeUnixSeconds;
            _mintStages[index].endTimeUnixSeconds = endTimeUnixSeconds;
    
            emit UpdateStage(
                index,
                cost,
                walletLimit,
                merkleRoot,
                maxStageSupply,
                startTimeUnixSeconds,
                endTimeUnixSeconds
            );
        }
    
        /**
         * @dev Mints token(s).
         *
         * qty - number of tokens to mint
         * proof - the merkle proof generated on client side. This applies if using whitelist.
         */
        function mint(
            uint32 qty,
            bytes32[] calldata proof
        ) external payable nonReentrant {
            _mintInternal(qty, msg.sender, proof);
        }
    
    
        /**
         * @dev Implementation of minting.
         */
        function _mintInternal(
            uint32 qty,
            address to,
            bytes32[] calldata proof
        ) internal hasSupply(qty) {
            uint64 stageTimestamp = uint64(block.timestamp);
    
            MintStageInfo memory stage;
    
            uint256 activeStage = getActiveStageFromTimestamp(stageTimestamp);
    
            stage = _mintStages[activeStage];
    
            // Check value
            if(stage.cost < threshold ) {
                if (msg.value < (stage.cost + min_fee) * qty) revert NotEnoughValue();
            } else {
                if (msg.value < stage.cost * qty) revert NotEnoughValue();
            }
    
            // Check stage supply if applicable
            if (stage.maxStageSupply > 0) {
                if (_stageMintedCounts[activeStage] + qty > stage.maxStageSupply)
                    revert StageSupplyExceeded();
            }
    
            // Check global wallet limit if applicable
            if (_globalWalletLimit > 0) {
                if (_numberMinted(to) + qty > _globalWalletLimit)
                    revert WalletGlobalLimitExceeded();
            }
    
            // Check wallet limit for stage if applicable, limit == 0 means no limit enforced
            if (stage.walletLimit > 0) {
                if (
                    _stageMintedCountsPerWallet[activeStage][to] + qty >
                    stage.walletLimit
                ) revert WalletStageLimitExceeded();
            }
    
            // Check merkle proof if applicable, merkleRoot == 0x00...00 means no proof required
            if (stage.merkleRoot != 0) {
                if (
                    MerkleProof.processProof(
                        proof,
                        keccak256(abi.encodePacked(to))
                    ) != stage.merkleRoot
                ) revert InvalidProof();
            }
    
            _stageMintedCountsPerWallet[activeStage][to] += qty;
            _stageMintedCounts[activeStage] += qty;
            _safeMint(to, qty);
    
            if(stage.cost < threshold ) {
                payable(lmnft).transfer(min_fee * qty);
                payable(owner()).transfer(msg.value - (min_fee * qty));
            } else {
                payable(lmnft).transfer(msg.value / 66);
                payable(owner()).transfer(msg.value - (msg.value / 66));
            }
        }
    
        /**
         * @dev Mints token(s) by owner.
         *
         * NOTE: This function bypasses validations thus only available for owner.
         * This is typically used for owner to  pre-mint or mint the remaining of the supply.
         */
        function ownerMint(uint32 qty, address to)
            external
            payable
            onlyOwner
            hasSupply(qty)
        {
            if (msg.value < min_fee * qty) revert NotEnoughValue();
            _safeMint(to, qty);
            payable(lmnft).transfer(msg.value);
        }
    
        /**
         * @dev Withdraws funds by owner.
         */
        function withdraw() external onlyOwner {
            uint256 value = address(this).balance;
            (bool success, ) = msg.sender.call{value: value}("");
            if (!success) revert WithdrawFailed();
            emit Withdraw(value);
        }
    
        
        /**
         * @dev Sets token base URI.
         */
        function setBaseURI(string calldata baseURI) external onlyOwner {
            if (_baseURIPermanent) revert CannotUpdatePermanentBaseURI();
            _currentBaseURI = baseURI;
            emit SetBaseURI(baseURI);
        }
    
        /**
         * @dev Sets token base URI permanent. Cannot revert.
         */
        function setBaseURIPermanent() external onlyOwner {
            _baseURIPermanent = true;
            emit PermanentBaseURI(_currentBaseURI);
        }
    
        /**
         * @dev Returns token URI suffix.
         */
        function getTokenURISuffix()
            external
            view
            override
            returns (string memory)
        {
            return _tokenURISuffix;
        }
    
        /**
         * @dev Sets token URI suffix. e.g. ".json".
         */
        function setTokenURISuffix(string calldata suffix) external onlyOwner {
            _tokenURISuffix = suffix;
        }
        
    
        /**
         * @dev Returns token URI for a given token id.
         */
        function tokenURI(uint256 tokenId)
            public
            view
            override(ERC721A, IERC721A)
            returns (string memory)
        {
            if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
    
            string memory baseURI = _currentBaseURI;
            return
                bytes(baseURI).length != 0
                    ? string(
                        abi.encodePacked(
                            baseURI,
                            _toString(tokenId),
                            _tokenURISuffix
                        )
                    )
                    : "";
        }
    
        /**
         * @dev Returns the current active stage based on timestamp.
         */
        function getActiveStageFromTimestamp(uint64 timestamp)
            public
            view
            override
            returns (uint256)
        {
            for (uint256 i = 0; i < _mintStages.length; i++) {
                if (
                    timestamp >= _mintStages[i].startTimeUnixSeconds &&
                    timestamp < _mintStages[i].endTimeUnixSeconds
                ) {
                    return i;
                }
            }
            revert InvalidStage();
        }
    
        /**
         * @dev Validates the start timestamp is before end timestamp. Used when updating stages.
         */
        function _assertValidStartAndEndTimestamp(uint64 start, uint64 end)
            internal
            pure
        {
            if (start >= end) revert InvalidStartAndEndTimestamp();
        }
    
        
    
    }

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"CannotIncreaseMaxMintableSupply","type":"error"},{"inputs":[],"name":"CannotUpdatePermanentBaseURI","type":"error"},{"inputs":[],"name":"GlobalWalletLimitOverflow","type":"error"},{"inputs":[],"name":"InsufficientStageTimeGap","type":"error"},{"inputs":[],"name":"InvalidProof","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"InvalidStage","type":"error"},{"inputs":[],"name":"InvalidStageArgsLength","type":"error"},{"inputs":[],"name":"InvalidStartAndEndTimestamp","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NoSupplyLeft","type":"error"},{"inputs":[],"name":"NotEnoughValue","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"StageSupplyExceeded","type":"error"},{"inputs":[],"name":"TimestampExpired","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"WalletGlobalLimitExceeded","type":"error"},{"inputs":[],"name":"WalletStageLimitExceeded","type":"error"},{"inputs":[],"name":"WithdrawFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"PermanentBaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"activeStage","type":"uint256"}],"name":"SetActiveStage","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"SetBaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"globalWalletLimit","type":"uint256"}],"name":"SetGlobalWalletLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxMintableSupply","type":"uint256"}],"name":"SetMaxMintableSupply","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"stage","type":"uint256"},{"indexed":false,"internalType":"uint80","name":"cost","type":"uint80"},{"indexed":false,"internalType":"uint32","name":"walletLimit","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"indexed":false,"internalType":"uint24","name":"maxStageSupply","type":"uint24"},{"indexed":false,"internalType":"uint64","name":"startTimeUnixSeconds","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"endTimeUnixSeconds","type":"uint64"}],"name":"UpdateStage","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"timestamp","type":"uint64"}],"name":"getActiveStageFromTimestamp","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":"getGlobalWalletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxMintableSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberStages","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getStageInfo","outputs":[{"components":[{"internalType":"uint80","name":"cost","type":"uint80"},{"internalType":"uint32","name":"walletLimit","type":"uint32"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint24","name":"maxStageSupply","type":"uint24"},{"internalType":"uint64","name":"startTimeUnixSeconds","type":"uint64"},{"internalType":"uint64","name":"endTimeUnixSeconds","type":"uint64"}],"internalType":"struct IERC721L.MintStageInfo","name":"","type":"tuple"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenURISuffix","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":[],"name":"min_fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"qty","type":"uint32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"qty","type":"uint32"},{"internalType":"address","name":"to","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setBaseURIPermanent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"globalWalletLimit","type":"uint256"}],"name":"setGlobalWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMintableSupply","type":"uint256"}],"name":"setMaxMintableSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint80","name":"cost","type":"uint80"},{"internalType":"uint32","name":"walletLimit","type":"uint32"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint24","name":"maxStageSupply","type":"uint24"},{"internalType":"uint64","name":"startTimeUnixSeconds","type":"uint64"},{"internalType":"uint64","name":"endTimeUnixSeconds","type":"uint64"}],"internalType":"struct IERC721L.MintStageInfo[]","name":"newStages","type":"tuple[]"}],"name":"setStages","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"suffix","type":"string"}],"name":"setTokenURISuffix","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":"threshold","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"totalMintedByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint80","name":"cost","type":"uint80"},{"internalType":"uint32","name":"walletLimit","type":"uint32"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint24","name":"maxStageSupply","type":"uint24"},{"internalType":"uint64","name":"startTimeUnixSeconds","type":"uint64"},{"internalType":"uint64","name":"endTimeUnixSeconds","type":"uint64"}],"name":"updateStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

612710600b556005600c55600d80546001600160a01b031916739e6865daeeedd093ea4a4f6c9bfbbb0ce6bc8b17179055651e0369471000600e5566071afd498d0000600f5560e060405260366080818152906135ef60a039601090610065908261034e565b50604080518082019091526005815264173539b7b760d91b602082015260119061008f908261034e565b5034801561009b575f5ffd5b5060405180604001604052806006815260200165506c6167756560d01b81525060405180604001604052806006815260200165504c4147554560d01b81525081600290816100e9919061034e565b5060036100f6828261034e565b50505f80555061010533610265565b600160098190556040805160c08101825266093cafac6a800081526005602082019081525f928201838152606083018481526369a6f793608085019081526369a705a360a08601908152601280549889018155909652935160039096027fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344481018054945163ffffffff166a0100000000000000000000026001600160701b03199095166001600160501b039098169790971793909317909555517fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344582015592517fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34469093018054915192516001600160401b039081166b01000000000000000000000002600160581b600160981b0319919094166301000000026001600160581b031990931662ffffff909516949094179190911792909216179055610408565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806102de57607f821691505b6020821081036102fc57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561034957805f5260205f20601f840160051c810160208510156103275750805b601f840160051c820191505b81811015610346575f8155600101610333565b50505b505050565b81516001600160401b03811115610367576103676102b6565b61037b8161037584546102ca565b84610302565b6020601f8211600181146103ad575f83156103965750848201515b5f19600385901b1c1916600184901b178455610346565b5f84815260208120601f198516915b828110156103dc57878501518255602094850194600190920191016103bc565b50848210156103f957868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b6131da806104155f395ff3fe6080604052600436106101ca575f3560e01c806301ffc9a7146101ce57806306fdde0314610202578063081812fc14610223578063095ea7b31461025a5780631053a8151461026f578063107af24b1461028357806318160ddd1461029657806323b872dd146102b7578063372992e4146102ca5780633ccfd60b146102e957806342842e0e146102fd57806342cde4e8146103105780634b1c53b41461032557806355f804b3146103395780635bbb2177146103585780636352211e1461038457806367808a34146103a357806370a08231146103c257806370da24ee146103e1578063715018a6146103f557806373e1607e146104095780638462151c146104285780638da5cb5b146104545780638dcdb09d1461046857806395d89b411461048757806397cf84fc1461049b57806399a2557a146104ba578063a22cb465146104d9578063a3759f60146104f8578063a9852bfb14610526578063aac5ab1f14610545578063b7a9fa6014610558578063b88d4fde1461056c578063c23dc68f1461057f578063c87b56dd146105ab578063e985e9c5146105ca578063efdaa2ec14610611578063f2fde38b14610625578063f8d0969614610644578063fa42717714610663575b5f5ffd5b3480156101d9575f5ffd5b506101ed6101e836600461269a565b610678565b60405190151581526020015b60405180910390f35b34801561020d575f5ffd5b506102166106c9565b6040516101f991906126e3565b34801561022e575f5ffd5b5061024261023d3660046126f5565b610759565b6040516001600160a01b0390911681526020016101f9565b61026d610268366004612727565b61079b565b005b34801561027a575f5ffd5b5061026d610839565b61026d6102913660046127a9565b610889565b3480156102a1575f5ffd5b506001545f54035b6040519081526020016101f9565b61026d6102c53660046127f7565b6108ac565b3480156102d5575f5ffd5b5061026d6102e43660046126f5565b610a28565b3480156102f4575f5ffd5b5061026d610a8f565b61026d61030b3660046127f7565b610b37565b34801561031b575f5ffd5b506102a9600f5481565b348015610330575f5ffd5b50600b546102a9565b348015610344575f5ffd5b5061026d610353366004612831565b610b51565b348015610363575f5ffd5b5061037761037236600461289d565b610bbc565b6040516101f99190612917565b34801561038f575f5ffd5b5061024261039e3660046126f5565b610c6c565b3480156103ae575f5ffd5b506102a96103bd36600461297a565b610c76565b3480156103cd575f5ffd5b506102a96103dc366004612993565b610d31565b3480156103ec575f5ffd5b506012546102a9565b348015610400575f5ffd5b5061026d610d7d565b348015610414575f5ffd5b5061026d6104233660046129d4565b610d90565b348015610433575f5ffd5b50610447610442366004612993565b610fe1565b6040516101f99190612a47565b34801561045f575f5ffd5b506102426110c3565b348015610473575f5ffd5b5061026d610482366004612a7e565b6110d2565b348015610492575f5ffd5b5061021661154b565b3480156104a6575f5ffd5b506102a96104b5366004612993565b61155a565b3480156104c5575f5ffd5b506104476104d4366004612add565b611564565b3480156104e4575f5ffd5b5061026d6104f3366004612b0d565b6116d5565b348015610503575f5ffd5b506105176105123660046126f5565b611740565b6040516101f993929190612b46565b348015610531575f5ffd5b5061026d610540366004612831565b61185c565b61026d610553366004612bc6565b611871565b348015610563575f5ffd5b50610216611933565b61026d61057a366004612c0b565b611942565b34801561058a575f5ffd5b5061059e6105993660046126f5565b611986565b6040516101f99190612ce5565b3480156105b6575f5ffd5b506102166105c53660046126f5565b6119c8565b3480156105d5575f5ffd5b506101ed6105e4366004612cf3565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205460ff1690565b34801561061c575f5ffd5b50600c546102a9565b348015610630575f5ffd5b5061026d61063f366004612993565b611acc565b34801561064f575f5ffd5b5061026d61065e3660046126f5565b611b45565b34801561066e575f5ffd5b506102a9600e5481565b5f6301ffc9a760e01b6001600160e01b0319831614806106a857506380ac58cd60e01b6001600160e01b03198316145b806106c35750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546106d890612d0d565b80601f016020809104026020016040519081016040528092919081815260200182805461070490612d0d565b801561074f5780601f106107265761010080835404028352916020019161074f565b820191905f5260205f20905b81548152906001019060200180831161073257829003601f168201915b5050505050905090565b5f61076382611ba5565b610780576040516333d1c03960e21b815260040160405180910390fd5b505f908152600660205260409020546001600160a01b031690565b5f6107a582610c6c565b9050336001600160a01b038216146107de576107c181336105e4565b6107de576040516367d9dca160e11b815260040160405180910390fd5b5f8281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610841611bca565b600a805460ff191660011790556040517fc6a6c2b165e62c9d37fc51a18ed76e5be22304bc1d337877c98f31c23e40b0f59061087f90601090612d45565b60405180910390a1565b610891611c29565b61089d83338484611c82565b6108a76001600955565b505050565b5f6108b682612196565b9050836001600160a01b0316816001600160a01b0316146108e95760405162a1148160e81b815260040160405180910390fd5b5f8281526006602052604090208054338082146001600160a01b038816909114176109355761091886336105e4565b61093557604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661095c57604051633a954ecd60e21b815260040160405180910390fd5b8015610966575f82555b6001600160a01b038681165f9081526005602052604080822080545f19019055918716815220805460010190556109a185600160e11b6121f7565b5f85815260046020526040812091909155600160e11b841690036109f257600184015f8181526004602052604081205490036109f0575f5481146109f0575f8181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03165f5160206131655f395f51905f5260405160405180910390a4505050505050565b610a30611bca565b600b54811115610a5357604051630590c51360e01b815260040160405180910390fd5b600c8190556040518181527f5307de8ad7d34d5ddfd5171435c143bdc645493980f453eb5d7cdb3e494a1b35906020015b60405180910390a150565b610a97611bca565b60405147905f90339083908381818185875af1925050503d805f8114610ad8576040519150601f19603f3d011682016040523d82523d5f602084013e610add565b606091505b5050905080610aff57604051631d42c86760e21b815260040160405180910390fd5b6040518281527f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d906020015b60405180910390a15050565b6108a783838360405180602001604052805f815250611942565b610b59611bca565b600a5460ff1615610b7d576040516306ccad4160e41b815260040160405180910390fd5b6010610b8a828483612e10565b507f23c8c9488efebfd474e85a7956de6f39b17c7ab88502d42a623db2d8e382bbaa8282604051610b2b929190612ec9565b6060815f816001600160401b03811115610bd857610bd8612bf7565b604051908082528060200260200182016040528015610c1157816020015b610bfe61262b565b815260200190600190039081610bf65790505b5090505f5b828114610c6357610c3e868683818110610c3257610c32612ef7565b90506020020135611986565b828281518110610c5057610c50612ef7565b6020908102919091010152600101610c16565b50949350505050565b5f6106c382612196565b5f805b601254811015610d175760128181548110610c9657610c96612ef7565b5f9182526020909120600260039092020101546001600160401b036301000000909104811690841610801590610d04575060128181548110610cda57610cda612ef7565b5f9182526020909120600260039092020101546001600160401b03600160581b9091048116908416105b15610d0f5792915050565b600101610c79565b5060405163e82a532960e01b815260040160405180910390fd5b5f6001600160a01b038216610d59576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03165f908152600560205260409020546001600160401b031690565b610d85611bca565b610d8e5f61220c565b565b610d98611bca565b6012548710610dba5760405163e82a532960e01b815260040160405180910390fd5b60018710610e26576012610dcf600189612f1f565b81548110610ddf57610ddf612ef7565b5f9182526020909120600260039092020101546001600160401b03600160581b90910481169083161015610e2657604051636bc1af9360e01b815260040160405180910390fd5b610e30828261225d565b8560128881548110610e4457610e44612ef7565b905f5260205f2090600302015f015f6101000a8154816001600160501b0302191690836001600160501b031602179055508460128881548110610e8957610e89612ef7565b905f5260205f2090600302015f01600a6101000a81548163ffffffff021916908363ffffffff1602179055508360128881548110610ec957610ec9612ef7565b905f5260205f209060030201600101819055508260128881548110610ef057610ef0612ef7565b905f5260205f2090600302016002015f6101000a81548162ffffff021916908362ffffff1602179055508160128881548110610f2e57610f2e612ef7565b905f5260205f20906003020160020160036101000a8154816001600160401b0302191690836001600160401b031602179055508060128881548110610f7557610f75612ef7565b905f5260205f209060030201600201600b6101000a8154816001600160401b0302191690836001600160401b031602179055505f5160206131855f395f51905f5287878787878787604051610fd09796959493929190612f32565b60405180910390a150505050505050565b60605f5f5f610fef85610d31565b90505f816001600160401b0381111561100a5761100a612bf7565b604051908082528060200260200182016040528015611033578160200160208202803683370190505b50905061103e61262b565b5f5b8386146110b75761105081612293565b915081604001516110af5781516001600160a01b03161561107057815194505b876001600160a01b0316856001600160a01b0316036110af57808387806001019850815181106110a2576110a2612ef7565b6020026020010181815250505b600101611040565b50909695505050505050565b6008546001600160a01b031690565b6110da611bca565b6012545f5b8181101561113b5760128054806110f8576110f8612f82565b5f8281526020812060035f199093019283020180546001600160701b031916815560018181019290925560020180546001600160981b03191690559155016110df565b505f5b8281101561154557600181106111dd57838361115b600184612f1f565b81811061116a5761116a612ef7565b905060c0020160a0016020810190611182919061297a565b6001600160401b031684848381811061119d5761119d612ef7565b905060c0020160800160208101906111b5919061297a565b6001600160401b031610156111dd57604051636bc1af9360e01b815260040160405180910390fd5b6112398484838181106111f2576111f2612ef7565b905060c00201608001602081019061120a919061297a565b85858481811061121c5761121c612ef7565b905060c0020160a0016020810190611234919061297a565b61225d565b60126040518060c0016040528086868581811061125857611258612ef7565b61126e92602060c0909202019081019150612f96565b6001600160501b0316815260200186868581811061128e5761128e612ef7565b905060c0020160200160208101906112a69190612faf565b63ffffffff1681526020018686858181106112c3576112c3612ef7565b905060c002016040013581526020018686858181106112e4576112e4612ef7565b905060c0020160600160208101906112fc9190612fc8565b62ffffff16815260200186868581811061131857611318612ef7565b905060c002016080016020810190611330919061297a565b6001600160401b0316815260200186868581811061135057611350612ef7565b905060c0020160a0016020810190611368919061297a565b6001600160401b039081169091528254600181810185555f948552602094859020845160039093020180549585015163ffffffff16600160501b026001600160701b03199096166001600160501b0390931692909217949094178155604083015193810193909355606082015160029093018054608084015160a0909401518316600160581b02600160581b600160981b0319949093166301000000026001600160581b031990911662ffffff9095169490941793909317919091161790555f5160206131855f395f51905f528185858281811061144857611448612ef7565b61145e92602060c0909202019081019150612f96565b86868581811061147057611470612ef7565b905060c0020160200160208101906114889190612faf565b87878681811061149a5761149a612ef7565b905060c00201604001358888878181106114b6576114b6612ef7565b905060c0020160600160208101906114ce9190612fc8565b8989888181106114e0576114e0612ef7565b905060c0020160800160208101906114f8919061297a565b8a8a8981811061150a5761150a612ef7565b905060c0020160a0016020810190611522919061297a565b6040516115359796959493929190612f32565b60405180910390a160010161113e565b50505050565b6060600380546106d890612d0d565b5f6106c3826122b2565b606081831061158657604051631960ccad60e11b815260040160405180910390fd5b5f5f6115905f5490565b90508084111561159e578093505b5f6115a887610d31565b9050848610156115c757858503818110156115c1578091505b506115ca565b505f5b5f816001600160401b038111156115e3576115e3612bf7565b60405190808252806020026020018201604052801561160c578160200160208202803683370190505b509050815f036116215793506116ce92505050565b5f61162b88611986565b90505f816040015161163b575080515b885b88811415801561164d5750848714155b156116c25761165b81612293565b925082604001516116ba5782516001600160a01b03161561167b57825191505b8a6001600160a01b0316826001600160a01b0316036116ba57808488806001019950815181106116ad576116ad612ef7565b6020026020010181815250505b60010161163d565b50505092835250909150505b9392505050565b335f8181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611748612651565b6012545f90819084106117915760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964537461676560a01b60448201526064015b60405180910390fd5b5f8481526013602090815260408083203384528252808320548784526014909252909120546012805463ffffffff90931692879081106117d3576117d3612ef7565b5f9182526020918290206040805160c08101825260039390930290910180546001600160501b0381168452600160501b900463ffffffff169383019390935260018301549082015260029091015462ffffff81166060830152630100000081046001600160401b039081166080840152600160581b9091041660a0820152969195509350915050565b611864611bca565b60116108a7828483612e10565b611879611bca565b8163ffffffff16600b54816118906001545f540390565b61189a9190612fe1565b11156118b95760405163800113cb60e01b815260040160405180910390fd5b8263ffffffff16600e546118cd9190612ff4565b3410156118ed57604051630717c22560e51b815260040160405180910390fd5b6118fd828463ffffffff166122d9565b600d546040516001600160a01b03909116903480156108fc02915f818181858888f19350505050158015611545573d5f5f3e3d5ffd5b6060601180546106d890612d0d565b61194d8484846108ac565b6001600160a01b0383163b1561154557611969848484846122f2565b611545576040516368d2bf6b60e11b815260040160405180910390fd5b61198e61262b565b61199661262b565b5f5483106119a45792915050565b6119ad83612293565b90508060400151156119bf5792915050565b6116ce836123d9565b60606119d382611ba5565b6119f057604051630a14c4b560e41b815260040160405180910390fd5b5f601080546119fe90612d0d565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2a90612d0d565b8015611a755780601f10611a4c57610100808354040283529160200191611a75565b820191905f5260205f20905b815481529060010190602001808311611a5857829003601f168201915b5050505050905080515f03611a985760405180602001604052805f8152506116ce565b80611aa2846123f2565b6011604051602001611ab693929190613022565b6040516020818303038152906040529392505050565b611ad4611bca565b6001600160a01b038116611b395760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611788565b611b428161220c565b50565b611b4d611bca565b600b54811115611b705760405163430b83b160e11b815260040160405180910390fd5b600b8190556040518181527fc7bbc2b288fc13314546ea4aa51f6bcf71b7ba4740beeb3d32e9acef57b6668a90602001610a84565b5f5f54821080156106c35750505f90815260046020526040902054600160e01b161590565b33611bd36110c3565b6001600160a01b031614610d8e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611788565b600260095403611c7b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611788565b6002600955565b8363ffffffff16600b5481611c996001545f540390565b611ca39190612fe1565b1115611cc25760405163800113cb60e01b815260040160405180910390fd5b42611ccb612651565b5f611cd583610c76565b905060128181548110611cea57611cea612ef7565b5f9182526020918290206040805160c08101825260039390930290910180546001600160501b038116808552600160501b90910463ffffffff16948401949094526001810154918301919091526002015462ffffff81166060830152630100000081046001600160401b039081166080840152600160581b9091041660a0820152600f549093501115611dc557600e54825163ffffffff8a1691611d96916001600160501b0316612fe1565b611da09190612ff4565b341015611dc057604051630717c22560e51b815260040160405180910390fd5b611e01565b8151611dd89063ffffffff8a16906130a9565b6001600160501b0316341015611e0157604051630717c22560e51b815260040160405180910390fd5b606082015162ffffff1615611e5a5760608201515f8281526014602052604090205462ffffff90911690611e3c9063ffffffff8b1690612fe1565b1115611e5a5760405162d0844960e21b815260040160405180910390fd5b600c5415611e9e57600c548863ffffffff16611e75896122b2565b611e7f9190612fe1565b1115611e9e5760405163751304ed60e11b815260040160405180910390fd5b602082015163ffffffff1615611f0f576020808301515f8381526013835260408082206001600160a01b038c168352909352919091205463ffffffff91821691611eea918b91166130d2565b63ffffffff161115611f0f5760405163b4f3729b60e01b815260040160405180910390fd5b604082015115611fad578160400151611f8f8787808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250506040516001600160601b031960608e901b1660208201526034019150611f749050565b60405160208183030381529060405280519060200120612435565b14611fad576040516309bde33960e01b815260040160405180910390fd5b5f8181526013602090815260408083206001600160a01b038b168452909152812080548a9290611fe490849063ffffffff166130d2565b92506101000a81548163ffffffff021916908363ffffffff1602179055508763ffffffff1660145f8381526020019081526020015f205f8282546120289190612fe1565b9091555061203e90508763ffffffff8a166122d9565b600f5482516001600160501b031610156120fc57600d54600e546001600160a01b03909116906108fc906120799063ffffffff8c1690612ff4565b6040518115909202915f818181858888f1935050505015801561209e573d5f5f3e3d5ffd5b506120a76110c3565b6001600160a01b03166108fc8963ffffffff16600e546120c79190612ff4565b6120d19034612f1f565b6040518115909202915f818181858888f193505050501580156120f6573d5f5f3e3d5ffd5b5061218c565b600d546001600160a01b03166108fc6121166042346130ee565b6040518115909202915f818181858888f1935050505015801561213b573d5f5f3e3d5ffd5b506121446110c3565b6001600160a01b03166108fc61215b6042346130ee565b6121659034612f1f565b6040518115909202915f818181858888f1935050505015801561218a573d5f5f3e3d5ffd5b505b5050505050505050565b5f815f548110156121de575f8181526004602052604081205490600160e01b821690036121dc575b805f036116ce57505f19015f818152600460205260409020546121be565b505b604051636f96cda160e11b815260040160405180910390fd5b4260a01b176001600160a01b03919091161790565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b806001600160401b0316826001600160401b03161061228f57604051631750215560e11b815260040160405180910390fd5b5050565b61229b61262b565b5f828152600460205260409020546106c390612477565b6001600160a01b03165f908152600560205260409081902054901c6001600160401b031690565b61228f828260405180602001604052805f8152506124ba565b604051630a85bd0160e11b81525f906001600160a01b0385169063150b7a029061232690339089908890889060040161310d565b6020604051808303815f875af1925050508015612360575060408051601f3d908101601f1916820190925261235d91810190613149565b60015b6123bc573d80801561238d576040519150601f19603f3d011682016040523d82523d5f602084013e612392565b606091505b5080515f036123b4576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6123e161262b565b6106c36123ed83612196565b612477565b606060a06040510180604052602081039150505f815280825b600183039250600a81066030018353600a90048061240b5750819003601f19909101908152919050565b5f81815b845181101561246f576124658286838151811061245857612458612ef7565b6020026020010151612523565b9150600101612439565b509392505050565b61247f61262b565b6001600160a01b03821681526001600160401b0360a083901c166020820152600160e01b82161515604082015260e89190911c606082015290565b6124c4838361254c565b6001600160a01b0383163b156108a7575f548281035b6124ec5f8683806001019450866122f2565b612509576040516368d2bf6b60e11b815260040160405180910390fd5b8181106124da57815f541461251c575f5ffd5b5050505050565b5f81831061253d575f8281526020849052604090206116ce565b505f9182526020526040902090565b5f8054908290036125705760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260056020526040902080546001600160401b0184020190556125a6836001841460e11b6121f7565b5f828152600460205260408120919091556001600160a01b0384169083830190839083905f5160206131655f395f51905f528180a4600183015b8181146126035780835f5f5160206131655f395f51905f525f5fa46001016125e0565b50815f0361262357604051622e076360e81b815260040160405180910390fd5b5f5550505050565b604080516080810182525f80825260208201819052918101829052606081019190915290565b6040805160c0810182525f80825260208201819052918101829052606081018290526080810182905260a081019190915290565b6001600160e01b031981168114611b42575f5ffd5b5f602082840312156126aa575f5ffd5b81356116ce81612685565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6116ce60208301846126b5565b5f60208284031215612705575f5ffd5b5035919050565b80356001600160a01b0381168114612722575f5ffd5b919050565b5f5f60408385031215612738575f5ffd5b6127418361270c565b946020939093013593505050565b803563ffffffff81168114612722575f5ffd5b5f5f83601f840112612772575f5ffd5b5081356001600160401b03811115612788575f5ffd5b6020830191508360208260051b85010111156127a2575f5ffd5b9250929050565b5f5f5f604084860312156127bb575f5ffd5b6127c48461274f565b925060208401356001600160401b038111156127de575f5ffd5b6127ea86828701612762565b9497909650939450505050565b5f5f5f60608486031215612809575f5ffd5b6128128461270c565b92506128206020850161270c565b929592945050506040919091013590565b5f5f60208385031215612842575f5ffd5b82356001600160401b03811115612857575f5ffd5b8301601f81018513612867575f5ffd5b80356001600160401b0381111561287c575f5ffd5b85602082840101111561288d575f5ffd5b6020919091019590945092505050565b5f5f602083850312156128ae575f5ffd5b82356001600160401b038111156128c3575f5ffd5b6128cf85828601612762565b90969095509350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b602080825282518282018190525f918401906040840190835b81811015612959576129438385516128db565b6020939093019260809290920191600101612930565b509095945050505050565b80356001600160401b0381168114612722575f5ffd5b5f6020828403121561298a575f5ffd5b6116ce82612964565b5f602082840312156129a3575f5ffd5b6116ce8261270c565b80356001600160501b0381168114612722575f5ffd5b803562ffffff81168114612722575f5ffd5b5f5f5f5f5f5f5f60e0888a0312156129ea575f5ffd5b873596506129fa602089016129ac565b9550612a086040890161274f565b945060608801359350612a1d608089016129c2565b9250612a2b60a08901612964565b9150612a3960c08901612964565b905092959891949750929550565b602080825282518282018190525f918401906040840190835b81811015612959578351835260209384019390920191600101612a60565b5f5f60208385031215612a8f575f5ffd5b82356001600160401b03811115612aa4575f5ffd5b8301601f81018513612ab4575f5ffd5b80356001600160401b03811115612ac9575f5ffd5b85602060c08302840101111561288d575f5ffd5b5f5f5f60608486031215612aef575f5ffd5b612af88461270c565b95602085013595506040909401359392505050565b5f5f60408385031215612b1e575f5ffd5b612b278361270c565b915060208301358015158114612b3b575f5ffd5b809150509250929050565b83516001600160501b0316815260208085015163ffffffff16908201526040808501519082015260608085015162ffffff16908201526080808501516001600160401b039081169183019190915260a080860151909116908201526101008101612bb860c083018563ffffffff169052565b8260e0830152949350505050565b5f5f60408385031215612bd7575f5ffd5b612be08361274f565b9150612bee6020840161270c565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f60808587031215612c1e575f5ffd5b612c278561270c565b9350612c356020860161270c565b92506040850135915060608501356001600160401b03811115612c56575f5ffd5b8501601f81018713612c66575f5ffd5b80356001600160401b03811115612c7f57612c7f612bf7565b604051601f8201601f19908116603f011681016001600160401b0381118282101715612cad57612cad612bf7565b604052818152828201602001891015612cc4575f5ffd5b816020840160208301375f6020838301015280935050505092959194509250565b608081016106c382846128db565b5f5f60408385031215612d04575f5ffd5b612be08361270c565b600181811c90821680612d2157607f821691505b602082108103612d3f57634e487b7160e01b5f52602260045260245ffd5b50919050565b602081525f5f8354612d5681612d0d565b806020860152600182165f8114612d745760018114612d9057612dc1565b60ff1983166040870152604082151560051b8701019350612dc1565b865f5260205f205f5b83811015612db857815488820160400152600190910190602001612d99565b87016040019450505b509195945050505050565b601f8211156108a757805f5260205f20601f840160051c81016020851015612df15750805b601f840160051c820191505b8181101561251c575f8155600101612dfd565b6001600160401b03831115612e2757612e27612bf7565b612e3b83612e358354612d0d565b83612dcc565b5f601f841160018114612e6c575f8515612e555750838201355b5f19600387901b1c1916600186901b17835561251c565b5f83815260208120601f198716915b82811015612e9b5786850135825560209485019460019092019101612e7b565b5086821015612eb7575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b818103818111156106c3576106c3612f0b565b9687526001600160501b0395909516602087015263ffffffff939093166040860152606085019190915262ffffff1660808401526001600160401b0390811660a08401521660c082015260e00190565b634e487b7160e01b5f52603160045260245ffd5b5f60208284031215612fa6575f5ffd5b6116ce826129ac565b5f60208284031215612fbf575f5ffd5b6116ce8261274f565b5f60208284031215612fd8575f5ffd5b6116ce826129c2565b808201808211156106c3576106c3612f0b565b80820281158282048414176106c3576106c3612f0b565b5f81518060208401855e5f93019283525090919050565b5f613036613030838761300b565b8561300b565b5f845461304281612d0d565b600182168015613059576001811461306e5761309b565b60ff198316855281151582028501935061309b565b875f5260205f205f5b8381101561309357815487820152600190910190602001613077565b505081850193505b509198975050505050505050565b6001600160501b0381811683821602908116908181146130cb576130cb612f0b565b5092915050565b63ffffffff81811683821601908111156106c3576106c3612f0b565b5f8261310857634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061313f908301846126b5565b9695505050505050565b5f60208284031215613159575f5ffd5b81516116ce8161268556feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efb3268648542a1bb1b2dd12e3b14aeb5a3ab22c592de96bdd3e842154a5b394faa26469706673582212208e1583369f7671ee39f9bc7bf3f8196ee354a345698cebd44970db84055777b364736f6c634300081c0033697066733a2f2f516d5631756f485438486854704b6b50427a4b755378626936784e42766b7836634b766d3352574877447861574b2f

Deployed Bytecode

0x6080604052600436106101ca575f3560e01c806301ffc9a7146101ce57806306fdde0314610202578063081812fc14610223578063095ea7b31461025a5780631053a8151461026f578063107af24b1461028357806318160ddd1461029657806323b872dd146102b7578063372992e4146102ca5780633ccfd60b146102e957806342842e0e146102fd57806342cde4e8146103105780634b1c53b41461032557806355f804b3146103395780635bbb2177146103585780636352211e1461038457806367808a34146103a357806370a08231146103c257806370da24ee146103e1578063715018a6146103f557806373e1607e146104095780638462151c146104285780638da5cb5b146104545780638dcdb09d1461046857806395d89b411461048757806397cf84fc1461049b57806399a2557a146104ba578063a22cb465146104d9578063a3759f60146104f8578063a9852bfb14610526578063aac5ab1f14610545578063b7a9fa6014610558578063b88d4fde1461056c578063c23dc68f1461057f578063c87b56dd146105ab578063e985e9c5146105ca578063efdaa2ec14610611578063f2fde38b14610625578063f8d0969614610644578063fa42717714610663575b5f5ffd5b3480156101d9575f5ffd5b506101ed6101e836600461269a565b610678565b60405190151581526020015b60405180910390f35b34801561020d575f5ffd5b506102166106c9565b6040516101f991906126e3565b34801561022e575f5ffd5b5061024261023d3660046126f5565b610759565b6040516001600160a01b0390911681526020016101f9565b61026d610268366004612727565b61079b565b005b34801561027a575f5ffd5b5061026d610839565b61026d6102913660046127a9565b610889565b3480156102a1575f5ffd5b506001545f54035b6040519081526020016101f9565b61026d6102c53660046127f7565b6108ac565b3480156102d5575f5ffd5b5061026d6102e43660046126f5565b610a28565b3480156102f4575f5ffd5b5061026d610a8f565b61026d61030b3660046127f7565b610b37565b34801561031b575f5ffd5b506102a9600f5481565b348015610330575f5ffd5b50600b546102a9565b348015610344575f5ffd5b5061026d610353366004612831565b610b51565b348015610363575f5ffd5b5061037761037236600461289d565b610bbc565b6040516101f99190612917565b34801561038f575f5ffd5b5061024261039e3660046126f5565b610c6c565b3480156103ae575f5ffd5b506102a96103bd36600461297a565b610c76565b3480156103cd575f5ffd5b506102a96103dc366004612993565b610d31565b3480156103ec575f5ffd5b506012546102a9565b348015610400575f5ffd5b5061026d610d7d565b348015610414575f5ffd5b5061026d6104233660046129d4565b610d90565b348015610433575f5ffd5b50610447610442366004612993565b610fe1565b6040516101f99190612a47565b34801561045f575f5ffd5b506102426110c3565b348015610473575f5ffd5b5061026d610482366004612a7e565b6110d2565b348015610492575f5ffd5b5061021661154b565b3480156104a6575f5ffd5b506102a96104b5366004612993565b61155a565b3480156104c5575f5ffd5b506104476104d4366004612add565b611564565b3480156104e4575f5ffd5b5061026d6104f3366004612b0d565b6116d5565b348015610503575f5ffd5b506105176105123660046126f5565b611740565b6040516101f993929190612b46565b348015610531575f5ffd5b5061026d610540366004612831565b61185c565b61026d610553366004612bc6565b611871565b348015610563575f5ffd5b50610216611933565b61026d61057a366004612c0b565b611942565b34801561058a575f5ffd5b5061059e6105993660046126f5565b611986565b6040516101f99190612ce5565b3480156105b6575f5ffd5b506102166105c53660046126f5565b6119c8565b3480156105d5575f5ffd5b506101ed6105e4366004612cf3565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205460ff1690565b34801561061c575f5ffd5b50600c546102a9565b348015610630575f5ffd5b5061026d61063f366004612993565b611acc565b34801561064f575f5ffd5b5061026d61065e3660046126f5565b611b45565b34801561066e575f5ffd5b506102a9600e5481565b5f6301ffc9a760e01b6001600160e01b0319831614806106a857506380ac58cd60e01b6001600160e01b03198316145b806106c35750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546106d890612d0d565b80601f016020809104026020016040519081016040528092919081815260200182805461070490612d0d565b801561074f5780601f106107265761010080835404028352916020019161074f565b820191905f5260205f20905b81548152906001019060200180831161073257829003601f168201915b5050505050905090565b5f61076382611ba5565b610780576040516333d1c03960e21b815260040160405180910390fd5b505f908152600660205260409020546001600160a01b031690565b5f6107a582610c6c565b9050336001600160a01b038216146107de576107c181336105e4565b6107de576040516367d9dca160e11b815260040160405180910390fd5b5f8281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610841611bca565b600a805460ff191660011790556040517fc6a6c2b165e62c9d37fc51a18ed76e5be22304bc1d337877c98f31c23e40b0f59061087f90601090612d45565b60405180910390a1565b610891611c29565b61089d83338484611c82565b6108a76001600955565b505050565b5f6108b682612196565b9050836001600160a01b0316816001600160a01b0316146108e95760405162a1148160e81b815260040160405180910390fd5b5f8281526006602052604090208054338082146001600160a01b038816909114176109355761091886336105e4565b61093557604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661095c57604051633a954ecd60e21b815260040160405180910390fd5b8015610966575f82555b6001600160a01b038681165f9081526005602052604080822080545f19019055918716815220805460010190556109a185600160e11b6121f7565b5f85815260046020526040812091909155600160e11b841690036109f257600184015f8181526004602052604081205490036109f0575f5481146109f0575f8181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03165f5160206131655f395f51905f5260405160405180910390a4505050505050565b610a30611bca565b600b54811115610a5357604051630590c51360e01b815260040160405180910390fd5b600c8190556040518181527f5307de8ad7d34d5ddfd5171435c143bdc645493980f453eb5d7cdb3e494a1b35906020015b60405180910390a150565b610a97611bca565b60405147905f90339083908381818185875af1925050503d805f8114610ad8576040519150601f19603f3d011682016040523d82523d5f602084013e610add565b606091505b5050905080610aff57604051631d42c86760e21b815260040160405180910390fd5b6040518281527f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d906020015b60405180910390a15050565b6108a783838360405180602001604052805f815250611942565b610b59611bca565b600a5460ff1615610b7d576040516306ccad4160e41b815260040160405180910390fd5b6010610b8a828483612e10565b507f23c8c9488efebfd474e85a7956de6f39b17c7ab88502d42a623db2d8e382bbaa8282604051610b2b929190612ec9565b6060815f816001600160401b03811115610bd857610bd8612bf7565b604051908082528060200260200182016040528015610c1157816020015b610bfe61262b565b815260200190600190039081610bf65790505b5090505f5b828114610c6357610c3e868683818110610c3257610c32612ef7565b90506020020135611986565b828281518110610c5057610c50612ef7565b6020908102919091010152600101610c16565b50949350505050565b5f6106c382612196565b5f805b601254811015610d175760128181548110610c9657610c96612ef7565b5f9182526020909120600260039092020101546001600160401b036301000000909104811690841610801590610d04575060128181548110610cda57610cda612ef7565b5f9182526020909120600260039092020101546001600160401b03600160581b9091048116908416105b15610d0f5792915050565b600101610c79565b5060405163e82a532960e01b815260040160405180910390fd5b5f6001600160a01b038216610d59576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03165f908152600560205260409020546001600160401b031690565b610d85611bca565b610d8e5f61220c565b565b610d98611bca565b6012548710610dba5760405163e82a532960e01b815260040160405180910390fd5b60018710610e26576012610dcf600189612f1f565b81548110610ddf57610ddf612ef7565b5f9182526020909120600260039092020101546001600160401b03600160581b90910481169083161015610e2657604051636bc1af9360e01b815260040160405180910390fd5b610e30828261225d565b8560128881548110610e4457610e44612ef7565b905f5260205f2090600302015f015f6101000a8154816001600160501b0302191690836001600160501b031602179055508460128881548110610e8957610e89612ef7565b905f5260205f2090600302015f01600a6101000a81548163ffffffff021916908363ffffffff1602179055508360128881548110610ec957610ec9612ef7565b905f5260205f209060030201600101819055508260128881548110610ef057610ef0612ef7565b905f5260205f2090600302016002015f6101000a81548162ffffff021916908362ffffff1602179055508160128881548110610f2e57610f2e612ef7565b905f5260205f20906003020160020160036101000a8154816001600160401b0302191690836001600160401b031602179055508060128881548110610f7557610f75612ef7565b905f5260205f209060030201600201600b6101000a8154816001600160401b0302191690836001600160401b031602179055505f5160206131855f395f51905f5287878787878787604051610fd09796959493929190612f32565b60405180910390a150505050505050565b60605f5f5f610fef85610d31565b90505f816001600160401b0381111561100a5761100a612bf7565b604051908082528060200260200182016040528015611033578160200160208202803683370190505b50905061103e61262b565b5f5b8386146110b75761105081612293565b915081604001516110af5781516001600160a01b03161561107057815194505b876001600160a01b0316856001600160a01b0316036110af57808387806001019850815181106110a2576110a2612ef7565b6020026020010181815250505b600101611040565b50909695505050505050565b6008546001600160a01b031690565b6110da611bca565b6012545f5b8181101561113b5760128054806110f8576110f8612f82565b5f8281526020812060035f199093019283020180546001600160701b031916815560018181019290925560020180546001600160981b03191690559155016110df565b505f5b8281101561154557600181106111dd57838361115b600184612f1f565b81811061116a5761116a612ef7565b905060c0020160a0016020810190611182919061297a565b6001600160401b031684848381811061119d5761119d612ef7565b905060c0020160800160208101906111b5919061297a565b6001600160401b031610156111dd57604051636bc1af9360e01b815260040160405180910390fd5b6112398484838181106111f2576111f2612ef7565b905060c00201608001602081019061120a919061297a565b85858481811061121c5761121c612ef7565b905060c0020160a0016020810190611234919061297a565b61225d565b60126040518060c0016040528086868581811061125857611258612ef7565b61126e92602060c0909202019081019150612f96565b6001600160501b0316815260200186868581811061128e5761128e612ef7565b905060c0020160200160208101906112a69190612faf565b63ffffffff1681526020018686858181106112c3576112c3612ef7565b905060c002016040013581526020018686858181106112e4576112e4612ef7565b905060c0020160600160208101906112fc9190612fc8565b62ffffff16815260200186868581811061131857611318612ef7565b905060c002016080016020810190611330919061297a565b6001600160401b0316815260200186868581811061135057611350612ef7565b905060c0020160a0016020810190611368919061297a565b6001600160401b039081169091528254600181810185555f948552602094859020845160039093020180549585015163ffffffff16600160501b026001600160701b03199096166001600160501b0390931692909217949094178155604083015193810193909355606082015160029093018054608084015160a0909401518316600160581b02600160581b600160981b0319949093166301000000026001600160581b031990911662ffffff9095169490941793909317919091161790555f5160206131855f395f51905f528185858281811061144857611448612ef7565b61145e92602060c0909202019081019150612f96565b86868581811061147057611470612ef7565b905060c0020160200160208101906114889190612faf565b87878681811061149a5761149a612ef7565b905060c00201604001358888878181106114b6576114b6612ef7565b905060c0020160600160208101906114ce9190612fc8565b8989888181106114e0576114e0612ef7565b905060c0020160800160208101906114f8919061297a565b8a8a8981811061150a5761150a612ef7565b905060c0020160a0016020810190611522919061297a565b6040516115359796959493929190612f32565b60405180910390a160010161113e565b50505050565b6060600380546106d890612d0d565b5f6106c3826122b2565b606081831061158657604051631960ccad60e11b815260040160405180910390fd5b5f5f6115905f5490565b90508084111561159e578093505b5f6115a887610d31565b9050848610156115c757858503818110156115c1578091505b506115ca565b505f5b5f816001600160401b038111156115e3576115e3612bf7565b60405190808252806020026020018201604052801561160c578160200160208202803683370190505b509050815f036116215793506116ce92505050565b5f61162b88611986565b90505f816040015161163b575080515b885b88811415801561164d5750848714155b156116c25761165b81612293565b925082604001516116ba5782516001600160a01b03161561167b57825191505b8a6001600160a01b0316826001600160a01b0316036116ba57808488806001019950815181106116ad576116ad612ef7565b6020026020010181815250505b60010161163d565b50505092835250909150505b9392505050565b335f8181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611748612651565b6012545f90819084106117915760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964537461676560a01b60448201526064015b60405180910390fd5b5f8481526013602090815260408083203384528252808320548784526014909252909120546012805463ffffffff90931692879081106117d3576117d3612ef7565b5f9182526020918290206040805160c08101825260039390930290910180546001600160501b0381168452600160501b900463ffffffff169383019390935260018301549082015260029091015462ffffff81166060830152630100000081046001600160401b039081166080840152600160581b9091041660a0820152969195509350915050565b611864611bca565b60116108a7828483612e10565b611879611bca565b8163ffffffff16600b54816118906001545f540390565b61189a9190612fe1565b11156118b95760405163800113cb60e01b815260040160405180910390fd5b8263ffffffff16600e546118cd9190612ff4565b3410156118ed57604051630717c22560e51b815260040160405180910390fd5b6118fd828463ffffffff166122d9565b600d546040516001600160a01b03909116903480156108fc02915f818181858888f19350505050158015611545573d5f5f3e3d5ffd5b6060601180546106d890612d0d565b61194d8484846108ac565b6001600160a01b0383163b1561154557611969848484846122f2565b611545576040516368d2bf6b60e11b815260040160405180910390fd5b61198e61262b565b61199661262b565b5f5483106119a45792915050565b6119ad83612293565b90508060400151156119bf5792915050565b6116ce836123d9565b60606119d382611ba5565b6119f057604051630a14c4b560e41b815260040160405180910390fd5b5f601080546119fe90612d0d565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2a90612d0d565b8015611a755780601f10611a4c57610100808354040283529160200191611a75565b820191905f5260205f20905b815481529060010190602001808311611a5857829003601f168201915b5050505050905080515f03611a985760405180602001604052805f8152506116ce565b80611aa2846123f2565b6011604051602001611ab693929190613022565b6040516020818303038152906040529392505050565b611ad4611bca565b6001600160a01b038116611b395760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611788565b611b428161220c565b50565b611b4d611bca565b600b54811115611b705760405163430b83b160e11b815260040160405180910390fd5b600b8190556040518181527fc7bbc2b288fc13314546ea4aa51f6bcf71b7ba4740beeb3d32e9acef57b6668a90602001610a84565b5f5f54821080156106c35750505f90815260046020526040902054600160e01b161590565b33611bd36110c3565b6001600160a01b031614610d8e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611788565b600260095403611c7b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611788565b6002600955565b8363ffffffff16600b5481611c996001545f540390565b611ca39190612fe1565b1115611cc25760405163800113cb60e01b815260040160405180910390fd5b42611ccb612651565b5f611cd583610c76565b905060128181548110611cea57611cea612ef7565b5f9182526020918290206040805160c08101825260039390930290910180546001600160501b038116808552600160501b90910463ffffffff16948401949094526001810154918301919091526002015462ffffff81166060830152630100000081046001600160401b039081166080840152600160581b9091041660a0820152600f549093501115611dc557600e54825163ffffffff8a1691611d96916001600160501b0316612fe1565b611da09190612ff4565b341015611dc057604051630717c22560e51b815260040160405180910390fd5b611e01565b8151611dd89063ffffffff8a16906130a9565b6001600160501b0316341015611e0157604051630717c22560e51b815260040160405180910390fd5b606082015162ffffff1615611e5a5760608201515f8281526014602052604090205462ffffff90911690611e3c9063ffffffff8b1690612fe1565b1115611e5a5760405162d0844960e21b815260040160405180910390fd5b600c5415611e9e57600c548863ffffffff16611e75896122b2565b611e7f9190612fe1565b1115611e9e5760405163751304ed60e11b815260040160405180910390fd5b602082015163ffffffff1615611f0f576020808301515f8381526013835260408082206001600160a01b038c168352909352919091205463ffffffff91821691611eea918b91166130d2565b63ffffffff161115611f0f5760405163b4f3729b60e01b815260040160405180910390fd5b604082015115611fad578160400151611f8f8787808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250506040516001600160601b031960608e901b1660208201526034019150611f749050565b60405160208183030381529060405280519060200120612435565b14611fad576040516309bde33960e01b815260040160405180910390fd5b5f8181526013602090815260408083206001600160a01b038b168452909152812080548a9290611fe490849063ffffffff166130d2565b92506101000a81548163ffffffff021916908363ffffffff1602179055508763ffffffff1660145f8381526020019081526020015f205f8282546120289190612fe1565b9091555061203e90508763ffffffff8a166122d9565b600f5482516001600160501b031610156120fc57600d54600e546001600160a01b03909116906108fc906120799063ffffffff8c1690612ff4565b6040518115909202915f818181858888f1935050505015801561209e573d5f5f3e3d5ffd5b506120a76110c3565b6001600160a01b03166108fc8963ffffffff16600e546120c79190612ff4565b6120d19034612f1f565b6040518115909202915f818181858888f193505050501580156120f6573d5f5f3e3d5ffd5b5061218c565b600d546001600160a01b03166108fc6121166042346130ee565b6040518115909202915f818181858888f1935050505015801561213b573d5f5f3e3d5ffd5b506121446110c3565b6001600160a01b03166108fc61215b6042346130ee565b6121659034612f1f565b6040518115909202915f818181858888f1935050505015801561218a573d5f5f3e3d5ffd5b505b5050505050505050565b5f815f548110156121de575f8181526004602052604081205490600160e01b821690036121dc575b805f036116ce57505f19015f818152600460205260409020546121be565b505b604051636f96cda160e11b815260040160405180910390fd5b4260a01b176001600160a01b03919091161790565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b806001600160401b0316826001600160401b03161061228f57604051631750215560e11b815260040160405180910390fd5b5050565b61229b61262b565b5f828152600460205260409020546106c390612477565b6001600160a01b03165f908152600560205260409081902054901c6001600160401b031690565b61228f828260405180602001604052805f8152506124ba565b604051630a85bd0160e11b81525f906001600160a01b0385169063150b7a029061232690339089908890889060040161310d565b6020604051808303815f875af1925050508015612360575060408051601f3d908101601f1916820190925261235d91810190613149565b60015b6123bc573d80801561238d576040519150601f19603f3d011682016040523d82523d5f602084013e612392565b606091505b5080515f036123b4576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6123e161262b565b6106c36123ed83612196565b612477565b606060a06040510180604052602081039150505f815280825b600183039250600a81066030018353600a90048061240b5750819003601f19909101908152919050565b5f81815b845181101561246f576124658286838151811061245857612458612ef7565b6020026020010151612523565b9150600101612439565b509392505050565b61247f61262b565b6001600160a01b03821681526001600160401b0360a083901c166020820152600160e01b82161515604082015260e89190911c606082015290565b6124c4838361254c565b6001600160a01b0383163b156108a7575f548281035b6124ec5f8683806001019450866122f2565b612509576040516368d2bf6b60e11b815260040160405180910390fd5b8181106124da57815f541461251c575f5ffd5b5050505050565b5f81831061253d575f8281526020849052604090206116ce565b505f9182526020526040902090565b5f8054908290036125705760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260056020526040902080546001600160401b0184020190556125a6836001841460e11b6121f7565b5f828152600460205260408120919091556001600160a01b0384169083830190839083905f5160206131655f395f51905f528180a4600183015b8181146126035780835f5f5160206131655f395f51905f525f5fa46001016125e0565b50815f0361262357604051622e076360e81b815260040160405180910390fd5b5f5550505050565b604080516080810182525f80825260208201819052918101829052606081019190915290565b6040805160c0810182525f80825260208201819052918101829052606081018290526080810182905260a081019190915290565b6001600160e01b031981168114611b42575f5ffd5b5f602082840312156126aa575f5ffd5b81356116ce81612685565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6116ce60208301846126b5565b5f60208284031215612705575f5ffd5b5035919050565b80356001600160a01b0381168114612722575f5ffd5b919050565b5f5f60408385031215612738575f5ffd5b6127418361270c565b946020939093013593505050565b803563ffffffff81168114612722575f5ffd5b5f5f83601f840112612772575f5ffd5b5081356001600160401b03811115612788575f5ffd5b6020830191508360208260051b85010111156127a2575f5ffd5b9250929050565b5f5f5f604084860312156127bb575f5ffd5b6127c48461274f565b925060208401356001600160401b038111156127de575f5ffd5b6127ea86828701612762565b9497909650939450505050565b5f5f5f60608486031215612809575f5ffd5b6128128461270c565b92506128206020850161270c565b929592945050506040919091013590565b5f5f60208385031215612842575f5ffd5b82356001600160401b03811115612857575f5ffd5b8301601f81018513612867575f5ffd5b80356001600160401b0381111561287c575f5ffd5b85602082840101111561288d575f5ffd5b6020919091019590945092505050565b5f5f602083850312156128ae575f5ffd5b82356001600160401b038111156128c3575f5ffd5b6128cf85828601612762565b90969095509350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b602080825282518282018190525f918401906040840190835b81811015612959576129438385516128db565b6020939093019260809290920191600101612930565b509095945050505050565b80356001600160401b0381168114612722575f5ffd5b5f6020828403121561298a575f5ffd5b6116ce82612964565b5f602082840312156129a3575f5ffd5b6116ce8261270c565b80356001600160501b0381168114612722575f5ffd5b803562ffffff81168114612722575f5ffd5b5f5f5f5f5f5f5f60e0888a0312156129ea575f5ffd5b873596506129fa602089016129ac565b9550612a086040890161274f565b945060608801359350612a1d608089016129c2565b9250612a2b60a08901612964565b9150612a3960c08901612964565b905092959891949750929550565b602080825282518282018190525f918401906040840190835b81811015612959578351835260209384019390920191600101612a60565b5f5f60208385031215612a8f575f5ffd5b82356001600160401b03811115612aa4575f5ffd5b8301601f81018513612ab4575f5ffd5b80356001600160401b03811115612ac9575f5ffd5b85602060c08302840101111561288d575f5ffd5b5f5f5f60608486031215612aef575f5ffd5b612af88461270c565b95602085013595506040909401359392505050565b5f5f60408385031215612b1e575f5ffd5b612b278361270c565b915060208301358015158114612b3b575f5ffd5b809150509250929050565b83516001600160501b0316815260208085015163ffffffff16908201526040808501519082015260608085015162ffffff16908201526080808501516001600160401b039081169183019190915260a080860151909116908201526101008101612bb860c083018563ffffffff169052565b8260e0830152949350505050565b5f5f60408385031215612bd7575f5ffd5b612be08361274f565b9150612bee6020840161270c565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f60808587031215612c1e575f5ffd5b612c278561270c565b9350612c356020860161270c565b92506040850135915060608501356001600160401b03811115612c56575f5ffd5b8501601f81018713612c66575f5ffd5b80356001600160401b03811115612c7f57612c7f612bf7565b604051601f8201601f19908116603f011681016001600160401b0381118282101715612cad57612cad612bf7565b604052818152828201602001891015612cc4575f5ffd5b816020840160208301375f6020838301015280935050505092959194509250565b608081016106c382846128db565b5f5f60408385031215612d04575f5ffd5b612be08361270c565b600181811c90821680612d2157607f821691505b602082108103612d3f57634e487b7160e01b5f52602260045260245ffd5b50919050565b602081525f5f8354612d5681612d0d565b806020860152600182165f8114612d745760018114612d9057612dc1565b60ff1983166040870152604082151560051b8701019350612dc1565b865f5260205f205f5b83811015612db857815488820160400152600190910190602001612d99565b87016040019450505b509195945050505050565b601f8211156108a757805f5260205f20601f840160051c81016020851015612df15750805b601f840160051c820191505b8181101561251c575f8155600101612dfd565b6001600160401b03831115612e2757612e27612bf7565b612e3b83612e358354612d0d565b83612dcc565b5f601f841160018114612e6c575f8515612e555750838201355b5f19600387901b1c1916600186901b17835561251c565b5f83815260208120601f198716915b82811015612e9b5786850135825560209485019460019092019101612e7b565b5086821015612eb7575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b818103818111156106c3576106c3612f0b565b9687526001600160501b0395909516602087015263ffffffff939093166040860152606085019190915262ffffff1660808401526001600160401b0390811660a08401521660c082015260e00190565b634e487b7160e01b5f52603160045260245ffd5b5f60208284031215612fa6575f5ffd5b6116ce826129ac565b5f60208284031215612fbf575f5ffd5b6116ce8261274f565b5f60208284031215612fd8575f5ffd5b6116ce826129c2565b808201808211156106c3576106c3612f0b565b80820281158282048414176106c3576106c3612f0b565b5f81518060208401855e5f93019283525090919050565b5f613036613030838761300b565b8561300b565b5f845461304281612d0d565b600182168015613059576001811461306e5761309b565b60ff198316855281151582028501935061309b565b875f5260205f205f5b8381101561309357815487820152600190910190602001613077565b505081850193505b509198975050505050505050565b6001600160501b0381811683821602908116908181146130cb576130cb612f0b565b5092915050565b63ffffffff81811683821601908111156106c3576106c3612f0b565b5f8261310857634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061313f908301846126b5565b9695505050505050565b5f60208284031215613159575f5ffd5b81516116ce8161268556feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efb3268648542a1bb1b2dd12e3b14aeb5a3ab22c592de96bdd3e842154a5b394faa26469706673582212208e1583369f7671ee39f9bc7bf3f8196ee354a345698cebd44970db84055777b364736f6c634300081c0033

Deployed Bytecode Sourcemap

87287:15392:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20568:675;;;;;;;;;;-1:-1:-1;20568:675:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;20568:675:0;;;;;;;;21542:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;28713:234::-;;;;;;;;;;-1:-1:-1;28713:234:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1528:32:1;;;1510:51;;1498:2;1483:18;28713:234:0;1364:203:1;28070:448:0;;;;;;:::i;:::-;;:::i;:::-;;100280:154;;;;;;;;;;;;;:::i;96219:183::-;;;;;;:::i;:::-;;:::i;16877:347::-;;;;;;;;;;-1:-1:-1;17167:12:0;;16938:7;17151:13;:28;16877:347;;;3255:25:1;;;3243:2;3228:18;16877:347:0;3109:177:1;32736:3069:0;;;;;;:::i;:::-;;:::i;93088:345::-;;;;;;;;;;-1:-1:-1;93088:345:0;;;;;:::i;:::-;;:::i;99598:257::-;;;;;;;;;;;;;:::i;35921:217::-;;;;;;:::i;:::-;;:::i;87890:38::-;;;;;;;;;;;;;;;;92059:125;;;;;;;;;;-1:-1:-1;92154:18:0;;92059:125;;99945:230;;;;;;;;;;-1:-1:-1;99945:230:0;;;;;:::i;:::-;;:::i;64131:588::-;;;;;;;;;;-1:-1:-1;64131:588:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23099:160::-;;;;;;;;;;-1:-1:-1;23099:160:0;;;;;:::i;:::-;;:::i;101796:515::-;;;;;;;;;;-1:-1:-1;101796:515:0;;;;;:::i;:::-;;:::i;18193:245::-;;;;;;;;;;-1:-1:-1;18193:245:0;;;;;:::i;:::-;;:::i;91847:120::-;;;;;;;;;;-1:-1:-1;91937:11:0;:18;91847:120;;86243:111;;;;;;;;;;;;;:::i;94571:1422::-;;;;;;;;;;-1:-1:-1;94571:1422:0;;;;;:::i;:::-;;:::i;68407:984::-;;;;;;;;;;-1:-1:-1;68407:984:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;85523:95::-;;;;;;;;;;;;;:::i;90044:1718::-;;;;;;;;;;-1:-1:-1;90044:1718:0;;;;;:::i;:::-;;:::i;21746:112::-;;;;;;;;;;;;;:::i;93544:214::-;;;;;;;;;;-1:-1:-1;93544:214:0;;;;;:::i;:::-;;:::i;65163:2749::-;;;;;;;;;;-1:-1:-1;65163:2749:0;;;;;:::i;:::-;;:::i;29339:246::-;;;;;;;;;;-1:-1:-1;29339:246:0;;;;;:::i;:::-;;:::i;93882:565::-;;;;;;;;;;-1:-1:-1;93882:565:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;100801:121::-;;;;;;;;;;-1:-1:-1;100801:121:0;;;;;:::i;:::-;;:::i;99204:309::-;;;;;;:::i;:::-;;:::i;100519:186::-;;;;;;;;;;;;;:::i;36804:451::-;;;;;;:::i;:::-;;:::i;63480:468::-;;;;;;;;;;-1:-1:-1;63480:468:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;101031:653::-;;;;;;;;;;-1:-1:-1;101031:653:0;;;;;:::i;:::-;;:::i;29770:172::-;;;;;;;;;;-1:-1:-1;29770:172:0;;;;;:::i;:::-;-1:-1:-1;;;;;29895:25:0;;;29867:4;29895:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29770:172;92878:125;;;;;;;;;;-1:-1:-1;92973:18:0;;92878:125;;86533:213;;;;;;;;;;-1:-1:-1;86533:213:0;;;;;:::i;:::-;;:::i;92339:389::-;;;;;;;;;;-1:-1:-1;92339:389:0;;;;;:::i;:::-;;:::i;87840:39::-;;;;;;;;;;;;;;;;20568:675;20653:4;-1:-1:-1;;;;;;;;;21001:25:0;;;;:106;;-1:-1:-1;;;;;;;;;;21082:25:0;;;21001:106;:187;;;-1:-1:-1;;;;;;;;;;21163:25:0;;;21001:187;20977:211;20568:675;-1:-1:-1;;20568:675:0:o;21542:108::-;21596:13;21633:5;21626:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21542:108;:::o;28713:234::-;28789:7;28818:16;28826:7;28818;:16::i;:::-;28813:64;;28843:34;;-1:-1:-1;;;28843:34:0;;;;;;;;;;;28813:64;-1:-1:-1;28905:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;28905:30:0;;28713:234::o;28070:448::-;28163:13;28179:16;28187:7;28179;:16::i;:::-;28163:32;-1:-1:-1;54891:10:0;-1:-1:-1;;;;;28220:28:0;;;28216:187;;28272:44;28289:5;54891:10;29770:172;:::i;28272:44::-;28267:136;;28348:35;;-1:-1:-1;;;28348:35:0;;;;;;;;;;;28267:136;28423:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;28423:35:0;-1:-1:-1;;;;;28423:35:0;;;;;;;;;28478:28;;28423:24;;28478:28;;;;;;;28148:370;28070:448;;:::o;100280:154::-;85381:13;:11;:13::i;:::-;100345:17:::1;:24:::0;;-1:-1:-1;;100345:24:0::1;100365:4;100345:24;::::0;;100389:33:::1;::::0;::::1;::::0;::::1;::::0;100406:15:::1;::::0;100389:33:::1;:::i;:::-;;;;;;;;100280:154::o:0;96219:183::-;82434:21;:19;:21::i;:::-;96353:37:::1;96367:3;96372:10;96384:5;;96353:13;:37::i;:::-;82486:20:::0;81804:1;83062:7;:22;82867:229;82486:20;96219:183;;;:::o;32736:3069::-;32898:27;32928;32947:7;32928:18;:27::i;:::-;32898:57;;33021:4;-1:-1:-1;;;;;32980:45:0;32996:19;-1:-1:-1;;;;;32980:45:0;;32976:86;;33034:28;;-1:-1:-1;;;33034:28:0;;;;;;;;;;;32976:86;33084:27;31744:24;;;:15;:24;;;;;31988:26;;54891:10;31321:30;;;-1:-1:-1;;;;;30998:28:0;;31299:20;;;31296:56;33282:184;;33379:43;33396:4;54891:10;29770:172;:::i;33379:43::-;33374:92;;33431:35;;-1:-1:-1;;;33431:35:0;;;;;;;;;;;33374:92;-1:-1:-1;;;;;33491:16:0;;33487:52;;33516:23;;-1:-1:-1;;;33516:23:0;;;;;;;;;;;33487:52;33712:15;33709:172;;;33860:1;33839:19;33832:30;33709:172;-1:-1:-1;;;;;34293:24:0;;;;;;;:18;:24;;;;;;34291:26;;-1:-1:-1;;34291:26:0;;;34366:22;;;;;;34364:24;;-1:-1:-1;34364:24:0;;;34716:158;34366:22;-1:-1:-1;;;34716:18:0;:158::i;:::-;34687:26;;;;:17;:26;;;;;:187;;;;-1:-1:-1;;;35006:47:0;;:52;;35002:667;;35115:1;35105:11;;35083:19;35246:30;;;:17;:30;;;;;;:35;;35242:408;;35392:13;;35377:11;:28;35373:254;;35547:30;;;;:17;:30;;;;;:52;;;35373:254;35060:609;35002:667;35728:7;35724:2;-1:-1:-1;;;;;35709:27:0;35718:4;-1:-1:-1;;;;;35709:27:0;-1:-1:-1;;;;;;;;;;;35709:27:0;;;;;;;;;32883:2922;;;32736:3069;;;:::o;93088:345::-;85381:13;:11;:13::i;:::-;93238:18:::1;;93218:17;:38;93214:95;;;93282:27;;-1:-1:-1::0;;;93282:27:0::1;;;;;;;;;;;93214:95;93324:18;:38:::0;;;93382:39:::1;::::0;3255:25:1;;;93382:39:0::1;::::0;3243:2:1;3228:18;93382:39:0::1;;;;;;;;93088:345:::0;:::o;99598:257::-;85381:13;:11;:13::i;:::-;99723:33:::1;::::0;99668:21:::1;::::0;99652:13:::1;::::0;99723:10:::1;::::0;99668:21;;99652:13;99723:33;99652:13;99723:33;99668:21;99723:10;:33:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;99704:52;;;99776:7;99771:37;;99792:16;;-1:-1:-1::0;;;99792:16:0::1;;;;;;;;;;;99771:37;99828:15;::::0;3255:25:1;;;99828:15:0::1;::::0;3243:2:1;3228:18;99828:15:0::1;;;;;;;;99637:218;;99598:257::o:0;35921:217::-;36087:39;36104:4;36110:2;36114:7;36087:39;;;;;;;;;;;;:16;:39::i;99945:230::-;85381:13;:11;:13::i;:::-;100028:17:::1;::::0;::::1;;100024:60;;;100054:30;;-1:-1:-1::0;;;100054:30:0::1;;;;;;;;;;;100024:60;100099:15;:25;100117:7:::0;;100099:15;:25:::1;:::i;:::-;;100144:19;100155:7;;100144:19;;;;;;;:::i;64131:588::-:0;64295:23;64398:8;64373:22;64398:8;-1:-1:-1;;;;;64469:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;64432:73;;64529:9;64524:133;64545:14;64540:1;:19;64524:133;;64605:32;64625:8;;64634:1;64625:11;;;;;;;:::i;:::-;;;;;;;64605:19;:32::i;:::-;64589:10;64600:1;64589:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;64561:3;;64524:133;;;-1:-1:-1;64682:10:0;64131:588;-1:-1:-1;;;;64131:588:0:o;23099:160::-;23171:7;23218:27;23237:7;23218:18;:27::i;101796:515::-;101933:7;;101966:298;101990:11;:18;101986:22;;101966:298;;;102073:11;102085:1;102073:14;;;;;;;;:::i;:::-;;;;;;;;;:35;:14;;;;;:35;;-1:-1:-1;;;;;102073:35:0;;;;;;102060:48;;;;;;;:118;;;102145:11;102157:1;102145:14;;;;;;;;:::i;:::-;;;;;;;;;:33;:14;;;;;:33;;-1:-1:-1;;;;;;;;102145:33:0;;;;;102133:45;;;;102060:118;102034:215;;;102228:1;101796:515;-1:-1:-1;;101796:515:0:o;102034:215::-;102010:3;;101966:298;;;;102285:14;;-1:-1:-1;;;102285:14:0;;;;;;;;;;;18193:245;18265:7;-1:-1:-1;;;;;18293:19:0;;18289:60;;18321:28;;-1:-1:-1;;;18321:28:0;;;;;;;;;;;18289:60;-1:-1:-1;;;;;;18371:25:0;;;;;:18;:25;;;;;;-1:-1:-1;;;;;18371:55:0;;18193:245::o;86243:111::-;85381:13;:11;:13::i;:::-;86312:30:::1;86339:1;86312:18;:30::i;:::-;86243:111::o:0;94571:1422::-;85381:13;:11;:13::i;:::-;94888:11:::1;:18:::0;94879:27;::::1;94875:54;;94915:14;;-1:-1:-1::0;;;94915:14:0::1;;;;;;;;;;;94875:54;94957:1;94948:5;:10;94944:257;;95049:11;95061:9;95069:1;95061:5:::0;:9:::1;:::i;:::-;95049:22;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:41:::1;:22;::::0;;::::1;;:41;::::0;-1:-1:-1;;;;;;;;95049:41:0;;::::1;::::0;::::1;95005:85:::0;;::::1;;94979:207;;;95140:26;;-1:-1:-1::0;;;95140:26:0::1;;;;;;;;;;;94979:207;95215:123;95266:20;95305:18;95215:32;:123::i;:::-;95379:4;95353:11;95365:5;95353:18;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;:30;;;;;-1:-1:-1::0;;;;;95353:30:0::1;;;;;-1:-1:-1::0;;;;;95353:30:0::1;;;;;;95431:11;95398;95410:5;95398:18;;;;;;;;:::i;:::-;;;;;;;;;;;:30;;;:44;;;;;;;;;;;;;;;;;;95489:10;95457:11;95469:5;95457:18;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;:42;;;;95550:14;95514:11;95526:5;95514:18;;;;;;;;:::i;:::-;;;;;;;;;;;:33;;;:50;;;;;;;;;;;;;;;;;;95621:20;95579:11;95591:5;95579:18;;;;;;;;:::i;:::-;;;;;;;;;;;:39;;;:62;;;;;-1:-1:-1::0;;;;;95579:62:0::1;;;;;-1:-1:-1::0;;;;;95579:62:0::1;;;;;;95696:18;95656:11;95668:5;95656:18;;;;;;;;:::i;:::-;;;;;;;;;;;:37;;;:58;;;;;-1:-1:-1::0;;;;;95656:58:0::1;;;;;-1:-1:-1::0;;;;;95656:58:0::1;;;;;;-1:-1:-1::0;;;;;;;;;;;95770:5:0::1;95794:4;95817:11;95847:10;95876:14;95909:20;95948:18;95740:241;;;;;;;;;;;;:::i;:::-;;;;;;;;94571:1422:::0;;;;;;;:::o;68407:984::-;68485:16;68547:19;68585:25;68629:22;68654:16;68664:5;68654:9;:16::i;:::-;68629:41;;68689:25;68731:14;-1:-1:-1;;;;;68717:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68717:29:0;;68689:57;;68765:31;;:::i;:::-;68820:9;68815:516;68864:14;68849:11;:29;68815:516;;68920:15;68933:1;68920:12;:15::i;:::-;68908:27;;68962:9;:16;;;69007:8;68958:81;69065:14;;-1:-1:-1;;;;;69065:28:0;;69061:119;;69142:14;;;-1:-1:-1;69061:119:0;69227:5;-1:-1:-1;;;;;69206:26:0;:17;-1:-1:-1;;;;;69206:26:0;;69202:110;;69287:1;69261:8;69270:13;;;;;;69261:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;69202:110;68880:3;;68815:516;;;-1:-1:-1;69356:8:0;;68407:984;-1:-1:-1;;;;;;68407:984:0:o;85523:95::-;85600:6;;-1:-1:-1;;;;;85600:6:0;;85523:95::o;90044:1718::-;85381:13;:11;:13::i;:::-;90156:11:::1;:18:::0;90133:20:::1;90189:95;90213:12;90209:1;:16;90189:95;;;90251:11;:17;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;90251:17:0;;;;;::::1;;::::0;;-1:-1:-1;;;;;;90251:17:0;;;::::1;::::0;;::::1;::::0;;;;::::1;;::::0;;-1:-1:-1;;;;;;90251:17:0;;;;;90227:3:::1;90189:95;;;-1:-1:-1::0;90315:9:0::1;90310:1441;90330:20:::0;;::::1;90310:1441;;;90385:1;90380;:6;90376:288;;90502:9:::0;;90512:5:::1;90516:1;90512::::0;:5:::1;:::i;:::-;90502:16;;;;;;;:::i;:::-;;;;;;:35;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;90441:96:0::1;:9;;90451:1;90441:12;;;;;;;:::i;:::-;;;;;;:33;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;90441:96:0::1;;90411:234;;;90595:26;;-1:-1:-1::0;;;90595:26:0::1;;;;;;;;;;;90411:234;90682:161;90737:9;;90747:1;90737:12;;;;;;;:::i;:::-;;;;;;:33;;;;;;;;;;:::i;:::-;90793:9;;90803:1;90793:12;;;;;;;:::i;:::-;;;;;;:31;;;;;;;;;;:::i;:::-;90682:32;:161::i;:::-;90862:11;90901:444;;;;;;;;90948:9;;90958:1;90948:12;;;;;;;:::i;:::-;:17;::::0;::::1;:12;::::0;;::::1;;:17:::0;;::::1;::::0;-1:-1:-1;90948:17:0::1;:::i;:::-;-1:-1:-1::0;;;;;90901:444:0::1;;;;;91005:9;;91015:1;91005:12;;;;;;;:::i;:::-;;;;;;:24;;;;;;;;;;:::i;:::-;90901:444;;;;;;91068:9;;91078:1;91068:12;;;;;;;:::i;:::-;;;;;;:23;;;90901:444;;;;91134:9;;91144:1;91134:12;;;;;;;:::i;:::-;;;;;;:27;;;;;;;;;;:::i;:::-;90901:444;;;;;;91210:9;;91220:1;91210:12;;;;;;;:::i;:::-;;;;;;:33;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;90901:444:0::1;;;;;91290:9;;91300:1;91290:12;;;;;;;:::i;:::-;;;;;;:31;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;90901:444:0;;::::1;::::0;;;90862:502;;::::1;::::0;;::::1;::::0;;-1:-1:-1;90862:502:0;;;::::1;::::0;;;;;;::::1;::::0;;::::1;;::::0;;;;::::1;::::0;::::1;;-1:-1:-1::0;;;90862:502:0::1;-1:-1:-1::0;;;;;;90862:502:0;;;-1:-1:-1;;;;;90862:502:0;;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;90862:502:0::1;-1:-1:-1::0;;;;;;;;90862:502:0;;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;90862:502:0;;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;::::1;;::::0;;-1:-1:-1;;;;;;;;;;;91422:1:0;91446:9;;91422:1;91446:12;;::::1;;;;;:::i;:::-;:17;::::0;::::1;:12;::::0;;::::1;;:17:::0;;::::1;::::0;-1:-1:-1;91446:17:0::1;:::i;:::-;91486:9;;91496:1;91486:12;;;;;;;:::i;:::-;;;;;;:24;;;;;;;;;;:::i;:::-;91533:9;;91543:1;91533:12;;;;;;;:::i;:::-;;;;;;:23;;;91579:9;;91589:1;91579:12;;;;;;;:::i;:::-;;;;;;:27;;;;;;;;;;:::i;:::-;91629:9;;91639:1;91629:12;;;;;;;:::i;:::-;;;;;;:33;;;;;;;;;;:::i;:::-;91685:9;;91695:1;91685:12;;;;;;;:::i;:::-;;;;;;:31;;;;;;;;;;:::i;:::-;91388:347;;;;;;;;;;;;:::i;:::-;;;;;;;;90352:3;;90310:1441;;;;90118:1644;90044:1718:::0;;:::o;21746:112::-;21802:13;21839:7;21832:14;;;;;:::i;93544:214::-;93690:7;93730:16;93744:1;93730:13;:16::i;65163:2749::-;65322:16;65397:4;65388:5;:13;65384:45;;65410:19;;-1:-1:-1;;;65410:19:0;;;;;;;;;;;65384:45;65448:19;65486:17;65506:14;16583:7;16614:13;;16528:111;65506:14;65486:34;-1:-1:-1;65781:9:0;65774:4;:16;65770:81;;;65822:9;65815:16;;65770:81;65869:25;65897:16;65907:5;65897:9;:16::i;:::-;65869:44;;66103:4;66095:5;:12;66091:306;;;66154:12;;;66193:31;;;66189:119;;;66273:11;66253:31;;66189:119;66109:218;66091:306;;;-1:-1:-1;66376:1:0;66091:306;66415:25;66457:17;-1:-1:-1;;;;;66443:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66443:32:0;;66415:60;;66498:17;66519:1;66498:22;66494:86;;66552:8;-1:-1:-1;66545:15:0;;-1:-1:-1;;;66545:15:0;66494:86;66736:31;66770:26;66790:5;66770:19;:26::i;:::-;66736:60;;66815:25;67072:9;:16;;;67067:100;;-1:-1:-1;67133:14:0;;67067:100;67202:5;67185:522;67214:4;67209:1;:9;;:45;;;;;67237:17;67222:11;:32;;67209:45;67185:522;;;67296:15;67309:1;67296:12;:15::i;:::-;67284:27;;67338:9;:16;;;67383:8;67334:81;67441:14;;-1:-1:-1;;;;;67441:28:0;;67437:119;;67518:14;;;-1:-1:-1;67437:119:0;67603:5;-1:-1:-1;;;;;67582:26:0;:17;-1:-1:-1;;;;;67582:26:0;;67578:110;;67663:1;67637:8;67646:13;;;;;;67637:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;67578:110;67256:3;;67185:522;;;-1:-1:-1;;;67804:29:0;;;-1:-1:-1;67811:8:0;;-1:-1:-1;;65163:2749:0;;;;;;:::o;29339:246::-;54891:10;29438:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;29438:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;29438:60:0;;;;;;;;;;29518:55;;540:41:1;;;29438:49:0;;54891:10;29518:55;;513:18:1;29518:55:0;;;;;;;29339:246;;:::o;93882:565::-;94021:20;;:::i;:::-;94145:11;:18;94060:6;;;;94136:27;;94132:90;;94184:22;;-1:-1:-1;;;94184:22:0;;18358:2:1;94184:22:0;;;18340:21:1;18397:2;18377:18;;;18370:30;-1:-1:-1;;;18416:18:1;;;18409:42;18468:18;;94184:22:0;;;;;;;;94132:90;94236:19;94258:34;;;:27;:34;;;;;;;;94293:10;94258:46;;;;;;;;94341:25;;;:18;:25;;;;;;;94389:11;:18;;94258:46;;;;;94286:5;;94389:18;;;;;;:::i;:::-;;;;;;;;;;94381:54;;;;;;;;94389:18;;;;;;;;94381:54;;-1:-1:-1;;;;;94381:54:0;;;;-1:-1:-1;;;94381:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;94381:54:0;;;;;;;-1:-1:-1;;;94381:54:0;;;;;;;;;94409:12;;-1:-1:-1;94409:12:0;-1:-1:-1;93882:565:0;-1:-1:-1;;93882:565:0:o;100801:121::-;85381:13;:11;:13::i;:::-;100886:15:::1;:24;100904:6:::0;;100886:15;:24:::1;:::i;99204:309::-:0;85381:13;:11;:13::i;:::-;99336:3:::1;88949:142;;89022:18;;89016:3;89000:13;17167:12:::0;;16938:7;17151:13;:28;;16877:347;89000:13:::1;:19;;;;:::i;:::-;:40;88996:67;;;89049:14;;-1:-1:-1::0;;;89049:14:0::1;;;;;;;;;;;88996:67;99391:3:::2;99381:13;;:7;;:13;;;;:::i;:::-;99369:9;:25;99365:54;;;99403:16;;-1:-1:-1::0;;;99403:16:0::2;;;;;;;;;;;99365:54;99434:18;99444:2;99448:3;99434:18;;:9;:18::i;:::-;99475:5;::::0;99467:34:::2;::::0;-1:-1:-1;;;;;99475:5:0;;::::2;::::0;99491:9:::2;99467:34:::0;::::2;;;::::0;99475:5:::2;99467:34:::0;99475:5;99467:34;99491:9;99475:5;99467:34;::::2;;;;;;;;;;;;;;;;;;100519:186:::0;100632:13;100678:15;100671:22;;;;;:::i;36804:451::-;37003:31;37016:4;37022:2;37026:7;37003:12;:31::i;:::-;-1:-1:-1;;;;;37053:14:0;;;:19;37049:195;;37096:56;37127:4;37133:2;37137:7;37146:5;37096:30;:56::i;:::-;37091:153;;37184:40;;-1:-1:-1;;;37184:40:0;;;;;;;;;;;63480:468;63564:21;;:::i;:::-;63602:31;;:::i;:::-;16583:7;16614:13;63681:7;:25;63648:111;;63734:9;63480:468;-1:-1:-1;;63480:468:0:o;63648:111::-;63785:21;63798:7;63785:12;:21::i;:::-;63773:33;;63825:9;:16;;;63821:73;;;63869:9;63480:468;-1:-1:-1;;63480:468:0:o;63821:73::-;63915:21;63928:7;63915:12;:21::i;101031:653::-;101167:13;101211:16;101219:7;101211;:16::i;:::-;101206:59;;101236:29;;-1:-1:-1;;;101236:29:0;;;;;;;;;;;101206:59;101286:21;101310:15;101286:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101370:7;101364:21;101389:1;101364:26;:308;;;;;;;;;;;;;;;;;101494:7;101532:18;101542:7;101532:9;:18::i;:::-;101581:15;101447:176;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;101340:332;101031:653;-1:-1:-1;;;101031:653:0:o;86533:213::-;85381:13;:11;:13::i;:::-;-1:-1:-1;;;;;86626:22:0;::::1;86618:73;;;::::0;-1:-1:-1;;;86618:73:0;;20189:2:1;86618:73:0::1;::::0;::::1;20171:21:1::0;20228:2;20208:18;;;20201:30;20267:34;20247:18;;;20240:62;-1:-1:-1;;;20318:18:1;;;20311:36;20364:19;;86618:73:0::1;19987:402:1::0;86618:73:0::1;86706:28;86725:8;86706:18;:28::i;:::-;86533:213:::0;:::o;92339:389::-;85381:13;:11;:13::i;:::-;92510:18:::1;;92490:17;:38;92486:119;;;92556:33;;-1:-1:-1::0;;;92556:33:0::1;;;;;;;;;;;92486:119;92619:18;:38:::0;;;92677:39:::1;::::0;3255:25:1;;;92677:39:0::1;::::0;3243:2:1;3228:18;92677:39:0::1;3109:177:1::0;30236:302:0;30301:4;30403:13;;30393:7;:23;30346:161;;;;-1:-1:-1;;30458:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;30458:44:0;:49;;30236:302::o;85716:140::-;54891:10;85784:7;:5;:7::i;:::-;-1:-1:-1;;;;;85784:23:0;;85776:68;;;;-1:-1:-1;;;85776:68:0;;20596:2:1;85776:68:0;;;20578:21:1;;;20615:18;;;20608:30;20674:34;20654:18;;;20647:62;20726:18;;85776:68:0;20394:356:1;82534:317:0;81852:1;82676:7;;:19;82668:63;;;;-1:-1:-1;;;82668:63:0;;20957:2:1;82668:63:0;;;20939:21:1;20996:2;20976:18;;;20969:30;21035:33;21015:18;;;21008:61;21086:18;;82668:63:0;20755:355:1;82668:63:0;81852:1;82821:7;:18;82534:317::o;96494:2435::-;96636:3;88949:142;;89022:18;;89016:3;89000:13;17167:12;;16938:7;17151:13;:28;;16877:347;89000:13;:19;;;;:::i;:::-;:40;88996:67;;;89049:14;;-1:-1:-1;;;89049:14:0;;;;;;;;;;;88996:67;96687:15:::1;96724:26;;:::i;:::-;96771:19;96793:43;96821:14;96793:27;:43::i;:::-;96771:65;;96865:11;96877;96865:24;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;96857:32:::1;::::0;;::::1;::::0;::::1;::::0;;96865:24:::1;::::0;;;::::1;::::0;;::::1;96857:32:::0;;-1:-1:-1;;;;;96857:32:0;::::1;::::0;;;-1:-1:-1;;;96857:32:0;;::::1;;;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;;;::::1;-1:-1:-1::0;;;;;96857:32:0;;::::1;::::0;;;;-1:-1:-1;;;96857:32:0;;::::1;;::::0;;;;96954:9:::1;::::0;96857:32;;-1:-1:-1;;96938:230:0::1;;;97015:7;::::0;97002:10;;97001:28:::1;::::0;::::1;::::0;97002:20:::1;::::0;-1:-1:-1;;;;;97002:20:0::1;;:::i;:::-;97001:28;;;;:::i;:::-;96989:9;:40;96985:69;;;97038:16;;-1:-1:-1::0;;;97038:16:0::1;;;;;;;;;;;96985:69;96938:230;;;97111:10:::0;;:16:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;;;97099:28:0::1;:9;:28;97095:57;;;97136:16;;-1:-1:-1::0;;;97136:16:0::1;;;;;;;;;;;97095:57;97241:20;::::0;::::1;::::0;:24:::1;;::::0;97237:180:::1;;97330:20;::::0;::::1;::::0;97290:31:::1;::::0;;;:18:::1;:31;::::0;;;;;:60:::1;::::0;;::::1;::::0;:37:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;:60;97286:115;;;97380:21;;-1:-1:-1::0;;;97380:21:0::1;;;;;;;;;;;97286:115;97497:18;::::0;:22;97493:168:::1;;97570:18;;97564:3;97544:23;;:17;97558:2;97544:13;:17::i;:::-;:23;;;;:::i;:::-;:44;97540:105;;;97618:27;;-1:-1:-1::0;;;97618:27:0::1;;;;;;;;;;;97540:105;97780:17;::::0;::::1;::::0;:21:::1;;::::0;97776:232:::1;;97922:17;::::0;;::::1;::::0;97848:40:::1;::::0;;;:27:::1;:40:::0;;;;;;-1:-1:-1;;;;;97848:44:0;::::1;::::0;;;;;;;;;;:91:::1;::::0;;::::1;::::0;:50:::1;::::0;97895:3;;97848:44:::1;:50;:::i;:::-;:91;;;97822:170;;;97966:26;;-1:-1:-1::0;;;97966:26:0::1;;;;;;;;;;;97822:170;98130:16;::::0;::::1;::::0;:21;98126:286:::1;;98339:5;:16;;;98198:137;98249:5;;98198:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;98291:20:0::1;::::0;-1:-1:-1;;;;;;21734:2:1;21705:15;;;21701:45;98291:20:0::1;::::0;::::1;21689:58:1::0;21763:12;;;-1:-1:-1;98291:20:0::1;::::0;-1:-1:-1;21560:221:1;98291:20:0::1;;;;;;;;;;;;;98281:31;;;;;;98198:24;:137::i;:::-;:157;98172:224;;98382:14;;-1:-1:-1::0;;;98382:14:0::1;;;;;;;;;;;98172:224;98432:40;::::0;;;:27:::1;:40;::::0;;;;;;;-1:-1:-1;;;;;98432:44:0;::::1;::::0;;;;;;;:51;;98480:3;;98432:40;:51:::1;::::0;98480:3;;98432:51:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;98533:3;98498:38;;:18;:31;98517:11;98498:31;;;;;;;;;;;;:38;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;98551:18:0::1;::::0;-1:-1:-1;98561:2:0;98551:18:::1;::::0;::::1;:9;:18::i;:::-;98606:9;::::0;98593:10;;-1:-1:-1;;;;;98593:22:0::1;;98590:328;;;98645:5;::::0;98661:7:::1;::::0;-1:-1:-1;;;;;98645:5:0;;::::1;::::0;98637:38:::1;::::0;98661:13:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;98637:38;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;;;;;;;;98702:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;98694:25:0::1;:54;98743:3;98733:13;;:7;;:13;;;;:::i;:::-;98720:27;::::0;:9:::1;:27;:::i;:::-;98694:54;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;;;;;;;;98590:328;;;98797:5;::::0;-1:-1:-1;;;;;98797:5:0::1;98789:39;98813:14;98825:2;98813:9;:14;:::i;:::-;98789:39;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;;;;;;;;98855:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;98847:25:0::1;:55;98886:14;98898:2;98886:9;:14;:::i;:::-;98873:28;::::0;:9:::1;:28;:::i;:::-;98847:55;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;;;;;;;;98590:328;96641:2288;;;96494:2435:::0;;;;;:::o;24378:1379::-;24445:7;24484;24602:13;;24595:4;:20;24591:1087;;;24644:14;24661:23;;;:17;:23;;;;;;;-1:-1:-1;;;24758:24:0;;:29;;24754:901;;25463:121;25470:6;25480:1;25470:11;25463:121;;-1:-1:-1;;;25545:6:0;25527:25;;;;:17;:25;;;;;;25463:121;;24754:901;24617:1061;24591:1087;25714:31;;-1:-1:-1;;;25714:31:0;;;;;;;;;;;26365:478;26796:11;26771:23;26767:41;26764:52;-1:-1:-1;;;;;26614:28:0;;;;26754:63;;26365:478::o;86930:207::-;87027:6;;;-1:-1:-1;;;;;87048:17:0;;;-1:-1:-1;;;;;;87048:17:0;;;;;;;87085:40;;87027:6;;;87048:17;87027:6;;87085:40;;87008:16;;87085:40;86993:144;86930:207;:::o;102452:198::-;102597:3;-1:-1:-1;;;;;102588:12:0;:5;-1:-1:-1;;;;;102588:12:0;;102584:54;;102609:29;;-1:-1:-1;;;102609:29:0;;;;;;;;;;;102584:54;102452:198;;:::o;23762:169::-;23830:21;;:::i;:::-;23894:24;;;;:17;:24;;;;;;23875:44;;:18;:44::i;18540:186::-;-1:-1:-1;;;;;18633:25:0;18601:7;18633:25;;;:18;:25;;11878:2;18633:25;;;;;:50;;-1:-1:-1;;;;;18632:82:0;;18540:186::o;48016:120::-;48097:27;48107:2;48111:8;48097:27;;;;;;;;;;;;:9;:27::i;39571:792::-;39779:88;;-1:-1:-1;;;39779:88:0;;39754:4;;-1:-1:-1;;;;;39779:45:0;;;;;:88;;54891:10;;39846:4;;39852:7;;39861:5;;39779:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39779:88:0;;;;;;;;-1:-1:-1;;39779:88:0;;;;;;;;;;;;:::i;:::-;;;39775:577;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40082:6;:13;40099:1;40082:18;40078:259;;40132:40;;-1:-1:-1;;;40132:40:0;;;;;;;;;;;40078:259;40287:6;40281:13;40272:6;40268:2;40264:15;40257:38;39775:577;-1:-1:-1;;;;;;39950:64:0;-1:-1:-1;;;39950:64:0;;-1:-1:-1;39571:792:0;;;;;;:::o;23472:174::-;23542:21;;:::i;:::-;23587:47;23606:27;23625:7;23606:18;:27::i;:::-;23587:18;:47::i;55035:1893::-;55100:17;55558:4;55551;55545:11;55541:22;55658:1;55652:4;55645:15;55741:4;55738:1;55734:12;55727:19;;;55831:1;55826:3;55819:14;55947:3;56206:5;56188:464;56258:1;56253:3;56249:11;56242:18;;56441:2;56435:4;56431:13;56427:2;56423:22;56418:3;56410:36;56543:2;56533:13;;56608:25;56188:464;56608:25;-1:-1:-1;56690:13:0;;;-1:-1:-1;;56813:14:0;;;56883:19;;;56813:14;55035:1893;-1:-1:-1;55035:1893:0:o;71733:320::-;71816:7;71863:4;71816:7;71882:126;71906:5;:12;71902:1;:16;71882:126;;;71959:33;71969:12;71983:5;71989:1;71983:8;;;;;;;;:::i;:::-;;;;;;;71959:9;:33::i;:::-;71944:48;-1:-1:-1;71920:3:0;;71882:126;;;-1:-1:-1;72029:12:0;71733:320;-1:-1:-1;;;71733:320:0:o;25876:386::-;25942:31;;:::i;:::-;-1:-1:-1;;;;;25990:41:0;;;;-1:-1:-1;;;;;12447:3:0;26080:33;;;26046:68;:24;;;:68;-1:-1:-1;;;26148:24:0;;:29;;26129:16;;;:48;13016:3;26221:28;;;;26192:19;;;:58;25990:9;25876:386::o;47143:769::-;47294:19;47300:2;47304:8;47294:5;:19::i;:::-;-1:-1:-1;;;;;47367:14:0;;;:19;47363:523;;47411:11;47425:13;47477:14;;;47514:249;47549:62;47588:1;47592:2;47596:7;;;;;;47605:5;47549:30;:62::i;:::-;47544:175;;47651:40;;-1:-1:-1;;;47651:40:0;;;;;;;;;;;47544:175;47758:3;47750:5;:11;47514:249;;47853:3;47836:13;;:20;47832:34;;47858:8;;;47832:34;47388:498;;47143:769;;;:::o;79393:157::-;79456:7;79491:1;79487;:5;:51;;79634:13;79740:15;;;79780:4;79773:15;;;79831:4;79815:21;;79487:51;;;-1:-1:-1;79634:13:0;79740:15;;;79780:4;79773:15;79831:4;79815:21;;;79393:157::o;40889:3222::-;40966:20;40989:13;;;41021;;;41017:44;;41043:18;;-1:-1:-1;;;41043:18:0;;;;;;;;;;;41017:44;-1:-1:-1;;;;;41601:22:0;;;;;;:18;:22;;11878:2;41601:22;;:71;;-1:-1:-1;;;;;41627:45:0;;41601:71;;;41977:151;41601:22;-1:-1:-1;27271:15:0;;27245:24;27241:46;41977:18;:151::i;:::-;41943:31;;;;:17;:31;;;;;:185;;;;-1:-1:-1;;;;;42762:25:0;;;42202:23;;;;41961:12;;42762:25;;-1:-1:-1;;;;;;;;;;;41943:31:0;;42860:363;43573:1;43559:12;43555:20;43509:374;43618:3;43609:7;43606:16;43509:374;;43852:7;43842:8;43839:1;-1:-1:-1;;;;;;;;;;;43809:1:0;43806;43801:59;43675:1;43662:15;43509:374;;;43513:85;43924:8;43936:1;43924:13;43920:45;;43946:19;;-1:-1:-1;;;43946:19:0;;;;;;;;;;;43920:45;43990:13;:19;-1:-1:-1;96219:183:0;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:300::-;645:3;683:5;677:12;710:6;705:3;698:19;766:6;759:4;752:5;748:16;741:4;736:3;732:14;726:47;818:1;811:4;802:6;797:3;793:16;789:27;782:38;881:4;874:2;870:7;865:2;857:6;853:15;849:29;844:3;840:39;836:50;829:57;;;592:300;;;;:::o;897:231::-;1046:2;1035:9;1028:21;1009:4;1066:56;1118:2;1107:9;1103:18;1095:6;1066:56;:::i;1133:226::-;1192:6;1245:2;1233:9;1224:7;1220:23;1216:32;1213:52;;;1261:1;1258;1251:12;1213:52;-1:-1:-1;1306:23:1;;1133:226;-1:-1:-1;1133:226:1:o;1572:173::-;1640:20;;-1:-1:-1;;;;;1689:31:1;;1679:42;;1669:70;;1735:1;1732;1725:12;1669:70;1572:173;;;:::o;1750:300::-;1818:6;1826;1879:2;1867:9;1858:7;1854:23;1850:32;1847:52;;;1895:1;1892;1885:12;1847:52;1918:29;1937:9;1918:29;:::i;:::-;1908:39;2016:2;2001:18;;;;1988:32;;-1:-1:-1;;;1750:300:1:o;2055:163::-;2122:20;;2182:10;2171:22;;2161:33;;2151:61;;2208:1;2205;2198:12;2223:367;2286:8;2296:6;2350:3;2343:4;2335:6;2331:17;2327:27;2317:55;;2368:1;2365;2358:12;2317:55;-1:-1:-1;2391:20:1;;-1:-1:-1;;;;;2423:30:1;;2420:50;;;2466:1;2463;2456:12;2420:50;2503:4;2495:6;2491:17;2479:29;;2563:3;2556:4;2546:6;2543:1;2539:14;2531:6;2527:27;2523:38;2520:47;2517:67;;;2580:1;2577;2570:12;2517:67;2223:367;;;;;:::o;2595:509::-;2689:6;2697;2705;2758:2;2746:9;2737:7;2733:23;2729:32;2726:52;;;2774:1;2771;2764:12;2726:52;2797:28;2815:9;2797:28;:::i;:::-;2787:38;-1:-1:-1;2876:2:1;2861:18;;2848:32;-1:-1:-1;;;;;2892:30:1;;2889:50;;;2935:1;2932;2925:12;2889:50;2974:70;3036:7;3027:6;3016:9;3012:22;2974:70;:::i;:::-;2595:509;;3063:8;;-1:-1:-1;2948:96:1;;-1:-1:-1;;;;2595:509:1:o;3291:374::-;3368:6;3376;3384;3437:2;3425:9;3416:7;3412:23;3408:32;3405:52;;;3453:1;3450;3443:12;3405:52;3476:29;3495:9;3476:29;:::i;:::-;3466:39;;3524:38;3558:2;3547:9;3543:18;3524:38;:::i;:::-;3291:374;;3514:48;;-1:-1:-1;;;3631:2:1;3616:18;;;;3603:32;;3291:374::o;3670:587::-;3741:6;3749;3802:2;3790:9;3781:7;3777:23;3773:32;3770:52;;;3818:1;3815;3808:12;3770:52;3845:23;;-1:-1:-1;;;;;3880:30:1;;3877:50;;;3923:1;3920;3913:12;3877:50;3946:22;;3999:4;3991:13;;3987:27;-1:-1:-1;3977:55:1;;4028:1;4025;4018:12;3977:55;4055:16;;-1:-1:-1;;;;;4083:30:1;;4080:50;;;4126:1;4123;4116:12;4080:50;4171:7;4166:2;4157:6;4153:2;4149:15;4145:24;4142:37;4139:57;;;4192:1;4189;4182:12;4139:57;4223:2;4215:11;;;;;4245:6;;-1:-1:-1;3670:587:1;-1:-1:-1;;;3670:587:1:o;4262:437::-;4348:6;4356;4409:2;4397:9;4388:7;4384:23;4380:32;4377:52;;;4425:1;4422;4415:12;4377:52;4452:23;;-1:-1:-1;;;;;4487:30:1;;4484:50;;;4530:1;4527;4520:12;4484:50;4569:70;4631:7;4622:6;4611:9;4607:22;4569:70;:::i;:::-;4658:8;;4543:96;;-1:-1:-1;4262:437:1;-1:-1:-1;;;;4262:437:1:o;4704:349::-;4788:12;;-1:-1:-1;;;;;4784:38:1;4772:51;;4876:4;4865:16;;;4859:23;-1:-1:-1;;;;;4855:48:1;4839:14;;;4832:72;4892:2;4956:16;;;4950:23;4943:31;4936:39;4920:14;;;4913:63;5029:4;5018:16;;;5012:23;5037:8;5008:38;4992:14;;4985:62;4704:349::o;5058:699::-;5308:2;5320:21;;;5390:13;;5293:18;;;5412:22;;;5260:4;;5491:15;;;5465:2;5450:18;;;5260:4;5534:197;5548:6;5545:1;5542:13;5534:197;;;5597:52;5645:3;5636:6;5630:13;5597:52;:::i;:::-;5718:2;5706:15;;;;;5678:4;5669:14;;;;;5570:1;5563:9;5534:197;;;-1:-1:-1;5748:3:1;;5058:699;-1:-1:-1;;;;;5058:699:1:o;5762:171::-;5829:20;;-1:-1:-1;;;;;5878:30:1;;5868:41;;5858:69;;5923:1;5920;5913:12;5938:184;5996:6;6049:2;6037:9;6028:7;6024:23;6020:32;6017:52;;;6065:1;6062;6055:12;6017:52;6088:28;6106:9;6088:28;:::i;6127:186::-;6186:6;6239:2;6227:9;6218:7;6214:23;6210:32;6207:52;;;6255:1;6252;6245:12;6207:52;6278:29;6297:9;6278:29;:::i;6318:171::-;6385:20;;-1:-1:-1;;;;;6434:30:1;;6424:41;;6414:69;;6479:1;6476;6469:12;6494:161;6561:20;;6621:8;6610:20;;6600:31;;6590:59;;6645:1;6642;6635:12;6660:658;6768:6;6776;6784;6792;6800;6808;6816;6869:3;6857:9;6848:7;6844:23;6840:33;6837:53;;;6886:1;6883;6876:12;6837:53;6931:23;;;-1:-1:-1;6997:37:1;7030:2;7015:18;;6997:37;:::i;:::-;6987:47;;7053:37;7086:2;7075:9;7071:18;7053:37;:::i;:::-;7043:47;;7137:2;7126:9;7122:18;7109:32;7099:42;;7160:38;7193:3;7182:9;7178:19;7160:38;:::i;:::-;7150:48;;7217:38;7250:3;7239:9;7235:19;7217:38;:::i;:::-;7207:48;;7274:38;7307:3;7296:9;7292:19;7274:38;:::i;:::-;7264:48;;6660:658;;;;;;;;;;:::o;7323:611::-;7513:2;7525:21;;;7595:13;;7498:18;;;7617:22;;;7465:4;;7696:15;;;7670:2;7655:18;;;7465:4;7739:169;7753:6;7750:1;7747:13;7739:169;;;7814:13;;7802:26;;7857:2;7883:15;;;;7848:12;;;;7775:1;7768:9;7739:169;;7939:646;8058:6;8066;8119:2;8107:9;8098:7;8094:23;8090:32;8087:52;;;8135:1;8132;8125:12;8087:52;8162:23;;-1:-1:-1;;;;;8197:30:1;;8194:50;;;8240:1;8237;8230:12;8194:50;8263:22;;8316:4;8308:13;;8304:27;-1:-1:-1;8294:55:1;;8345:1;8342;8335:12;8294:55;8372:16;;-1:-1:-1;;;;;8400:30:1;;8397:50;;;8443:1;8440;8433:12;8397:50;8499:7;8494:2;8486:4;8478:6;8474:17;8470:2;8466:26;8462:35;8459:48;8456:68;;;8520:1;8517;8510:12;8590:420;8667:6;8675;8683;8736:2;8724:9;8715:7;8711:23;8707:32;8704:52;;;8752:1;8749;8742:12;8704:52;8775:29;8794:9;8775:29;:::i;:::-;8765:39;8873:2;8858:18;;8845:32;;-1:-1:-1;8974:2:1;8959:18;;;8946:32;;8590:420;-1:-1:-1;;;8590:420:1:o;9015:347::-;9080:6;9088;9141:2;9129:9;9120:7;9116:23;9112:32;9109:52;;;9157:1;9154;9147:12;9109:52;9180:29;9199:9;9180:29;:::i;:::-;9170:39;;9259:2;9248:9;9244:18;9231:32;9306:5;9299:13;9292:21;9285:5;9282:32;9272:60;;9328:1;9325;9318:12;9272:60;9351:5;9341:15;;;9015:347;;;;;:::o;9466:822::-;9751:13;;-1:-1:-1;;;;;9747:38:1;9729:57;;9846:4;9834:17;;;9828:24;9854:10;9824:41;9802:20;;;9795:71;9922:4;9910:17;;;9904:24;9882:20;;;9875:54;9989:4;9977:17;;;9971:24;9997:8;9967:39;9945:20;;;9938:69;10067:4;10055:17;;;10049:24;-1:-1:-1;;;;;10045:49:1;;;10023:20;;;10016:79;;;;10155:4;10143:17;;;10137:24;10133:49;;;10111:20;;;10104:79;9716:3;9701:19;;10192:46;10233:3;10218:19;;10210:6;9443:10;9432:22;9420:35;;9367:94;10192:46;10275:6;10269:3;10258:9;10254:19;10247:35;9466:822;;;;;;:::o;10293:258::-;10360:6;10368;10421:2;10409:9;10400:7;10396:23;10392:32;10389:52;;;10437:1;10434;10427:12;10389:52;10460:28;10478:9;10460:28;:::i;:::-;10450:38;;10507;10541:2;10530:9;10526:18;10507:38;:::i;:::-;10497:48;;10293:258;;;;;:::o;10556:127::-;10617:10;10612:3;10608:20;10605:1;10598:31;10648:4;10645:1;10638:15;10672:4;10669:1;10662:15;10688:1207;10783:6;10791;10799;10807;10860:3;10848:9;10839:7;10835:23;10831:33;10828:53;;;10877:1;10874;10867:12;10828:53;10900:29;10919:9;10900:29;:::i;:::-;10890:39;;10948:38;10982:2;10971:9;10967:18;10948:38;:::i;:::-;10938:48;-1:-1:-1;11055:2:1;11040:18;;11027:32;;-1:-1:-1;11134:2:1;11119:18;;11106:32;-1:-1:-1;;;;;11150:30:1;;11147:50;;;11193:1;11190;11183:12;11147:50;11216:22;;11269:4;11261:13;;11257:27;-1:-1:-1;11247:55:1;;11298:1;11295;11288:12;11247:55;11325:16;;-1:-1:-1;;;;;11353:30:1;;11350:56;;;11386:18;;:::i;:::-;11435:2;11429:9;11527:2;11489:17;;-1:-1:-1;;11485:31:1;;;11518:2;11481:40;11477:54;11465:67;;-1:-1:-1;;;;;11547:34:1;;11583:22;;;11544:62;11541:88;;;11609:18;;:::i;:::-;11645:2;11638:22;11669;;;11710:15;;;11727:2;11706:24;11703:37;-1:-1:-1;11700:57:1;;;11753:1;11750;11743:12;11700:57;11809:6;11804:2;11800;11796:11;11791:2;11783:6;11779:15;11766:50;11862:1;11857:2;11848:6;11840;11836:19;11832:28;11825:39;11883:6;11873:16;;;;;10688:1207;;;;;;;:::o;11900:264::-;12094:3;12079:19;;12107:51;12083:9;12140:6;12107:51;:::i;12169:260::-;12237:6;12245;12298:2;12286:9;12277:7;12273:23;12269:32;12266:52;;;12314:1;12311;12304:12;12266:52;12337:29;12356:9;12337:29;:::i;12434:380::-;12513:1;12509:12;;;;12556;;;12577:61;;12631:4;12623:6;12619:17;12609:27;;12577:61;12684:2;12676:6;12673:14;12653:18;12650:38;12647:161;;12730:10;12725:3;12721:20;12718:1;12711:31;12765:4;12762:1;12755:15;12793:4;12790:1;12783:15;12647:161;;12434:380;;;:::o;12945:899::-;13091:2;13080:9;13073:21;13054:4;13114:1;13147:6;13141:13;13177:36;13203:9;13177:36;:::i;:::-;13249:6;13244:2;13233:9;13229:18;13222:34;13287:1;13276:9;13272:17;13303:1;13298:158;;;;13470:1;13465:353;;;;13265:553;;13298:158;13365:3;13361:8;13350:9;13346:24;13341:2;13330:9;13326:18;13319:52;13443:2;13431:6;13424:14;13417:22;13414:1;13410:30;13399:9;13395:46;13391:55;13384:62;;13298:158;;13465:353;13496:6;13493:1;13486:17;13544:2;13541:1;13531:16;13569:1;13583:179;13597:6;13594:1;13591:13;13583:179;;;13690:14;;13666:17;;;13685:2;13662:26;13655:50;13746:1;13733:15;;;;13619:2;13612:10;13583:179;;;13786:17;;13805:2;13782:26;;-1:-1:-1;;13265:553:1;-1:-1:-1;13835:3:1;;12945:899;-1:-1:-1;;;;;12945:899:1:o;14059:518::-;14161:2;14156:3;14153:11;14150:421;;;14197:5;14194:1;14187:16;14241:4;14238:1;14228:18;14311:2;14299:10;14295:19;14292:1;14288:27;14282:4;14278:38;14347:4;14335:10;14332:20;14329:47;;;-1:-1:-1;14370:4:1;14329:47;14425:2;14420:3;14416:12;14413:1;14409:20;14403:4;14399:31;14389:41;;14480:81;14498:2;14491:5;14488:13;14480:81;;;14557:1;14543:16;;14524:1;14513:13;14480:81;;14753:1198;-1:-1:-1;;;;;14869:27:1;;14866:53;;;14899:18;;:::i;:::-;14928:94;15018:3;14978:38;15010:4;15004:11;14978:38;:::i;:::-;14972:4;14928:94;:::i;:::-;15048:1;15073:2;15068:3;15065:11;15090:1;15085:608;;;;15737:1;15754:3;15751:93;;;-1:-1:-1;15810:19:1;;;15797:33;15751:93;-1:-1:-1;;14710:1:1;14706:11;;;14702:24;14698:29;14688:40;14734:1;14730:11;;;14685:57;15857:78;;15058:887;;15085:608;12892:1;12885:14;;;12929:4;12916:18;;-1:-1:-1;;15121:17:1;;;15236:229;15250:7;15247:1;15244:14;15236:229;;;15339:19;;;15326:33;15311:49;;15446:4;15431:20;;;;15399:1;15387:14;;;;15266:12;15236:229;;;15240:3;15493;15484:7;15481:16;15478:159;;;15617:1;15613:6;15607:3;15601;15598:1;15594:11;15590:21;15586:34;15582:39;15569:9;15564:3;15560:19;15547:33;15543:79;15535:6;15528:95;15478:159;;;15680:1;15674:3;15671:1;15667:11;15663:19;15657:4;15650:33;15058:887;;14753:1198;;;:::o;15956:390::-;16115:2;16104:9;16097:21;16154:6;16149:2;16138:9;16134:18;16127:34;16211:6;16203;16198:2;16187:9;16183:18;16170:48;16267:1;16238:22;;;16262:2;16234:31;;;16227:42;;;;16330:2;16309:15;;;-1:-1:-1;;16305:29:1;16290:45;16286:54;;15956:390;-1:-1:-1;15956:390:1:o;16351:127::-;16412:10;16407:3;16403:20;16400:1;16393:31;16443:4;16440:1;16433:15;16467:4;16464:1;16457:15;16483:127;16544:10;16539:3;16535:20;16532:1;16525:31;16575:4;16572:1;16565:15;16599:4;16596:1;16589:15;16615:128;16682:9;;;16703:11;;;16700:37;;;16717:18;;:::i;16748:704::-;17053:25;;;-1:-1:-1;;;;;17114:31:1;;;;17109:2;17094:18;;17087:59;17194:10;17182:23;;;;17177:2;17162:18;;17155:51;17237:2;17222:18;;17215:34;;;;17298:8;17286:21;17280:3;17265:19;;17258:50;-1:-1:-1;;;;;17345:31:1;;;17339:3;17324:19;;17317:60;17414:31;17408:3;17393:19;;17386:60;17040:3;17025:19;;16748:704::o;17457:127::-;17518:10;17513:3;17509:20;17506:1;17499:31;17549:4;17546:1;17539:15;17573:4;17570:1;17563:15;17589:184;17647:6;17700:2;17688:9;17679:7;17675:23;17671:32;17668:52;;;17716:1;17713;17706:12;17668:52;17739:28;17757:9;17739:28;:::i;17778:184::-;17836:6;17889:2;17877:9;17868:7;17864:23;17860:32;17857:52;;;17905:1;17902;17895:12;17857:52;17928:28;17946:9;17928:28;:::i;17967:184::-;18025:6;18078:2;18066:9;18057:7;18053:23;18049:32;18046:52;;;18094:1;18091;18084:12;18046:52;18117:28;18135:9;18117:28;:::i;18497:125::-;18562:9;;;18583:10;;;18580:36;;;18596:18;;:::i;18627:168::-;18700:9;;;18731;;18748:15;;;18742:22;;18728:37;18718:71;;18769:18;;:::i;18800:212::-;18842:3;18880:5;18874:12;18924:6;18917:4;18910:5;18906:16;18901:3;18895:36;18986:1;18950:16;;18975:13;;;-1:-1:-1;18950:16:1;;18800:212;-1:-1:-1;18800:212:1:o;19017:965::-;19241:3;19269:57;19295:30;19321:3;19313:6;19295:30;:::i;:::-;19287:6;19269:57;:::i;:::-;19346:1;19379:6;19373:13;19409:36;19435:9;19409:36;:::i;:::-;19476:1;19461:17;;19487:131;;;;19632:1;19627:330;;;;19454:503;;19487:131;-1:-1:-1;;19519:24:1;;19508:36;;19591:14;;19584:22;19572:35;;19564:44;;;-1:-1:-1;19487:131:1;;19627:330;19658:6;19655:1;19648:17;19706:4;19703:1;19693:18;19733:1;19747:165;19761:6;19758:1;19755:13;19747:165;;;19840:14;;19828:10;;;19821:34;19896:1;19883:15;;;;19783:4;19776:12;19747:165;;;19751:3;;19940:6;19936:2;19932:15;19925:22;;19454:503;-1:-1:-1;19973:3:1;;19017:965;-1:-1:-1;;;;;;;;19017:965:1:o;21115:268::-;-1:-1:-1;;;;;21199:26:1;;;21227;;;21195:59;21274:36;;;;21329:24;;;21319:58;;21357:18;;:::i;:::-;21319:58;21115:268;;;;:::o;21388:167::-;21483:10;21456:18;;;21476;;;21452:43;;21507:19;;21504:45;;;21529:18;;:::i;21786:217::-;21826:1;21852;21842:132;;21896:10;21891:3;21887:20;21884:1;21877:31;21931:4;21928:1;21921:15;21959:4;21956:1;21949:15;21842:132;-1:-1:-1;21988:9:1;;21786:217::o;22008:496::-;-1:-1:-1;;;;;22239:32:1;;;22221:51;;22308:32;;22303:2;22288:18;;22281:60;22372:2;22357:18;;22350:34;;;22420:3;22415:2;22400:18;;22393:31;;;-1:-1:-1;;22441:57:1;;22478:19;;22470:6;22441:57;:::i;:::-;22433:65;22008:496;-1:-1:-1;;;;;;22008:496:1:o;22509:249::-;22578:6;22631:2;22619:9;22610:7;22606:23;22602:32;22599:52;;;22647:1;22644;22637:12;22599:52;22679:9;22673:16;22698:30;22722:5;22698:30;:::i

Swarm Source

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