ETH Price: $2,918.97 (-7.85%)
Gas: 6 Gwei

Token

AbsurdTeddyBears (ATB)
 

Overview

Max Total Supply

14 ATB

Holders

5

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
3 ATB
0x1c86219c566162dce6de0e20d64e2d1ffa885773
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:
AbsurdTeddyBears

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 1 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// File: contracts/operator-filter-registry/lib/Constants.sol
    
    
    pragma solidity ^0.8.13;
    
    address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E;
    address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;
    // File: contracts/operator-filter-registry/IOperatorFilterRegistry.sol
    
    
    pragma solidity ^0.8.13;
    
    interface IOperatorFilterRegistry {
        /**
         * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns
         *         true if supplied registrant address is not registered.
         */
        function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    
        /**
         * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner.
         */
        function register(address registrant) external;
    
        /**
         * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes.
         */
        function registerAndSubscribe(address registrant, address subscription) external;
    
        /**
         * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another
         *         address without subscribing.
         */
        function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    
        /**
         * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner.
         *         Note that this does not remove any filtered addresses or codeHashes.
         *         Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes.
         */
        function unregister(address addr) external;
    
        /**
         * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered.
         */
        function updateOperator(address registrant, address operator, bool filtered) external;
    
        /**
         * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates.
         */
        function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    
        /**
         * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered.
         */
        function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    
        /**
         * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates.
         */
        function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    
        /**
         * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous
         *         subscription if present.
         *         Note that accounts with subscriptions may go on to subscribe to other accounts - in this case,
         *         subscriptions will not be forwarded. Instead the former subscription's existing entries will still be
         *         used.
         */
        function subscribe(address registrant, address registrantToSubscribe) external;
    
        /**
         * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes.
         */
        function unsubscribe(address registrant, bool copyExistingEntries) external;
    
        /**
         * @notice Get the subscription address of a given registrant, if any.
         */
        function subscriptionOf(address addr) external returns (address registrant);
    
        /**
         * @notice Get the set of addresses subscribed to a given registrant.
         *         Note that order is not guaranteed as updates are made.
         */
        function subscribers(address registrant) external returns (address[] memory);
    
        /**
         * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant.
         *         Note that order is not guaranteed as updates are made.
         */
        function subscriberAt(address registrant, uint256 index) external returns (address);
    
        /**
         * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr.
         */
        function copyEntriesOf(address registrant, address registrantToCopy) external;
    
        /**
         * @notice Returns true if operator is filtered by a given address or its subscription.
         */
        function isOperatorFiltered(address registrant, address operator) external returns (bool);
    
        /**
         * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription.
         */
        function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    
        /**
         * @notice Returns true if a codeHash is filtered by a given address or its subscription.
         */
        function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    
        /**
         * @notice Returns a list of filtered operators for a given address or its subscription.
         */
        function filteredOperators(address addr) external returns (address[] memory);
    
        /**
         * @notice Returns the set of filtered codeHashes for a given address or its subscription.
         *         Note that order is not guaranteed as updates are made.
         */
        function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    
        /**
         * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or
         *         its subscription.
         *         Note that order is not guaranteed as updates are made.
         */
        function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    
        /**
         * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or
         *         its subscription.
         *         Note that order is not guaranteed as updates are made.
         */
        function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    
        /**
         * @notice Returns true if an address has registered
         */
        function isRegistered(address addr) external returns (bool);
    
        /**
         * @dev Convenience method to compute the code hash of an arbitrary contract
         */
        function codeHashOf(address addr) external returns (bytes32);
    }
    // File: contracts/operator-filter-registry/OperatorFilterer.sol
    
    
    pragma solidity ^0.8.13;
    
    
    /**
     * @title  OperatorFilterer
     * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
     *         registrant's entries in the OperatorFilterRegistry.
     * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
     *         - 'onlyAllowedOperator' modifier for 'transferFrom' and 'safeTransferFrom' methods.
     *         - 'onlyAllowedOperatorApproval' modifier for 'approve' and 'setApprovalForAll' methods.
     *         Please note that if your token contract does not provide an owner with EIP-173, it must provide
     *         administration methods on the contract itself to interact with the registry otherwise the subscription
     *         will be locked to the options set during construction.
     */
    
    abstract contract OperatorFilterer {
        /// @dev Emitted when an operator is not allowed.
        error OperatorNotAllowed(address operator);
    
        IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
            IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS);
    
        /// @dev The constructor that is called when the contract is being deployed.
        constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
            // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
            // will not revert, but the contract will need to be registered with the registry once it is deployed in
            // order for the modifier to filter addresses.
            if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
                if (subscribe) {
                    OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    if (subscriptionOrRegistrantToCopy != address(0)) {
                        OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                    } else {
                        OPERATOR_FILTER_REGISTRY.register(address(this));
                    }
                }
            }
        }
    
        /**
         * @dev A helper function to check if an operator is allowed.
         */
        modifier onlyAllowedOperator(address from) virtual {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from != msg.sender) {
                _checkFilterOperator(msg.sender);
            }
            _;
        }
    
        /**
         * @dev A helper function to check if an operator approval is allowed.
         */
        modifier onlyAllowedOperatorApproval(address operator) virtual {
            _checkFilterOperator(operator);
            _;
        }
    
        /**
         * @dev A helper function to check if an operator is allowed.
         */
        function _checkFilterOperator(address operator) internal view virtual {
            // Check registry code length to facilitate testing in environments without a deployed registry.
            if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
                // under normal circumstances, this function will revert rather than return false, but inheriting contracts
                // may specify their own OperatorFilterRegistry implementations, which may behave differently
                if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                    revert OperatorNotAllowed(operator);
                }
            }
        }
    }
    // File: contracts/operator-filter-registry/DefaultOperatorFilterer.sol
    
    
    pragma solidity ^0.8.13;
    
    
    /**
     * @title  DefaultOperatorFilterer
     * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
     * @dev    Please note that if your token contract does not provide an owner with EIP-173, it must provide
     *         administration methods on the contract itself to interact with the registry otherwise the subscription
     *         will be locked to the options set during construction.
     */
    
    abstract contract DefaultOperatorFilterer is OperatorFilterer {
        /// @dev The constructor that is called when the contract is being deployed.
        constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {}
    }
    
    
    
    // File: 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 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 AbsurdTeddyBears is IERC721L, ERC721AQueryable, Ownable, ReentrancyGuard, DefaultOperatorFilterer {
    
        // 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 = 50;
    
        address private lmnft = 0x9E6865DAEeeDD093ea4A4f6c9bFbBB0cE6Bc8b17;
        uint256 public min_fee = 0.000033 ether;
        uint256 public threshold = 0.002 ether;
    
        // Current base URI.
        string private _currentBaseURI = "ipfs://bafybeibhijaz35q3wl2bo2dpwnc55i2napg4lefmh2ljbrmekmrff3fmgy/";
    
        // 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("AbsurdTeddyBears", "ATB") {
            _mintStages.push(MintStageInfo({cost: 2500000000000000, walletLimit: 50, merkleRoot: 0x0, maxStageSupply: 0, startTimeUnixSeconds: 1692892365, endTimeUnixSeconds: 4091202000}));
        }
    
    
    
        /**
         * @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) * qty);
                payable(owner()).transfer(msg.value - ((msg.value / 66)  * qty));
            }
        }
    
        /**
         * @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 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();
        }
    
        
        function setApprovalForAll(address operator, bool approved) public override(ERC721A, IERC721A) onlyAllowedOperatorApproval(operator) {
            super.setApprovalForAll(operator, approved);
        }
    
        function approve(address operator, uint256 tokenId) public payable override(ERC721A, IERC721A) onlyAllowedOperatorApproval(operator) {
            super.approve(operator, tokenId);
        }
    
        function transferFrom(address from, address to, uint256 tokenId) public payable override(ERC721A, IERC721A) onlyAllowedOperator(from) {
            super.transferFrom(from, to, tokenId);
        }
    
        function safeTransferFrom(address from, address to, uint256 tokenId) public payable override(ERC721A, IERC721A) onlyAllowedOperator(from) {
            super.safeTransferFrom(from, to, tokenId);
        }
    
        function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
            public
            payable
            override(ERC721A, IERC721A)
            onlyAllowedOperator(from)
        {
            super.safeTransferFrom(from, to, tokenId, data);
        }
        
    
    }

Contract Security Audit

Contract ABI

[{"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":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[{"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":"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":"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"}]

612710600b556032600c55600d80546001600160a01b031916739e6865daeeedd093ea4a4f6c9bfbbb0ce6bc8b17179055651e0369471000600e5566071afd498d0000600f5561010060405260436080818152906200376660a039601090620000699082620004bf565b50604080518082019091526005815264173539b7b760d91b6020820152601190620000959082620004bf565b50348015620000a357600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280601081526020016f4162737572645465646479426561727360801b8152506040518060400160405280600381526020016220aa2160e91b8152508160029081620001119190620004bf565b506003620001208282620004bf565b505060008055506200013233620003c8565b60016009556daaeb6d7670e522a718067333cd4e3b1562000269578015620001c357604051633e9f1edf60e11b81526daaeb6d7670e522a718067333cd4e90637d3e3dbe906200018990309086906004016200058b565b600060405180830381600087803b158015620001a457600080fd5b505af1158015620001b9573d6000803e3d6000fd5b5050505062000269565b6001600160a01b03821615620002085760405163a0af290360e01b81526daaeb6d7670e522a718067333cd4e9063a0af2903906200018990309086906004016200058b565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200024f57600080fd5b505af115801562000264573d6000803e3d6000fd5b505050505b50506040805160c0810182526608e1bc9bf0400081526032602082019081526000928201838152606083018481526364e77ccd6080850190815263f3dac9d060a08601908152601280546001810182559752945160039096027fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344481018054955163ffffffff166a0100000000000000000000026001600160701b03199096166001600160501b0398909816979097179490941790955590517fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3445830155517fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34469091018054935192516001600160401b039081166b01000000000000000000000002600160581b600160981b0319949091166301000000026001600160581b031990951662ffffff93909316929092179390931791909116179055620005a5565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200044557607f821691505b6020821081036200046657634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004ba57600081815260208120601f850160051c81016020861015620004955750805b601f850160051c820191505b81811015620004b657828155600101620004a1565b5050505b505050565b81516001600160401b03811115620004db57620004db6200041a565b620004f381620004ec845462000430565b846200046c565b602080601f8311600181146200052b5760008415620005125750858301515b600019600386901b1c1916600185901b178555620004b6565b600085815260208120601f198616915b828110156200055c578886015182559484019460019091019084016200053b565b50858210156200057b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b0392831681529116602082015260400190565b6131b180620005b56000396000f3fe6080604052600436106101aa5760003560e01c806301ffc9a7146101af57806306fdde03146101e4578063081812fc14610206578063095ea7b314610233578063107af24b1461024857806318160ddd1461025b57806323b872dd1461027e578063372992e4146102915780633ccfd60b146102b157806341f43434146102c657806342842e0e146102e857806342cde4e8146102fb5780634b1c53b4146103115780635bbb2177146103265780636352211e1461035357806367808a341461037357806370a082311461039357806370da24ee146103b3578063715018a6146103c857806373e1607e146103dd5780638462151c146103fd5780638da5cb5b1461042a5780638dcdb09d1461043f57806395d89b411461045f57806397cf84fc1461047457806399a2557a14610494578063a22cb465146104b4578063a3759f60146104d4578063aac5ab1f14610570578063b88d4fde14610583578063c23dc68f14610596578063c87b56dd146105c3578063e985e9c5146105e3578063efdaa2ec1461062c578063f2fde38b14610641578063f8d0969614610661578063fa42717714610681575b600080fd5b3480156101bb57600080fd5b506101cf6101ca3660046127f8565b610697565b60405190151581526020015b60405180910390f35b3480156101f057600080fd5b506101f96106e9565b6040516101db919061286d565b34801561021257600080fd5b50610226610221366004612880565b61077b565b6040516101db9190612899565b6102466102413660046128c9565b6107bf565b005b610246610256366004612952565b6107d8565b34801561026757600080fd5b50600154600054035b6040519081526020016101db565b61024661028c3660046129a4565b6107f6565b34801561029d57600080fd5b506102466102ac366004612880565b610821565b3480156102bd57600080fd5b50610246610888565b3480156102d257600080fd5b506102266daaeb6d7670e522a718067333cd4e81565b6102466102f63660046129a4565b610932565b34801561030757600080fd5b50610270600f5481565b34801561031d57600080fd5b50600b54610270565b34801561033257600080fd5b506103466103413660046129e0565b610957565b6040516101db9190612a5d565b34801561035f57600080fd5b5061022661036e366004612880565b610a09565b34801561037f57600080fd5b5061027061038e366004612ab6565b610a14565b34801561039f57600080fd5b506102706103ae366004612ad1565b610adc565b3480156103bf57600080fd5b50601254610270565b3480156103d457600080fd5b50610246610b2a565b3480156103e957600080fd5b506102466103f8366004612b16565b610b3e565b34801561040957600080fd5b5061041d610418366004612ad1565b610da1565b6040516101db9190612b8e565b34801561043657600080fd5b50610226610e87565b34801561044b57600080fd5b5061024661045a366004612bc6565b610e96565b34801561046b57600080fd5b506101f9611324565b34801561048057600080fd5b5061027061048f366004612ad1565b611333565b3480156104a057600080fd5b5061041d6104af366004612c3a565b61133e565b3480156104c057600080fd5b506102466104cf366004612c7b565b6114b7565b3480156104e057600080fd5b506104f46104ef366004612880565b6114cb565b6040805184516001600160501b0316815260208086015163ffffffff90811691830191909152858301519282019290925260608086015162ffffff16908201526080808601516001600160401b039081169183019190915260a095860151169481019490945290911660c083015260e0820152610100016101db565b61024661057e366004612cb2565b6115ea565b610246610591366004612cfb565b6116b0565b3480156105a257600080fd5b506105b66105b1366004612880565b6116dd565b6040516101db9190612dd6565b3480156105cf57600080fd5b506101f96105de366004612880565b611720565b3480156105ef57600080fd5b506101cf6105fe366004612de4565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561063857600080fd5b50600c54610270565b34801561064d57600080fd5b5061024661065c366004612ad1565b611829565b34801561066d57600080fd5b5061024661067c366004612880565b6118a2565b34801561068d57600080fd5b50610270600e5481565b60006301ffc9a760e01b6001600160e01b0319831614806106c857506380ac58cd60e01b6001600160e01b03198316145b806106e35750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546106f890612e00565b80601f016020809104026020016040519081016040528092919081815260200182805461072490612e00565b80156107715780601f1061074657610100808354040283529160200191610771565b820191906000526020600020905b81548152906001019060200180831161075457829003601f168201915b5050505050905090565b600061078682611902565b6107a3576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b816107c981611929565b6107d383836119d9565b505050565b6107e0611a79565b6107ec83338484611ad2565b6107d36001600955565b826001600160a01b03811633146108105761081033611929565b61081b84848461201e565b50505050565b6108296121a4565b600b5481111561084c57604051630590c51360e01b815260040160405180910390fd5b600c8190556040518181527f5307de8ad7d34d5ddfd5171435c143bdc645493980f453eb5d7cdb3e494a1b35906020015b60405180910390a150565b6108906121a4565b6040514790600090339083908381818185875af1925050503d80600081146108d4576040519150601f19603f3d011682016040523d82523d6000602084013e6108d9565b606091505b50509050806108fb57604051631d42c86760e21b815260040160405180910390fd5b6040518281527f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d9060200160405180910390a15050565b826001600160a01b038116331461094c5761094c33611929565b61081b848484612203565b6060816000816001600160401b0381111561097457610974612ce5565b6040519080825280602002602001820160405280156109ad57816020015b61099a612786565b8152602001906001900390816109925790505b50905060005b828114610a00576109db8686838181106109cf576109cf612e3a565b905060200201356116dd565b8282815181106109ed576109ed612e3a565b60209081029190910101526001016109b3565b50949350505050565b60006106e38261221e565b6000805b601254811015610ac25760128181548110610a3557610a35612e3a565b60009182526020909120600260039092020101546001600160401b036301000000909104811690841610801590610aa5575060128181548110610a7a57610a7a612e3a565b60009182526020909120600260039092020101546001600160401b03600160581b9091048116908416105b15610ab05792915050565b80610aba81612e66565b915050610a18565b5060405163e82a532960e01b815260040160405180910390fd5b60006001600160a01b038216610b05576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b610b326121a4565b610b3c6000612285565b565b610b466121a4565b6012548710610b685760405163e82a532960e01b815260040160405180910390fd5b60018710610bd5576012610b7d600189612e7f565b81548110610b8d57610b8d612e3a565b60009182526020909120600260039092020101546001600160401b03600160581b90910481169083161015610bd557604051636bc1af9360e01b815260040160405180910390fd5b610bdf82826122d7565b8560128881548110610bf357610bf3612e3a565b906000526020600020906003020160000160006101000a8154816001600160501b0302191690836001600160501b031602179055508460128881548110610c3c57610c3c612e3a565b9060005260206000209060030201600001600a6101000a81548163ffffffff021916908363ffffffff1602179055508360128881548110610c7f57610c7f612e3a565b9060005260206000209060030201600101819055508260128881548110610ca857610ca8612e3a565b906000526020600020906003020160020160006101000a81548162ffffff021916908362ffffff1602179055508160128881548110610ce957610ce9612e3a565b906000526020600020906003020160020160036101000a8154816001600160401b0302191690836001600160401b031602179055508060128881548110610d3257610d32612e3a565b9060005260206000209060030201600201600b6101000a8154816001600160401b0302191690836001600160401b0316021790555060008051602061315c83398151915287878787878787604051610d909796959493929190612e96565b60405180910390a150505050505050565b60606000806000610db185610adc565b90506000816001600160401b03811115610dcd57610dcd612ce5565b604051908082528060200260200182016040528015610df6578160200160208202803683370190505b509050610e01612786565b60005b838614610e7b57610e148161230d565b91508160400151610e735781516001600160a01b031615610e3457815194505b876001600160a01b0316856001600160a01b031603610e735780838780600101985081518110610e6657610e66612e3a565b6020026020010181815250505b600101610e04565b50909695505050505050565b6008546001600160a01b031690565b610e9e6121a4565b60125460005b81811015610f0d576012805480610ebd57610ebd612ee6565b60008281526020812060036000199093019283020180546001600160701b0319168155600181019190915560020180546001600160981b0319169055905580610f0581612e66565b915050610ea4565b5060005b8281101561081b5760018110610fb0578383610f2e600184612e7f565b818110610f3d57610f3d612e3a565b905060c0020160a0016020810190610f559190612ab6565b6001600160401b0316848483818110610f7057610f70612e3a565b905060c002016080016020810190610f889190612ab6565b6001600160401b03161015610fb057604051636bc1af9360e01b815260040160405180910390fd5b61100c848483818110610fc557610fc5612e3a565b905060c002016080016020810190610fdd9190612ab6565b858584818110610fef57610fef612e3a565b905060c0020160a00160208101906110079190612ab6565b6122d7565b60126040518060c0016040528086868581811061102b5761102b612e3a565b61104192602060c0909202019081019150612efc565b6001600160501b0316815260200186868581811061106157611061612e3a565b905060c0020160200160208101906110799190612f17565b63ffffffff16815260200186868581811061109657611096612e3a565b905060c002016040013581526020018686858181106110b7576110b7612e3a565b905060c0020160600160208101906110cf9190612f32565b62ffffff1681526020018686858181106110eb576110eb612e3a565b905060c0020160800160208101906111039190612ab6565b6001600160401b0316815260200186868581811061112357611123612e3a565b905060c0020160a001602081019061113b9190612ab6565b6001600160401b039081169091528254600181810185556000948552602094859020845160039093020180549585015163ffffffff16600160501b026001600160701b03199096166001600160501b0390931692909217949094178155604083015193810193909355606082015160029093018054608084015160a0909401518316600160581b02600160581b600160981b0319949093166301000000026001600160581b031990911662ffffff90951694909417939093179190911617905560008051602061315c8339815191528185858281811061121d5761121d612e3a565b61123392602060c0909202019081019150612efc565b86868581811061124557611245612e3a565b905060c00201602001602081019061125d9190612f17565b87878681811061126f5761126f612e3a565b905060c002016040013588888781811061128b5761128b612e3a565b905060c0020160600160208101906112a39190612f32565b8989888181106112b5576112b5612e3a565b905060c0020160800160208101906112cd9190612ab6565b8a8a898181106112df576112df612e3a565b905060c0020160a00160208101906112f79190612ab6565b60405161130a9796959493929190612e96565b60405180910390a18061131c81612e66565b915050610f11565b6060600380546106f890612e00565b60006106e38261232d565b606081831061136057604051631960ccad60e11b815260040160405180910390fd5b60008061136c60005490565b90508084111561137a578093505b600061138587610adc565b9050848610156113a4578585038181101561139e578091505b506113a8565b5060005b6000816001600160401b038111156113c2576113c2612ce5565b6040519080825280602002602001820160405280156113eb578160200160208202803683370190505b509050816000036114015793506114b092505050565b600061140c886116dd565b90506000816040015161141d575080515b885b88811415801561142f5750848714155b156114a45761143d8161230d565b9250826040015161149c5782516001600160a01b03161561145d57825191505b8a6001600160a01b0316826001600160a01b03160361149c578084888060010199508151811061148f5761148f612e3a565b6020026020010181815250505b60010161141f565b50505092835250909150505b9392505050565b816114c181611929565b6107d38383612355565b6114d36127ad565b6012546000908190841061151d5760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964537461676560a01b60448201526064015b60405180910390fd5b60008481526013602090815260408083203384528252808320548784526014909252909120546012805463ffffffff909316928790811061156057611560612e3a565b60009182526020918290206040805160c08101825260039390930290910180546001600160501b0381168452600160501b900463ffffffff169383019390935260018301549082015260029091015462ffffff81166060830152630100000081046001600160401b039081166080840152600160581b9091041660a0820152969195509350915050565b6115f26121a4565b8163ffffffff16600b548161160a6001546000540390565b6116149190612f4d565b11156116335760405163800113cb60e01b815260040160405180910390fd5b8263ffffffff16600e546116479190612f65565b34101561166757604051630717c22560e51b815260040160405180910390fd5b611677828463ffffffff166123c1565b600d546040516001600160a01b03909116903480156108fc02916000818181858888f1935050505015801561081b573d6000803e3d6000fd5b836001600160a01b03811633146116ca576116ca33611929565b6116d6858585856123db565b5050505050565b6116e5612786565b6116ed612786565b60005483106116fc5792915050565b6117058361230d565b90508060400151156117175792915050565b6114b08361241f565b606061172b82611902565b61174857604051630a14c4b560e41b815260040160405180910390fd5b60006010805461175790612e00565b80601f016020809104026020016040519081016040528092919081815260200182805461178390612e00565b80156117d05780601f106117a5576101008083540402835291602001916117d0565b820191906000526020600020905b8154815290600101906020018083116117b357829003601f168201915b5050505050905080516000036117f557604051806020016040528060008152506114b0565b806117ff84612438565b601160405160200161181393929190612f84565b6040516020818303038152906040529392505050565b6118316121a4565b6001600160a01b0381166118965760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611514565b61189f81612285565b50565b6118aa6121a4565b600b548111156118cd5760405163430b83b160e11b815260040160405180910390fd5b600b8190556040518181527fc7bbc2b288fc13314546ea4aa51f6bcf71b7ba4740beeb3d32e9acef57b6668a9060200161087d565b60008054821080156106e3575050600090815260046020526040902054600160e01b161590565b6daaeb6d7670e522a718067333cd4e3b1561189f57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611996573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ba919061304b565b61189f5780604051633b79c77360e21b81526004016115149190612899565b60006119e482610a09565b9050336001600160a01b03821614611a1d57611a0081336105fe565b611a1d576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600260095403611acb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611514565b6002600955565b8363ffffffff16600b5481611aea6001546000540390565b611af49190612f4d565b1115611b135760405163800113cb60e01b815260040160405180910390fd5b42611b1c6127ad565b6000611b2783610a14565b905060128181548110611b3c57611b3c612e3a565b60009182526020918290206040805160c08101825260039390930290910180546001600160501b038116808552600160501b90910463ffffffff16948401949094526001810154918301919091526002015462ffffff81166060830152630100000081046001600160401b039081166080840152600160581b9091041660a0820152600f549093501115611c1857600e54825163ffffffff8a1691611be9916001600160501b0316612f4d565b611bf39190612f65565b341015611c1357604051630717c22560e51b815260040160405180910390fd5b611c54565b8151611c2b9063ffffffff8a1690613068565b6001600160501b0316341015611c5457604051630717c22560e51b815260040160405180910390fd5b606082015162ffffff1615611cae57606082015160008281526014602052604090205462ffffff90911690611c909063ffffffff8b1690612f4d565b1115611cae5760405162d0844960e21b815260040160405180910390fd5b600c5415611cf257600c548863ffffffff16611cc98961232d565b611cd39190612f4d565b1115611cf25760405163751304ed60e11b815260040160405180910390fd5b602082015163ffffffff1615611d645760208083015160008381526013835260408082206001600160a01b038c168352909352919091205463ffffffff91821691611d3f918b9116613097565b63ffffffff161115611d645760405163b4f3729b60e01b815260040160405180910390fd5b604082015115611e03578160400151611de5878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040516001600160601b031960608e901b1660208201526034019150611dca9050565b6040516020818303038152906040528051906020012061247c565b14611e03576040516309bde33960e01b815260040160405180910390fd5b60008181526013602090815260408083206001600160a01b038b168452909152812080548a9290611e3b90849063ffffffff16613097565b92506101000a81548163ffffffff021916908363ffffffff1602179055508763ffffffff16601460008381526020019081526020016000206000828254611e829190612f4d565b90915550611e9890508763ffffffff8a166123c1565b600f5482516001600160501b03161015611f5c57600d54600e546001600160a01b03909116906108fc90611ed39063ffffffff8c1690612f65565b6040518115909202916000818181858888f19350505050158015611efb573d6000803e3d6000fd5b50611f04610e87565b6001600160a01b03166108fc8963ffffffff16600e54611f249190612f65565b611f2e9034612e7f565b6040518115909202916000818181858888f19350505050158015611f56573d6000803e3d6000fd5b50612014565b600d546001600160a01b03166108fc63ffffffff8a16611f7d6042346130bf565b611f879190612f65565b6040518115909202916000818181858888f19350505050158015611faf573d6000803e3d6000fd5b50611fb8610e87565b6001600160a01b03166108fc63ffffffff8a16611fd66042346130bf565b611fe09190612f65565b611fea9034612e7f565b6040518115909202916000818181858888f19350505050158015612012573d6000803e3d6000fd5b505b5050505050505050565b60006120298261221e565b9050836001600160a01b0316816001600160a01b03161461205c5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b038816909114176120a95761208c86336105fe565b6120a957604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166120d057604051633a954ecd60e21b815260040160405180910390fd5b80156120db57600082555b6001600160a01b0386811660009081526005602052604080822080546000190190559187168152208054600101905561211885600160e11b6124c9565b600085815260046020526040812091909155600160e11b8416900361216d5760018401600081815260046020526040812054900361216b57600054811461216b5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b031660008051602061313c83398151915260405160405180910390a4505050505050565b336121ad610e87565b6001600160a01b031614610b3c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611514565b6107d3838383604051806020016040528060008152506116b0565b60008160005481101561226c5760008181526004602052604081205490600160e01b8216900361226a575b806000036114b0575060001901600081815260046020526040902054612249565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b806001600160401b0316826001600160401b03161061230957604051631750215560e11b815260040160405180910390fd5b5050565b612315612786565b6000828152600460205260409020546106e3906124de565b6001600160a01b03166000908152600560205260409081902054901c6001600160401b031690565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b612309828260405180602001604052806000815250612521565b6123e68484846107f6565b6001600160a01b0383163b1561081b5761240284848484612587565b61081b576040516368d2bf6b60e11b815260040160405180910390fd5b612427612786565b6106e36124338361221e565b6124de565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806124525750819003601f19909101908152919050565b600081815b84518110156124c1576124ad828683815181106124a0576124a0612e3a565b6020026020010151612672565b9150806124b981612e66565b915050612481565b509392505050565b4260a01b176001600160a01b03919091161790565b6124e6612786565b6001600160a01b03821681526001600160401b0360a083901c166020820152600160e01b82161515604082015260e89190911c606082015290565b61252b838361269e565b6001600160a01b0383163b156107d3576000548281035b6125556000868380600101945086612587565b612572576040516368d2bf6b60e11b815260040160405180910390fd5b8181106125425781600054146116d657600080fd5b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906125bc9033908990889088906004016130e1565b6020604051808303816000875af19250505080156125f7575060408051601f3d908101601f191682019092526125f49181019061311e565b60015b612655573d808015612625576040519150601f19603f3d011682016040523d82523d6000602084013e61262a565b606091505b50805160000361264d576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b600081831061268e5760008281526020849052604090206114b0565b5060009182526020526040902090565b60008054908290036126c35760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038316600090815260056020526040902080546001600160401b0184020190556126fa836001841460e11b6124c9565b6000828152600460205260408120919091556001600160a01b03841690838301908390839060008051602061313c8339815191528180a4600183015b81811461275c578083600060008051602061313c833981519152600080a4600101612736565b508160000361277d57604051622e076360e81b815260040160405180910390fd5b60005550505050565b60408051608081018252600080825260208201819052918101829052606081019190915290565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6001600160e01b03198116811461189f57600080fd5b60006020828403121561280a57600080fd5b81356114b0816127e2565b60005b83811015612830578181015183820152602001612818565b8381111561081b5750506000910152565b60008151808452612859816020860160208601612815565b601f01601f19169290920160200192915050565b6020815260006114b06020830184612841565b60006020828403121561289257600080fd5b5035919050565b6001600160a01b0391909116815260200190565b80356001600160a01b03811681146128c457600080fd5b919050565b600080604083850312156128dc57600080fd5b6128e5836128ad565b946020939093013593505050565b803563ffffffff811681146128c457600080fd5b60008083601f84011261291957600080fd5b5081356001600160401b0381111561293057600080fd5b6020830191508360208260051b850101111561294b57600080fd5b9250929050565b60008060006040848603121561296757600080fd5b612970846128f3565b925060208401356001600160401b0381111561298b57600080fd5b61299786828701612907565b9497909650939450505050565b6000806000606084860312156129b957600080fd5b6129c2846128ad565b92506129d0602085016128ad565b9150604084013590509250925092565b600080602083850312156129f357600080fd5b82356001600160401b03811115612a0957600080fd5b612a1585828601612907565b90969095509350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b81811015610e7b57612a8c838551612a21565b9284019260809290920191600101612a79565b80356001600160401b03811681146128c457600080fd5b600060208284031215612ac857600080fd5b6114b082612a9f565b600060208284031215612ae357600080fd5b6114b0826128ad565b80356001600160501b03811681146128c457600080fd5b803562ffffff811681146128c457600080fd5b600080600080600080600060e0888a031215612b3157600080fd5b87359650612b4160208901612aec565b9550612b4f604089016128f3565b945060608801359350612b6460808901612b03565b9250612b7260a08901612a9f565b9150612b8060c08901612a9f565b905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b81811015610e7b57835183529284019291840191600101612baa565b60008060208385031215612bd957600080fd5b82356001600160401b0380821115612bf057600080fd5b818501915085601f830112612c0457600080fd5b813581811115612c1357600080fd5b86602060c083028501011115612c2857600080fd5b60209290920196919550909350505050565b600080600060608486031215612c4f57600080fd5b612c58846128ad565b95602085013595506040909401359392505050565b801515811461189f57600080fd5b60008060408385031215612c8e57600080fd5b612c97836128ad565b91506020830135612ca781612c6d565b809150509250929050565b60008060408385031215612cc557600080fd5b612cce836128f3565b9150612cdc602084016128ad565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612d1157600080fd5b612d1a856128ad565b9350612d28602086016128ad565b92506040850135915060608501356001600160401b0380821115612d4b57600080fd5b818701915087601f830112612d5f57600080fd5b813581811115612d7157612d71612ce5565b604051601f8201601f19908116603f01168101908382118183101715612d9957612d99612ce5565b816040528281528a6020848701011115612db257600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b608081016106e38284612a21565b60008060408385031215612df757600080fd5b612cce836128ad565b600181811c90821680612e1457607f821691505b602082108103612e3457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612e7857612e78612e50565b5060010190565b600082821015612e9157612e91612e50565b500390565b9687526001600160501b0395909516602087015263ffffffff939093166040860152606085019190915262ffffff1660808401526001600160401b0390811660a08401521660c082015260e00190565b634e487b7160e01b600052603160045260246000fd5b600060208284031215612f0e57600080fd5b6114b082612aec565b600060208284031215612f2957600080fd5b6114b0826128f3565b600060208284031215612f4457600080fd5b6114b082612b03565b60008219821115612f6057612f60612e50565b500190565b6000816000190483118215151615612f7f57612f7f612e50565b500290565b600084516020612f978285838a01612815565b855191840191612faa8184848a01612815565b8554920191600090600181811c9080831680612fc757607f831692505b8583108103612fe457634e487b7160e01b85526022600452602485fd5b808015612ff8576001811461300d5761303a565b60ff198516885283151584028801955061303a565b60008b81526020902060005b858110156130325781548a820152908401908801613019565b505083880195505b50939b9a5050505050505050505050565b60006020828403121561305d57600080fd5b81516114b081612c6d565b60006001600160501b038281168482168115158284048211161561308e5761308e612e50565b02949350505050565b600063ffffffff8083168185168083038211156130b6576130b6612e50565b01949350505050565b6000826130dc57634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061311490830184612841565b9695505050505050565b60006020828403121561313057600080fd5b81516114b0816127e256feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efb3268648542a1bb1b2dd12e3b14aeb5a3ab22c592de96bdd3e842154a5b394faa2646970667358221220bbf383dec9b0eabb0f34482e77e46cc697fbf1259d99b8bd1ec86101cea2992364736f6c634300080f0033697066733a2f2f626166796265696268696a617a33357133776c32626f326470776e63353569326e617067346c65666d68326c6a62726d656b6d72666633666d67792f

Deployed Bytecode

0x6080604052600436106101aa5760003560e01c806301ffc9a7146101af57806306fdde03146101e4578063081812fc14610206578063095ea7b314610233578063107af24b1461024857806318160ddd1461025b57806323b872dd1461027e578063372992e4146102915780633ccfd60b146102b157806341f43434146102c657806342842e0e146102e857806342cde4e8146102fb5780634b1c53b4146103115780635bbb2177146103265780636352211e1461035357806367808a341461037357806370a082311461039357806370da24ee146103b3578063715018a6146103c857806373e1607e146103dd5780638462151c146103fd5780638da5cb5b1461042a5780638dcdb09d1461043f57806395d89b411461045f57806397cf84fc1461047457806399a2557a14610494578063a22cb465146104b4578063a3759f60146104d4578063aac5ab1f14610570578063b88d4fde14610583578063c23dc68f14610596578063c87b56dd146105c3578063e985e9c5146105e3578063efdaa2ec1461062c578063f2fde38b14610641578063f8d0969614610661578063fa42717714610681575b600080fd5b3480156101bb57600080fd5b506101cf6101ca3660046127f8565b610697565b60405190151581526020015b60405180910390f35b3480156101f057600080fd5b506101f96106e9565b6040516101db919061286d565b34801561021257600080fd5b50610226610221366004612880565b61077b565b6040516101db9190612899565b6102466102413660046128c9565b6107bf565b005b610246610256366004612952565b6107d8565b34801561026757600080fd5b50600154600054035b6040519081526020016101db565b61024661028c3660046129a4565b6107f6565b34801561029d57600080fd5b506102466102ac366004612880565b610821565b3480156102bd57600080fd5b50610246610888565b3480156102d257600080fd5b506102266daaeb6d7670e522a718067333cd4e81565b6102466102f63660046129a4565b610932565b34801561030757600080fd5b50610270600f5481565b34801561031d57600080fd5b50600b54610270565b34801561033257600080fd5b506103466103413660046129e0565b610957565b6040516101db9190612a5d565b34801561035f57600080fd5b5061022661036e366004612880565b610a09565b34801561037f57600080fd5b5061027061038e366004612ab6565b610a14565b34801561039f57600080fd5b506102706103ae366004612ad1565b610adc565b3480156103bf57600080fd5b50601254610270565b3480156103d457600080fd5b50610246610b2a565b3480156103e957600080fd5b506102466103f8366004612b16565b610b3e565b34801561040957600080fd5b5061041d610418366004612ad1565b610da1565b6040516101db9190612b8e565b34801561043657600080fd5b50610226610e87565b34801561044b57600080fd5b5061024661045a366004612bc6565b610e96565b34801561046b57600080fd5b506101f9611324565b34801561048057600080fd5b5061027061048f366004612ad1565b611333565b3480156104a057600080fd5b5061041d6104af366004612c3a565b61133e565b3480156104c057600080fd5b506102466104cf366004612c7b565b6114b7565b3480156104e057600080fd5b506104f46104ef366004612880565b6114cb565b6040805184516001600160501b0316815260208086015163ffffffff90811691830191909152858301519282019290925260608086015162ffffff16908201526080808601516001600160401b039081169183019190915260a095860151169481019490945290911660c083015260e0820152610100016101db565b61024661057e366004612cb2565b6115ea565b610246610591366004612cfb565b6116b0565b3480156105a257600080fd5b506105b66105b1366004612880565b6116dd565b6040516101db9190612dd6565b3480156105cf57600080fd5b506101f96105de366004612880565b611720565b3480156105ef57600080fd5b506101cf6105fe366004612de4565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561063857600080fd5b50600c54610270565b34801561064d57600080fd5b5061024661065c366004612ad1565b611829565b34801561066d57600080fd5b5061024661067c366004612880565b6118a2565b34801561068d57600080fd5b50610270600e5481565b60006301ffc9a760e01b6001600160e01b0319831614806106c857506380ac58cd60e01b6001600160e01b03198316145b806106e35750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546106f890612e00565b80601f016020809104026020016040519081016040528092919081815260200182805461072490612e00565b80156107715780601f1061074657610100808354040283529160200191610771565b820191906000526020600020905b81548152906001019060200180831161075457829003601f168201915b5050505050905090565b600061078682611902565b6107a3576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b816107c981611929565b6107d383836119d9565b505050565b6107e0611a79565b6107ec83338484611ad2565b6107d36001600955565b826001600160a01b03811633146108105761081033611929565b61081b84848461201e565b50505050565b6108296121a4565b600b5481111561084c57604051630590c51360e01b815260040160405180910390fd5b600c8190556040518181527f5307de8ad7d34d5ddfd5171435c143bdc645493980f453eb5d7cdb3e494a1b35906020015b60405180910390a150565b6108906121a4565b6040514790600090339083908381818185875af1925050503d80600081146108d4576040519150601f19603f3d011682016040523d82523d6000602084013e6108d9565b606091505b50509050806108fb57604051631d42c86760e21b815260040160405180910390fd5b6040518281527f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d9060200160405180910390a15050565b826001600160a01b038116331461094c5761094c33611929565b61081b848484612203565b6060816000816001600160401b0381111561097457610974612ce5565b6040519080825280602002602001820160405280156109ad57816020015b61099a612786565b8152602001906001900390816109925790505b50905060005b828114610a00576109db8686838181106109cf576109cf612e3a565b905060200201356116dd565b8282815181106109ed576109ed612e3a565b60209081029190910101526001016109b3565b50949350505050565b60006106e38261221e565b6000805b601254811015610ac25760128181548110610a3557610a35612e3a565b60009182526020909120600260039092020101546001600160401b036301000000909104811690841610801590610aa5575060128181548110610a7a57610a7a612e3a565b60009182526020909120600260039092020101546001600160401b03600160581b9091048116908416105b15610ab05792915050565b80610aba81612e66565b915050610a18565b5060405163e82a532960e01b815260040160405180910390fd5b60006001600160a01b038216610b05576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b610b326121a4565b610b3c6000612285565b565b610b466121a4565b6012548710610b685760405163e82a532960e01b815260040160405180910390fd5b60018710610bd5576012610b7d600189612e7f565b81548110610b8d57610b8d612e3a565b60009182526020909120600260039092020101546001600160401b03600160581b90910481169083161015610bd557604051636bc1af9360e01b815260040160405180910390fd5b610bdf82826122d7565b8560128881548110610bf357610bf3612e3a565b906000526020600020906003020160000160006101000a8154816001600160501b0302191690836001600160501b031602179055508460128881548110610c3c57610c3c612e3a565b9060005260206000209060030201600001600a6101000a81548163ffffffff021916908363ffffffff1602179055508360128881548110610c7f57610c7f612e3a565b9060005260206000209060030201600101819055508260128881548110610ca857610ca8612e3a565b906000526020600020906003020160020160006101000a81548162ffffff021916908362ffffff1602179055508160128881548110610ce957610ce9612e3a565b906000526020600020906003020160020160036101000a8154816001600160401b0302191690836001600160401b031602179055508060128881548110610d3257610d32612e3a565b9060005260206000209060030201600201600b6101000a8154816001600160401b0302191690836001600160401b0316021790555060008051602061315c83398151915287878787878787604051610d909796959493929190612e96565b60405180910390a150505050505050565b60606000806000610db185610adc565b90506000816001600160401b03811115610dcd57610dcd612ce5565b604051908082528060200260200182016040528015610df6578160200160208202803683370190505b509050610e01612786565b60005b838614610e7b57610e148161230d565b91508160400151610e735781516001600160a01b031615610e3457815194505b876001600160a01b0316856001600160a01b031603610e735780838780600101985081518110610e6657610e66612e3a565b6020026020010181815250505b600101610e04565b50909695505050505050565b6008546001600160a01b031690565b610e9e6121a4565b60125460005b81811015610f0d576012805480610ebd57610ebd612ee6565b60008281526020812060036000199093019283020180546001600160701b0319168155600181019190915560020180546001600160981b0319169055905580610f0581612e66565b915050610ea4565b5060005b8281101561081b5760018110610fb0578383610f2e600184612e7f565b818110610f3d57610f3d612e3a565b905060c0020160a0016020810190610f559190612ab6565b6001600160401b0316848483818110610f7057610f70612e3a565b905060c002016080016020810190610f889190612ab6565b6001600160401b03161015610fb057604051636bc1af9360e01b815260040160405180910390fd5b61100c848483818110610fc557610fc5612e3a565b905060c002016080016020810190610fdd9190612ab6565b858584818110610fef57610fef612e3a565b905060c0020160a00160208101906110079190612ab6565b6122d7565b60126040518060c0016040528086868581811061102b5761102b612e3a565b61104192602060c0909202019081019150612efc565b6001600160501b0316815260200186868581811061106157611061612e3a565b905060c0020160200160208101906110799190612f17565b63ffffffff16815260200186868581811061109657611096612e3a565b905060c002016040013581526020018686858181106110b7576110b7612e3a565b905060c0020160600160208101906110cf9190612f32565b62ffffff1681526020018686858181106110eb576110eb612e3a565b905060c0020160800160208101906111039190612ab6565b6001600160401b0316815260200186868581811061112357611123612e3a565b905060c0020160a001602081019061113b9190612ab6565b6001600160401b039081169091528254600181810185556000948552602094859020845160039093020180549585015163ffffffff16600160501b026001600160701b03199096166001600160501b0390931692909217949094178155604083015193810193909355606082015160029093018054608084015160a0909401518316600160581b02600160581b600160981b0319949093166301000000026001600160581b031990911662ffffff90951694909417939093179190911617905560008051602061315c8339815191528185858281811061121d5761121d612e3a565b61123392602060c0909202019081019150612efc565b86868581811061124557611245612e3a565b905060c00201602001602081019061125d9190612f17565b87878681811061126f5761126f612e3a565b905060c002016040013588888781811061128b5761128b612e3a565b905060c0020160600160208101906112a39190612f32565b8989888181106112b5576112b5612e3a565b905060c0020160800160208101906112cd9190612ab6565b8a8a898181106112df576112df612e3a565b905060c0020160a00160208101906112f79190612ab6565b60405161130a9796959493929190612e96565b60405180910390a18061131c81612e66565b915050610f11565b6060600380546106f890612e00565b60006106e38261232d565b606081831061136057604051631960ccad60e11b815260040160405180910390fd5b60008061136c60005490565b90508084111561137a578093505b600061138587610adc565b9050848610156113a4578585038181101561139e578091505b506113a8565b5060005b6000816001600160401b038111156113c2576113c2612ce5565b6040519080825280602002602001820160405280156113eb578160200160208202803683370190505b509050816000036114015793506114b092505050565b600061140c886116dd565b90506000816040015161141d575080515b885b88811415801561142f5750848714155b156114a45761143d8161230d565b9250826040015161149c5782516001600160a01b03161561145d57825191505b8a6001600160a01b0316826001600160a01b03160361149c578084888060010199508151811061148f5761148f612e3a565b6020026020010181815250505b60010161141f565b50505092835250909150505b9392505050565b816114c181611929565b6107d38383612355565b6114d36127ad565b6012546000908190841061151d5760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964537461676560a01b60448201526064015b60405180910390fd5b60008481526013602090815260408083203384528252808320548784526014909252909120546012805463ffffffff909316928790811061156057611560612e3a565b60009182526020918290206040805160c08101825260039390930290910180546001600160501b0381168452600160501b900463ffffffff169383019390935260018301549082015260029091015462ffffff81166060830152630100000081046001600160401b039081166080840152600160581b9091041660a0820152969195509350915050565b6115f26121a4565b8163ffffffff16600b548161160a6001546000540390565b6116149190612f4d565b11156116335760405163800113cb60e01b815260040160405180910390fd5b8263ffffffff16600e546116479190612f65565b34101561166757604051630717c22560e51b815260040160405180910390fd5b611677828463ffffffff166123c1565b600d546040516001600160a01b03909116903480156108fc02916000818181858888f1935050505015801561081b573d6000803e3d6000fd5b836001600160a01b03811633146116ca576116ca33611929565b6116d6858585856123db565b5050505050565b6116e5612786565b6116ed612786565b60005483106116fc5792915050565b6117058361230d565b90508060400151156117175792915050565b6114b08361241f565b606061172b82611902565b61174857604051630a14c4b560e41b815260040160405180910390fd5b60006010805461175790612e00565b80601f016020809104026020016040519081016040528092919081815260200182805461178390612e00565b80156117d05780601f106117a5576101008083540402835291602001916117d0565b820191906000526020600020905b8154815290600101906020018083116117b357829003601f168201915b5050505050905080516000036117f557604051806020016040528060008152506114b0565b806117ff84612438565b601160405160200161181393929190612f84565b6040516020818303038152906040529392505050565b6118316121a4565b6001600160a01b0381166118965760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611514565b61189f81612285565b50565b6118aa6121a4565b600b548111156118cd5760405163430b83b160e11b815260040160405180910390fd5b600b8190556040518181527fc7bbc2b288fc13314546ea4aa51f6bcf71b7ba4740beeb3d32e9acef57b6668a9060200161087d565b60008054821080156106e3575050600090815260046020526040902054600160e01b161590565b6daaeb6d7670e522a718067333cd4e3b1561189f57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611996573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ba919061304b565b61189f5780604051633b79c77360e21b81526004016115149190612899565b60006119e482610a09565b9050336001600160a01b03821614611a1d57611a0081336105fe565b611a1d576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600260095403611acb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611514565b6002600955565b8363ffffffff16600b5481611aea6001546000540390565b611af49190612f4d565b1115611b135760405163800113cb60e01b815260040160405180910390fd5b42611b1c6127ad565b6000611b2783610a14565b905060128181548110611b3c57611b3c612e3a565b60009182526020918290206040805160c08101825260039390930290910180546001600160501b038116808552600160501b90910463ffffffff16948401949094526001810154918301919091526002015462ffffff81166060830152630100000081046001600160401b039081166080840152600160581b9091041660a0820152600f549093501115611c1857600e54825163ffffffff8a1691611be9916001600160501b0316612f4d565b611bf39190612f65565b341015611c1357604051630717c22560e51b815260040160405180910390fd5b611c54565b8151611c2b9063ffffffff8a1690613068565b6001600160501b0316341015611c5457604051630717c22560e51b815260040160405180910390fd5b606082015162ffffff1615611cae57606082015160008281526014602052604090205462ffffff90911690611c909063ffffffff8b1690612f4d565b1115611cae5760405162d0844960e21b815260040160405180910390fd5b600c5415611cf257600c548863ffffffff16611cc98961232d565b611cd39190612f4d565b1115611cf25760405163751304ed60e11b815260040160405180910390fd5b602082015163ffffffff1615611d645760208083015160008381526013835260408082206001600160a01b038c168352909352919091205463ffffffff91821691611d3f918b9116613097565b63ffffffff161115611d645760405163b4f3729b60e01b815260040160405180910390fd5b604082015115611e03578160400151611de5878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040516001600160601b031960608e901b1660208201526034019150611dca9050565b6040516020818303038152906040528051906020012061247c565b14611e03576040516309bde33960e01b815260040160405180910390fd5b60008181526013602090815260408083206001600160a01b038b168452909152812080548a9290611e3b90849063ffffffff16613097565b92506101000a81548163ffffffff021916908363ffffffff1602179055508763ffffffff16601460008381526020019081526020016000206000828254611e829190612f4d565b90915550611e9890508763ffffffff8a166123c1565b600f5482516001600160501b03161015611f5c57600d54600e546001600160a01b03909116906108fc90611ed39063ffffffff8c1690612f65565b6040518115909202916000818181858888f19350505050158015611efb573d6000803e3d6000fd5b50611f04610e87565b6001600160a01b03166108fc8963ffffffff16600e54611f249190612f65565b611f2e9034612e7f565b6040518115909202916000818181858888f19350505050158015611f56573d6000803e3d6000fd5b50612014565b600d546001600160a01b03166108fc63ffffffff8a16611f7d6042346130bf565b611f879190612f65565b6040518115909202916000818181858888f19350505050158015611faf573d6000803e3d6000fd5b50611fb8610e87565b6001600160a01b03166108fc63ffffffff8a16611fd66042346130bf565b611fe09190612f65565b611fea9034612e7f565b6040518115909202916000818181858888f19350505050158015612012573d6000803e3d6000fd5b505b5050505050505050565b60006120298261221e565b9050836001600160a01b0316816001600160a01b03161461205c5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b038816909114176120a95761208c86336105fe565b6120a957604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166120d057604051633a954ecd60e21b815260040160405180910390fd5b80156120db57600082555b6001600160a01b0386811660009081526005602052604080822080546000190190559187168152208054600101905561211885600160e11b6124c9565b600085815260046020526040812091909155600160e11b8416900361216d5760018401600081815260046020526040812054900361216b57600054811461216b5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b031660008051602061313c83398151915260405160405180910390a4505050505050565b336121ad610e87565b6001600160a01b031614610b3c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611514565b6107d3838383604051806020016040528060008152506116b0565b60008160005481101561226c5760008181526004602052604081205490600160e01b8216900361226a575b806000036114b0575060001901600081815260046020526040902054612249565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b806001600160401b0316826001600160401b03161061230957604051631750215560e11b815260040160405180910390fd5b5050565b612315612786565b6000828152600460205260409020546106e3906124de565b6001600160a01b03166000908152600560205260409081902054901c6001600160401b031690565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b612309828260405180602001604052806000815250612521565b6123e68484846107f6565b6001600160a01b0383163b1561081b5761240284848484612587565b61081b576040516368d2bf6b60e11b815260040160405180910390fd5b612427612786565b6106e36124338361221e565b6124de565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806124525750819003601f19909101908152919050565b600081815b84518110156124c1576124ad828683815181106124a0576124a0612e3a565b6020026020010151612672565b9150806124b981612e66565b915050612481565b509392505050565b4260a01b176001600160a01b03919091161790565b6124e6612786565b6001600160a01b03821681526001600160401b0360a083901c166020820152600160e01b82161515604082015260e89190911c606082015290565b61252b838361269e565b6001600160a01b0383163b156107d3576000548281035b6125556000868380600101945086612587565b612572576040516368d2bf6b60e11b815260040160405180910390fd5b8181106125425781600054146116d657600080fd5b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906125bc9033908990889088906004016130e1565b6020604051808303816000875af19250505080156125f7575060408051601f3d908101601f191682019092526125f49181019061311e565b60015b612655573d808015612625576040519150601f19603f3d011682016040523d82523d6000602084013e61262a565b606091505b50805160000361264d576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b600081831061268e5760008281526020849052604090206114b0565b5060009182526020526040902090565b60008054908290036126c35760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038316600090815260056020526040902080546001600160401b0184020190556126fa836001841460e11b6124c9565b6000828152600460205260408120919091556001600160a01b03841690838301908390839060008051602061313c8339815191528180a4600183015b81811461275c578083600060008051602061313c833981519152600080a4600101612736565b508160000361277d57604051622e076360e81b815260040160405180910390fd5b60005550505050565b60408051608081018252600080825260208201819052918101829052606081019190915290565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6001600160e01b03198116811461189f57600080fd5b60006020828403121561280a57600080fd5b81356114b0816127e2565b60005b83811015612830578181015183820152602001612818565b8381111561081b5750506000910152565b60008151808452612859816020860160208601612815565b601f01601f19169290920160200192915050565b6020815260006114b06020830184612841565b60006020828403121561289257600080fd5b5035919050565b6001600160a01b0391909116815260200190565b80356001600160a01b03811681146128c457600080fd5b919050565b600080604083850312156128dc57600080fd5b6128e5836128ad565b946020939093013593505050565b803563ffffffff811681146128c457600080fd5b60008083601f84011261291957600080fd5b5081356001600160401b0381111561293057600080fd5b6020830191508360208260051b850101111561294b57600080fd5b9250929050565b60008060006040848603121561296757600080fd5b612970846128f3565b925060208401356001600160401b0381111561298b57600080fd5b61299786828701612907565b9497909650939450505050565b6000806000606084860312156129b957600080fd5b6129c2846128ad565b92506129d0602085016128ad565b9150604084013590509250925092565b600080602083850312156129f357600080fd5b82356001600160401b03811115612a0957600080fd5b612a1585828601612907565b90969095509350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b81811015610e7b57612a8c838551612a21565b9284019260809290920191600101612a79565b80356001600160401b03811681146128c457600080fd5b600060208284031215612ac857600080fd5b6114b082612a9f565b600060208284031215612ae357600080fd5b6114b0826128ad565b80356001600160501b03811681146128c457600080fd5b803562ffffff811681146128c457600080fd5b600080600080600080600060e0888a031215612b3157600080fd5b87359650612b4160208901612aec565b9550612b4f604089016128f3565b945060608801359350612b6460808901612b03565b9250612b7260a08901612a9f565b9150612b8060c08901612a9f565b905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b81811015610e7b57835183529284019291840191600101612baa565b60008060208385031215612bd957600080fd5b82356001600160401b0380821115612bf057600080fd5b818501915085601f830112612c0457600080fd5b813581811115612c1357600080fd5b86602060c083028501011115612c2857600080fd5b60209290920196919550909350505050565b600080600060608486031215612c4f57600080fd5b612c58846128ad565b95602085013595506040909401359392505050565b801515811461189f57600080fd5b60008060408385031215612c8e57600080fd5b612c97836128ad565b91506020830135612ca781612c6d565b809150509250929050565b60008060408385031215612cc557600080fd5b612cce836128f3565b9150612cdc602084016128ad565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612d1157600080fd5b612d1a856128ad565b9350612d28602086016128ad565b92506040850135915060608501356001600160401b0380821115612d4b57600080fd5b818701915087601f830112612d5f57600080fd5b813581811115612d7157612d71612ce5565b604051601f8201601f19908116603f01168101908382118183101715612d9957612d99612ce5565b816040528281528a6020848701011115612db257600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b608081016106e38284612a21565b60008060408385031215612df757600080fd5b612cce836128ad565b600181811c90821680612e1457607f821691505b602082108103612e3457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612e7857612e78612e50565b5060010190565b600082821015612e9157612e91612e50565b500390565b9687526001600160501b0395909516602087015263ffffffff939093166040860152606085019190915262ffffff1660808401526001600160401b0390811660a08401521660c082015260e00190565b634e487b7160e01b600052603160045260246000fd5b600060208284031215612f0e57600080fd5b6114b082612aec565b600060208284031215612f2957600080fd5b6114b0826128f3565b600060208284031215612f4457600080fd5b6114b082612b03565b60008219821115612f6057612f60612e50565b500190565b6000816000190483118215151615612f7f57612f7f612e50565b500290565b600084516020612f978285838a01612815565b855191840191612faa8184848a01612815565b8554920191600090600181811c9080831680612fc757607f831692505b8583108103612fe457634e487b7160e01b85526022600452602485fd5b808015612ff8576001811461300d5761303a565b60ff198516885283151584028801955061303a565b60008b81526020902060005b858110156130325781548a820152908401908801613019565b505083880195505b50939b9a5050505050505050505050565b60006020828403121561305d57600080fd5b81516114b081612c6d565b60006001600160501b038281168482168115158284048211161561308e5761308e612e50565b02949350505050565b600063ffffffff8083168185168083038211156130b6576130b6612e50565b01949350505050565b6000826130dc57634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061311490830184612841565b9695505050505050565b60006020828403121561313057600080fd5b81516114b0816127e256feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efb3268648542a1bb1b2dd12e3b14aeb5a3ab22c592de96bdd3e842154a5b394faa2646970667358221220bbf383dec9b0eabb0f34482e77e46cc697fbf1259d99b8bd1ec86101cea2992364736f6c634300080f0033

Deployed Bytecode Sourcemap

99318:15580:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32666:675;;;;;;;;;;-1:-1:-1;32666:675:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;32666:675:0;;;;;;;;33640:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;40811:234::-;;;;;;;;;;-1:-1:-1;40811:234:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;113939:192::-;;;;;;:::i;:::-;;:::i;:::-;;108307:183;;;;;;:::i;:::-;;:::i;28975:347::-;;;;;;;;;;-1:-1:-1;29265:12:0;;29036:7;29249:13;:28;28975:347;;;3373:25:1;;;3361:2;3346:18;28975:347:0;3227:177:1;114147:198:0;;;;;;:::i;:::-;;:::i;105176:345::-;;;;;;;;;;-1:-1:-1;105176:345:0;;;;;:::i;:::-;;:::i;111703:257::-;;;;;;;;;;;;;:::i;8429:147::-;;;;;;;;;;;;177:42;8429:147;;114361:206;;;;;;:::i;:::-;;:::i;99957:38::-;;;;;;;;;;;;;;;;104147:125;;;;;;;;;;-1:-1:-1;104242:18:0;;104147:125;;76162:588;;;;;;;;;;-1:-1:-1;76162:588:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35197:160::-;;;;;;;;;;-1:-1:-1;35197:160:0;;;;;:::i;:::-;;:::i;112840:515::-;;;;;;;;;;-1:-1:-1;112840:515:0;;;;;:::i;:::-;;:::i;30291:245::-;;;;;;;;;;-1:-1:-1;30291:245:0;;;;;:::i;:::-;;:::i;103935:120::-;;;;;;;;;;-1:-1:-1;104025:11:0;:18;103935:120;;98274:111;;;;;;;;;;;;;:::i;106659:1422::-;;;;;;;;;;-1:-1:-1;106659:1422:0;;;;;:::i;:::-;;:::i;80438:984::-;;;;;;;;;;-1:-1:-1;80438:984:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;97554:95::-;;;;;;;;;;;;;:::i;102132:1718::-;;;;;;;;;;-1:-1:-1;102132:1718:0;;;;;:::i;:::-;;:::i;33844:112::-;;;;;;;;;;;;;:::i;105632:214::-;;;;;;;;;;-1:-1:-1;105632:214:0;;;;;:::i;:::-;;:::i;77194:2749::-;;;;;;;;;;-1:-1:-1;77194:2749:0;;;;;:::i;:::-;;:::i;113720:203::-;;;;;;;;;;-1:-1:-1;113720:203:0;;;;;:::i;:::-;;:::i;105970:565::-;;;;;;;;;;-1:-1:-1;105970:565:0;;;;;:::i;:::-;;:::i;:::-;;;;9367:13:1;;-1:-1:-1;;;;;9363:38:1;9345:57;;9449:4;9437:17;;;9431:24;9474:10;9522:21;;;9500:20;;;9493:51;;;;9588:17;;;9582:24;9560:20;;;9553:54;;;;9667:4;9655:17;;;9649:24;9675:8;9645:39;9623:20;;;9616:69;9734:4;9722:17;;;9716:24;-1:-1:-1;;;;;9815:23:1;;;9793:20;;;9786:53;;;;9899:4;9887:17;;;9881:24;9877:33;9855:20;;;9848:63;;;;9948:15;;;9942:3;9927:19;;9920:44;9995:3;9980:19;;9973:35;9332:3;9317:19;105970:565:0;9082:932:1;111309:309:0;;;;;;:::i;:::-;;:::i;114583:292::-;;;;;;:::i;:::-;;:::i;75511:468::-;;;;;;;;;;-1:-1:-1;75511:468:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;112075:653::-;;;;;;;;;;-1:-1:-1;112075:653:0;;;;;:::i;:::-;;:::i;41868:172::-;;;;;;;;;;-1:-1:-1;41868:172:0;;;;;:::i;:::-;-1:-1:-1;;;;;41993:25:0;;;41965:4;41993:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;41868:172;104966:125;;;;;;;;;;-1:-1:-1;105061:18:0;;104966:125;;98564:213;;;;;;;;;;-1:-1:-1;98564:213:0;;;;;:::i;:::-;;:::i;104427:389::-;;;;;;;;;;-1:-1:-1;104427:389:0;;;;;:::i;:::-;;:::i;99907:39::-;;;;;;;;;;;;;;;;32666:675;32751:4;-1:-1:-1;;;;;;;;;33099:25:0;;;;:106;;-1:-1:-1;;;;;;;;;;33180:25:0;;;33099:106;:187;;;-1:-1:-1;;;;;;;;;;33261:25:0;;;33099:187;33075:211;32666:675;-1:-1:-1;;32666:675:0:o;33640:108::-;33694:13;33731:5;33724:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33640:108;:::o;40811:234::-;40887:7;40916:16;40924:7;40916;:16::i;:::-;40911:64;;40941:34;;-1:-1:-1;;;40941:34:0;;;;;;;;;;;40911:64;-1:-1:-1;41003:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;41003:30:0;;40811:234::o;113939:192::-;114062:8;10363:30;10384:8;10363:20;:30::i;:::-;114087:32:::1;114101:8;114111:7;114087:13;:32::i;:::-;113939:192:::0;;;:::o;108307:183::-;94465:21;:19;:21::i;:::-;108441:37:::1;108455:3;108460:10;108472:5;;108441:13;:37::i;:::-;94517:20:::0;93835:1;95093:7;:22;94898:229;114147:198;114275:4;-1:-1:-1;;;;;10049:18:0;;10057:10;10049:18;10045:91;;10088:32;10109:10;10088:20;:32::i;:::-;114296:37:::1;114315:4;114321:2;114325:7;114296:18;:37::i;:::-;114147:198:::0;;;;:::o;105176:345::-;97412:13;:11;:13::i;:::-;105326:18:::1;;105306:17;:38;105302:95;;;105370:27;;-1:-1:-1::0;;;105370:27:0::1;;;;;;;;;;;105302:95;105412:18;:38:::0;;;105470:39:::1;::::0;3373:25:1;;;105470:39:0::1;::::0;3361:2:1;3346:18;105470:39:0::1;;;;;;;;105176:345:::0;:::o;111703:257::-;97412:13;:11;:13::i;:::-;111828:33:::1;::::0;111773:21:::1;::::0;111757:13:::1;::::0;111828:10:::1;::::0;111773:21;;111757:13;111828:33;111757:13;111828:33;111773:21;111828:10;:33:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;111809:52;;;111881:7;111876:37;;111897:16;;-1:-1:-1::0;;;111897:16:0::1;;;;;;;;;;;111876:37;111933:15;::::0;3373:25:1;;;111933:15:0::1;::::0;3361:2:1;3346:18;111933:15:0::1;;;;;;;111742:218;;111703:257::o:0;114361:206::-;114493:4;-1:-1:-1;;;;;10049:18:0;;10057:10;10049:18;10045:91;;10088:32;10109:10;10088:20;:32::i;:::-;114514:41:::1;114537:4;114543:2;114547:7;114514:22;:41::i;76162:588::-:0;76326:23;76429:8;76404:22;76429:8;-1:-1:-1;;;;;76500:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;76463:73;;76560:9;76555:133;76576:14;76571:1;:19;76555:133;;76636:32;76656:8;;76665:1;76656:11;;;;;;;:::i;:::-;;;;;;;76636:19;:32::i;:::-;76620:10;76631:1;76620:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;76592:3;;76555:133;;;-1:-1:-1;76713:10:0;76162:588;-1:-1:-1;;;;76162:588:0:o;35197:160::-;35269:7;35316:27;35335:7;35316:18;:27::i;112840:515::-;112977:7;;113010:298;113034:11;:18;113030:22;;113010:298;;;113117:11;113129:1;113117:14;;;;;;;;:::i;:::-;;;;;;;;;:35;:14;;;;;:35;;-1:-1:-1;;;;;113117:35:0;;;;;;113104:48;;;;;;;:118;;;113189:11;113201:1;113189:14;;;;;;;;:::i;:::-;;;;;;;;;:33;:14;;;;;:33;;-1:-1:-1;;;;;;;;113189:33:0;;;;;113177:45;;;;113104:118;113078:215;;;113272:1;112840:515;-1:-1:-1;;112840:515:0:o;113078:215::-;113054:3;;;;:::i;:::-;;;;113010:298;;;;113329:14;;-1:-1:-1;;;113329:14:0;;;;;;;;;;;30291:245;30363:7;-1:-1:-1;;;;;30391:19:0;;30387:60;;30419:28;;-1:-1:-1;;;30419:28:0;;;;;;;;;;;30387:60;-1:-1:-1;;;;;;30469:25:0;;;;;:18;:25;;;;;;-1:-1:-1;;;;;30469:55:0;;30291:245::o;98274:111::-;97412:13;:11;:13::i;:::-;98343:30:::1;98370:1;98343:18;:30::i;:::-;98274:111::o:0;106659:1422::-;97412:13;:11;:13::i;:::-;106976:11:::1;:18:::0;106967:27;::::1;106963:54;;107003:14;;-1:-1:-1::0;;;107003:14:0::1;;;;;;;;;;;106963:54;107045:1;107036:5;:10;107032:257;;107137:11;107149:9;107157:1;107149:5:::0;:9:::1;:::i;:::-;107137:22;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:41:::1;:22;::::0;;::::1;;:41;::::0;-1:-1:-1;;;;;;;;107137:41:0;;::::1;::::0;::::1;107093:85:::0;;::::1;;107067:207;;;107228:26;;-1:-1:-1::0;;;107228:26:0::1;;;;;;;;;;;107067:207;107303:123;107354:20;107393:18;107303:32;:123::i;:::-;107467:4;107441:11;107453:5;107441:18;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;:30;;;;;-1:-1:-1::0;;;;;107441:30:0::1;;;;;-1:-1:-1::0;;;;;107441:30:0::1;;;;;;107519:11;107486;107498:5;107486:18;;;;;;;;:::i;:::-;;;;;;;;;;;:30;;;:44;;;;;;;;;;;;;;;;;;107577:10;107545:11;107557:5;107545:18;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;:42;;;;107638:14;107602:11;107614:5;107602:18;;;;;;;;:::i;:::-;;;;;;;;;;;:33;;;:50;;;;;;;;;;;;;;;;;;107709:20;107667:11;107679:5;107667:18;;;;;;;;:::i;:::-;;;;;;;;;;;:39;;;:62;;;;;-1:-1:-1::0;;;;;107667:62:0::1;;;;;-1:-1:-1::0;;;;;107667:62:0::1;;;;;;107784:18;107744:11;107756:5;107744:18;;;;;;;;:::i;:::-;;;;;;;;;;;:37;;;:58;;;;;-1:-1:-1::0;;;;;107744:58:0::1;;;;;-1:-1:-1::0;;;;;107744:58:0::1;;;;;;-1:-1:-1::0;;;;;;;;;;;107858:5:0::1;107882:4;107905:11;107935:10;107964:14;107997:20;108036:18;107828:241;;;;;;;;;;;;:::i;:::-;;;;;;;;106659:1422:::0;;;;;;;:::o;80438:984::-;80516:16;80578:19;80616:25;80660:22;80685:16;80695:5;80685:9;:16::i;:::-;80660:41;;80720:25;80762:14;-1:-1:-1;;;;;80748:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;80748:29:0;;80720:57;;80796:31;;:::i;:::-;80851:9;80846:516;80895:14;80880:11;:29;80846:516;;80951:15;80964:1;80951:12;:15::i;:::-;80939:27;;80993:9;:16;;;81038:8;80989:81;81096:14;;-1:-1:-1;;;;;81096:28:0;;81092:119;;81173:14;;;-1:-1:-1;81092:119:0;81258:5;-1:-1:-1;;;;;81237:26:0;:17;-1:-1:-1;;;;;81237:26:0;;81233:110;;81318:1;81292:8;81301:13;;;;;;81292:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;81233:110;80911:3;;80846:516;;;-1:-1:-1;81387:8:0;;80438:984;-1:-1:-1;;;;;;80438:984:0:o;97554:95::-;97631:6;;-1:-1:-1;;;;;97631:6:0;;97554:95::o;102132:1718::-;97412:13;:11;:13::i;:::-;102244:11:::1;:18:::0;102221:20:::1;102277:95;102301:12;102297:1;:16;102277:95;;;102339:11;:17;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;102339:17:0;;;;;::::1;;::::0;;-1:-1:-1;;;;;;102339:17:0;;;::::1;::::0;::::1;::::0;;;;::::1;;::::0;;-1:-1:-1;;;;;;102339:17:0;;;;;102315:3;::::1;::::0;::::1;:::i;:::-;;;;102277:95;;;;102403:9;102398:1441;102418:20:::0;;::::1;102398:1441;;;102473:1;102468;:6;102464:288;;102590:9:::0;;102600:5:::1;102604:1;102600::::0;:5:::1;:::i;:::-;102590:16;;;;;;;:::i;:::-;;;;;;:35;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;102529:96:0::1;:9;;102539:1;102529:12;;;;;;;:::i;:::-;;;;;;:33;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;102529:96:0::1;;102499:234;;;102683:26;;-1:-1:-1::0;;;102683:26:0::1;;;;;;;;;;;102499:234;102770:161;102825:9;;102835:1;102825:12;;;;;;;:::i;:::-;;;;;;:33;;;;;;;;;;:::i;:::-;102881:9;;102891:1;102881:12;;;;;;;:::i;:::-;;;;;;:31;;;;;;;;;;:::i;:::-;102770:32;:161::i;:::-;102950:11;102989:444;;;;;;;;103036:9;;103046:1;103036:12;;;;;;;:::i;:::-;:17;::::0;::::1;:12;::::0;;::::1;;:17:::0;;::::1;::::0;-1:-1:-1;103036:17:0::1;:::i;:::-;-1:-1:-1::0;;;;;102989:444:0::1;;;;;103093:9;;103103:1;103093:12;;;;;;;:::i;:::-;;;;;;:24;;;;;;;;;;:::i;:::-;102989:444;;;;;;103156:9;;103166:1;103156:12;;;;;;;:::i;:::-;;;;;;:23;;;102989:444;;;;103222:9;;103232:1;103222:12;;;;;;;:::i;:::-;;;;;;:27;;;;;;;;;;:::i;:::-;102989:444;;;;;;103298:9;;103308:1;103298:12;;;;;;;:::i;:::-;;;;;;:33;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;102989:444:0::1;;;;;103378:9;;103388:1;103378:12;;;;;;;:::i;:::-;;;;;;:31;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;102989:444:0;;::::1;::::0;;;102950:502;;::::1;::::0;;::::1;::::0;;-1:-1:-1;102950:502:0;;;::::1;::::0;;;;;;::::1;::::0;;::::1;;::::0;;;;::::1;::::0;::::1;;-1:-1:-1::0;;;102950:502:0::1;-1:-1:-1::0;;;;;;102950:502:0;;;-1:-1:-1;;;;;102950: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;;;102950:502:0::1;-1:-1:-1::0;;;;;;;;102950:502:0;;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;102950:502:0;;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;::::1;;::::0;;-1:-1:-1;;;;;;;;;;;103510:1:0;103534:9;;103510:1;103534:12;;::::1;;;;;:::i;:::-;:17;::::0;::::1;:12;::::0;;::::1;;:17:::0;;::::1;::::0;-1:-1:-1;103534:17:0::1;:::i;:::-;103574:9;;103584:1;103574:12;;;;;;;:::i;:::-;;;;;;:24;;;;;;;;;;:::i;:::-;103621:9;;103631:1;103621:12;;;;;;;:::i;:::-;;;;;;:23;;;103667:9;;103677:1;103667:12;;;;;;;:::i;:::-;;;;;;:27;;;;;;;;;;:::i;:::-;103717:9;;103727:1;103717:12;;;;;;;:::i;:::-;;;;;;:33;;;;;;;;;;:::i;:::-;103773:9;;103783:1;103773:12;;;;;;;:::i;:::-;;;;;;:31;;;;;;;;;;:::i;:::-;103476:347;;;;;;;;;;;;:::i;:::-;;;;;;;;102440:3:::0;::::1;::::0;::::1;:::i;:::-;;;;102398:1441;;33844:112:::0;33900:13;33937:7;33930:14;;;;;:::i;105632:214::-;105778:7;105818:16;105832:1;105818:13;:16::i;77194:2749::-;77353:16;77428:4;77419:5;:13;77415:45;;77441:19;;-1:-1:-1;;;77441:19:0;;;;;;;;;;;77415:45;77479:19;77517:17;77537:14;28681:7;28712:13;;28626:111;77537:14;77517:34;-1:-1:-1;77812:9:0;77805:4;:16;77801:81;;;77853:9;77846:16;;77801:81;77900:25;77928:16;77938:5;77928:9;:16::i;:::-;77900:44;;78134:4;78126:5;:12;78122:306;;;78185:12;;;78224:31;;;78220:119;;;78304:11;78284:31;;78220:119;78140:218;78122:306;;;-1:-1:-1;78407:1:0;78122:306;78446:25;78488:17;-1:-1:-1;;;;;78474:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;78474:32:0;;78446:60;;78529:17;78550:1;78529:22;78525:86;;78583:8;-1:-1:-1;78576:15:0;;-1:-1:-1;;;78576:15:0;78525:86;78767:31;78801:26;78821:5;78801:19;:26::i;:::-;78767:60;;78846:25;79103:9;:16;;;79098:100;;-1:-1:-1;79164:14:0;;79098:100;79233:5;79216:522;79245:4;79240:1;:9;;:45;;;;;79268:17;79253:11;:32;;79240:45;79216:522;;;79327:15;79340:1;79327:12;:15::i;:::-;79315:27;;79369:9;:16;;;79414:8;79365:81;79472:14;;-1:-1:-1;;;;;79472:28:0;;79468:119;;79549:14;;;-1:-1:-1;79468:119:0;79634:5;-1:-1:-1;;;;;79613:26:0;:17;-1:-1:-1;;;;;79613:26:0;;79609:110;;79694:1;79668:8;79677:13;;;;;;79668:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;79609:110;79287:3;;79216:522;;;-1:-1:-1;;;79835:29:0;;;-1:-1:-1;79842:8:0;;-1:-1:-1;;77194:2749:0;;;;;;:::o;113720:203::-;113843:8;10363:30;10384:8;10363:20;:30::i;:::-;113868:43:::1;113892:8;113902;113868:23;:43::i;105970:565::-:0;106109:20;;:::i;:::-;106233:11;:18;106148:6;;;;106224:27;;106220:90;;106272:22;;-1:-1:-1;;;106272:22:0;;14837:2:1;106272:22:0;;;14819:21:1;14876:2;14856:18;;;14849:30;-1:-1:-1;;;14895:18:1;;;14888:42;14947:18;;106272:22:0;;;;;;;;106220:90;106324:19;106346:34;;;:27;:34;;;;;;;;106381:10;106346:46;;;;;;;;106429:25;;;:18;:25;;;;;;;106477:11;:18;;106346:46;;;;;106374:5;;106477:18;;;;;;:::i;:::-;;;;;;;;;;106469:54;;;;;;;;106477:18;;;;;;;;106469:54;;-1:-1:-1;;;;;106469:54:0;;;;-1:-1:-1;;;106469:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;106469:54:0;;;;;;;-1:-1:-1;;;106469:54:0;;;;;;;;;106497:12;;-1:-1:-1;106497:12:0;-1:-1:-1;105970:565:0;-1:-1:-1;;105970:565:0:o;111309:309::-;97412:13;:11;:13::i;:::-;111441:3:::1;101037:142;;101110:18;;101104:3;101088:13;29265:12:::0;;29036:7;29249:13;:28;;28975:347;101088:13:::1;:19;;;;:::i;:::-;:40;101084:67;;;101137:14;;-1:-1:-1::0;;;101137:14:0::1;;;;;;;;;;;101084:67;111496:3:::2;111486:13;;:7;;:13;;;;:::i;:::-;111474:9;:25;111470:54;;;111508:16;;-1:-1:-1::0;;;111508:16:0::2;;;;;;;;;;;111470:54;111539:18;111549:2;111553:3;111539:18;;:9;:18::i;:::-;111580:5;::::0;111572:34:::2;::::0;-1:-1:-1;;;;;111580:5:0;;::::2;::::0;111596:9:::2;111572:34:::0;::::2;;;::::0;111580:5:::2;111572:34:::0;111580:5;111572:34;111596:9;111580:5;111572:34;::::2;;;;;;;;;;;;;::::0;::::2;;;;114583:292:::0;114786:4;-1:-1:-1;;;;;10049:18:0;;10057:10;10049:18;10045:91;;10088:32;10109:10;10088:20;:32::i;:::-;114816:47:::1;114839:4;114845:2;114849:7;114858:4;114816:22;:47::i;:::-;114583:292:::0;;;;;:::o;75511:468::-;75595:21;;:::i;:::-;75633:31;;:::i;:::-;28681:7;28712:13;75712:7;:25;75679:111;;75765:9;75511:468;-1:-1:-1;;75511:468:0:o;75679:111::-;75816:21;75829:7;75816:12;:21::i;:::-;75804:33;;75856:9;:16;;;75852:73;;;75900:9;75511:468;-1:-1:-1;;75511:468:0:o;75852:73::-;75946:21;75959:7;75946:12;:21::i;112075:653::-;112211:13;112255:16;112263:7;112255;:16::i;:::-;112250:59;;112280:29;;-1:-1:-1;;;112280:29:0;;;;;;;;;;;112250:59;112330:21;112354:15;112330:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;112414:7;112408:21;112433:1;112408:26;:308;;;;;;;;;;;;;;;;;112538:7;112576:18;112586:7;112576:9;:18::i;:::-;112625:15;112491:176;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;112384:332;112075:653;-1:-1:-1;;;112075:653:0:o;98564:213::-;97412:13;:11;:13::i;:::-;-1:-1:-1;;;;;98657:22:0;::::1;98649:73;;;::::0;-1:-1:-1;;;98649:73:0;;17173:2:1;98649:73:0::1;::::0;::::1;17155:21:1::0;17212:2;17192:18;;;17185:30;17251:34;17231:18;;;17224:62;-1:-1:-1;;;17302:18:1;;;17295:36;17348:19;;98649:73:0::1;16971:402:1::0;98649:73:0::1;98737:28;98756:8;98737:18;:28::i;:::-;98564:213:::0;:::o;104427:389::-;97412:13;:11;:13::i;:::-;104598:18:::1;;104578:17;:38;104574:119;;;104644:33;;-1:-1:-1::0;;;104644:33:0::1;;;;;;;;;;;104574:119;104707:18;:38:::0;;;104765:39:::1;::::0;3373:25:1;;;104765:39:0::1;::::0;3361:2:1;3346:18;104765:39:0::1;3227:177:1::0;42334:302:0;42399:4;42501:13;;42491:7;:23;42444:161;;;;-1:-1:-1;;42556:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;42556:44:0;:49;;42334:302::o;10534:683::-;177:42;10733:45;:49;10729:477;;11044:67;;-1:-1:-1;;;11044:67:0;;11095:4;11044:67;;;17590:34:1;-1:-1:-1;;;;;17660:15:1;;17640:18;;;17633:43;177:42:0;;11044;;17525:18:1;;11044:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11039:152;;11162:8;11143:28;;-1:-1:-1;;;11143:28:0;;;;;;;;:::i;40168:448::-;40261:13;40277:16;40285:7;40277;:16::i;:::-;40261:32;-1:-1:-1;66989:10:0;-1:-1:-1;;;;;40318:28:0;;;40314:187;;40370:44;40387:5;66989:10;41868:172;:::i;40370:44::-;40365:136;;40446:35;;-1:-1:-1;;;40446:35:0;;;;;;;;;;;40365:136;40521:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;40521:35:0;-1:-1:-1;;;;;40521:35:0;;;;;;;;;40576:28;;40521:24;;40576:28;;;;;;;40246:370;40168:448;;:::o;94565:317::-;93883:1;94707:7;;:19;94699:63;;;;-1:-1:-1;;;94699:63:0;;18139:2:1;94699:63:0;;;18121:21:1;18178:2;18158:18;;;18151:30;18217:33;18197:18;;;18190:61;18268:18;;94699:63:0;17937:355:1;94699:63:0;93883:1;94852:7;:18;94565:317::o;108582:2452::-;108724:3;101037:142;;101110:18;;101104:3;101088:13;29265:12;;29036:7;29249:13;:28;;28975:347;101088:13;:19;;;;:::i;:::-;:40;101084:67;;;101137:14;;-1:-1:-1;;;101137:14:0;;;;;;;;;;;101084:67;108775:15:::1;108812:26;;:::i;:::-;108859:19;108881:43;108909:14;108881:27;:43::i;:::-;108859:65;;108953:11;108965;108953:24;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;108945:32:::1;::::0;;::::1;::::0;::::1;::::0;;108953:24:::1;::::0;;;::::1;::::0;;::::1;108945:32:::0;;-1:-1:-1;;;;;108945:32:0;::::1;::::0;;;-1:-1:-1;;;108945:32:0;;::::1;;;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;;;::::1;-1:-1:-1::0;;;;;108945:32:0;;::::1;::::0;;;;-1:-1:-1;;;108945:32:0;;::::1;;::::0;;;;109042:9:::1;::::0;108945:32;;-1:-1:-1;;109026:230:0::1;;;109103:7;::::0;109090:10;;109089:28:::1;::::0;::::1;::::0;109090:20:::1;::::0;-1:-1:-1;;;;;109090:20:0::1;;:::i;:::-;109089:28;;;;:::i;:::-;109077:9;:40;109073:69;;;109126:16;;-1:-1:-1::0;;;109126:16:0::1;;;;;;;;;;;109073:69;109026:230;;;109199:10:::0;;:16:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;;;109187:28:0::1;:9;:28;109183:57;;;109224:16;;-1:-1:-1::0;;;109224:16:0::1;;;;;;;;;;;109183:57;109329:20;::::0;::::1;::::0;:24:::1;;::::0;109325:180:::1;;109418:20;::::0;::::1;::::0;109378:31:::1;::::0;;;:18:::1;:31;::::0;;;;;:60:::1;::::0;;::::1;::::0;:37:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;:60;109374:115;;;109468:21;;-1:-1:-1::0;;;109468:21:0::1;;;;;;;;;;;109374:115;109585:18;::::0;:22;109581:168:::1;;109658:18;;109652:3;109632:23;;:17;109646:2;109632:13;:17::i;:::-;:23;;;;:::i;:::-;:44;109628:105;;;109706:27;;-1:-1:-1::0;;;109706:27:0::1;;;;;;;;;;;109628:105;109868:17;::::0;::::1;::::0;:21:::1;;::::0;109864:232:::1;;110010:17;::::0;;::::1;::::0;109936:40:::1;::::0;;;:27:::1;:40:::0;;;;;;-1:-1:-1;;;;;109936:44:0;::::1;::::0;;;;;;;;;;:91:::1;::::0;;::::1;::::0;:50:::1;::::0;109983:3;;109936:44:::1;:50;:::i;:::-;:91;;;109910:170;;;110054:26;;-1:-1:-1::0;;;110054:26:0::1;;;;;;;;;;;109910:170;110218:16;::::0;::::1;::::0;:21;110214:286:::1;;110427:5;:16;;;110286:137;110337:5;;110286:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;110379:20:0::1;::::0;-1:-1:-1;;;;;;18979:2:1;18950:15;;;18946:45;110379:20:0::1;::::0;::::1;18934:58:1::0;19008:12;;;-1:-1:-1;110379:20:0::1;::::0;-1:-1:-1;18805:221:1;110379:20:0::1;;;;;;;;;;;;;110369:31;;;;;;110286:24;:137::i;:::-;:157;110260:224;;110470:14;;-1:-1:-1::0;;;110470:14:0::1;;;;;;;;;;;110260:224;110520:40;::::0;;;:27:::1;:40;::::0;;;;;;;-1:-1:-1;;;;;110520:44:0;::::1;::::0;;;;;;;:51;;110568:3;;110520:40;:51:::1;::::0;110568:3;;110520:51:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;110621:3;110586:38;;:18;:31;110605:11;110586:31;;;;;;;;;;;;:38;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;110639:18:0::1;::::0;-1:-1:-1;110649:2:0;110639:18:::1;::::0;::::1;:9;:18::i;:::-;110694:9;::::0;110681:10;;-1:-1:-1;;;;;110681:22:0::1;;110678:345;;;110733:5;::::0;110749:7:::1;::::0;-1:-1:-1;;;;;110733:5:0;;::::1;::::0;110725:38:::1;::::0;110749:13:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;110725:38;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;110790:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;110782:25:0::1;:54;110831:3;110821:13;;:7;;:13;;;;:::i;:::-;110808:27;::::0;:9:::1;:27;:::i;:::-;110782:54;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;110678:345;;;110885:5;::::0;-1:-1:-1;;;;;110885:5:0::1;110877:47;110901:22;::::0;::::1;110902:14;110914:2;110902:9;:14;:::i;:::-;110901:22;;;;:::i;:::-;110877:47;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;110951:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;110943:25:0::1;:64;110982:23;::::0;::::1;110983:14;110995:2;110983:9;:14;:::i;:::-;110982:23;;;;:::i;:::-;110969:37;::::0;:9:::1;:37;:::i;:::-;110943:64;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;110678:345;108729:2305;;;108582:2452:::0;;;;;:::o;44834:3069::-;44996:27;45026;45045:7;45026:18;:27::i;:::-;44996:57;;45119:4;-1:-1:-1;;;;;45078:45:0;45094:19;-1:-1:-1;;;;;45078:45:0;;45074:86;;45132:28;;-1:-1:-1;;;45132:28:0;;;;;;;;;;;45074:86;45182:27;43842:24;;;:15;:24;;;;;44086:26;;66989:10;43419:30;;;-1:-1:-1;;;;;43096:28:0;;43397:20;;;43394:56;45380:184;;45477:43;45494:4;66989:10;41868:172;:::i;45477:43::-;45472:92;;45529:35;;-1:-1:-1;;;45529:35:0;;;;;;;;;;;45472:92;-1:-1:-1;;;;;45589:16:0;;45585:52;;45614:23;;-1:-1:-1;;;45614:23:0;;;;;;;;;;;45585:52;45810:15;45807:172;;;45958:1;45937:19;45930:30;45807:172;-1:-1:-1;;;;;46391:24:0;;;;;;;:18;:24;;;;;;46389:26;;-1:-1:-1;;46389:26:0;;;46464:22;;;;;;46462:24;;-1:-1:-1;46462:24:0;;;46814:158;46464:22;-1:-1:-1;;;46814:18:0;:158::i;:::-;46785:26;;;;:17;:26;;;;;:187;;;;-1:-1:-1;;;47104:47:0;;:52;;47100:667;;47213:1;47203:11;;47181:19;47344:30;;;:17;:30;;;;;;:35;;47340:408;;47490:13;;47475:11;:28;47471:254;;47645:30;;;;:17;:30;;;;;:52;;;47471:254;47158:609;47100:667;47826:7;47822:2;-1:-1:-1;;;;;47807:27:0;47816:4;-1:-1:-1;;;;;47807:27:0;-1:-1:-1;;;;;;;;;;;47807:27:0;;;;;;;;;44981:2922;;;44834:3069;;;:::o;97747:140::-;66989:10;97815:7;:5;:7::i;:::-;-1:-1:-1;;;;;97815:23:0;;97807:68;;;;-1:-1:-1;;;97807:68:0;;19455:2:1;97807:68:0;;;19437:21:1;;;19474:18;;;19467:30;19533:34;19513:18;;;19506:62;19585:18;;97807:68:0;19253:356:1;48019:217:0;48185:39;48202:4;48208:2;48212:7;48185:39;;;;;;;;;;;;:16;:39::i;36476:1379::-;36543:7;36582;36700:13;;36693:4;:20;36689:1087;;;36742:14;36759:23;;;:17;:23;;;;;;;-1:-1:-1;;;36856:24:0;;:29;;36852:901;;37561:121;37568:6;37578:1;37568:11;37561:121;;-1:-1:-1;;;37643:6:0;37625:25;;;;:17;:25;;;;;;37561:121;;36852:901;36715:1061;36689:1087;37812:31;;-1:-1:-1;;;37812:31:0;;;;;;;;;;;98961:207;99058:6;;;-1:-1:-1;;;;;99079:17:0;;;-1:-1:-1;;;;;;99079:17:0;;;;;;;99116:40;;99058:6;;;99079:17;99058:6;;99116:40;;99039:16;;99116:40;99024:144;98961:207;:::o;113496:198::-;113641:3;-1:-1:-1;;;;;113632:12:0;:5;-1:-1:-1;;;;;113632:12:0;;113628:54;;113653:29;;-1:-1:-1;;;113653:29:0;;;;;;;;;;;113628:54;113496:198;;:::o;35860:169::-;35928:21;;:::i;:::-;35992:24;;;;:17;:24;;;;;;35973:44;;:18;:44::i;30638:186::-;-1:-1:-1;;;;;30731:25:0;30699:7;30731:25;;;:18;:25;;23976:2;30731:25;;;;;:50;;-1:-1:-1;;;;;30730:82:0;;30638:186::o;41437:246::-;66989:10;41536:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;41536:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;41536:60:0;;;;;;;;;;41616:55;;540:41:1;;;41536:49:0;;66989:10;41616:55;;513:18:1;41616:55:0;;;;;;;41437:246;;:::o;60114:120::-;60195:27;60205:2;60209:8;60195:27;;;;;;;;;;;;:9;:27::i;48902:451::-;49101:31;49114:4;49120:2;49124:7;49101:12;:31::i;:::-;-1:-1:-1;;;;;49151:14:0;;;:19;49147:195;;49194:56;49225:4;49231:2;49235:7;49244:5;49194:30;:56::i;:::-;49189:153;;49282:40;;-1:-1:-1;;;49282:40:0;;;;;;;;;;;35570:174;35640:21;;:::i;:::-;35685:47;35704:27;35723:7;35704:18;:27::i;:::-;35685:18;:47::i;67133:1893::-;67198:17;67656:4;67649;67643:11;67639:22;67756:1;67750:4;67743:15;67839:4;67836:1;67832:12;67825:19;;;67929:1;67924:3;67917:14;68045:3;68304:5;68286:464;68356:1;68351:3;68347:11;68340:18;;68539:2;68533:4;68529:13;68525:2;68521:22;68516:3;68508:36;68641:2;68631:13;;68706:25;68286:464;68706:25;-1:-1:-1;68788:13:0;;;-1:-1:-1;;68911:14:0;;;68981:19;;;68911:14;67133:1893;-1:-1:-1;67133:1893:0:o;83764:320::-;83847:7;83894:4;83847:7;83913:126;83937:5;:12;83933:1;:16;83913:126;;;83990:33;84000:12;84014:5;84020:1;84014:8;;;;;;;;:::i;:::-;;;;;;;83990:9;:33::i;:::-;83975:48;-1:-1:-1;83951:3:0;;;;:::i;:::-;;;;83913:126;;;-1:-1:-1;84060:12:0;83764:320;-1:-1:-1;;;83764:320:0:o;38463:478::-;38894:11;38869:23;38865:41;38862:52;-1:-1:-1;;;;;38712:28:0;;;;38852:63;;38463:478::o;37974:386::-;38040:31;;:::i;:::-;-1:-1:-1;;;;;38088:41:0;;;;-1:-1:-1;;;;;24545:3:0;38178:33;;;38144:68;:24;;;:68;-1:-1:-1;;;38246:24:0;;:29;;38227:16;;;:48;25114:3;38319:28;;;;38290:19;;;:58;38088:9;37974:386::o;59241:769::-;59392:19;59398:2;59402:8;59392:5;:19::i;:::-;-1:-1:-1;;;;;59465:14:0;;;:19;59461:523;;59509:11;59523:13;59575:14;;;59612:249;59647:62;59686:1;59690:2;59694:7;;;;;;59703:5;59647:30;:62::i;:::-;59642:175;;59749:40;;-1:-1:-1;;;59749:40:0;;;;;;;;;;;59642:175;59856:3;59848:5;:11;59612:249;;59951:3;59934:13;;:20;59930:34;;59956:8;;;51669:792;51877:88;;-1:-1:-1;;;51877:88:0;;51852:4;;-1:-1:-1;;;;;51877:45:0;;;;;:88;;66989:10;;51944:4;;51950:7;;51959:5;;51877:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51877:88:0;;;;;;;;-1:-1:-1;;51877:88:0;;;;;;;;;;;;:::i;:::-;;;51873:577;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52180:6;:13;52197:1;52180:18;52176:259;;52230:40;;-1:-1:-1;;;52230:40:0;;;;;;;;;;;52176:259;52385:6;52379:13;52370:6;52366:2;52362:15;52355:38;51873:577;-1:-1:-1;;;;;;52048:64:0;-1:-1:-1;;;52048:64:0;;-1:-1:-1;51669:792:0;;;;;;:::o;91424:157::-;91487:7;91522:1;91518;:5;:51;;91665:13;91771:15;;;91811:4;91804:15;;;91862:4;91846:21;;91518:51;;;-1:-1:-1;91665:13:0;91771:15;;;91811:4;91804:15;91862:4;91846:21;;;91424:157::o;52987:3222::-;53064:20;53087:13;;;53119;;;53115:44;;53141:18;;-1:-1:-1;;;53141:18:0;;;;;;;;;;;53115:44;-1:-1:-1;;;;;53699:22:0;;;;;;:18;:22;;23976:2;53699:22;;:71;;-1:-1:-1;;;;;53725:45:0;;53699:71;;;54075:151;53699:22;-1:-1:-1;39369:15:0;;39343:24;39339:46;54075:18;:151::i;:::-;54041:31;;;;:17;:31;;;;;:185;;;;-1:-1:-1;;;;;54860:25:0;;;54300:23;;;;54059:12;;54860:25;;-1:-1:-1;;;;;;;;;;;54041:31:0;;54958:363;55671:1;55657:12;55653:20;55607:374;55716:3;55707:7;55704:16;55607:374;;55950:7;55940:8;55937:1;-1:-1:-1;;;;;;;;;;;55907:1:0;55904;55899:59;55773:1;55760:15;55607:374;;;55611:85;56022:8;56034:1;56022:13;56018:45;;56044:19;;-1:-1:-1;;;56044:19:0;;;;;;;;;;;56018:45;56088:13;:19;-1:-1:-1;113939:192: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:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1528:203::-;-1:-1:-1;;;;;1692:32:1;;;;1674:51;;1662:2;1647:18;;1528:203::o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2173:163::-;2240:20;;2300:10;2289:22;;2279:33;;2269:61;;2326:1;2323;2316:12;2341:367;2404:8;2414:6;2468:3;2461:4;2453:6;2449:17;2445:27;2435:55;;2486:1;2483;2476:12;2435:55;-1:-1:-1;2509:20:1;;-1:-1:-1;;;;;2541:30:1;;2538:50;;;2584:1;2581;2574:12;2538:50;2621:4;2613:6;2609:17;2597:29;;2681:3;2674:4;2664:6;2661:1;2657:14;2649:6;2645:27;2641:38;2638:47;2635:67;;;2698:1;2695;2688:12;2635:67;2341:367;;;;;:::o;2713:509::-;2807:6;2815;2823;2876:2;2864:9;2855:7;2851:23;2847:32;2844:52;;;2892:1;2889;2882:12;2844:52;2915:28;2933:9;2915:28;:::i;:::-;2905:38;-1:-1:-1;2994:2:1;2979:18;;2966:32;-1:-1:-1;;;;;3010:30:1;;3007:50;;;3053:1;3050;3043:12;3007:50;3092:70;3154:7;3145:6;3134:9;3130:22;3092:70;:::i;:::-;2713:509;;3181:8;;-1:-1:-1;3066:96:1;;-1:-1:-1;;;;2713:509:1:o;3409:328::-;3486:6;3494;3502;3555:2;3543:9;3534:7;3530:23;3526:32;3523:52;;;3571:1;3568;3561:12;3523:52;3594:29;3613:9;3594:29;:::i;:::-;3584:39;;3642:38;3676:2;3665:9;3661:18;3642:38;:::i;:::-;3632:48;;3727:2;3716:9;3712:18;3699:32;3689:42;;3409:328;;;;;:::o;3981:437::-;4067:6;4075;4128:2;4116:9;4107:7;4103:23;4099:32;4096:52;;;4144:1;4141;4134:12;4096:52;4171:23;;-1:-1:-1;;;;;4206:30:1;;4203:50;;;4249:1;4246;4239:12;4203:50;4288:70;4350:7;4341:6;4330:9;4326:22;4288:70;:::i;:::-;4377:8;;4262:96;;-1:-1:-1;3981:437:1;-1:-1:-1;;;;3981:437:1:o;4423:349::-;4507:12;;-1:-1:-1;;;;;4503:38:1;4491:51;;4595:4;4584:16;;;4578:23;-1:-1:-1;;;;;4574:48:1;4558:14;;;4551:72;4611:2;4675:16;;;4669:23;4662:31;4655:39;4639:14;;;4632:63;4748:4;4737:16;;;4731:23;4756:8;4727:38;4711:14;;4704:62;4423:349::o;4777:722::-;5010:2;5062:21;;;5132:13;;5035:18;;;5154:22;;;4981:4;;5010:2;5233:15;;;;5207:2;5192:18;;;4981:4;5276:197;5290:6;5287:1;5284:13;5276:197;;;5339:52;5387:3;5378:6;5372:13;5339:52;:::i;:::-;5448:15;;;;5420:4;5411:14;;;;;5312:1;5305:9;5276:197;;5504:171;5571:20;;-1:-1:-1;;;;;5620:30:1;;5610:41;;5600:69;;5665:1;5662;5655:12;5680:184;5738:6;5791:2;5779:9;5770:7;5766:23;5762:32;5759:52;;;5807:1;5804;5797:12;5759:52;5830:28;5848:9;5830:28;:::i;5869:186::-;5928:6;5981:2;5969:9;5960:7;5956:23;5952:32;5949:52;;;5997:1;5994;5987:12;5949:52;6020:29;6039:9;6020:29;:::i;6060:171::-;6127:20;;-1:-1:-1;;;;;6176:30:1;;6166:41;;6156:69;;6221:1;6218;6211:12;6236:161;6303:20;;6363:8;6352:20;;6342:31;;6332:59;;6387:1;6384;6377:12;6402:612;6510:6;6518;6526;6534;6542;6550;6558;6611:3;6599:9;6590:7;6586:23;6582:33;6579:53;;;6628:1;6625;6618:12;6579:53;6664:9;6651:23;6641:33;;6693:37;6726:2;6715:9;6711:18;6693:37;:::i;:::-;6683:47;;6749:37;6782:2;6771:9;6767:18;6749:37;:::i;:::-;6739:47;;6833:2;6822:9;6818:18;6805:32;6795:42;;6856:38;6889:3;6878:9;6874:19;6856:38;:::i;:::-;6846:48;;6913:38;6946:3;6935:9;6931:19;6913:38;:::i;:::-;6903:48;;6970:38;7003:3;6992:9;6988:19;6970:38;:::i;:::-;6960:48;;6402:612;;;;;;;;;;:::o;7019:632::-;7190:2;7242:21;;;7312:13;;7215:18;;;7334:22;;;7161:4;;7190:2;7413:15;;;;7387:2;7372:18;;;7161:4;7456:169;7470:6;7467:1;7464:13;7456:169;;;7531:13;;7519:26;;7600:15;;;;7565:12;;;;7492:1;7485:9;7456:169;;7656:651;7775:6;7783;7836:2;7824:9;7815:7;7811:23;7807:32;7804:52;;;7852:1;7849;7842:12;7804:52;7879:23;;-1:-1:-1;;;;;7951:14:1;;;7948:34;;;7978:1;7975;7968:12;7948:34;8016:6;8005:9;8001:22;7991:32;;8061:7;8054:4;8050:2;8046:13;8042:27;8032:55;;8083:1;8080;8073:12;8032:55;8123:2;8110:16;8149:2;8141:6;8138:14;8135:34;;;8165:1;8162;8155:12;8135:34;8221:7;8216:2;8208:4;8200:6;8196:17;8192:2;8188:26;8184:35;8181:48;8178:68;;;8242:1;8239;8232:12;8178:68;8273:2;8265:11;;;;;8295:6;;-1:-1:-1;7656:651:1;;-1:-1:-1;;;;7656:651:1:o;8312:322::-;8389:6;8397;8405;8458:2;8446:9;8437:7;8433:23;8429:32;8426:52;;;8474:1;8471;8464:12;8426:52;8497:29;8516:9;8497:29;:::i;:::-;8487:39;8573:2;8558:18;;8545:32;;-1:-1:-1;8624:2:1;8609:18;;;8596:32;;8312:322;-1:-1:-1;;;8312:322:1:o;8639:118::-;8725:5;8718:13;8711:21;8704:5;8701:32;8691:60;;8747:1;8744;8737:12;8762:315;8827:6;8835;8888:2;8876:9;8867:7;8863:23;8859:32;8856:52;;;8904:1;8901;8894:12;8856:52;8927:29;8946:9;8927:29;:::i;:::-;8917:39;;9006:2;8995:9;8991:18;8978:32;9019:28;9041:5;9019:28;:::i;:::-;9066:5;9056:15;;;8762:315;;;;;:::o;10019:258::-;10086:6;10094;10147:2;10135:9;10126:7;10122:23;10118:32;10115:52;;;10163:1;10160;10153:12;10115:52;10186:28;10204:9;10186:28;:::i;:::-;10176:38;;10233;10267:2;10256:9;10252:18;10233:38;:::i;:::-;10223:48;;10019:258;;;;;:::o;10282:127::-;10343:10;10338:3;10334:20;10331:1;10324:31;10374:4;10371:1;10364:15;10398:4;10395:1;10388:15;10414:1138;10509:6;10517;10525;10533;10586:3;10574:9;10565:7;10561:23;10557:33;10554:53;;;10603:1;10600;10593:12;10554:53;10626:29;10645:9;10626:29;:::i;:::-;10616:39;;10674:38;10708:2;10697:9;10693:18;10674:38;:::i;:::-;10664:48;-1:-1:-1;10759:2:1;10744:18;;10731:32;;-1:-1:-1;10814:2:1;10799:18;;10786:32;-1:-1:-1;;;;;10867:14:1;;;10864:34;;;10894:1;10891;10884:12;10864:34;10932:6;10921:9;10917:22;10907:32;;10977:7;10970:4;10966:2;10962:13;10958:27;10948:55;;10999:1;10996;10989:12;10948:55;11035:2;11022:16;11057:2;11053;11050:10;11047:36;;;11063:18;;:::i;:::-;11138:2;11132:9;11106:2;11192:13;;-1:-1:-1;;11188:22:1;;;11212:2;11184:31;11180:40;11168:53;;;11236:18;;;11256:22;;;11233:46;11230:72;;;11282:18;;:::i;:::-;11322:10;11318:2;11311:22;11357:2;11349:6;11342:18;11397:7;11392:2;11387;11383;11379:11;11375:20;11372:33;11369:53;;;11418:1;11415;11408:12;11369:53;11474:2;11469;11465;11461:11;11456:2;11448:6;11444:15;11431:46;11519:1;11514:2;11509;11501:6;11497:15;11493:24;11486:35;11540:6;11530:16;;;;;;;10414:1138;;;;;;;:::o;11557:266::-;11753:3;11738:19;;11766:51;11742:9;11799:6;11766:51;:::i;11828:260::-;11896:6;11904;11957:2;11945:9;11936:7;11932:23;11928:32;11925:52;;;11973:1;11970;11963:12;11925:52;11996:29;12015:9;11996:29;:::i;12093:380::-;12172:1;12168:12;;;;12215;;;12236:61;;12290:4;12282:6;12278:17;12268:27;;12236:61;12343:2;12335:6;12332:14;12312:18;12309:38;12306:161;;12389:10;12384:3;12380:20;12377:1;12370:31;12424:4;12421:1;12414:15;12452:4;12449:1;12442:15;12306:161;;12093:380;;;:::o;12688:127::-;12749:10;12744:3;12740:20;12737:1;12730:31;12780:4;12777:1;12770:15;12804:4;12801:1;12794:15;12820:127;12881:10;12876:3;12872:20;12869:1;12862:31;12912:4;12909:1;12902:15;12936:4;12933:1;12926:15;12952:135;12991:3;13012:17;;;13009:43;;13032:18;;:::i;:::-;-1:-1:-1;13079:1:1;13068:13;;12952:135::o;13092:125::-;13132:4;13160:1;13157;13154:8;13151:34;;;13165:18;;:::i;:::-;-1:-1:-1;13202:9:1;;13092:125::o;13222:709::-;13527:25;;;-1:-1:-1;;;;;13588:31:1;;;;13583:2;13568:18;;13561:59;13668:10;13656:23;;;;13651:2;13636:18;;13629:51;13711:2;13696:18;;13689:34;;;;13772:8;13760:21;13754:3;13739:19;;13732:50;-1:-1:-1;;;;;13856:15:1;;;13850:3;13835:19;;13828:44;13909:15;13903:3;13888:19;;13881:44;13514:3;13499:19;;13222:709::o;13936:127::-;13997:10;13992:3;13988:20;13985:1;13978:31;14028:4;14025:1;14018:15;14052:4;14049:1;14042:15;14068:184;14126:6;14179:2;14167:9;14158:7;14154:23;14150:32;14147:52;;;14195:1;14192;14185:12;14147:52;14218:28;14236:9;14218:28;:::i;14257:184::-;14315:6;14368:2;14356:9;14347:7;14343:23;14339:32;14336:52;;;14384:1;14381;14374:12;14336:52;14407:28;14425:9;14407:28;:::i;14446:184::-;14504:6;14557:2;14545:9;14536:7;14532:23;14528:32;14525:52;;;14573:1;14570;14563:12;14525:52;14596:28;14614:9;14596:28;:::i;14976:128::-;15016:3;15047:1;15043:6;15040:1;15037:13;15034:39;;;15053:18;;:::i;:::-;-1:-1:-1;15089:9:1;;14976:128::o;15109:168::-;15149:7;15215:1;15211;15207:6;15203:14;15200:1;15197:21;15192:1;15185:9;15178:17;15174:45;15171:71;;;15222:18;;:::i;:::-;-1:-1:-1;15262:9:1;;15109:168::o;15408:1558::-;15632:3;15670:6;15664:13;15696:4;15709:51;15753:6;15748:3;15743:2;15735:6;15731:15;15709:51;:::i;:::-;15823:13;;15782:16;;;;15845:55;15823:13;15782:16;15867:15;;;15845:55;:::i;:::-;15989:13;;15922:20;;;15962:1;;16049;16071:18;;;;16124;;;;16151:93;;16229:4;16219:8;16215:19;16203:31;;16151:93;16292:2;16282:8;16279:16;16259:18;16256:40;16253:167;;-1:-1:-1;;;16319:33:1;;16375:4;16372:1;16365:15;16405:4;16326:3;16393:17;16253:167;16436:18;16463:141;;;;16618:1;16613:328;;;;16429:512;;16463:141;-1:-1:-1;;16498:24:1;;16484:39;;16575:16;;16568:24;16554:39;;16543:51;;;-1:-1:-1;16463:141:1;;16613:328;15355:1;15348:14;;;15392:4;15379:18;;16708:1;16722:169;16736:8;16733:1;16730:15;16722:169;;;16818:14;;16803:13;;;16796:37;16861:16;;;;16753:10;;16722:169;;;16726:3;;16922:8;16915:5;16911:20;16904:27;;16429:512;-1:-1:-1;16957:3:1;;15408:1558;-1:-1:-1;;;;;;;;;;;15408:1558:1:o;17687:245::-;17754:6;17807:2;17795:9;17786:7;17782:23;17778:32;17775:52;;;17823:1;17820;17813:12;17775:52;17855:9;17849:16;17874:28;17896:5;17874:28;:::i;18297:270::-;18336:7;-1:-1:-1;;;;;18406:10:1;;;18436;;;18469:11;;18462:19;18491:12;;;18483:21;;18458:47;18455:73;;;18508:18;;:::i;:::-;18548:13;;18297:270;-1:-1:-1;;;;18297:270:1:o;18572:228::-;18611:3;18639:10;18676:2;18673:1;18669:10;18706:2;18703:1;18699:10;18737:3;18733:2;18729:12;18724:3;18721:21;18718:47;;;18745:18;;:::i;:::-;18781:13;;18572:228;-1:-1:-1;;;;18572:228:1:o;19031:217::-;19071:1;19097;19087:132;;19141:10;19136:3;19132:20;19129:1;19122:31;19176:4;19173:1;19166:15;19204:4;19201:1;19194:15;19087:132;-1:-1:-1;19233:9:1;;19031:217::o;19614:489::-;-1:-1:-1;;;;;19883:15:1;;;19865:34;;19935:15;;19930:2;19915:18;;19908:43;19982:2;19967:18;;19960:34;;;20030:3;20025:2;20010:18;;20003:31;;;19808:4;;20051:46;;20077:19;;20069:6;20051:46;:::i;:::-;20043:54;19614:489;-1:-1:-1;;;;;;19614:489:1:o;20108:249::-;20177:6;20230:2;20218:9;20209:7;20205:23;20201:32;20198:52;;;20246:1;20243;20236:12;20198:52;20278:9;20272:16;20297:30;20321:5;20297:30;:::i

Swarm Source

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