ETH Price: $2,416.84 (+1.54%)

Token

WEN LAMBO (LAMBO)
 

Overview

Max Total Supply

999 LAMBO

Holders

685

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 LAMBO
0x04f1fefcd1823dc34a524eb0cbf241c580feb996
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:
WENLAMBO

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-11
*/

/**
 _     ____  _      ____  ____ 
/ \   /  _ \/ \__/|/  __\/  _ \
| |   | / \|| |\/||| | //| / \|
| |_/\| |-||| |  ||| |_\\| \_/|
\____/\_/ \|\_/  \|\____/\____/
                               
 */
/**
https://twitter.com/WENLAMBO_XYZ
 */


// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

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

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


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


/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

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

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // 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) {
                _;
                return;
            }
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }
}

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

contract WENLAMBO is ERC721A, DefaultOperatorFilterer {
    mapping(uint256 => uint256) blockFree;

    mapping(address => bool) minted;

    uint256 public maxSupply = 999;

    uint256 public maxPerTx = 10;    

    uint256 public price = 0.0025 ether;

    uint256 public royalty = 50;

    bool pause;

    function mint(uint256 amount) payable public {
        require(totalSupply() + amount <= maxSupply);
        require(amount <= maxPerTx);
        _mint(amount);
    }

    string uri = "ipfs://bafybeicw6irrj4kusodzrfcfg7gkg4n5ixcje66pt4w4epjttn7vm2abhi/";
    function setUri(string memory _uri) external onlyOwner {
        uri = _uri;
    }

    address owner;
    modifier onlyOwner {
        require(owner == msg.sender);
        _;
    }
    
    constructor() ERC721A("WEN LAMBO", "LAMBO") {
        owner = msg.sender;
    }

    function _mint(uint256 amount) internal {
        require(msg.sender == tx.origin);
        if (msg.value == 0) {
            uint256 freeNum = (maxSupply - totalSupply()) / 12;
            require(blockFree[block.number] + 1 <= freeNum);
            blockFree[block.number] += 1;
            _safeMint(msg.sender, 1);
            return;
        }
        require(msg.value >= amount * price);
        _safeMint(msg.sender, amount);
    }

    function reserve(uint16 _mintAmount, address _receiver) external onlyOwner {
        uint16 totalSupply = uint16(totalSupply());
        require(totalSupply + _mintAmount <= maxSupply, "Exceeds max supply.");
        _safeMint(_receiver , _mintAmount);
    }

    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual returns (address, uint256) {
        uint256 royaltyAmount = (_salePrice * royalty) / 1000;
        return (owner, royaltyAmount);
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        return string(abi.encodePacked(uri, _toString(tokenId), ".json"));
    }

    function withdraw() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

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

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

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

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

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        payable
        override
        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":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_mintAmount","type":"uint16"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526103e7600a55600a600b556608e1bc9bf04000600c556032600d55604051806080016040528060438152602001620035de60439139600f9081620000499190620005d4565b503480156200005757600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600981526020017f57454e204c414d424f00000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4c414d424f0000000000000000000000000000000000000000000000000000008152508160029081620000ec9190620005d4565b508060039081620000fe9190620005d4565b506200010f6200035560201b60201c565b600081905550505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200030c578015620001d2576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200019892919062000700565b600060405180830381600087803b158015620001b357600080fd5b505af1158015620001c8573d6000803e3d6000fd5b505050506200030b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200028c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200025292919062000700565b600060405180830381600087803b1580156200026d57600080fd5b505af115801562000282573d6000803e3d6000fd5b505050506200030a565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620002d591906200072d565b600060405180830381600087803b158015620002f057600080fd5b505af115801562000305573d6000803e3d6000fd5b505050505b5b5b505033601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200074a565b600090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003dc57607f821691505b602082108103620003f257620003f162000394565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200045c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200041d565b6200046886836200041d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004b5620004af620004a98462000480565b6200048a565b62000480565b9050919050565b6000819050919050565b620004d18362000494565b620004e9620004e082620004bc565b8484546200042a565b825550505050565b600090565b62000500620004f1565b6200050d818484620004c6565b505050565b5b81811015620005355762000529600082620004f6565b60018101905062000513565b5050565b601f82111562000584576200054e81620003f8565b62000559846200040d565b8101602085101562000569578190505b6200058162000578856200040d565b83018262000512565b50505b505050565b600082821c905092915050565b6000620005a96000198460080262000589565b1980831691505092915050565b6000620005c4838362000596565b9150826002028217905092915050565b620005df826200035a565b67ffffffffffffffff811115620005fb57620005fa62000365565b5b620006078254620003c3565b6200061482828562000539565b600060209050601f8311600181146200064c576000841562000637578287015190505b620006438582620005b6565b865550620006b3565b601f1984166200065c86620003f8565b60005b8281101562000686578489015182556001820191506020850194506020810190506200065f565b86831015620006a65784890151620006a2601f89168262000596565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006e882620006bb565b9050919050565b620006fa81620006db565b82525050565b6000604082019050620007176000830185620006ef565b620007266020830184620006ef565b9392505050565b6000602082019050620007446000830184620006ef565b92915050565b612e84806200075a6000396000f3fe60806040526004361061014b5760003560e01c806370a08231116100b6578063b88d4fde1161006f578063b88d4fde1461045d578063bad0ba6f14610479578063c87b56dd146104a2578063d5abeb01146104df578063e985e9c51461050a578063f968adbe146105475761014b565b806370a082311461035c57806395d89b41146103995780639b642de1146103c4578063a035b1fe146103ed578063a0712d6814610418578063a22cb465146104345761014b565b806329ee566c1161010857806329ee566c146102585780632a55205a146102835780633ccfd60b146102c157806341f43434146102d857806342842e0e146103035780636352211e1461031f5761014b565b806301ffc9a71461015057806306fdde031461018d578063081812fc146101b8578063095ea7b3146101f557806318160ddd1461021157806323b872dd1461023c575b600080fd5b34801561015c57600080fd5b5061017760048036038101906101729190611f82565b610572565b6040516101849190611fca565b60405180910390f35b34801561019957600080fd5b506101a2610604565b6040516101af9190612075565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da91906120cd565b610696565b6040516101ec919061213b565b60405180910390f35b61020f600480360381019061020a9190612182565b610715565b005b34801561021d57600080fd5b5061022661081f565b60405161023391906121d1565b60405180910390f35b610256600480360381019061025191906121ec565b610836565b005b34801561026457600080fd5b5061026d610986565b60405161027a91906121d1565b60405180910390f35b34801561028f57600080fd5b506102aa60048036038101906102a5919061223f565b61098c565b6040516102b892919061227f565b60405180910390f35b3480156102cd57600080fd5b506102d66109de565b005b3480156102e457600080fd5b506102ed610a81565b6040516102fa9190612307565b60405180910390f35b61031d600480360381019061031891906121ec565b610a93565b005b34801561032b57600080fd5b50610346600480360381019061034191906120cd565b610be3565b604051610353919061213b565b60405180910390f35b34801561036857600080fd5b50610383600480360381019061037e9190612322565b610bf5565b60405161039091906121d1565b60405180910390f35b3480156103a557600080fd5b506103ae610cad565b6040516103bb9190612075565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190612484565b610d3f565b005b3480156103f957600080fd5b50610402610dac565b60405161040f91906121d1565b60405180910390f35b610432600480360381019061042d91906120cd565b610db2565b005b34801561044057600080fd5b5061045b600480360381019061045691906124f9565b610dee565b005b610477600480360381019061047291906125da565b610ef8565b005b34801561048557600080fd5b506104a0600480360381019061049b9190612697565b61104b565b005b3480156104ae57600080fd5b506104c960048036038101906104c491906120cd565b611118565b6040516104d69190612075565b60405180910390f35b3480156104eb57600080fd5b506104f461114c565b60405161050191906121d1565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c91906126d7565b611152565b60405161053e9190611fca565b60405180910390f35b34801561055357600080fd5b5061055c6111e6565b60405161056991906121d1565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105cd57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105fd5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461061390612746565b80601f016020809104026020016040519081016040528092919081815260200182805461063f90612746565b801561068c5780601f106106615761010080835404028352916020019161068c565b820191906000526020600020905b81548152906001019060200180831161066f57829003601f168201915b5050505050905090565b60006106a1826111ec565b6106d7576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610810576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161078d929190612777565b602060405180830381865afa1580156107aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ce91906127b5565b61080f57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610806919061213b565b60405180910390fd5b5b61081a838361124b565b505050565b600061082961138f565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610974573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036108a8576108a3848484611394565b610980565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016108f1929190612777565b602060405180830381865afa15801561090e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093291906127b5565b61097357336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161096a919061213b565b60405180910390fd5b5b61097f848484611394565b5b50505050565b600d5481565b60008060006103e8600d54856109a29190612811565b6109ac9190612882565b9050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168192509250509250929050565b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a3857600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610a7e573d6000803e3d6000fd5b50565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610bd1573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b0557610b008484846116b6565b610bdd565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610b4e929190612777565b602060405180830381865afa158015610b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8f91906127b5565b610bd057336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610bc7919061213b565b60405180910390fd5b5b610bdc8484846116b6565b5b50505050565b6000610bee826116d6565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c5c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b606060038054610cbc90612746565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce890612746565b8015610d355780601f10610d0a57610100808354040283529160200191610d35565b820191906000526020600020905b815481529060010190602001808311610d1857829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d9957600080fd5b80600f9081610da89190612a55565b5050565b600c5481565b600a5481610dbe61081f565b610dc89190612b27565b1115610dd357600080fd5b600b54811115610de257600080fd5b610deb816117a2565b50565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610ee9576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610e66929190612777565b602060405180830381865afa158015610e83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea791906127b5565b610ee857806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610edf919061213b565b60405180910390fd5b5b610ef38383611897565b505050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611037573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f6b57610f66858585856119a2565b611044565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610fb4929190612777565b602060405180830381865afa158015610fd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff591906127b5565b61103657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161102d919061213b565b60405180910390fd5b5b611043858585856119a2565b5b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110a557600080fd5b60006110af61081f565b9050600a5483826110c09190612b5b565b61ffff161115611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc90612bdd565b60405180910390fd5b611113828461ffff16611a15565b505050565b6060600f61112583611a33565b604051602001611136929190612d08565b6040516020818303038152906040529050919050565b600a5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b5481565b6000816111f761138f565b11158015611206575060005482105b8015611244575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600061125682610be3565b90508073ffffffffffffffffffffffffffffffffffffffff16611277611a83565b73ffffffffffffffffffffffffffffffffffffffff16146112da576112a38161129e611a83565b611152565b6112d9576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061139f826116d6565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611406576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061141284611a8b565b915091506114288187611423611a83565b611ab2565b6114745761143d86611438611a83565b611152565b611473576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036114da576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114e78686866001611af6565b80156114f257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506115c08561159c888887611afc565b7c020000000000000000000000000000000000000000000000000000000017611b24565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036116465760006001850190506000600460008381526020019081526020016000205403611644576000548114611643578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46116ae8686866001611b4f565b505050505050565b6116d183838360405180602001604052806000815250610ef8565b505050565b600080829050806116e561138f565b1161176b5760005481101561176a5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611768575b6000810361175e576004600083600190039350838152602001908152602001600020549050611734565b809250505061179d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117da57600080fd5b6000340361186f576000600c6117ee61081f565b600a546117fb9190612d37565b6118059190612882565b905080600160086000438152602001908152602001600020546118289190612b27565b111561183357600080fd5b60016008600043815260200190815260200160002060008282546118579190612b27565b92505081905550611869336001611a15565b50611894565b600c548161187d9190612811565b34101561188957600080fd5b6118933382611a15565b5b50565b80600760006118a4611a83565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611951611a83565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119969190611fca565b60405180910390a35050565b6119ad848484610836565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611a0f576119d884848484611b55565b611a0e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611a2f828260405180602001604052806000815250611ca5565b5050565b606060a060405101806040526020810391506000825281835b600115611a6e57600184039350600a81066030018453600a8104905080611a4c575b50828103602084039350808452505050919050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611b13868684611d42565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b7b611a83565b8786866040518563ffffffff1660e01b8152600401611b9d9493929190612dc0565b6020604051808303816000875af1925050508015611bd957506040513d601f19601f82011682018060405250810190611bd69190612e21565b60015b611c52573d8060008114611c09576040519150601f19603f3d011682016040523d82523d6000602084013e611c0e565b606091505b506000815103611c4a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b611caf8383611d4b565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611d3d57600080549050600083820390505b611cef6000868380600101945086611b55565b611d25576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611cdc578160005414611d3a57600080fd5b50505b505050565b60009392505050565b60008054905060008203611d8b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d986000848385611af6565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611e0f83611e006000866000611afc565b611e0985611f06565b17611b24565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611eb057808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611e75565b5060008203611eeb576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611f016000848385611b4f565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611f5f81611f2a565b8114611f6a57600080fd5b50565b600081359050611f7c81611f56565b92915050565b600060208284031215611f9857611f97611f20565b5b6000611fa684828501611f6d565b91505092915050565b60008115159050919050565b611fc481611faf565b82525050565b6000602082019050611fdf6000830184611fbb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561201f578082015181840152602081019050612004565b60008484015250505050565b6000601f19601f8301169050919050565b600061204782611fe5565b6120518185611ff0565b9350612061818560208601612001565b61206a8161202b565b840191505092915050565b6000602082019050818103600083015261208f818461203c565b905092915050565b6000819050919050565b6120aa81612097565b81146120b557600080fd5b50565b6000813590506120c7816120a1565b92915050565b6000602082840312156120e3576120e2611f20565b5b60006120f1848285016120b8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612125826120fa565b9050919050565b6121358161211a565b82525050565b6000602082019050612150600083018461212c565b92915050565b61215f8161211a565b811461216a57600080fd5b50565b60008135905061217c81612156565b92915050565b6000806040838503121561219957612198611f20565b5b60006121a78582860161216d565b92505060206121b8858286016120b8565b9150509250929050565b6121cb81612097565b82525050565b60006020820190506121e660008301846121c2565b92915050565b60008060006060848603121561220557612204611f20565b5b60006122138682870161216d565b93505060206122248682870161216d565b9250506040612235868287016120b8565b9150509250925092565b6000806040838503121561225657612255611f20565b5b6000612264858286016120b8565b9250506020612275858286016120b8565b9150509250929050565b6000604082019050612294600083018561212c565b6122a160208301846121c2565b9392505050565b6000819050919050565b60006122cd6122c86122c3846120fa565b6122a8565b6120fa565b9050919050565b60006122df826122b2565b9050919050565b60006122f1826122d4565b9050919050565b612301816122e6565b82525050565b600060208201905061231c60008301846122f8565b92915050565b60006020828403121561233857612337611f20565b5b60006123468482850161216d565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6123918261202b565b810181811067ffffffffffffffff821117156123b0576123af612359565b5b80604052505050565b60006123c3611f16565b90506123cf8282612388565b919050565b600067ffffffffffffffff8211156123ef576123ee612359565b5b6123f88261202b565b9050602081019050919050565b82818337600083830152505050565b6000612427612422846123d4565b6123b9565b90508281526020810184848401111561244357612442612354565b5b61244e848285612405565b509392505050565b600082601f83011261246b5761246a61234f565b5b813561247b848260208601612414565b91505092915050565b60006020828403121561249a57612499611f20565b5b600082013567ffffffffffffffff8111156124b8576124b7611f25565b5b6124c484828501612456565b91505092915050565b6124d681611faf565b81146124e157600080fd5b50565b6000813590506124f3816124cd565b92915050565b600080604083850312156125105761250f611f20565b5b600061251e8582860161216d565b925050602061252f858286016124e4565b9150509250929050565b600067ffffffffffffffff82111561255457612553612359565b5b61255d8261202b565b9050602081019050919050565b600061257d61257884612539565b6123b9565b90508281526020810184848401111561259957612598612354565b5b6125a4848285612405565b509392505050565b600082601f8301126125c1576125c061234f565b5b81356125d184826020860161256a565b91505092915050565b600080600080608085870312156125f4576125f3611f20565b5b60006126028782880161216d565b94505060206126138782880161216d565b9350506040612624878288016120b8565b925050606085013567ffffffffffffffff81111561264557612644611f25565b5b612651878288016125ac565b91505092959194509250565b600061ffff82169050919050565b6126748161265d565b811461267f57600080fd5b50565b6000813590506126918161266b565b92915050565b600080604083850312156126ae576126ad611f20565b5b60006126bc85828601612682565b92505060206126cd8582860161216d565b9150509250929050565b600080604083850312156126ee576126ed611f20565b5b60006126fc8582860161216d565b925050602061270d8582860161216d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061275e57607f821691505b60208210810361277157612770612717565b5b50919050565b600060408201905061278c600083018561212c565b612799602083018461212c565b9392505050565b6000815190506127af816124cd565b92915050565b6000602082840312156127cb576127ca611f20565b5b60006127d9848285016127a0565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061281c82612097565b915061282783612097565b925082820261283581612097565b9150828204841483151761284c5761284b6127e2565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061288d82612097565b915061289883612097565b9250826128a8576128a7612853565b5b828204905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026129157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826128d8565b61291f86836128d8565b95508019841693508086168417925050509392505050565b600061295261294d61294884612097565b6122a8565b612097565b9050919050565b6000819050919050565b61296c83612937565b61298061297882612959565b8484546128e5565b825550505050565b600090565b612995612988565b6129a0818484612963565b505050565b5b818110156129c4576129b960008261298d565b6001810190506129a6565b5050565b601f821115612a09576129da816128b3565b6129e3846128c8565b810160208510156129f2578190505b612a066129fe856128c8565b8301826129a5565b50505b505050565b600082821c905092915050565b6000612a2c60001984600802612a0e565b1980831691505092915050565b6000612a458383612a1b565b9150826002028217905092915050565b612a5e82611fe5565b67ffffffffffffffff811115612a7757612a76612359565b5b612a818254612746565b612a8c8282856129c8565b600060209050601f831160018114612abf5760008415612aad578287015190505b612ab78582612a39565b865550612b1f565b601f198416612acd866128b3565b60005b82811015612af557848901518255600182019150602085019450602081019050612ad0565b86831015612b125784890151612b0e601f891682612a1b565b8355505b6001600288020188555050505b505050505050565b6000612b3282612097565b9150612b3d83612097565b9250828201905080821115612b5557612b546127e2565b5b92915050565b6000612b668261265d565b9150612b718361265d565b9250828201905061ffff811115612b8b57612b8a6127e2565b5b92915050565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b6000612bc7601383611ff0565b9150612bd282612b91565b602082019050919050565b60006020820190508181036000830152612bf681612bba565b9050919050565b600081905092915050565b60008154612c1581612746565b612c1f8186612bfd565b94506001821660008114612c3a5760018114612c4f57612c82565b60ff1983168652811515820286019350612c82565b612c58856128b3565b60005b83811015612c7a57815481890152600182019150602081019050612c5b565b838801955050505b50505092915050565b6000612c9682611fe5565b612ca08185612bfd565b9350612cb0818560208601612001565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000612cf2600583612bfd565b9150612cfd82612cbc565b600582019050919050565b6000612d148285612c08565b9150612d208284612c8b565b9150612d2b82612ce5565b91508190509392505050565b6000612d4282612097565b9150612d4d83612097565b9250828203905081811115612d6557612d646127e2565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000612d9282612d6b565b612d9c8185612d76565b9350612dac818560208601612001565b612db58161202b565b840191505092915050565b6000608082019050612dd5600083018761212c565b612de2602083018661212c565b612def60408301856121c2565b8181036060830152612e018184612d87565b905095945050505050565b600081519050612e1b81611f56565b92915050565b600060208284031215612e3757612e36611f20565b5b6000612e4584828501612e0c565b9150509291505056fea264697066735822122020cf2ede8ecc8056c8d2be183d2c1c9c69332b37f3ca29e9125661f45d30278164736f6c63430008110033697066733a2f2f626166796265696377366972726a346b75736f647a726663666737676b67346e356978636a653636707434773465706a74746e37766d32616268692f

Deployed Bytecode

0x60806040526004361061014b5760003560e01c806370a08231116100b6578063b88d4fde1161006f578063b88d4fde1461045d578063bad0ba6f14610479578063c87b56dd146104a2578063d5abeb01146104df578063e985e9c51461050a578063f968adbe146105475761014b565b806370a082311461035c57806395d89b41146103995780639b642de1146103c4578063a035b1fe146103ed578063a0712d6814610418578063a22cb465146104345761014b565b806329ee566c1161010857806329ee566c146102585780632a55205a146102835780633ccfd60b146102c157806341f43434146102d857806342842e0e146103035780636352211e1461031f5761014b565b806301ffc9a71461015057806306fdde031461018d578063081812fc146101b8578063095ea7b3146101f557806318160ddd1461021157806323b872dd1461023c575b600080fd5b34801561015c57600080fd5b5061017760048036038101906101729190611f82565b610572565b6040516101849190611fca565b60405180910390f35b34801561019957600080fd5b506101a2610604565b6040516101af9190612075565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da91906120cd565b610696565b6040516101ec919061213b565b60405180910390f35b61020f600480360381019061020a9190612182565b610715565b005b34801561021d57600080fd5b5061022661081f565b60405161023391906121d1565b60405180910390f35b610256600480360381019061025191906121ec565b610836565b005b34801561026457600080fd5b5061026d610986565b60405161027a91906121d1565b60405180910390f35b34801561028f57600080fd5b506102aa60048036038101906102a5919061223f565b61098c565b6040516102b892919061227f565b60405180910390f35b3480156102cd57600080fd5b506102d66109de565b005b3480156102e457600080fd5b506102ed610a81565b6040516102fa9190612307565b60405180910390f35b61031d600480360381019061031891906121ec565b610a93565b005b34801561032b57600080fd5b50610346600480360381019061034191906120cd565b610be3565b604051610353919061213b565b60405180910390f35b34801561036857600080fd5b50610383600480360381019061037e9190612322565b610bf5565b60405161039091906121d1565b60405180910390f35b3480156103a557600080fd5b506103ae610cad565b6040516103bb9190612075565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190612484565b610d3f565b005b3480156103f957600080fd5b50610402610dac565b60405161040f91906121d1565b60405180910390f35b610432600480360381019061042d91906120cd565b610db2565b005b34801561044057600080fd5b5061045b600480360381019061045691906124f9565b610dee565b005b610477600480360381019061047291906125da565b610ef8565b005b34801561048557600080fd5b506104a0600480360381019061049b9190612697565b61104b565b005b3480156104ae57600080fd5b506104c960048036038101906104c491906120cd565b611118565b6040516104d69190612075565b60405180910390f35b3480156104eb57600080fd5b506104f461114c565b60405161050191906121d1565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c91906126d7565b611152565b60405161053e9190611fca565b60405180910390f35b34801561055357600080fd5b5061055c6111e6565b60405161056991906121d1565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105cd57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105fd5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461061390612746565b80601f016020809104026020016040519081016040528092919081815260200182805461063f90612746565b801561068c5780601f106106615761010080835404028352916020019161068c565b820191906000526020600020905b81548152906001019060200180831161066f57829003601f168201915b5050505050905090565b60006106a1826111ec565b6106d7576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610810576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161078d929190612777565b602060405180830381865afa1580156107aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ce91906127b5565b61080f57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610806919061213b565b60405180910390fd5b5b61081a838361124b565b505050565b600061082961138f565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610974573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036108a8576108a3848484611394565b610980565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016108f1929190612777565b602060405180830381865afa15801561090e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093291906127b5565b61097357336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161096a919061213b565b60405180910390fd5b5b61097f848484611394565b5b50505050565b600d5481565b60008060006103e8600d54856109a29190612811565b6109ac9190612882565b9050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168192509250509250929050565b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a3857600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610a7e573d6000803e3d6000fd5b50565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610bd1573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b0557610b008484846116b6565b610bdd565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610b4e929190612777565b602060405180830381865afa158015610b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8f91906127b5565b610bd057336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610bc7919061213b565b60405180910390fd5b5b610bdc8484846116b6565b5b50505050565b6000610bee826116d6565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c5c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b606060038054610cbc90612746565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce890612746565b8015610d355780601f10610d0a57610100808354040283529160200191610d35565b820191906000526020600020905b815481529060010190602001808311610d1857829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d9957600080fd5b80600f9081610da89190612a55565b5050565b600c5481565b600a5481610dbe61081f565b610dc89190612b27565b1115610dd357600080fd5b600b54811115610de257600080fd5b610deb816117a2565b50565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610ee9576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610e66929190612777565b602060405180830381865afa158015610e83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea791906127b5565b610ee857806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610edf919061213b565b60405180910390fd5b5b610ef38383611897565b505050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611037573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f6b57610f66858585856119a2565b611044565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610fb4929190612777565b602060405180830381865afa158015610fd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff591906127b5565b61103657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161102d919061213b565b60405180910390fd5b5b611043858585856119a2565b5b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110a557600080fd5b60006110af61081f565b9050600a5483826110c09190612b5b565b61ffff161115611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc90612bdd565b60405180910390fd5b611113828461ffff16611a15565b505050565b6060600f61112583611a33565b604051602001611136929190612d08565b6040516020818303038152906040529050919050565b600a5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b5481565b6000816111f761138f565b11158015611206575060005482105b8015611244575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600061125682610be3565b90508073ffffffffffffffffffffffffffffffffffffffff16611277611a83565b73ffffffffffffffffffffffffffffffffffffffff16146112da576112a38161129e611a83565b611152565b6112d9576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061139f826116d6565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611406576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061141284611a8b565b915091506114288187611423611a83565b611ab2565b6114745761143d86611438611a83565b611152565b611473576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036114da576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114e78686866001611af6565b80156114f257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506115c08561159c888887611afc565b7c020000000000000000000000000000000000000000000000000000000017611b24565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036116465760006001850190506000600460008381526020019081526020016000205403611644576000548114611643578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46116ae8686866001611b4f565b505050505050565b6116d183838360405180602001604052806000815250610ef8565b505050565b600080829050806116e561138f565b1161176b5760005481101561176a5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611768575b6000810361175e576004600083600190039350838152602001908152602001600020549050611734565b809250505061179d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117da57600080fd5b6000340361186f576000600c6117ee61081f565b600a546117fb9190612d37565b6118059190612882565b905080600160086000438152602001908152602001600020546118289190612b27565b111561183357600080fd5b60016008600043815260200190815260200160002060008282546118579190612b27565b92505081905550611869336001611a15565b50611894565b600c548161187d9190612811565b34101561188957600080fd5b6118933382611a15565b5b50565b80600760006118a4611a83565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611951611a83565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119969190611fca565b60405180910390a35050565b6119ad848484610836565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611a0f576119d884848484611b55565b611a0e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611a2f828260405180602001604052806000815250611ca5565b5050565b606060a060405101806040526020810391506000825281835b600115611a6e57600184039350600a81066030018453600a8104905080611a4c575b50828103602084039350808452505050919050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611b13868684611d42565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b7b611a83565b8786866040518563ffffffff1660e01b8152600401611b9d9493929190612dc0565b6020604051808303816000875af1925050508015611bd957506040513d601f19601f82011682018060405250810190611bd69190612e21565b60015b611c52573d8060008114611c09576040519150601f19603f3d011682016040523d82523d6000602084013e611c0e565b606091505b506000815103611c4a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b611caf8383611d4b565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611d3d57600080549050600083820390505b611cef6000868380600101945086611b55565b611d25576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611cdc578160005414611d3a57600080fd5b50505b505050565b60009392505050565b60008054905060008203611d8b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d986000848385611af6565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611e0f83611e006000866000611afc565b611e0985611f06565b17611b24565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611eb057808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611e75565b5060008203611eeb576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611f016000848385611b4f565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611f5f81611f2a565b8114611f6a57600080fd5b50565b600081359050611f7c81611f56565b92915050565b600060208284031215611f9857611f97611f20565b5b6000611fa684828501611f6d565b91505092915050565b60008115159050919050565b611fc481611faf565b82525050565b6000602082019050611fdf6000830184611fbb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561201f578082015181840152602081019050612004565b60008484015250505050565b6000601f19601f8301169050919050565b600061204782611fe5565b6120518185611ff0565b9350612061818560208601612001565b61206a8161202b565b840191505092915050565b6000602082019050818103600083015261208f818461203c565b905092915050565b6000819050919050565b6120aa81612097565b81146120b557600080fd5b50565b6000813590506120c7816120a1565b92915050565b6000602082840312156120e3576120e2611f20565b5b60006120f1848285016120b8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612125826120fa565b9050919050565b6121358161211a565b82525050565b6000602082019050612150600083018461212c565b92915050565b61215f8161211a565b811461216a57600080fd5b50565b60008135905061217c81612156565b92915050565b6000806040838503121561219957612198611f20565b5b60006121a78582860161216d565b92505060206121b8858286016120b8565b9150509250929050565b6121cb81612097565b82525050565b60006020820190506121e660008301846121c2565b92915050565b60008060006060848603121561220557612204611f20565b5b60006122138682870161216d565b93505060206122248682870161216d565b9250506040612235868287016120b8565b9150509250925092565b6000806040838503121561225657612255611f20565b5b6000612264858286016120b8565b9250506020612275858286016120b8565b9150509250929050565b6000604082019050612294600083018561212c565b6122a160208301846121c2565b9392505050565b6000819050919050565b60006122cd6122c86122c3846120fa565b6122a8565b6120fa565b9050919050565b60006122df826122b2565b9050919050565b60006122f1826122d4565b9050919050565b612301816122e6565b82525050565b600060208201905061231c60008301846122f8565b92915050565b60006020828403121561233857612337611f20565b5b60006123468482850161216d565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6123918261202b565b810181811067ffffffffffffffff821117156123b0576123af612359565b5b80604052505050565b60006123c3611f16565b90506123cf8282612388565b919050565b600067ffffffffffffffff8211156123ef576123ee612359565b5b6123f88261202b565b9050602081019050919050565b82818337600083830152505050565b6000612427612422846123d4565b6123b9565b90508281526020810184848401111561244357612442612354565b5b61244e848285612405565b509392505050565b600082601f83011261246b5761246a61234f565b5b813561247b848260208601612414565b91505092915050565b60006020828403121561249a57612499611f20565b5b600082013567ffffffffffffffff8111156124b8576124b7611f25565b5b6124c484828501612456565b91505092915050565b6124d681611faf565b81146124e157600080fd5b50565b6000813590506124f3816124cd565b92915050565b600080604083850312156125105761250f611f20565b5b600061251e8582860161216d565b925050602061252f858286016124e4565b9150509250929050565b600067ffffffffffffffff82111561255457612553612359565b5b61255d8261202b565b9050602081019050919050565b600061257d61257884612539565b6123b9565b90508281526020810184848401111561259957612598612354565b5b6125a4848285612405565b509392505050565b600082601f8301126125c1576125c061234f565b5b81356125d184826020860161256a565b91505092915050565b600080600080608085870312156125f4576125f3611f20565b5b60006126028782880161216d565b94505060206126138782880161216d565b9350506040612624878288016120b8565b925050606085013567ffffffffffffffff81111561264557612644611f25565b5b612651878288016125ac565b91505092959194509250565b600061ffff82169050919050565b6126748161265d565b811461267f57600080fd5b50565b6000813590506126918161266b565b92915050565b600080604083850312156126ae576126ad611f20565b5b60006126bc85828601612682565b92505060206126cd8582860161216d565b9150509250929050565b600080604083850312156126ee576126ed611f20565b5b60006126fc8582860161216d565b925050602061270d8582860161216d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061275e57607f821691505b60208210810361277157612770612717565b5b50919050565b600060408201905061278c600083018561212c565b612799602083018461212c565b9392505050565b6000815190506127af816124cd565b92915050565b6000602082840312156127cb576127ca611f20565b5b60006127d9848285016127a0565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061281c82612097565b915061282783612097565b925082820261283581612097565b9150828204841483151761284c5761284b6127e2565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061288d82612097565b915061289883612097565b9250826128a8576128a7612853565b5b828204905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026129157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826128d8565b61291f86836128d8565b95508019841693508086168417925050509392505050565b600061295261294d61294884612097565b6122a8565b612097565b9050919050565b6000819050919050565b61296c83612937565b61298061297882612959565b8484546128e5565b825550505050565b600090565b612995612988565b6129a0818484612963565b505050565b5b818110156129c4576129b960008261298d565b6001810190506129a6565b5050565b601f821115612a09576129da816128b3565b6129e3846128c8565b810160208510156129f2578190505b612a066129fe856128c8565b8301826129a5565b50505b505050565b600082821c905092915050565b6000612a2c60001984600802612a0e565b1980831691505092915050565b6000612a458383612a1b565b9150826002028217905092915050565b612a5e82611fe5565b67ffffffffffffffff811115612a7757612a76612359565b5b612a818254612746565b612a8c8282856129c8565b600060209050601f831160018114612abf5760008415612aad578287015190505b612ab78582612a39565b865550612b1f565b601f198416612acd866128b3565b60005b82811015612af557848901518255600182019150602085019450602081019050612ad0565b86831015612b125784890151612b0e601f891682612a1b565b8355505b6001600288020188555050505b505050505050565b6000612b3282612097565b9150612b3d83612097565b9250828201905080821115612b5557612b546127e2565b5b92915050565b6000612b668261265d565b9150612b718361265d565b9250828201905061ffff811115612b8b57612b8a6127e2565b5b92915050565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b6000612bc7601383611ff0565b9150612bd282612b91565b602082019050919050565b60006020820190508181036000830152612bf681612bba565b9050919050565b600081905092915050565b60008154612c1581612746565b612c1f8186612bfd565b94506001821660008114612c3a5760018114612c4f57612c82565b60ff1983168652811515820286019350612c82565b612c58856128b3565b60005b83811015612c7a57815481890152600182019150602081019050612c5b565b838801955050505b50505092915050565b6000612c9682611fe5565b612ca08185612bfd565b9350612cb0818560208601612001565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000612cf2600583612bfd565b9150612cfd82612cbc565b600582019050919050565b6000612d148285612c08565b9150612d208284612c8b565b9150612d2b82612ce5565b91508190509392505050565b6000612d4282612097565b9150612d4d83612097565b9250828203905081811115612d6557612d646127e2565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000612d9282612d6b565b612d9c8185612d76565b9350612dac818560208601612001565b612db58161202b565b840191505092915050565b6000608082019050612dd5600083018761212c565b612de2602083018661212c565b612def60408301856121c2565b8181036060830152612e018184612d87565b905095945050505050565b600081519050612e1b81611f56565b92915050565b600060208284031215612e3757612e36611f20565b5b6000612e4584828501612e0c565b9150509291505056fea264697066735822122020cf2ede8ecc8056c8d2be183d2c1c9c69332b37f3ca29e9125661f45d30278164736f6c63430008110033

Deployed Bytecode Sourcemap

57330:3098:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18930:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19832:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26323:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59641:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15583:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59814:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57601:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58942:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;59340:109;;;;;;;;;;;;;:::i;:::-;;54699:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59993:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21225:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16767:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20008:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57923:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57557:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57656:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59457:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60180:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58672:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59168:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57477:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27272:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57516:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18930:639;19015:4;19354:10;19339:25;;:11;:25;;;;:102;;;;19431:10;19416:25;;:11;:25;;;;19339:102;:179;;;;19508:10;19493:25;;:11;:25;;;;19339:179;19319:199;;18930:639;;;:::o;19832:100::-;19886:13;19919:5;19912:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19832:100;:::o;26323:218::-;26399:7;26424:16;26432:7;26424;:16::i;:::-;26419:64;;26449:34;;;;;;;;;;;;;;26419:64;26503:15;:24;26519:7;26503:24;;;;;;;;;;;:30;;;;;;;;;;;;26496:37;;26323:218;;;:::o;59641:165::-;59745:8;56741:1;54799:42;56693:45;;;:49;56689:225;;;54799:42;56764;;;56815:4;56822:8;56764:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56759:144;;56878:8;56859:28;;;;;;;;;;;:::i;:::-;;;;;;;;56759:144;56689:225;59766:32:::1;59780:8;59790:7;59766:13;:32::i;:::-;59641:165:::0;;;:::o;15583:323::-;15644:7;15872:15;:13;:15::i;:::-;15857:12;;15841:13;;:28;:46;15834:53;;15583:323;:::o;59814:171::-;59923:4;55995:1;54799:42;55947:45;;;:49;55943:539;;;56236:10;56228:18;;:4;:18;;;56224:85;;59940:37:::1;59959:4;59965:2;59969:7;59940:18;:37::i;:::-;56287:7:::0;;56224:85;54799:42;56328;;;56379:4;56386:10;56328:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56323:148;;56444:10;56425:30;;;;;;;;;;;:::i;:::-;;;;;;;;56323:148;55943:539;59940:37:::1;59959:4;59965:2;59969:7;59940:18;:37::i;:::-;59814:171:::0;;;;;:::o;57601:27::-;;;;:::o;58942:218::-;59030:7;59039;59059:21;59108:4;59097:7;;59084:10;:20;;;;:::i;:::-;59083:29;;;;:::i;:::-;59059:53;;59131:5;;;;;;;;;;;59138:13;59123:29;;;;;58942:218;;;;;:::o;59340:109::-;58082:10;58073:19;;:5;;;;;;;;;;;:19;;;58065:28;;;;;;59398:10:::1;59390:28;;:51;59419:21;59390:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;59340:109::o:0;54699:143::-;54799:42;54699:143;:::o;59993:179::-;60106:4;55995:1;54799:42;55947:45;;;:49;55943:539;;;56236:10;56228:18;;:4;:18;;;56224:85;;60123:41:::1;60146:4;60152:2;60156:7;60123:22;:41::i;:::-;56287:7:::0;;56224:85;54799:42;56328;;;56379:4;56386:10;56328:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56323:148;;56444:10;56425:30;;;;;;;;;;;:::i;:::-;;;;;;;;56323:148;55943:539;60123:41:::1;60146:4;60152:2;60156:7;60123:22;:41::i;:::-;59993:179:::0;;;;;:::o;21225:152::-;21297:7;21340:27;21359:7;21340:18;:27::i;:::-;21317:52;;21225:152;;;:::o;16767:233::-;16839:7;16880:1;16863:19;;:5;:19;;;16859:60;;16891:28;;;;;;;;;;;;;;16859:60;10926:13;16937:18;:25;16956:5;16937:25;;;;;;;;;;;;;;;;:55;16930:62;;16767:233;;;:::o;20008:104::-;20064:13;20097:7;20090:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20008:104;:::o;57923:84::-;58082:10;58073:19;;:5;;;;;;;;;;;:19;;;58065:28;;;;;;57995:4:::1;57989:3;:10;;;;;;:::i;:::-;;57923:84:::0;:::o;57557:35::-;;;;:::o;57656:170::-;57746:9;;57736:6;57720:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;57712:44;;;;;;57785:8;;57775:6;:18;;57767:27;;;;;;57805:13;57811:6;57805:5;:13::i;:::-;57656:170;:::o;59457:176::-;59561:8;56741:1;54799:42;56693:45;;;:49;56689:225;;;54799:42;56764;;;56815:4;56822:8;56764:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56759:144;;56878:8;56859:28;;;;;;;;;;;:::i;:::-;;;;;;;;56759:144;56689:225;59582:43:::1;59606:8;59616;59582:23;:43::i;:::-;59457:176:::0;;;:::o;60180:245::-;60348:4;55995:1;54799:42;55947:45;;;:49;55943:539;;;56236:10;56228:18;;:4;:18;;;56224:85;;60370:47:::1;60393:4;60399:2;60403:7;60412:4;60370:22;:47::i;:::-;56287:7:::0;;56224:85;54799:42;56328;;;56379:4;56386:10;56328:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56323:148;;56444:10;56425:30;;;;;;;;;;;:::i;:::-;;;;;;;;56323:148;55943:539;60370:47:::1;60393:4;60399:2;60403:7;60412:4;60370:22;:47::i;:::-;60180:245:::0;;;;;;:::o;58672:262::-;58082:10;58073:19;;:5;;;;;;;;;;;:19;;;58065:28;;;;;;58758:18:::1;58786:13;:11;:13::i;:::-;58758:42;;58848:9;;58833:11;58819;:25;;;;:::i;:::-;:38;;;;58811:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;58892:34;58902:9;58914:11;58892:34;;:9;:34::i;:::-;58747:187;58672:262:::0;;:::o;59168:164::-;59233:13;59290:3;59295:18;59305:7;59295:9;:18::i;:::-;59273:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59259:65;;59168:164;;;:::o;57477:30::-;;;;:::o;27272:164::-;27369:4;27393:18;:25;27412:5;27393:25;;;;;;;;;;;;;;;:35;27419:8;27393:35;;;;;;;;;;;;;;;;;;;;;;;;;27386:42;;27272:164;;;;:::o;57516:28::-;;;;:::o;27694:282::-;27759:4;27815:7;27796:15;:13;:15::i;:::-;:26;;:66;;;;;27849:13;;27839:7;:23;27796:66;:153;;;;;27948:1;11702:8;27900:17;:26;27918:7;27900:26;;;;;;;;;;;;:44;:49;27796:153;27776:173;;27694:282;;;:::o;25756:408::-;25845:13;25861:16;25869:7;25861;:16::i;:::-;25845:32;;25917:5;25894:28;;:19;:17;:19::i;:::-;:28;;;25890:175;;25942:44;25959:5;25966:19;:17;:19::i;:::-;25942:16;:44::i;:::-;25937:128;;26014:35;;;;;;;;;;;;;;25937:128;25890:175;26110:2;26077:15;:24;26093:7;26077:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;26148:7;26144:2;26128:28;;26137:5;26128:28;;;;;;;;;;;;25834:330;25756:408;;:::o;15099:92::-;15155:7;15099:92;:::o;29962:2825::-;30104:27;30134;30153:7;30134:18;:27::i;:::-;30104:57;;30219:4;30178:45;;30194:19;30178:45;;;30174:86;;30232:28;;;;;;;;;;;;;;30174:86;30274:27;30303:23;30330:35;30357:7;30330:26;:35::i;:::-;30273:92;;;;30465:68;30490:15;30507:4;30513:19;:17;:19::i;:::-;30465:24;:68::i;:::-;30460:180;;30553:43;30570:4;30576:19;:17;:19::i;:::-;30553:16;:43::i;:::-;30548:92;;30605:35;;;;;;;;;;;;;;30548:92;30460:180;30671:1;30657:16;;:2;:16;;;30653:52;;30682:23;;;;;;;;;;;;;;30653:52;30718:43;30740:4;30746:2;30750:7;30759:1;30718:21;:43::i;:::-;30854:15;30851:160;;;30994:1;30973:19;30966:30;30851:160;31391:18;:24;31410:4;31391:24;;;;;;;;;;;;;;;;31389:26;;;;;;;;;;;;31460:18;:22;31479:2;31460:22;;;;;;;;;;;;;;;;31458:24;;;;;;;;;;;31782:146;31819:2;31868:45;31883:4;31889:2;31893:19;31868:14;:45::i;:::-;11982:8;31840:73;31782:18;:146::i;:::-;31753:17;:26;31771:7;31753:26;;;;;;;;;;;:175;;;;32099:1;11982:8;32048:19;:47;:52;32044:627;;32121:19;32153:1;32143:7;:11;32121:33;;32310:1;32276:17;:30;32294:11;32276:30;;;;;;;;;;;;:35;32272:384;;32414:13;;32399:11;:28;32395:242;;32594:19;32561:17;:30;32579:11;32561:30;;;;;;;;;;;:52;;;;32395:242;32272:384;32102:569;32044:627;32718:7;32714:2;32699:27;;32708:4;32699:27;;;;;;;;;;;;32737:42;32758:4;32764:2;32768:7;32777:1;32737:20;:42::i;:::-;30093:2694;;;29962:2825;;;:::o;32883:193::-;33029:39;33046:4;33052:2;33056:7;33029:39;;;;;;;;;;;;:16;:39::i;:::-;32883:193;;;:::o;22380:1275::-;22447:7;22467:12;22482:7;22467:22;;22550:4;22531:15;:13;:15::i;:::-;:23;22527:1061;;22584:13;;22577:4;:20;22573:1015;;;22622:14;22639:17;:23;22657:4;22639:23;;;;;;;;;;;;22622:40;;22756:1;11702:8;22728:6;:24;:29;22724:845;;23393:113;23410:1;23400:6;:11;23393:113;;23453:17;:25;23471:6;;;;;;;23453:25;;;;;;;;;;;;23444:34;;23393:113;;;23539:6;23532:13;;;;;;22724:845;22599:989;22573:1015;22527:1061;23616:31;;;;;;;;;;;;;;22380:1275;;;;:::o;58214:450::-;58287:9;58273:23;;:10;:23;;;58265:32;;;;;;58325:1;58312:9;:14;58308:262;;58343:15;58391:2;58374:13;:11;:13::i;:::-;58362:9;;:25;;;;:::i;:::-;58361:32;;;;:::i;:::-;58343:50;;58447:7;58442:1;58416:9;:23;58426:12;58416:23;;;;;;;;;;;;:27;;;;:::i;:::-;:38;;58408:47;;;;;;58497:1;58470:9;:23;58480:12;58470:23;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;58513:24;58523:10;58535:1;58513:9;:24::i;:::-;58552:7;;;58308:262;58610:5;;58601:6;:14;;;;:::i;:::-;58588:9;:27;;58580:36;;;;;;58627:29;58637:10;58649:6;58627:9;:29::i;:::-;58214:450;;:::o;26881:234::-;27028:8;26976:18;:39;26995:19;:17;:19::i;:::-;26976:39;;;;;;;;;;;;;;;:49;27016:8;26976:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;27088:8;27052:55;;27067:19;:17;:19::i;:::-;27052:55;;;27098:8;27052:55;;;;;;:::i;:::-;;;;;;;;26881:234;;:::o;33674:407::-;33849:31;33862:4;33868:2;33872:7;33849:12;:31::i;:::-;33913:1;33895:2;:14;;;:19;33891:183;;33934:56;33965:4;33971:2;33975:7;33984:5;33934:30;:56::i;:::-;33929:145;;34018:40;;;;;;;;;;;;;;33929:145;33891:183;33674:407;;;;:::o;43834:112::-;43911:27;43921:2;43925:8;43911:27;;;;;;;;;;;;:9;:27::i;:::-;43834:112;;:::o;50209:1745::-;50274:17;50708:4;50701;50695:11;50691:22;50800:1;50794:4;50787:15;50875:4;50872:1;50868:12;50861:19;;50957:1;50952:3;50945:14;51061:3;51300:5;51282:428;51308:1;51282:428;;;51348:1;51343:3;51339:11;51332:18;;51519:2;51513:4;51509:13;51505:2;51501:22;51496:3;51488:36;51613:2;51607:4;51603:13;51595:21;;51680:4;51282:428;51670:25;51282:428;51286:21;51749:3;51744;51740:13;51864:4;51859:3;51855:14;51848:21;;51929:6;51924:3;51917:19;50313:1634;;;50209:1745;;;:::o;50002:105::-;50062:7;50089:10;50082:17;;50002:105;:::o;28857:485::-;28959:27;28988:23;29029:38;29070:15;:24;29086:7;29070:24;;;;;;;;;;;29029:65;;29247:18;29224:41;;29304:19;29298:26;29279:45;;29209:126;28857:485;;;:::o;28085:659::-;28234:11;28399:16;28392:5;28388:28;28379:37;;28559:16;28548:9;28544:32;28531:45;;28709:15;28698:9;28695:30;28687:5;28676:9;28673:20;28670:56;28660:66;;28085:659;;;;;:::o;34743:159::-;;;;;:::o;49311:311::-;49446:7;49466:16;12106:3;49492:19;:41;;49466:68;;12106:3;49560:31;49571:4;49577:2;49581:9;49560:10;:31::i;:::-;49552:40;;:62;;49545:69;;;49311:311;;;;;:::o;24203:450::-;24283:14;24451:16;24444:5;24440:28;24431:37;;24628:5;24614:11;24589:23;24585:41;24582:52;24575:5;24572:63;24562:73;;24203:450;;;;:::o;35567:158::-;;;;;:::o;36165:716::-;36328:4;36374:2;36349:45;;;36395:19;:17;:19::i;:::-;36416:4;36422:7;36431:5;36349:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36345:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36649:1;36632:6;:13;:18;36628:235;;36678:40;;;;;;;;;;;;;;36628:235;36821:6;36815:13;36806:6;36802:2;36798:15;36791:38;36345:529;36518:54;;;36508:64;;;:6;:64;;;;36501:71;;;36165:716;;;;;;:::o;43061:689::-;43192:19;43198:2;43202:8;43192:5;:19::i;:::-;43271:1;43253:2;:14;;;:19;43249:483;;43293:11;43307:13;;43293:27;;43339:13;43361:8;43355:3;:14;43339:30;;43388:233;43419:62;43458:1;43462:2;43466:7;;;;;;43475:5;43419:30;:62::i;:::-;43414:167;;43517:40;;;;;;;;;;;;;;43414:167;43616:3;43608:5;:11;43388:233;;43703:3;43686:13;;:20;43682:34;;43708:8;;;43682:34;43274:458;;43249:483;43061:689;;;:::o;49012:147::-;49149:6;49012:147;;;;;:::o;37343:2966::-;37416:20;37439:13;;37416:36;;37479:1;37467:8;:13;37463:44;;37489:18;;;;;;;;;;;;;;37463:44;37520:61;37550:1;37554:2;37558:12;37572:8;37520:21;:61::i;:::-;38064:1;11064:2;38034:1;:26;;38033:32;38021:8;:45;37995:18;:22;38014:2;37995:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;38343:139;38380:2;38434:33;38457:1;38461:2;38465:1;38434:14;:33::i;:::-;38401:30;38422:8;38401:20;:30::i;:::-;:66;38343:18;:139::i;:::-;38309:17;:31;38327:12;38309:31;;;;;;;;;;;:173;;;;38499:16;38530:11;38559:8;38544:12;:23;38530:37;;39080:16;39076:2;39072:25;39060:37;;39452:12;39412:8;39371:1;39309:25;39250:1;39189;39162:335;39823:1;39809:12;39805:20;39763:346;39864:3;39855:7;39852:16;39763:346;;40082:7;40072:8;40069:1;40042:25;40039:1;40036;40031:59;39917:1;39908:7;39904:15;39893:26;;39763:346;;;39767:77;40154:1;40142:8;:13;40138:45;;40164:19;;;;;;;;;;;;;;40138:45;40216:3;40200:13;:19;;;;37769:2462;;40241:60;40270:1;40274:2;40278:12;40292:8;40241:20;:60::i;:::-;37405:2904;37343:2966;;:::o;24755:324::-;24825:14;25058:1;25048:8;25045:15;25019:24;25015:46;25005:56;;24755:324;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:474::-;5935:6;5943;5992:2;5980:9;5971:7;5967:23;5963:32;5960:119;;;5998:79;;:::i;:::-;5960:119;6118:1;6143:53;6188:7;6179:6;6168:9;6164:22;6143:53;:::i;:::-;6133:63;;6089:117;6245:2;6271:53;6316:7;6307:6;6296:9;6292:22;6271:53;:::i;:::-;6261:63;;6216:118;5867:474;;;;;:::o;6347:332::-;6468:4;6506:2;6495:9;6491:18;6483:26;;6519:71;6587:1;6576:9;6572:17;6563:6;6519:71;:::i;:::-;6600:72;6668:2;6657:9;6653:18;6644:6;6600:72;:::i;:::-;6347:332;;;;;:::o;6685:60::-;6713:3;6734:5;6727:12;;6685:60;;;:::o;6751:142::-;6801:9;6834:53;6852:34;6861:24;6879:5;6861:24;:::i;:::-;6852:34;:::i;:::-;6834:53;:::i;:::-;6821:66;;6751:142;;;:::o;6899:126::-;6949:9;6982:37;7013:5;6982:37;:::i;:::-;6969:50;;6899:126;;;:::o;7031:158::-;7113:9;7146:37;7177:5;7146:37;:::i;:::-;7133:50;;7031:158;;;:::o;7195:195::-;7314:69;7377:5;7314:69;:::i;:::-;7309:3;7302:82;7195:195;;:::o;7396:286::-;7521:4;7559:2;7548:9;7544:18;7536:26;;7572:103;7672:1;7661:9;7657:17;7648:6;7572:103;:::i;:::-;7396:286;;;;:::o;7688:329::-;7747:6;7796:2;7784:9;7775:7;7771:23;7767:32;7764:119;;;7802:79;;:::i;:::-;7764:119;7922:1;7947:53;7992:7;7983:6;7972:9;7968:22;7947:53;:::i;:::-;7937:63;;7893:117;7688:329;;;;:::o;8023:117::-;8132:1;8129;8122:12;8146:117;8255:1;8252;8245:12;8269:180;8317:77;8314:1;8307:88;8414:4;8411:1;8404:15;8438:4;8435:1;8428:15;8455:281;8538:27;8560:4;8538:27;:::i;:::-;8530:6;8526:40;8668:6;8656:10;8653:22;8632:18;8620:10;8617:34;8614:62;8611:88;;;8679:18;;:::i;:::-;8611:88;8719:10;8715:2;8708:22;8498:238;8455:281;;:::o;8742:129::-;8776:6;8803:20;;:::i;:::-;8793:30;;8832:33;8860:4;8852:6;8832:33;:::i;:::-;8742:129;;;:::o;8877:308::-;8939:4;9029:18;9021:6;9018:30;9015:56;;;9051:18;;:::i;:::-;9015:56;9089:29;9111:6;9089:29;:::i;:::-;9081:37;;9173:4;9167;9163:15;9155:23;;8877:308;;;:::o;9191:146::-;9288:6;9283:3;9278;9265:30;9329:1;9320:6;9315:3;9311:16;9304:27;9191:146;;;:::o;9343:425::-;9421:5;9446:66;9462:49;9504:6;9462:49;:::i;:::-;9446:66;:::i;:::-;9437:75;;9535:6;9528:5;9521:21;9573:4;9566:5;9562:16;9611:3;9602:6;9597:3;9593:16;9590:25;9587:112;;;9618:79;;:::i;:::-;9587:112;9708:54;9755:6;9750:3;9745;9708:54;:::i;:::-;9427:341;9343:425;;;;;:::o;9788:340::-;9844:5;9893:3;9886:4;9878:6;9874:17;9870:27;9860:122;;9901:79;;:::i;:::-;9860:122;10018:6;10005:20;10043:79;10118:3;10110:6;10103:4;10095:6;10091:17;10043:79;:::i;:::-;10034:88;;9850:278;9788:340;;;;:::o;10134:509::-;10203:6;10252:2;10240:9;10231:7;10227:23;10223:32;10220:119;;;10258:79;;:::i;:::-;10220:119;10406:1;10395:9;10391:17;10378:31;10436:18;10428:6;10425:30;10422:117;;;10458:79;;:::i;:::-;10422:117;10563:63;10618:7;10609:6;10598:9;10594:22;10563:63;:::i;:::-;10553:73;;10349:287;10134:509;;;;:::o;10649:116::-;10719:21;10734:5;10719:21;:::i;:::-;10712:5;10709:32;10699:60;;10755:1;10752;10745:12;10699:60;10649:116;:::o;10771:133::-;10814:5;10852:6;10839:20;10830:29;;10868:30;10892:5;10868:30;:::i;:::-;10771:133;;;;:::o;10910:468::-;10975:6;10983;11032:2;11020:9;11011:7;11007:23;11003:32;11000:119;;;11038:79;;:::i;:::-;11000:119;11158:1;11183:53;11228:7;11219:6;11208:9;11204:22;11183:53;:::i;:::-;11173:63;;11129:117;11285:2;11311:50;11353:7;11344:6;11333:9;11329:22;11311:50;:::i;:::-;11301:60;;11256:115;10910:468;;;;;:::o;11384:307::-;11445:4;11535:18;11527:6;11524:30;11521:56;;;11557:18;;:::i;:::-;11521:56;11595:29;11617:6;11595:29;:::i;:::-;11587:37;;11679:4;11673;11669:15;11661:23;;11384:307;;;:::o;11697:423::-;11774:5;11799:65;11815:48;11856:6;11815:48;:::i;:::-;11799:65;:::i;:::-;11790:74;;11887:6;11880:5;11873:21;11925:4;11918:5;11914:16;11963:3;11954:6;11949:3;11945:16;11942:25;11939:112;;;11970:79;;:::i;:::-;11939:112;12060:54;12107:6;12102:3;12097;12060:54;:::i;:::-;11780:340;11697:423;;;;;:::o;12139:338::-;12194:5;12243:3;12236:4;12228:6;12224:17;12220:27;12210:122;;12251:79;;:::i;:::-;12210:122;12368:6;12355:20;12393:78;12467:3;12459:6;12452:4;12444:6;12440:17;12393:78;:::i;:::-;12384:87;;12200:277;12139:338;;;;:::o;12483:943::-;12578:6;12586;12594;12602;12651:3;12639:9;12630:7;12626:23;12622:33;12619:120;;;12658:79;;:::i;:::-;12619:120;12778:1;12803:53;12848:7;12839:6;12828:9;12824:22;12803:53;:::i;:::-;12793:63;;12749:117;12905:2;12931:53;12976:7;12967:6;12956:9;12952:22;12931:53;:::i;:::-;12921:63;;12876:118;13033:2;13059:53;13104:7;13095:6;13084:9;13080:22;13059:53;:::i;:::-;13049:63;;13004:118;13189:2;13178:9;13174:18;13161:32;13220:18;13212:6;13209:30;13206:117;;;13242:79;;:::i;:::-;13206:117;13347:62;13401:7;13392:6;13381:9;13377:22;13347:62;:::i;:::-;13337:72;;13132:287;12483:943;;;;;;;:::o;13432:89::-;13468:7;13508:6;13501:5;13497:18;13486:29;;13432:89;;;:::o;13527:120::-;13599:23;13616:5;13599:23;:::i;:::-;13592:5;13589:34;13579:62;;13637:1;13634;13627:12;13579:62;13527:120;:::o;13653:137::-;13698:5;13736:6;13723:20;13714:29;;13752:32;13778:5;13752:32;:::i;:::-;13653:137;;;;:::o;13796:472::-;13863:6;13871;13920:2;13908:9;13899:7;13895:23;13891:32;13888:119;;;13926:79;;:::i;:::-;13888:119;14046:1;14071:52;14115:7;14106:6;14095:9;14091:22;14071:52;:::i;:::-;14061:62;;14017:116;14172:2;14198:53;14243:7;14234:6;14223:9;14219:22;14198:53;:::i;:::-;14188:63;;14143:118;13796:472;;;;;:::o;14274:474::-;14342:6;14350;14399:2;14387:9;14378:7;14374:23;14370:32;14367:119;;;14405:79;;:::i;:::-;14367:119;14525:1;14550:53;14595:7;14586:6;14575:9;14571:22;14550:53;:::i;:::-;14540:63;;14496:117;14652:2;14678:53;14723:7;14714:6;14703:9;14699:22;14678:53;:::i;:::-;14668:63;;14623:118;14274:474;;;;;:::o;14754:180::-;14802:77;14799:1;14792:88;14899:4;14896:1;14889:15;14923:4;14920:1;14913:15;14940:320;14984:6;15021:1;15015:4;15011:12;15001:22;;15068:1;15062:4;15058:12;15089:18;15079:81;;15145:4;15137:6;15133:17;15123:27;;15079:81;15207:2;15199:6;15196:14;15176:18;15173:38;15170:84;;15226:18;;:::i;:::-;15170:84;14991:269;14940:320;;;:::o;15266:332::-;15387:4;15425:2;15414:9;15410:18;15402:26;;15438:71;15506:1;15495:9;15491:17;15482:6;15438:71;:::i;:::-;15519:72;15587:2;15576:9;15572:18;15563:6;15519:72;:::i;:::-;15266:332;;;;;:::o;15604:137::-;15658:5;15689:6;15683:13;15674:22;;15705:30;15729:5;15705:30;:::i;:::-;15604:137;;;;:::o;15747:345::-;15814:6;15863:2;15851:9;15842:7;15838:23;15834:32;15831:119;;;15869:79;;:::i;:::-;15831:119;15989:1;16014:61;16067:7;16058:6;16047:9;16043:22;16014:61;:::i;:::-;16004:71;;15960:125;15747:345;;;;:::o;16098:180::-;16146:77;16143:1;16136:88;16243:4;16240:1;16233:15;16267:4;16264:1;16257:15;16284:410;16324:7;16347:20;16365:1;16347:20;:::i;:::-;16342:25;;16381:20;16399:1;16381:20;:::i;:::-;16376:25;;16436:1;16433;16429:9;16458:30;16476:11;16458:30;:::i;:::-;16447:41;;16637:1;16628:7;16624:15;16621:1;16618:22;16598:1;16591:9;16571:83;16548:139;;16667:18;;:::i;:::-;16548:139;16332:362;16284:410;;;;:::o;16700:180::-;16748:77;16745:1;16738:88;16845:4;16842:1;16835:15;16869:4;16866:1;16859:15;16886:185;16926:1;16943:20;16961:1;16943:20;:::i;:::-;16938:25;;16977:20;16995:1;16977:20;:::i;:::-;16972:25;;17016:1;17006:35;;17021:18;;:::i;:::-;17006:35;17063:1;17060;17056:9;17051:14;;16886:185;;;;:::o;17077:141::-;17126:4;17149:3;17141:11;;17172:3;17169:1;17162:14;17206:4;17203:1;17193:18;17185:26;;17077:141;;;:::o;17224:93::-;17261:6;17308:2;17303;17296:5;17292:14;17288:23;17278:33;;17224:93;;;:::o;17323:107::-;17367:8;17417:5;17411:4;17407:16;17386:37;;17323:107;;;;:::o;17436:393::-;17505:6;17555:1;17543:10;17539:18;17578:97;17608:66;17597:9;17578:97;:::i;:::-;17696:39;17726:8;17715:9;17696:39;:::i;:::-;17684:51;;17768:4;17764:9;17757:5;17753:21;17744:30;;17817:4;17807:8;17803:19;17796:5;17793:30;17783:40;;17512:317;;17436:393;;;;;:::o;17835:142::-;17885:9;17918:53;17936:34;17945:24;17963:5;17945:24;:::i;:::-;17936:34;:::i;:::-;17918:53;:::i;:::-;17905:66;;17835:142;;;:::o;17983:75::-;18026:3;18047:5;18040:12;;17983:75;;;:::o;18064:269::-;18174:39;18205:7;18174:39;:::i;:::-;18235:91;18284:41;18308:16;18284:41;:::i;:::-;18276:6;18269:4;18263:11;18235:91;:::i;:::-;18229:4;18222:105;18140:193;18064:269;;;:::o;18339:73::-;18384:3;18339:73;:::o;18418:189::-;18495:32;;:::i;:::-;18536:65;18594:6;18586;18580:4;18536:65;:::i;:::-;18471:136;18418:189;;:::o;18613:186::-;18673:120;18690:3;18683:5;18680:14;18673:120;;;18744:39;18781:1;18774:5;18744:39;:::i;:::-;18717:1;18710:5;18706:13;18697:22;;18673:120;;;18613:186;;:::o;18805:543::-;18906:2;18901:3;18898:11;18895:446;;;18940:38;18972:5;18940:38;:::i;:::-;19024:29;19042:10;19024:29;:::i;:::-;19014:8;19010:44;19207:2;19195:10;19192:18;19189:49;;;19228:8;19213:23;;19189:49;19251:80;19307:22;19325:3;19307:22;:::i;:::-;19297:8;19293:37;19280:11;19251:80;:::i;:::-;18910:431;;18895:446;18805:543;;;:::o;19354:117::-;19408:8;19458:5;19452:4;19448:16;19427:37;;19354:117;;;;:::o;19477:169::-;19521:6;19554:51;19602:1;19598:6;19590:5;19587:1;19583:13;19554:51;:::i;:::-;19550:56;19635:4;19629;19625:15;19615:25;;19528:118;19477:169;;;;:::o;19651:295::-;19727:4;19873:29;19898:3;19892:4;19873:29;:::i;:::-;19865:37;;19935:3;19932:1;19928:11;19922:4;19919:21;19911:29;;19651:295;;;;:::o;19951:1395::-;20068:37;20101:3;20068:37;:::i;:::-;20170:18;20162:6;20159:30;20156:56;;;20192:18;;:::i;:::-;20156:56;20236:38;20268:4;20262:11;20236:38;:::i;:::-;20321:67;20381:6;20373;20367:4;20321:67;:::i;:::-;20415:1;20439:4;20426:17;;20471:2;20463:6;20460:14;20488:1;20483:618;;;;21145:1;21162:6;21159:77;;;21211:9;21206:3;21202:19;21196:26;21187:35;;21159:77;21262:67;21322:6;21315:5;21262:67;:::i;:::-;21256:4;21249:81;21118:222;20453:887;;20483:618;20535:4;20531:9;20523:6;20519:22;20569:37;20601:4;20569:37;:::i;:::-;20628:1;20642:208;20656:7;20653:1;20650:14;20642:208;;;20735:9;20730:3;20726:19;20720:26;20712:6;20705:42;20786:1;20778:6;20774:14;20764:24;;20833:2;20822:9;20818:18;20805:31;;20679:4;20676:1;20672:12;20667:17;;20642:208;;;20878:6;20869:7;20866:19;20863:179;;;20936:9;20931:3;20927:19;20921:26;20979:48;21021:4;21013:6;21009:17;20998:9;20979:48;:::i;:::-;20971:6;20964:64;20886:156;20863:179;21088:1;21084;21076:6;21072:14;21068:22;21062:4;21055:36;20490:611;;;20453:887;;20043:1303;;;19951:1395;;:::o;21352:191::-;21392:3;21411:20;21429:1;21411:20;:::i;:::-;21406:25;;21445:20;21463:1;21445:20;:::i;:::-;21440:25;;21488:1;21485;21481:9;21474:16;;21509:3;21506:1;21503:10;21500:36;;;21516:18;;:::i;:::-;21500:36;21352:191;;;;:::o;21549:193::-;21588:3;21607:19;21624:1;21607:19;:::i;:::-;21602:24;;21640:19;21657:1;21640:19;:::i;:::-;21635:24;;21682:1;21679;21675:9;21668:16;;21705:6;21700:3;21697:15;21694:41;;;21715:18;;:::i;:::-;21694:41;21549:193;;;;:::o;21748:169::-;21888:21;21884:1;21876:6;21872:14;21865:45;21748:169;:::o;21923:366::-;22065:3;22086:67;22150:2;22145:3;22086:67;:::i;:::-;22079:74;;22162:93;22251:3;22162:93;:::i;:::-;22280:2;22275:3;22271:12;22264:19;;21923:366;;;:::o;22295:419::-;22461:4;22499:2;22488:9;22484:18;22476:26;;22548:9;22542:4;22538:20;22534:1;22523:9;22519:17;22512:47;22576:131;22702:4;22576:131;:::i;:::-;22568:139;;22295:419;;;:::o;22720:148::-;22822:11;22859:3;22844:18;;22720:148;;;;:::o;22898:874::-;23001:3;23038:5;23032:12;23067:36;23093:9;23067:36;:::i;:::-;23119:89;23201:6;23196:3;23119:89;:::i;:::-;23112:96;;23239:1;23228:9;23224:17;23255:1;23250:166;;;;23430:1;23425:341;;;;23217:549;;23250:166;23334:4;23330:9;23319;23315:25;23310:3;23303:38;23396:6;23389:14;23382:22;23374:6;23370:35;23365:3;23361:45;23354:52;;23250:166;;23425:341;23492:38;23524:5;23492:38;:::i;:::-;23552:1;23566:154;23580:6;23577:1;23574:13;23566:154;;;23654:7;23648:14;23644:1;23639:3;23635:11;23628:35;23704:1;23695:7;23691:15;23680:26;;23602:4;23599:1;23595:12;23590:17;;23566:154;;;23749:6;23744:3;23740:16;23733:23;;23432:334;;23217:549;;23005:767;;22898:874;;;;:::o;23778:390::-;23884:3;23912:39;23945:5;23912:39;:::i;:::-;23967:89;24049:6;24044:3;23967:89;:::i;:::-;23960:96;;24065:65;24123:6;24118:3;24111:4;24104:5;24100:16;24065:65;:::i;:::-;24155:6;24150:3;24146:16;24139:23;;23888:280;23778:390;;;;:::o;24174:155::-;24314:7;24310:1;24302:6;24298:14;24291:31;24174:155;:::o;24335:400::-;24495:3;24516:84;24598:1;24593:3;24516:84;:::i;:::-;24509:91;;24609:93;24698:3;24609:93;:::i;:::-;24727:1;24722:3;24718:11;24711:18;;24335:400;;;:::o;24741:695::-;25019:3;25041:92;25129:3;25120:6;25041:92;:::i;:::-;25034:99;;25150:95;25241:3;25232:6;25150:95;:::i;:::-;25143:102;;25262:148;25406:3;25262:148;:::i;:::-;25255:155;;25427:3;25420:10;;24741:695;;;;;:::o;25442:194::-;25482:4;25502:20;25520:1;25502:20;:::i;:::-;25497:25;;25536:20;25554:1;25536:20;:::i;:::-;25531:25;;25580:1;25577;25573:9;25565:17;;25604:1;25598:4;25595:11;25592:37;;;25609:18;;:::i;:::-;25592:37;25442:194;;;;:::o;25642:98::-;25693:6;25727:5;25721:12;25711:22;;25642:98;;;:::o;25746:168::-;25829:11;25863:6;25858:3;25851:19;25903:4;25898:3;25894:14;25879:29;;25746:168;;;;:::o;25920:373::-;26006:3;26034:38;26066:5;26034:38;:::i;:::-;26088:70;26151:6;26146:3;26088:70;:::i;:::-;26081:77;;26167:65;26225:6;26220:3;26213:4;26206:5;26202:16;26167:65;:::i;:::-;26257:29;26279:6;26257:29;:::i;:::-;26252:3;26248:39;26241:46;;26010:283;25920:373;;;;:::o;26299:640::-;26494:4;26532:3;26521:9;26517:19;26509:27;;26546:71;26614:1;26603:9;26599:17;26590:6;26546:71;:::i;:::-;26627:72;26695:2;26684:9;26680:18;26671:6;26627:72;:::i;:::-;26709;26777:2;26766:9;26762:18;26753:6;26709:72;:::i;:::-;26828:9;26822:4;26818:20;26813:2;26802:9;26798:18;26791:48;26856:76;26927:4;26918:6;26856:76;:::i;:::-;26848:84;;26299:640;;;;;;;:::o;26945:141::-;27001:5;27032:6;27026:13;27017:22;;27048:32;27074:5;27048:32;:::i;:::-;26945:141;;;;:::o;27092:349::-;27161:6;27210:2;27198:9;27189:7;27185:23;27181:32;27178:119;;;27216:79;;:::i;:::-;27178:119;27336:1;27361:63;27416:7;27407:6;27396:9;27392:22;27361:63;:::i;:::-;27351:73;;27307:127;27092:349;;;;:::o

Swarm Source

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